FA-87146 / Physics integrator stability / Open access
Verlet velocity estimate divides by the first step length · case 01
Reported velocity is wrong whenever the last step differs from the first.
ROOT CAUSE
The backward difference uses dts[0].
VERIFIED REPAIR
Divide by the last step length.
Unsuccessful approach: Dividing by the mean step length still mismatches the last displacement.
Case contract
solve(x0, v0, w2, g, dts): position Verlet with variable steps, acceleration -w2*x+g. First step is Taylor x1=x0+v0*h0+0.5*a(x0)*h0^2; then x_{n+1}=x_n+(x_n-x_{n-1})*(h_n/h_{n-1})+a(x_n)*h_n*(h_n+h_{n-1})/2. Velocity estimate is (x_n-x_{n-1})/h_last. Empty dts returns the initial state. Return [x, v] rounded.
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, w2, g, dts):
def acc(p):
return -w2 * p + g
if not dts:
return [round(x0, 6), round(v0, 6)]
prev = x0
x = x0 + v0 * dts[0] + 0.5 * acc(x0) * dts[0] * dts[0]
for i in range(1, len(dts)):
h, hp = dts[i], dts[i - 1]
nxt = x + (x - prev) * (h / hp) + acc(x) * h * (h + hp) / 2
prev, x = x, nxt
v = (x - prev) / dts[0]
return [round(x, 6), round(v, 6)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[-1.619, -0.338, 11.211, 0.0, [0.03, 0.01, 0.02, 0.01]], [-1.598199, 0.839977]], [[-1.195, 0.979, 7.176, -9.81, [0.03, 0.03, 0.05, 0.02, 0.03, 0.03]], [-1.038473, 0.66576]], [[-1.471, 0.053, 5.614, -9.81, [0.01, 0.03]], [-1.470123, 0.014154]], [[1.699, 1.89, 11.648, 2.0, [0.01, 0.01, 0.01]], [1.747613, 1.439167]], [[-0.64, -1.038, 3.026, -9.81, [0.01, 0.02, 0.05]], [-0.748017, -1.466874]], [[-1.565, 1.894, 9.158, 2.0, [0.03, 0.02, 0.02, 0.03]], [-1.297197, 3.207236]], [[1.122, 1.423, 17.941, -9.81, [0.03, 0.05, 0.02, 0.03, 0.03, 0.02]], [0.892542, -3.585623]], [[1.513, 0.14, 19.472, 0.0, [0.03, 0.02, 0.02, 0.01, 0.03, 0.02]], [1.287869, -3.251244]]], [[[1.862, 1.422, 6.208, 2.0, [0.01, 0.03, 0.03, 0.01, 0.01]], [1.950431, 0.584063]], [[0.685, -1.105, 19.009, -9.81, [0.03, 0.05, 0.01, 0.02, 0.03]], [0.32196, -3.660507]], [[-0.078, 1.151, 6.047, 0.0, [0.02, 0.01, 0.02, 0.01, 0.01, 0.03, 0.05]], [0.096206, 1.157257]], [[-1.613, -0.622, 8.807, -9.81, [0.02, 0.03, 0.01, 0.05, 0.03]], [-1.655241, -0.043343]], [[-1.953, 1.838, 13.851, 2.0, [0.03, 0.05, 0.05, 0.01, 0.02, 0.01, 0.03]], [-1.062022, 6.37742]], [[-0.889, 0.43, 14.698, 0.0, [0.01, 0.03, 0.05, 0.05, 0.02]], [-0.661664, 2.211445]], [[-1.926, 1.549, 6.213, -9.81, [0.01, 0.03, 0.01, 0.02, 0.02]], [-1.778987, 1.690133]], [[0.412, -1.173, 12.93, 0.0, [0.03, 0.05, 0.03, 0.01, 0.01, 0.01]], [0.203048, -1.72765]]], [[[0.854, -1.02, 18.521, 2.0, [0.01, 0.01, 0.01, 0.03, 0.03, 0.05]], [0.587236, -2.434127]], [[1.409, 1.358, 6.866, -9.81, [0.02, 0.03]], [1.452425, 0.67206]], [[0.908, 1.194, 12.697, -9.81, [0.01, 0.05, 0.03, 0.01]], [0.919611, -0.859237]], [[0.713, -0.809, 17.736, -9.81, [0.02, 0.03, 0.02]], [0.602417, -2.116921]], [[0.727, 1.438, 6.895, 2.0, [0.05, 0.01, 0.01, 0.05, 0.02, 0.05, 0.05]], [0.966442, 0.602832]], [[0.781, -0.925, 5.968, 2.0, [0.05, 0.01]], [0.720799, -1.062479]], [[1.111, -1.009, 10.758, 0.0, [0.03, 0.05, 0.05, 0.05, 0.03]], [0.661033, -2.983284]], [[1.952, 1.187, 17.407, 0.0, [0.01, 0.02, 0.03, 0.01, 0.05, 0.01, 0.01, 0.05]], [1.571477, -4.269375]]], [[[1.541, -0.559, 13.316, 2.0, [0.01, 0.02, 0.05, 0.01, 0.05, 0.01, 0.03, 0.01, 0.05]], [0.921697, -3.990283]], [[1.356, 0.43, 6.172, -9.81, [0.03, 0.03, 0.01, 0.02, 0.02, 0.03]], [1.238615, -1.827115]], [[0.712, -1.32, 18.303, -9.81, [0.01, 0.05, 0.02, 0.02, 0.05, 0.01, 0.03, 0.01, 0.01]], [-0.001573, -4.938097]], [[-1.464, 1.574, 11.607, 2.0, [0.05, 0.02, 0.05, 0.01, 0.05, 0.02]], [-0.806018, 4.6123]], [[1.469, 0.687, 17.408, 2.0, [0.02, 0.05]], [1.459063, -0.379255]], [[-0.101, 1.196, 2.452, -9.81, [0.03, 0.02, 0.01, 0.03, 0.03, 0.02, 0.03, 0.01, 0.01]], [-0.048386, -0.598008]], [[1.678, -1.604, 6.016, 2.0, [0.02, 0.03, 0.05, 0.02, 0.05, 0.05, 0.02]], [1.087528, -3.119149]], [[-1.863, 1.623, 16.996, 0.0, [0.05, 0.01]], [-1.709241, 3.302938]]], [[[1.686, 1.833, 18.796, 2.0, [0.05, 0.03, 0.03, 0.03, 0.01, 0.05]], [1.451037, -3.390776]], [[-1.649, -1.262, 17.944, 2.0, [0.05, 0.03, 0.01, 0.03, 0.03, 0.01, 0.05, 0.01, 0.05]], [-0.887193, 5.798575]], [[0.838, -1.307, 3.091, 2.0, [0.03, 0.05, 0.03, 0.02, 0.02, 0.02, 0.03, 0.02, 0.01]], [0.529959, -1.335404]], [[-0.323, -0.978, 13.635, 2.0, [0.01, 0.01, 0.02, 0.02]], [-0.369754, -0.643529]], [[-0.102, -0.108, 9.259, 2.0, [0.03, 0.01, 0.05, 0.01, 0.03, 0.03, 0.05, 0.01, 0.05]], [-0.026457, 0.577844]], [[-0.233, 1.656, 10.109, -9.81, [0.02, 0.03, 0.01]], [-0.147526, 1.223195]], [[-0.245, 1.48, 17.152, 0.0, [0.02, 0.03, 0.02, 0.01, 0.01, 0.01, 0.03]], [-0.026787, 1.78343]], [[1.301, 1.97, 10.917, 2.0, [0.03, 0.02, 0.03]], [1.41814, 1.139533]]]]
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 | [-1.598199, 0.279992] | [-1.598199, 0.839977] | Failed |
| case 1 | [-1.038473, 0.66576] | [-1.038473, 0.66576] | Passed |
| case 2 | [-1.470123, 0.042462] | [-1.470123, 0.014154] | Failed |
| case 3 | [1.747613, 1.439167] | [1.747613, 1.439167] | Passed |
| case 4 | [-0.748017, -7.334368] | [-0.748017, -1.466874] | Failed |
| case 5 | [-1.297197, 3.207236] | [-1.297197, 3.207236] | Passed |
| case 6 | [0.892542, -2.390415] | [0.892542, -3.585623] | Failed |
| case 7 | [1.287869, -2.167496] | [1.287869, -3.251244] | Failed |
SHA-256 / 4a28f1bb4e165130c81cf575e4ec365ac1b06e810d1556de68170f10e00cb180
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, w2, g, dts):
def acc(p):
return -w2 * p + g
if not dts:
return [round(x0, 6), round(v0, 6)]
prev = x0
x = x0 + v0 * dts[0] + 0.5 * acc(x0) * dts[0] * dts[0]
for i in range(1, len(dts)):
h, hp = dts[i], dts[i - 1]
nxt = x + (x - prev) * (h / hp) + acc(x) * h * (h + hp) / 2
prev, x = x, nxt
v = (x - prev) / (sum(dts) / len(dts))
return [round(x, 6), round(v, 6)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[-1.619, -0.338, 11.211, 0.0, [0.03, 0.01, 0.02, 0.01]], [-1.598199, 0.839977]], [[-1.195, 0.979, 7.176, -9.81, [0.03, 0.03, 0.05, 0.02, 0.03, 0.03]], [-1.038473, 0.66576]], [[-1.471, 0.053, 5.614, -9.81, [0.01, 0.03]], [-1.470123, 0.014154]], [[1.699, 1.89, 11.648, 2.0, [0.01, 0.01, 0.01]], [1.747613, 1.439167]], [[-0.64, -1.038, 3.026, -9.81, [0.01, 0.02, 0.05]], [-0.748017, -1.466874]], [[-1.565, 1.894, 9.158, 2.0, [0.03, 0.02, 0.02, 0.03]], [-1.297197, 3.207236]], [[1.122, 1.423, 17.941, -9.81, [0.03, 0.05, 0.02, 0.03, 0.03, 0.02]], [0.892542, -3.585623]], [[1.513, 0.14, 19.472, 0.0, [0.03, 0.02, 0.02, 0.01, 0.03, 0.02]], [1.287869, -3.251244]]], [[[1.862, 1.422, 6.208, 2.0, [0.01, 0.03, 0.03, 0.01, 0.01]], [1.950431, 0.584063]], [[0.685, -1.105, 19.009, -9.81, [0.03, 0.05, 0.01, 0.02, 0.03]], [0.32196, -3.660507]], [[-0.078, 1.151, 6.047, 0.0, [0.02, 0.01, 0.02, 0.01, 0.01, 0.03, 0.05]], [0.096206, 1.157257]], [[-1.613, -0.622, 8.807, -9.81, [0.02, 0.03, 0.01, 0.05, 0.03]], [-1.655241, -0.043343]], [[-1.953, 1.838, 13.851, 2.0, [0.03, 0.05, 0.05, 0.01, 0.02, 0.01, 0.03]], [-1.062022, 6.37742]], [[-0.889, 0.43, 14.698, 0.0, [0.01, 0.03, 0.05, 0.05, 0.02]], [-0.661664, 2.211445]], [[-1.926, 1.549, 6.213, -9.81, [0.01, 0.03, 0.01, 0.02, 0.02]], [-1.778987, 1.690133]], [[0.412, -1.173, 12.93, 0.0, [0.03, 0.05, 0.03, 0.01, 0.01, 0.01]], [0.203048, -1.72765]]], [[[0.854, -1.02, 18.521, 2.0, [0.01, 0.01, 0.01, 0.03, 0.03, 0.05]], [0.587236, -2.434127]], [[1.409, 1.358, 6.866, -9.81, [0.02, 0.03]], [1.452425, 0.67206]], [[0.908, 1.194, 12.697, -9.81, [0.01, 0.05, 0.03, 0.01]], [0.919611, -0.859237]], [[0.713, -0.809, 17.736, -9.81, [0.02, 0.03, 0.02]], [0.602417, -2.116921]], [[0.727, 1.438, 6.895, 2.0, [0.05, 0.01, 0.01, 0.05, 0.02, 0.05, 0.05]], [0.966442, 0.602832]], [[0.781, -0.925, 5.968, 2.0, [0.05, 0.01]], [0.720799, -1.062479]], [[1.111, -1.009, 10.758, 0.0, [0.03, 0.05, 0.05, 0.05, 0.03]], [0.661033, -2.983284]], [[1.952, 1.187, 17.407, 0.0, [0.01, 0.02, 0.03, 0.01, 0.05, 0.01, 0.01, 0.05]], [1.571477, -4.269375]]], [[[1.541, -0.559, 13.316, 2.0, [0.01, 0.02, 0.05, 0.01, 0.05, 0.01, 0.03, 0.01, 0.05]], [0.921697, -3.990283]], [[1.356, 0.43, 6.172, -9.81, [0.03, 0.03, 0.01, 0.02, 0.02, 0.03]], [1.238615, -1.827115]], [[0.712, -1.32, 18.303, -9.81, [0.01, 0.05, 0.02, 0.02, 0.05, 0.01, 0.03, 0.01, 0.01]], [-0.001573, -4.938097]], [[-1.464, 1.574, 11.607, 2.0, [0.05, 0.02, 0.05, 0.01, 0.05, 0.02]], [-0.806018, 4.6123]], [[1.469, 0.687, 17.408, 2.0, [0.02, 0.05]], [1.459063, -0.379255]], [[-0.101, 1.196, 2.452, -9.81, [0.03, 0.02, 0.01, 0.03, 0.03, 0.02, 0.03, 0.01, 0.01]], [-0.048386, -0.598008]], [[1.678, -1.604, 6.016, 2.0, [0.02, 0.03, 0.05, 0.02, 0.05, 0.05, 0.02]], [1.087528, -3.119149]], [[-1.863, 1.623, 16.996, 0.0, [0.05, 0.01]], [-1.709241, 3.302938]]], [[[1.686, 1.833, 18.796, 2.0, [0.05, 0.03, 0.03, 0.03, 0.01, 0.05]], [1.451037, -3.390776]], [[-1.649, -1.262, 17.944, 2.0, [0.05, 0.03, 0.01, 0.03, 0.03, 0.01, 0.05, 0.01, 0.05]], [-0.887193, 5.798575]], [[0.838, -1.307, 3.091, 2.0, [0.03, 0.05, 0.03, 0.02, 0.02, 0.02, 0.03, 0.02, 0.01]], [0.529959, -1.335404]], [[-0.323, -0.978, 13.635, 2.0, [0.01, 0.01, 0.02, 0.02]], [-0.369754, -0.643529]], [[-0.102, -0.108, 9.259, 2.0, [0.03, 0.01, 0.05, 0.01, 0.03, 0.03, 0.05, 0.01, 0.05]], [-0.026457, 0.577844]], [[-0.233, 1.656, 10.109, -9.81, [0.02, 0.03, 0.01]], [-0.147526, 1.223195]], [[-0.245, 1.48, 17.152, 0.0, [0.02, 0.03, 0.02, 0.01, 0.01, 0.01, 0.03]], [-0.026787, 1.78343]], [[1.301, 1.97, 10.917, 2.0, [0.03, 0.02, 0.03]], [1.41814, 1.139533]]]]
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 | [-1.598199, 0.479987] | [-1.598199, 0.839977] | Failed |
| case 1 | [-1.038473, 0.63072] | [-1.038473, 0.66576] | Failed |
| case 2 | [-1.470123, 0.021231] | [-1.470123, 0.014154] | Failed |
| case 3 | [1.747613, 1.439167] | [1.747613, 1.439167] | Passed |
| case 4 | [-0.748017, -2.750388] | [-0.748017, -1.466874] | Failed |
| case 5 | [-1.297197, 3.848683] | [-1.297197, 3.207236] | Failed |
| case 6 | [0.892542, -2.390415] | [0.892542, -3.585623] | Failed |
| case 7 | [1.287869, -3.001148] | [1.287869, -3.251244] | Failed |
SHA-256 / b2734c2585857a360181260e4007e0505343673243000f8fd23d6f26206251ae
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, w2, g, dts):
def acc(p):
return -w2 * p + g
if not dts:
return [round(x0, 6), round(v0, 6)]
prev = x0
x = x0 + v0 * dts[0] + 0.5 * acc(x0) * dts[0] * dts[0]
for i in range(1, len(dts)):
h, hp = dts[i], dts[i - 1]
nxt = x + (x - prev) * (h / hp) + acc(x) * h * (h + hp) / 2
prev, x = x, nxt
v = (x - prev) / dts[-1]
return [round(x, 6), round(v, 6)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[-1.619, -0.338, 11.211, 0.0, [0.03, 0.01, 0.02, 0.01]], [-1.598199, 0.839977]], [[-1.195, 0.979, 7.176, -9.81, [0.03, 0.03, 0.05, 0.02, 0.03, 0.03]], [-1.038473, 0.66576]], [[-1.471, 0.053, 5.614, -9.81, [0.01, 0.03]], [-1.470123, 0.014154]], [[1.699, 1.89, 11.648, 2.0, [0.01, 0.01, 0.01]], [1.747613, 1.439167]], [[-0.64, -1.038, 3.026, -9.81, [0.01, 0.02, 0.05]], [-0.748017, -1.466874]], [[-1.565, 1.894, 9.158, 2.0, [0.03, 0.02, 0.02, 0.03]], [-1.297197, 3.207236]], [[1.122, 1.423, 17.941, -9.81, [0.03, 0.05, 0.02, 0.03, 0.03, 0.02]], [0.892542, -3.585623]], [[1.513, 0.14, 19.472, 0.0, [0.03, 0.02, 0.02, 0.01, 0.03, 0.02]], [1.287869, -3.251244]]], [[[1.862, 1.422, 6.208, 2.0, [0.01, 0.03, 0.03, 0.01, 0.01]], [1.950431, 0.584063]], [[0.685, -1.105, 19.009, -9.81, [0.03, 0.05, 0.01, 0.02, 0.03]], [0.32196, -3.660507]], [[-0.078, 1.151, 6.047, 0.0, [0.02, 0.01, 0.02, 0.01, 0.01, 0.03, 0.05]], [0.096206, 1.157257]], [[-1.613, -0.622, 8.807, -9.81, [0.02, 0.03, 0.01, 0.05, 0.03]], [-1.655241, -0.043343]], [[-1.953, 1.838, 13.851, 2.0, [0.03, 0.05, 0.05, 0.01, 0.02, 0.01, 0.03]], [-1.062022, 6.37742]], [[-0.889, 0.43, 14.698, 0.0, [0.01, 0.03, 0.05, 0.05, 0.02]], [-0.661664, 2.211445]], [[-1.926, 1.549, 6.213, -9.81, [0.01, 0.03, 0.01, 0.02, 0.02]], [-1.778987, 1.690133]], [[0.412, -1.173, 12.93, 0.0, [0.03, 0.05, 0.03, 0.01, 0.01, 0.01]], [0.203048, -1.72765]]], [[[0.854, -1.02, 18.521, 2.0, [0.01, 0.01, 0.01, 0.03, 0.03, 0.05]], [0.587236, -2.434127]], [[1.409, 1.358, 6.866, -9.81, [0.02, 0.03]], [1.452425, 0.67206]], [[0.908, 1.194, 12.697, -9.81, [0.01, 0.05, 0.03, 0.01]], [0.919611, -0.859237]], [[0.713, -0.809, 17.736, -9.81, [0.02, 0.03, 0.02]], [0.602417, -2.116921]], [[0.727, 1.438, 6.895, 2.0, [0.05, 0.01, 0.01, 0.05, 0.02, 0.05, 0.05]], [0.966442, 0.602832]], [[0.781, -0.925, 5.968, 2.0, [0.05, 0.01]], [0.720799, -1.062479]], [[1.111, -1.009, 10.758, 0.0, [0.03, 0.05, 0.05, 0.05, 0.03]], [0.661033, -2.983284]], [[1.952, 1.187, 17.407, 0.0, [0.01, 0.02, 0.03, 0.01, 0.05, 0.01, 0.01, 0.05]], [1.571477, -4.269375]]], [[[1.541, -0.559, 13.316, 2.0, [0.01, 0.02, 0.05, 0.01, 0.05, 0.01, 0.03, 0.01, 0.05]], [0.921697, -3.990283]], [[1.356, 0.43, 6.172, -9.81, [0.03, 0.03, 0.01, 0.02, 0.02, 0.03]], [1.238615, -1.827115]], [[0.712, -1.32, 18.303, -9.81, [0.01, 0.05, 0.02, 0.02, 0.05, 0.01, 0.03, 0.01, 0.01]], [-0.001573, -4.938097]], [[-1.464, 1.574, 11.607, 2.0, [0.05, 0.02, 0.05, 0.01, 0.05, 0.02]], [-0.806018, 4.6123]], [[1.469, 0.687, 17.408, 2.0, [0.02, 0.05]], [1.459063, -0.379255]], [[-0.101, 1.196, 2.452, -9.81, [0.03, 0.02, 0.01, 0.03, 0.03, 0.02, 0.03, 0.01, 0.01]], [-0.048386, -0.598008]], [[1.678, -1.604, 6.016, 2.0, [0.02, 0.03, 0.05, 0.02, 0.05, 0.05, 0.02]], [1.087528, -3.119149]], [[-1.863, 1.623, 16.996, 0.0, [0.05, 0.01]], [-1.709241, 3.302938]]], [[[1.686, 1.833, 18.796, 2.0, [0.05, 0.03, 0.03, 0.03, 0.01, 0.05]], [1.451037, -3.390776]], [[-1.649, -1.262, 17.944, 2.0, [0.05, 0.03, 0.01, 0.03, 0.03, 0.01, 0.05, 0.01, 0.05]], [-0.887193, 5.798575]], [[0.838, -1.307, 3.091, 2.0, [0.03, 0.05, 0.03, 0.02, 0.02, 0.02, 0.03, 0.02, 0.01]], [0.529959, -1.335404]], [[-0.323, -0.978, 13.635, 2.0, [0.01, 0.01, 0.02, 0.02]], [-0.369754, -0.643529]], [[-0.102, -0.108, 9.259, 2.0, [0.03, 0.01, 0.05, 0.01, 0.03, 0.03, 0.05, 0.01, 0.05]], [-0.026457, 0.577844]], [[-0.233, 1.656, 10.109, -9.81, [0.02, 0.03, 0.01]], [-0.147526, 1.223195]], [[-0.245, 1.48, 17.152, 0.0, [0.02, 0.03, 0.02, 0.01, 0.01, 0.01, 0.03]], [-0.026787, 1.78343]], [[1.301, 1.97, 10.917, 2.0, [0.03, 0.02, 0.03]], [1.41814, 1.139533]]]]
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 | [-1.598199, 0.839977] | [-1.598199, 0.839977] | Passed |
| case 1 | [-1.038473, 0.66576] | [-1.038473, 0.66576] | Passed |
| case 2 | [-1.470123, 0.014154] | [-1.470123, 0.014154] | Passed |
| case 3 | [1.747613, 1.439167] | [1.747613, 1.439167] | Passed |
| case 4 | [-0.748017, -1.466874] | [-0.748017, -1.466874] | Passed |
| case 5 | [-1.297197, 3.207236] | [-1.297197, 3.207236] | Passed |
| case 6 | [0.892542, -3.585623] | [0.892542, -3.585623] | Passed |
| case 7 | [1.287869, -3.251244] | [1.287869, -3.251244] | Passed |
SHA-256 / ef0b88eaecf757a765c6cb81a9a48a7f4f80aee94d8ffb1c0c1fbef3dffa508d
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:56.000247+00:00.
Case digest / f1993bcf56f8d65fcf11a5857a714c45eca9eab788d7e9b50aa02545ac737679