FA-87021 / Physics integrator stability / Open access
RK4 loop never advances the simulation clock · case 01
The drive force is frozen at cos(0) and forced response is wrong.
ROOT CAUSE
The t += dt statement is missing.
VERIFIED REPAIR
Advance t by dt after each step.
Unsuccessful approach: Advancing t before evaluating stage one shifts every stage by one step.
Case contract
solve(x0, v0, k, c, F, wf, dt, steps): unit mass x''=-k*x-c*v+F*cos(wf*t) with wf in rad/s, t starting at 0, integrated with classical RK4. Return [x, v, t] rounded to 6.
Why this case matters
Game and robotics physics loops depend on integrator update order, step control and stabilization terms; a wrong decision point turns a stable simulation into drifting or exploding motion.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(x0, v0, k, c, F, wf, dt, steps):
def f(t, x, v):
return v, -k * x - c * v + F * math.cos(wf * t)
t = 0.0
x, v = x0, v0
for _ in range(steps):
k1x, k1v = f(t, x, v)
k2x, k2v = f(t + dt / 2, x + dt / 2 * k1x, v + dt / 2 * k1v)
k3x, k3v = f(t + dt / 2, x + dt / 2 * k2x, v + dt / 2 * k2v)
k4x, k4v = f(t + dt, x + dt * k3x, v + dt * k3v)
x = x + dt / 6 * (k1x + 2 * k2x + 2 * k3x + k4x)
v = v + dt / 6 * (k1v + 2 * k2v + 2 * k3v + k4v)
return [round(x, 6), round(v, 6), round(t, 6)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[0.844, 0.886, 19.018, 1.354, 1.974, 2.862, 0.2, 4], [-0.48866, -0.348254, 0.8]], [[-0.109, -0.682, 16.643, 0.151, 1.208, 3.199, 0.05, 3], [-0.171504, -0.13078, 0.15]], [[0.488, -0.59, 18.046, 0.065, 1.27, 1.284, 0.2, 3], [-0.348659, -0.553321, 0.6]], [[0.477, 0.804, 9.463, 0.795, 0.343, 4.866, 0.2, 1], [0.539279, -0.178827, 0.2]], [[0.594, 0.724, 5.574, 1.414, 0.54, 2.544, 0.2, 5], [0.050911, -1.000788, 1.0]], [[0.873, 0.152, 12.557, 0.098, 1.074, 1.939, 0.1, 6], [-0.290594, -2.488439, 0.6]], [[-0.015, 0.798, 18.348, 1.42, 1.862, 3.955, 0.05, 2], [0.067066, 0.815353, 0.1]], [[0.206, 0.096, 17.287, 0.284, 1.767, 2.847, 0.2, 1], [0.188435, -0.265686, 0.2]]], [[[-0.492, -0.144, 14.57, 1.424, 1.521, 1.605, 0.05, 3], [-0.421761, 1.012157, 0.15]], [[0.003, 0.395, 12.77, 0.296, 0.352, 4.733, 0.1, 2], [0.078731, 0.325617, 0.2]], [[-0.926, 0.952, 5.429, 0.55, 1.365, 4.948, 0.2, 1], [-0.633361, 1.884933, 0.2]], [[-0.534, 0.495, 13.551, 1.071, 1.879, 2.403, 0.1, 7], [0.467684, 0.332973, 0.7]], [[-0.435, -0.421, 0.535, 1.01, 1.434, 4.069, 0.2, 1], [-0.481308, -0.068347, 0.2]], [[-0.017, 0.68, 3.032, 0.837, 0.432, 2.962, 0.05, 8], [0.225745, 0.477143, 0.4]], [[0.35, 0.024, 2.459, 0.489, 1.678, 3.184, 0.2, 2], [0.401172, 0.137673, 0.4]], [[-0.032, 0.808, 18.227, 0.749, 0.437, 3.703, 0.1, 1], [0.04836, 0.775101, 0.1]]], [[[0.156, -0.808, 12.089, 0.635, 0.926, 3.013, 0.05, 7], [-0.092465, -0.474045, 0.35]], [[-0.743, 0.606, 18.791, 0.354, 1.009, 2.833, 0.1, 3], [-0.053531, 3.257429, 0.3]], [[-0.226, -0.701, 16.947, 0.853, 0.897, 1.169, 0.1, 3], [-0.195897, 0.805228, 0.3]], [[-0.571, 0.019, 10.668, 1.333, 0.813, 4.88, 0.1, 10], [0.238859, -0.217571, 1.0]], [[-0.262, -0.939, 2.411, 0.717, 1.809, 4.573, 0.2, 3], [-0.441532, -0.085208, 0.6]], [[0.395, -0.904, 16.019, 1.336, 1.807, 0.641, 0.1, 9], [-0.000556, 0.633994, 0.9]], [[-0.394, 0.849, 18.783, 1.27, 1.837, 1.788, 0.1, 10], [0.047492, -1.406422, 1.0]], [[-0.722, -0.414, 11.067, 1.242, 1.818, 2.28, 0.2, 2], [-0.248164, 2.157098, 0.4]]], [[[0.008, 0.621, 19.737, 0.731, 0.589, 2.671, 0.2, 10], [0.072111, -0.089781, 2.0]], [[-0.772, 0.752, 2.823, 0.497, 1.621, 2.92, 0.1, 6], [0.065151, 1.550767, 0.6]], [[-0.442, 0.797, 6.557, 1.401, 1.795, 3.756, 0.1, 9], [0.25065, -0.396817, 0.9]], [[-0.198, -0.028, 4.048, 0.079, 1.642, 1.588, 0.2, 8], [0.361524, -1.100738, 1.6]], [[-0.262, 0.32, 14.578, 0.644, 0.243, 3.924, 0.1, 3], [-0.039877, 0.966063, 0.3]], [[0.906, -0.658, 3.163, 1.453, 1.529, 3.675, 0.2, 7], [-0.365644, -0.533183, 1.4]], [[-0.83, 0.207, 3.417, 1.347, 0.61, 3.166, 0.1, 6], [-0.347709, 1.031334, 0.6]], [[-0.484, -0.908, 18.372, 0.481, 1.964, 2.315, 0.2, 2], [-0.051507, 2.343495, 0.4]]], [[[-0.341, 0.921, 14.484, 0.78, 0.993, 4.954, 0.1, 11], [-0.092121, -0.961694, 1.1]], [[-0.279, -0.59, 18.348, 0.337, 0.803, 4.86, 0.05, 13], [0.195004, 0.648818, 0.65]], [[0.163, 0.02, 4.507, 0.115, 0.982, 3.557, 0.1, 3], [0.175188, 0.032334, 0.3]], [[0.96, 0.368, 6.136, 0.868, 0.713, 4.277, 0.1, 13], [-0.632372, -0.226167, 1.3]], [[0.48, 0.991, 13.504, 0.938, 1.754, 1.99, 0.2, 8], [-0.112907, 0.598276, 1.6]], [[-0.235, 0.94, 18.166, 1.391, 0.342, 1.087, 0.1, 3], [0.096306, 0.958657, 0.3]], [[0.613, 0.575, 19.459, 1.488, 0.738, 4.191, 0.1, 1], [0.612276, -0.562497, 0.1]], [[-0.25, -0.588, 8.961, 0.399, 0.698, 2.615, 0.1, 5], [-0.152947, 0.804646, 0.5]]]]
for i, (args, expected) in enumerate(fixtures[N-1]):
check("case %d" % i, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| case 0 | [-0.371706, 0.061267, 0.0] | [-0.48866, -0.348254, 0.8] | Failed |
| case 1 | [-0.171296, -0.124801, 0.0] | [-0.171504, -0.13078, 0.15] | Failed |
| case 2 | [-0.341068, -0.504592, 0.0] | [-0.348659, -0.553321, 0.6] | Failed |
| case 3 | [0.539279, -0.178827, 0.0] | [0.539279, -0.178827, 0.2] | Failed |
| case 4 | [0.120687, -0.789393, 0.0] | [0.050911, -1.000788, 1.0] | Failed |
| case 5 | [-0.273667, -2.384462, 0.0] | [-0.290594, -2.488439, 0.6] | Failed |
| case 6 | [0.06714, 0.818834, 0.0] | [0.067066, 0.815353, 0.1] | Failed |
| case 7 | [0.188435, -0.265686, 0.0] | [0.188435, -0.265686, 0.2] | Failed |
SHA-256 / 72de12110af1ec5a71705f5103c526641be1e7dd78ff147cf0339aaa4ce81bb5
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(x0, v0, k, c, F, wf, dt, steps):
def f(t, x, v):
return v, -k * x - c * v + F * math.cos(wf * t)
t = 0.0
x, v = x0, v0
for _ in range(steps):
t = t + dt
k1x, k1v = f(t, x, v)
k2x, k2v = f(t + dt / 2, x + dt / 2 * k1x, v + dt / 2 * k1v)
k3x, k3v = f(t + dt / 2, x + dt / 2 * k2x, v + dt / 2 * k2v)
k4x, k4v = f(t + dt, x + dt * k3x, v + dt * k3v)
x = x + dt / 6 * (k1x + 2 * k2x + 2 * k3x + k4x)
v = v + dt / 6 * (k1v + 2 * k2v + 2 * k3v + k4v)
return [round(x, 6), round(v, 6), round(t, 6)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[0.844, 0.886, 19.018, 1.354, 1.974, 2.862, 0.2, 4], [-0.48866, -0.348254, 0.8]], [[-0.109, -0.682, 16.643, 0.151, 1.208, 3.199, 0.05, 3], [-0.171504, -0.13078, 0.15]], [[0.488, -0.59, 18.046, 0.065, 1.27, 1.284, 0.2, 3], [-0.348659, -0.553321, 0.6]], [[0.477, 0.804, 9.463, 0.795, 0.343, 4.866, 0.2, 1], [0.539279, -0.178827, 0.2]], [[0.594, 0.724, 5.574, 1.414, 0.54, 2.544, 0.2, 5], [0.050911, -1.000788, 1.0]], [[0.873, 0.152, 12.557, 0.098, 1.074, 1.939, 0.1, 6], [-0.290594, -2.488439, 0.6]], [[-0.015, 0.798, 18.348, 1.42, 1.862, 3.955, 0.05, 2], [0.067066, 0.815353, 0.1]], [[0.206, 0.096, 17.287, 0.284, 1.767, 2.847, 0.2, 1], [0.188435, -0.265686, 0.2]]], [[[-0.492, -0.144, 14.57, 1.424, 1.521, 1.605, 0.05, 3], [-0.421761, 1.012157, 0.15]], [[0.003, 0.395, 12.77, 0.296, 0.352, 4.733, 0.1, 2], [0.078731, 0.325617, 0.2]], [[-0.926, 0.952, 5.429, 0.55, 1.365, 4.948, 0.2, 1], [-0.633361, 1.884933, 0.2]], [[-0.534, 0.495, 13.551, 1.071, 1.879, 2.403, 0.1, 7], [0.467684, 0.332973, 0.7]], [[-0.435, -0.421, 0.535, 1.01, 1.434, 4.069, 0.2, 1], [-0.481308, -0.068347, 0.2]], [[-0.017, 0.68, 3.032, 0.837, 0.432, 2.962, 0.05, 8], [0.225745, 0.477143, 0.4]], [[0.35, 0.024, 2.459, 0.489, 1.678, 3.184, 0.2, 2], [0.401172, 0.137673, 0.4]], [[-0.032, 0.808, 18.227, 0.749, 0.437, 3.703, 0.1, 1], [0.04836, 0.775101, 0.1]]], [[[0.156, -0.808, 12.089, 0.635, 0.926, 3.013, 0.05, 7], [-0.092465, -0.474045, 0.35]], [[-0.743, 0.606, 18.791, 0.354, 1.009, 2.833, 0.1, 3], [-0.053531, 3.257429, 0.3]], [[-0.226, -0.701, 16.947, 0.853, 0.897, 1.169, 0.1, 3], [-0.195897, 0.805228, 0.3]], [[-0.571, 0.019, 10.668, 1.333, 0.813, 4.88, 0.1, 10], [0.238859, -0.217571, 1.0]], [[-0.262, -0.939, 2.411, 0.717, 1.809, 4.573, 0.2, 3], [-0.441532, -0.085208, 0.6]], [[0.395, -0.904, 16.019, 1.336, 1.807, 0.641, 0.1, 9], [-0.000556, 0.633994, 0.9]], [[-0.394, 0.849, 18.783, 1.27, 1.837, 1.788, 0.1, 10], [0.047492, -1.406422, 1.0]], [[-0.722, -0.414, 11.067, 1.242, 1.818, 2.28, 0.2, 2], [-0.248164, 2.157098, 0.4]]], [[[0.008, 0.621, 19.737, 0.731, 0.589, 2.671, 0.2, 10], [0.072111, -0.089781, 2.0]], [[-0.772, 0.752, 2.823, 0.497, 1.621, 2.92, 0.1, 6], [0.065151, 1.550767, 0.6]], [[-0.442, 0.797, 6.557, 1.401, 1.795, 3.756, 0.1, 9], [0.25065, -0.396817, 0.9]], [[-0.198, -0.028, 4.048, 0.079, 1.642, 1.588, 0.2, 8], [0.361524, -1.100738, 1.6]], [[-0.262, 0.32, 14.578, 0.644, 0.243, 3.924, 0.1, 3], [-0.039877, 0.966063, 0.3]], [[0.906, -0.658, 3.163, 1.453, 1.529, 3.675, 0.2, 7], [-0.365644, -0.533183, 1.4]], [[-0.83, 0.207, 3.417, 1.347, 0.61, 3.166, 0.1, 6], [-0.347709, 1.031334, 0.6]], [[-0.484, -0.908, 18.372, 0.481, 1.964, 2.315, 0.2, 2], [-0.051507, 2.343495, 0.4]]], [[[-0.341, 0.921, 14.484, 0.78, 0.993, 4.954, 0.1, 11], [-0.092121, -0.961694, 1.1]], [[-0.279, -0.59, 18.348, 0.337, 0.803, 4.86, 0.05, 13], [0.195004, 0.648818, 0.65]], [[0.163, 0.02, 4.507, 0.115, 0.982, 3.557, 0.1, 3], [0.175188, 0.032334, 0.3]], [[0.96, 0.368, 6.136, 0.868, 0.713, 4.277, 0.1, 13], [-0.632372, -0.226167, 1.3]], [[0.48, 0.991, 13.504, 0.938, 1.754, 1.99, 0.2, 8], [-0.112907, 0.598276, 1.6]], [[-0.235, 0.94, 18.166, 1.391, 0.342, 1.087, 0.1, 3], [0.096306, 0.958657, 0.3]], [[0.613, 0.575, 19.459, 1.488, 0.738, 4.191, 0.1, 1], [0.612276, -0.562497, 0.1]], [[-0.25, -0.588, 8.961, 0.399, 0.698, 2.615, 0.1, 5], [-0.152947, 0.804646, 0.5]]]]
for i, (args, expected) in enumerate(fixtures[N-1]):
check("case %d" % i, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| case 0 | [-0.572882, -0.330509, 0.8] | [-0.48866, -0.348254, 0.8] | Failed |
| case 1 | [-0.172001, -0.139372, 0.15] | [-0.171504, -0.13078, 0.15] | Failed |
| case 2 | [-0.362789, -0.595435, 0.6] | [-0.348659, -0.553321, 0.6] | Failed |
| case 3 | [0.535051, -0.223909, 0.2] | [0.539279, -0.178827, 0.2] | Failed |
| case 4 | [0.004201, -1.035609, 1.0] | [0.050911, -1.000788, 1.0] | Failed |
| case 5 | [-0.303182, -2.532475, 0.6] | [-0.290594, -2.488439, 0.6] | Failed |
| case 6 | [0.066669, 0.805454, 0.1] | [0.067066, 0.815353, 0.1] | Failed |
| case 7 | [0.179915, -0.359568, 0.2] | [0.188435, -0.265686, 0.2] | Failed |
SHA-256 / ec07809cfae632a3f432334348e28846296d9f3b57cf23a7b09fca1449e7e19c
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(x0, v0, k, c, F, wf, dt, steps):
def f(t, x, v):
return v, -k * x - c * v + F * math.cos(wf * t)
t = 0.0
x, v = x0, v0
for _ in range(steps):
k1x, k1v = f(t, x, v)
k2x, k2v = f(t + dt / 2, x + dt / 2 * k1x, v + dt / 2 * k1v)
k3x, k3v = f(t + dt / 2, x + dt / 2 * k2x, v + dt / 2 * k2v)
k4x, k4v = f(t + dt, x + dt * k3x, v + dt * k3v)
x = x + dt / 6 * (k1x + 2 * k2x + 2 * k3x + k4x)
v = v + dt / 6 * (k1v + 2 * k2v + 2 * k3v + k4v)
t = t + dt
return [round(x, 6), round(v, 6), round(t, 6)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[0.844, 0.886, 19.018, 1.354, 1.974, 2.862, 0.2, 4], [-0.48866, -0.348254, 0.8]], [[-0.109, -0.682, 16.643, 0.151, 1.208, 3.199, 0.05, 3], [-0.171504, -0.13078, 0.15]], [[0.488, -0.59, 18.046, 0.065, 1.27, 1.284, 0.2, 3], [-0.348659, -0.553321, 0.6]], [[0.477, 0.804, 9.463, 0.795, 0.343, 4.866, 0.2, 1], [0.539279, -0.178827, 0.2]], [[0.594, 0.724, 5.574, 1.414, 0.54, 2.544, 0.2, 5], [0.050911, -1.000788, 1.0]], [[0.873, 0.152, 12.557, 0.098, 1.074, 1.939, 0.1, 6], [-0.290594, -2.488439, 0.6]], [[-0.015, 0.798, 18.348, 1.42, 1.862, 3.955, 0.05, 2], [0.067066, 0.815353, 0.1]], [[0.206, 0.096, 17.287, 0.284, 1.767, 2.847, 0.2, 1], [0.188435, -0.265686, 0.2]]], [[[-0.492, -0.144, 14.57, 1.424, 1.521, 1.605, 0.05, 3], [-0.421761, 1.012157, 0.15]], [[0.003, 0.395, 12.77, 0.296, 0.352, 4.733, 0.1, 2], [0.078731, 0.325617, 0.2]], [[-0.926, 0.952, 5.429, 0.55, 1.365, 4.948, 0.2, 1], [-0.633361, 1.884933, 0.2]], [[-0.534, 0.495, 13.551, 1.071, 1.879, 2.403, 0.1, 7], [0.467684, 0.332973, 0.7]], [[-0.435, -0.421, 0.535, 1.01, 1.434, 4.069, 0.2, 1], [-0.481308, -0.068347, 0.2]], [[-0.017, 0.68, 3.032, 0.837, 0.432, 2.962, 0.05, 8], [0.225745, 0.477143, 0.4]], [[0.35, 0.024, 2.459, 0.489, 1.678, 3.184, 0.2, 2], [0.401172, 0.137673, 0.4]], [[-0.032, 0.808, 18.227, 0.749, 0.437, 3.703, 0.1, 1], [0.04836, 0.775101, 0.1]]], [[[0.156, -0.808, 12.089, 0.635, 0.926, 3.013, 0.05, 7], [-0.092465, -0.474045, 0.35]], [[-0.743, 0.606, 18.791, 0.354, 1.009, 2.833, 0.1, 3], [-0.053531, 3.257429, 0.3]], [[-0.226, -0.701, 16.947, 0.853, 0.897, 1.169, 0.1, 3], [-0.195897, 0.805228, 0.3]], [[-0.571, 0.019, 10.668, 1.333, 0.813, 4.88, 0.1, 10], [0.238859, -0.217571, 1.0]], [[-0.262, -0.939, 2.411, 0.717, 1.809, 4.573, 0.2, 3], [-0.441532, -0.085208, 0.6]], [[0.395, -0.904, 16.019, 1.336, 1.807, 0.641, 0.1, 9], [-0.000556, 0.633994, 0.9]], [[-0.394, 0.849, 18.783, 1.27, 1.837, 1.788, 0.1, 10], [0.047492, -1.406422, 1.0]], [[-0.722, -0.414, 11.067, 1.242, 1.818, 2.28, 0.2, 2], [-0.248164, 2.157098, 0.4]]], [[[0.008, 0.621, 19.737, 0.731, 0.589, 2.671, 0.2, 10], [0.072111, -0.089781, 2.0]], [[-0.772, 0.752, 2.823, 0.497, 1.621, 2.92, 0.1, 6], [0.065151, 1.550767, 0.6]], [[-0.442, 0.797, 6.557, 1.401, 1.795, 3.756, 0.1, 9], [0.25065, -0.396817, 0.9]], [[-0.198, -0.028, 4.048, 0.079, 1.642, 1.588, 0.2, 8], [0.361524, -1.100738, 1.6]], [[-0.262, 0.32, 14.578, 0.644, 0.243, 3.924, 0.1, 3], [-0.039877, 0.966063, 0.3]], [[0.906, -0.658, 3.163, 1.453, 1.529, 3.675, 0.2, 7], [-0.365644, -0.533183, 1.4]], [[-0.83, 0.207, 3.417, 1.347, 0.61, 3.166, 0.1, 6], [-0.347709, 1.031334, 0.6]], [[-0.484, -0.908, 18.372, 0.481, 1.964, 2.315, 0.2, 2], [-0.051507, 2.343495, 0.4]]], [[[-0.341, 0.921, 14.484, 0.78, 0.993, 4.954, 0.1, 11], [-0.092121, -0.961694, 1.1]], [[-0.279, -0.59, 18.348, 0.337, 0.803, 4.86, 0.05, 13], [0.195004, 0.648818, 0.65]], [[0.163, 0.02, 4.507, 0.115, 0.982, 3.557, 0.1, 3], [0.175188, 0.032334, 0.3]], [[0.96, 0.368, 6.136, 0.868, 0.713, 4.277, 0.1, 13], [-0.632372, -0.226167, 1.3]], [[0.48, 0.991, 13.504, 0.938, 1.754, 1.99, 0.2, 8], [-0.112907, 0.598276, 1.6]], [[-0.235, 0.94, 18.166, 1.391, 0.342, 1.087, 0.1, 3], [0.096306, 0.958657, 0.3]], [[0.613, 0.575, 19.459, 1.488, 0.738, 4.191, 0.1, 1], [0.612276, -0.562497, 0.1]], [[-0.25, -0.588, 8.961, 0.399, 0.698, 2.615, 0.1, 5], [-0.152947, 0.804646, 0.5]]]]
for i, (args, expected) in enumerate(fixtures[N-1]):
check("case %d" % i, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| case 0 | [-0.48866, -0.348254, 0.8] | [-0.48866, -0.348254, 0.8] | Passed |
| case 1 | [-0.171504, -0.13078, 0.15] | [-0.171504, -0.13078, 0.15] | Passed |
| case 2 | [-0.348659, -0.553321, 0.6] | [-0.348659, -0.553321, 0.6] | Passed |
| case 3 | [0.539279, -0.178827, 0.2] | [0.539279, -0.178827, 0.2] | Passed |
| case 4 | [0.050911, -1.000788, 1.0] | [0.050911, -1.000788, 1.0] | Passed |
| case 5 | [-0.290594, -2.488439, 0.6] | [-0.290594, -2.488439, 0.6] | Passed |
| case 6 | [0.067066, 0.815353, 0.1] | [0.067066, 0.815353, 0.1] | Passed |
| case 7 | [0.188435, -0.265686, 0.2] | [0.188435, -0.265686, 0.2] | Passed |
SHA-256 / 6f497daaff224ba3b29040a3e9945b727e3d631c5946fcc238b2a8b108c15264
Verification & scope
A deterministic bounded teaching model with stipulated toy conventions and rounded float output; not a production physics engine or a proof of numerical stability. This reproducer isolates one failure mechanism. Results cover the supplied fixtures. Variants within a family share a test contract and should remain grouped when constructing evaluation splits. Related mechanisms with a shared evaluation_group must also remain together; these controlled models are not independent production incidents.
Observations recorded using Python 3.12.14 at 2026-09-29T14:50:54.980409+00:00.
Case digest / 5a5c66ddf1c269cb073dc4306372f6022501bd44806ee1a6fe33f5246309609a