FA-87151 / Physics integrator stability / Open access
Verlet bootstrap ignores the initial velocity · case 01
Launched bodies start from rest apart from the acceleration term.
ROOT CAUSE
x1 omits v0*h0.
VERIFIED REPAIR
Include v0*h0 in the first position.
Unsuccessful approach: Adding v0 without the step length adds a velocity to a position.
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 + 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 = [[[[0.043, 0.281, 14.181, -9.81, [0.03, 0.05, 0.02, 0.02, 0.03, 0.02]], [-0.057871, -1.335146]], [[-1.571, -1.847, 12.561, 0.0, [0.05, 0.05]], [-1.654908, -0.324492]], [[1.96, 1.554, 13.101, 0.0, [0.01, 0.02, 0.02, 0.03, 0.02]], [1.985105, -0.797275]], [[0.617, -1.642, 8.295, -9.81, [0.05, 0.01, 0.02, 0.01, 0.03, 0.02]], [0.248614, -3.42338]], [[-0.64, -1.038, 3.026, -9.81, [0.01, 0.02, 0.05]], [-0.748017, -1.466874]], [[-0.083, -0.339, 3.131, 0.0, [0.05, 0.02]], [-0.106057, -0.321586]], [[1.835, -1.641, 6.597, 2.0, [0.02, 0.02]], [1.761368, -1.939568]], [[-1.559, 0.132, 13.212, 0.0, [0.05, 0.05, 0.02, 0.03, 0.01, 0.01]], [-1.249546, 3.301322]]], [[[1.862, 1.422, 6.208, 2.0, [0.01, 0.03, 0.03, 0.01, 0.01]], [1.950431, 0.584063]], [[-1.61, -1.732, 8.212, 0.0, [0.05, 0.05, 0.03, 0.03, 0.05, 0.02, 0.01]], [-1.628363, 1.520418]], [[0.644, -0.151, 13.871, -9.81, [0.02, 0.02, 0.01, 0.01, 0.05, 0.02, 0.03]], [0.387894, -2.717601]], [[1.693, 1.184, 10.982, -9.81, [0.02, 0.03, 0.05, 0.05]], [1.550068, -2.368135]], [[0.487, 0.867, 0.777, -9.81, [0.05, 0.05, 0.03, 0.01, 0.02, 0.01, 0.05]], [0.430783, -1.12279]], [[0.623, 0.084, 19.474, 0.0, [0.02, 0.01]], [0.620063, -0.21909]], [[-0.485, 1.456, 18.965, 2.0, [0.01, 0.03, 0.05, 0.05, 0.02, 0.02]], [-0.07504, 2.805631]], [[1.678, 1.014, 7.008, -9.81, [0.02, 0.01, 0.01, 0.03, 0.01, 0.05, 0.05]], [1.510529, -2.322643]]], [[[-1.478, -0.428, 14.024, 2.0, [0.01, 0.02, 0.01]], [-1.476913, 0.36867]], [[-1.241, -0.995, 19.089, -9.81, [0.01, 0.01, 0.03, 0.05, 0.02, 0.05, 0.02, 0.03]], [-1.117034, 1.855358]], [[-0.873, -1.85, 3.249, 2.0, [0.03, 0.01, 0.05, 0.03, 0.01, 0.05, 0.01, 0.03]], [-1.154179, -0.756734]], [[1.462, -1.373, 3.135, 0.0, [0.05, 0.02, 0.02, 0.01, 0.02, 0.05, 0.03]], [1.102151, -2.133217]], [[1.606, 1.967, 9.66, 0.0, [0.05, 0.03, 0.01, 0.02, 0.03, 0.05, 0.01]], [1.674706, -1.223548]], [[-0.635, -0.168, 10.919, -9.81, [0.03, 0.05, 0.03, 0.01, 0.03, 0.03, 0.05, 0.02]], [-0.757474, -0.737512]], [[-1.655, 0.554, 15.555, -9.81, [0.03, 0.02, 0.01, 0.01, 0.03, 0.01]], [-1.500918, 2.131832]], [[0.106, -1.937, 2.608, 0.0, [0.03, 0.01, 0.03, 0.05, 0.01, 0.05, 0.05, 0.02]], [-0.374085, -1.858207]]], [[[-0.434, -1.688, 15.899, 0.0, [0.03, 0.05, 0.01, 0.02]], [-0.573341, -0.885589]], [[-1.996, 0.382, 13.281, 2.0, [0.05, 0.02, 0.05, 0.03, 0.02, 0.01]], [-1.486075, 4.955798]], [[-0.786, 1.689, 5.769, 2.0, [0.03, 0.05, 0.03, 0.03]], [-0.490174, 2.418931]], [[-0.101, -1.02, 19.226, 2.0, [0.05, 0.01]], [-0.154839, -0.776626]], [[1.286, 1.196, 2.402, 0.0, [0.05, 0.05, 0.02, 0.01, 0.05, 0.05, 0.05, 0.03, 0.05]], [1.499807, 0.049865]], [[0.278, 1.61, 10.377, -9.81, [0.05, 0.03, 0.02, 0.05, 0.03, 0.05]], [0.295151, -1.14607]], [[-1.698, 0.325, 6.546, -9.81, [0.02, 0.02]], [-1.683974, 0.363268]], [[-0.516, 0.344, 13.779, -9.81, [0.01, 0.03, 0.01, 0.01, 0.03, 0.05]], [-0.495793, 0.012391]]], [[[1.069, 0.063, 3.1, 0.0, [0.01, 0.02, 0.01, 0.02, 0.03, 0.02, 0.01, 0.01]], [1.049237, -0.349388]], [[0.705, -0.579, 5.962, 0.0, [0.03, 0.05, 0.03, 0.03, 0.02, 0.03, 0.05, 0.03, 0.02, 0.03]], [0.333218, -1.592526]], [[-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.391, 1.387, 17.389, -9.81, [0.05, 0.03, 0.01]], [0.447014, -0.078323]], [[1.94, 0.689, 18.476, 0.0, [0.05, 0.01, 0.03, 0.01, 0.05, 0.02, 0.03, 0.02, 0.02]], [1.133627, -6.57541]], [[-1.434, -0.348, 10.741, -9.81, [0.03, 0.03, 0.03, 0.01, 0.05, 0.03, 0.03, 0.03, 0.01, 0.01]], [-1.336072, 1.031162]], [[1.097, 0.642, 16.162, 2.0, [0.01, 0.03]], [1.110042, 0.246936]], [[-0.08, 0.73, 11.393, -9.81, [0.03, 0.03, 0.05, 0.01, 0.01, 0.01, 0.01]], [-0.072953, -0.593702]]]]
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.102567, -1.566719] | [-0.057871, -1.335146] | Failed |
| case 1 | [-1.473108, 1.464508] | [-1.654908, -0.324492] | Failed |
| case 2 | [1.832904, -2.270494] | [1.985105, -0.797275] | Failed |
| case 3 | [0.472685, -1.894701] | [0.248614, -3.42338] | Failed |
| case 4 | [-0.665175, -0.432642] | [-0.748017, -1.466874] | Failed |
| case 5 | [-0.082364, 0.015557] | [-0.106057, -0.321586] | Failed |
| case 6 | [1.826921, -0.302898] | [1.761368, -1.939568] | Failed |
| case 7 | [-1.270661, 3.19242] | [-1.249546, 3.301322] | Failed |
SHA-256 / 8bdd430eea6ebe4f63fd4dc40007e7eb6c1ed785d1871e66984787f2d82b7a7e
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 + 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 = [[[[0.043, 0.281, 14.181, -9.81, [0.03, 0.05, 0.02, 0.02, 0.03, 0.02]], [-0.057871, -1.335146]], [[-1.571, -1.847, 12.561, 0.0, [0.05, 0.05]], [-1.654908, -0.324492]], [[1.96, 1.554, 13.101, 0.0, [0.01, 0.02, 0.02, 0.03, 0.02]], [1.985105, -0.797275]], [[0.617, -1.642, 8.295, -9.81, [0.05, 0.01, 0.02, 0.01, 0.03, 0.02]], [0.248614, -3.42338]], [[-0.64, -1.038, 3.026, -9.81, [0.01, 0.02, 0.05]], [-0.748017, -1.466874]], [[-0.083, -0.339, 3.131, 0.0, [0.05, 0.02]], [-0.106057, -0.321586]], [[1.835, -1.641, 6.597, 2.0, [0.02, 0.02]], [1.761368, -1.939568]], [[-1.559, 0.132, 13.212, 0.0, [0.05, 0.05, 0.02, 0.03, 0.01, 0.01]], [-1.249546, 3.301322]]], [[[1.862, 1.422, 6.208, 2.0, [0.01, 0.03, 0.03, 0.01, 0.01]], [1.950431, 0.584063]], [[-1.61, -1.732, 8.212, 0.0, [0.05, 0.05, 0.03, 0.03, 0.05, 0.02, 0.01]], [-1.628363, 1.520418]], [[0.644, -0.151, 13.871, -9.81, [0.02, 0.02, 0.01, 0.01, 0.05, 0.02, 0.03]], [0.387894, -2.717601]], [[1.693, 1.184, 10.982, -9.81, [0.02, 0.03, 0.05, 0.05]], [1.550068, -2.368135]], [[0.487, 0.867, 0.777, -9.81, [0.05, 0.05, 0.03, 0.01, 0.02, 0.01, 0.05]], [0.430783, -1.12279]], [[0.623, 0.084, 19.474, 0.0, [0.02, 0.01]], [0.620063, -0.21909]], [[-0.485, 1.456, 18.965, 2.0, [0.01, 0.03, 0.05, 0.05, 0.02, 0.02]], [-0.07504, 2.805631]], [[1.678, 1.014, 7.008, -9.81, [0.02, 0.01, 0.01, 0.03, 0.01, 0.05, 0.05]], [1.510529, -2.322643]]], [[[-1.478, -0.428, 14.024, 2.0, [0.01, 0.02, 0.01]], [-1.476913, 0.36867]], [[-1.241, -0.995, 19.089, -9.81, [0.01, 0.01, 0.03, 0.05, 0.02, 0.05, 0.02, 0.03]], [-1.117034, 1.855358]], [[-0.873, -1.85, 3.249, 2.0, [0.03, 0.01, 0.05, 0.03, 0.01, 0.05, 0.01, 0.03]], [-1.154179, -0.756734]], [[1.462, -1.373, 3.135, 0.0, [0.05, 0.02, 0.02, 0.01, 0.02, 0.05, 0.03]], [1.102151, -2.133217]], [[1.606, 1.967, 9.66, 0.0, [0.05, 0.03, 0.01, 0.02, 0.03, 0.05, 0.01]], [1.674706, -1.223548]], [[-0.635, -0.168, 10.919, -9.81, [0.03, 0.05, 0.03, 0.01, 0.03, 0.03, 0.05, 0.02]], [-0.757474, -0.737512]], [[-1.655, 0.554, 15.555, -9.81, [0.03, 0.02, 0.01, 0.01, 0.03, 0.01]], [-1.500918, 2.131832]], [[0.106, -1.937, 2.608, 0.0, [0.03, 0.01, 0.03, 0.05, 0.01, 0.05, 0.05, 0.02]], [-0.374085, -1.858207]]], [[[-0.434, -1.688, 15.899, 0.0, [0.03, 0.05, 0.01, 0.02]], [-0.573341, -0.885589]], [[-1.996, 0.382, 13.281, 2.0, [0.05, 0.02, 0.05, 0.03, 0.02, 0.01]], [-1.486075, 4.955798]], [[-0.786, 1.689, 5.769, 2.0, [0.03, 0.05, 0.03, 0.03]], [-0.490174, 2.418931]], [[-0.101, -1.02, 19.226, 2.0, [0.05, 0.01]], [-0.154839, -0.776626]], [[1.286, 1.196, 2.402, 0.0, [0.05, 0.05, 0.02, 0.01, 0.05, 0.05, 0.05, 0.03, 0.05]], [1.499807, 0.049865]], [[0.278, 1.61, 10.377, -9.81, [0.05, 0.03, 0.02, 0.05, 0.03, 0.05]], [0.295151, -1.14607]], [[-1.698, 0.325, 6.546, -9.81, [0.02, 0.02]], [-1.683974, 0.363268]], [[-0.516, 0.344, 13.779, -9.81, [0.01, 0.03, 0.01, 0.01, 0.03, 0.05]], [-0.495793, 0.012391]]], [[[1.069, 0.063, 3.1, 0.0, [0.01, 0.02, 0.01, 0.02, 0.03, 0.02, 0.01, 0.01]], [1.049237, -0.349388]], [[0.705, -0.579, 5.962, 0.0, [0.03, 0.05, 0.03, 0.03, 0.02, 0.03, 0.05, 0.03, 0.02, 0.03]], [0.333218, -1.592526]], [[-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.391, 1.387, 17.389, -9.81, [0.05, 0.03, 0.01]], [0.447014, -0.078323]], [[1.94, 0.689, 18.476, 0.0, [0.05, 0.01, 0.03, 0.01, 0.05, 0.02, 0.03, 0.02, 0.02]], [1.133627, -6.57541]], [[-1.434, -0.348, 10.741, -9.81, [0.03, 0.03, 0.03, 0.01, 0.05, 0.03, 0.03, 0.03, 0.01, 0.01]], [-1.336072, 1.031162]], [[1.097, 0.642, 16.162, 2.0, [0.01, 0.03]], [1.110042, 0.246936]], [[-0.08, 0.73, 11.393, -9.81, [0.03, 0.03, 0.05, 0.01, 0.01, 0.01, 0.01]], [-0.072953, -0.593702]]]]
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.38732, 6.152378] | [-0.057871, -1.335146] | Failed |
| case 1 | [-5.109108, -34.315484] | [-1.654908, -0.324492] | Failed |
| case 2 | [17.052982, 145.051384] | [1.985105, -0.797275] | Failed |
| case 3 | [-4.008738, -32.468278] | [0.248614, -3.42338] | Failed |
| case 4 | [-8.949392, -103.855823] | [-0.748017, -1.466874] | Failed |
| case 5 | [-0.556221, -6.727294] | [-0.106057, -0.321586] | Failed |
| case 6 | [-1.450749, -82.136385] | [1.761368, -1.939568] | Failed |
| case 7 | [-0.848349, 5.370468] | [-1.249546, 3.301322] | Failed |
SHA-256 / ecee38c354efb16d7f6c2afa850983a64dfcd0db8b5046acc3ea5322ec1bab59
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 = [[[[0.043, 0.281, 14.181, -9.81, [0.03, 0.05, 0.02, 0.02, 0.03, 0.02]], [-0.057871, -1.335146]], [[-1.571, -1.847, 12.561, 0.0, [0.05, 0.05]], [-1.654908, -0.324492]], [[1.96, 1.554, 13.101, 0.0, [0.01, 0.02, 0.02, 0.03, 0.02]], [1.985105, -0.797275]], [[0.617, -1.642, 8.295, -9.81, [0.05, 0.01, 0.02, 0.01, 0.03, 0.02]], [0.248614, -3.42338]], [[-0.64, -1.038, 3.026, -9.81, [0.01, 0.02, 0.05]], [-0.748017, -1.466874]], [[-0.083, -0.339, 3.131, 0.0, [0.05, 0.02]], [-0.106057, -0.321586]], [[1.835, -1.641, 6.597, 2.0, [0.02, 0.02]], [1.761368, -1.939568]], [[-1.559, 0.132, 13.212, 0.0, [0.05, 0.05, 0.02, 0.03, 0.01, 0.01]], [-1.249546, 3.301322]]], [[[1.862, 1.422, 6.208, 2.0, [0.01, 0.03, 0.03, 0.01, 0.01]], [1.950431, 0.584063]], [[-1.61, -1.732, 8.212, 0.0, [0.05, 0.05, 0.03, 0.03, 0.05, 0.02, 0.01]], [-1.628363, 1.520418]], [[0.644, -0.151, 13.871, -9.81, [0.02, 0.02, 0.01, 0.01, 0.05, 0.02, 0.03]], [0.387894, -2.717601]], [[1.693, 1.184, 10.982, -9.81, [0.02, 0.03, 0.05, 0.05]], [1.550068, -2.368135]], [[0.487, 0.867, 0.777, -9.81, [0.05, 0.05, 0.03, 0.01, 0.02, 0.01, 0.05]], [0.430783, -1.12279]], [[0.623, 0.084, 19.474, 0.0, [0.02, 0.01]], [0.620063, -0.21909]], [[-0.485, 1.456, 18.965, 2.0, [0.01, 0.03, 0.05, 0.05, 0.02, 0.02]], [-0.07504, 2.805631]], [[1.678, 1.014, 7.008, -9.81, [0.02, 0.01, 0.01, 0.03, 0.01, 0.05, 0.05]], [1.510529, -2.322643]]], [[[-1.478, -0.428, 14.024, 2.0, [0.01, 0.02, 0.01]], [-1.476913, 0.36867]], [[-1.241, -0.995, 19.089, -9.81, [0.01, 0.01, 0.03, 0.05, 0.02, 0.05, 0.02, 0.03]], [-1.117034, 1.855358]], [[-0.873, -1.85, 3.249, 2.0, [0.03, 0.01, 0.05, 0.03, 0.01, 0.05, 0.01, 0.03]], [-1.154179, -0.756734]], [[1.462, -1.373, 3.135, 0.0, [0.05, 0.02, 0.02, 0.01, 0.02, 0.05, 0.03]], [1.102151, -2.133217]], [[1.606, 1.967, 9.66, 0.0, [0.05, 0.03, 0.01, 0.02, 0.03, 0.05, 0.01]], [1.674706, -1.223548]], [[-0.635, -0.168, 10.919, -9.81, [0.03, 0.05, 0.03, 0.01, 0.03, 0.03, 0.05, 0.02]], [-0.757474, -0.737512]], [[-1.655, 0.554, 15.555, -9.81, [0.03, 0.02, 0.01, 0.01, 0.03, 0.01]], [-1.500918, 2.131832]], [[0.106, -1.937, 2.608, 0.0, [0.03, 0.01, 0.03, 0.05, 0.01, 0.05, 0.05, 0.02]], [-0.374085, -1.858207]]], [[[-0.434, -1.688, 15.899, 0.0, [0.03, 0.05, 0.01, 0.02]], [-0.573341, -0.885589]], [[-1.996, 0.382, 13.281, 2.0, [0.05, 0.02, 0.05, 0.03, 0.02, 0.01]], [-1.486075, 4.955798]], [[-0.786, 1.689, 5.769, 2.0, [0.03, 0.05, 0.03, 0.03]], [-0.490174, 2.418931]], [[-0.101, -1.02, 19.226, 2.0, [0.05, 0.01]], [-0.154839, -0.776626]], [[1.286, 1.196, 2.402, 0.0, [0.05, 0.05, 0.02, 0.01, 0.05, 0.05, 0.05, 0.03, 0.05]], [1.499807, 0.049865]], [[0.278, 1.61, 10.377, -9.81, [0.05, 0.03, 0.02, 0.05, 0.03, 0.05]], [0.295151, -1.14607]], [[-1.698, 0.325, 6.546, -9.81, [0.02, 0.02]], [-1.683974, 0.363268]], [[-0.516, 0.344, 13.779, -9.81, [0.01, 0.03, 0.01, 0.01, 0.03, 0.05]], [-0.495793, 0.012391]]], [[[1.069, 0.063, 3.1, 0.0, [0.01, 0.02, 0.01, 0.02, 0.03, 0.02, 0.01, 0.01]], [1.049237, -0.349388]], [[0.705, -0.579, 5.962, 0.0, [0.03, 0.05, 0.03, 0.03, 0.02, 0.03, 0.05, 0.03, 0.02, 0.03]], [0.333218, -1.592526]], [[-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.391, 1.387, 17.389, -9.81, [0.05, 0.03, 0.01]], [0.447014, -0.078323]], [[1.94, 0.689, 18.476, 0.0, [0.05, 0.01, 0.03, 0.01, 0.05, 0.02, 0.03, 0.02, 0.02]], [1.133627, -6.57541]], [[-1.434, -0.348, 10.741, -9.81, [0.03, 0.03, 0.03, 0.01, 0.05, 0.03, 0.03, 0.03, 0.01, 0.01]], [-1.336072, 1.031162]], [[1.097, 0.642, 16.162, 2.0, [0.01, 0.03]], [1.110042, 0.246936]], [[-0.08, 0.73, 11.393, -9.81, [0.03, 0.03, 0.05, 0.01, 0.01, 0.01, 0.01]], [-0.072953, -0.593702]]]]
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.057871, -1.335146] | [-0.057871, -1.335146] | Passed |
| case 1 | [-1.654908, -0.324492] | [-1.654908, -0.324492] | Passed |
| case 2 | [1.985105, -0.797275] | [1.985105, -0.797275] | Passed |
| case 3 | [0.248614, -3.42338] | [0.248614, -3.42338] | Passed |
| case 4 | [-0.748017, -1.466874] | [-0.748017, -1.466874] | Passed |
| case 5 | [-0.106057, -0.321586] | [-0.106057, -0.321586] | Passed |
| case 6 | [1.761368, -1.939568] | [1.761368, -1.939568] | Passed |
| case 7 | [-1.249546, 3.301322] | [-1.249546, 3.301322] | Passed |
SHA-256 / b52a84250ea433e8506e619d2fda4602bbf9784a1a404bebad31effd60c5851d
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.000482+00:00.
Case digest / 397128bb9790400d52de8536568c0a59a41c154faef2fc18b281afc4bfa4768e