FAILURE MAP
← Case archive

FA-87031 / Physics integrator stability / Open access

Drive frequency is treated as hertz in an angular-frequency contract · case 01

The forcing oscillates 2*pi times too fast.

Verified by executionVariant 1 · 8 checks per implementationDownload source bundle ↓JSON ↗

ROOT CAUSE

cos(wf*t*2*pi) is used although wf is already in rad/s.

VERIFIED REPAIR

Use cos(wf*t).

Unsuccessful approach: Using sin shifts the drive phase by a quarter period.

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 * 2 * math.pi)
    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.109, -0.682, 16.643, 0.151, 1.208, 3.199, 0.05, 3], [-0.171504, -0.13078, 0.15]], [[-0.584, -0.068, 3.984, 1.16, 1.256, 1.221, 0.2, 6], [0.398036, 0.466803, 1.2]], [[0.689, 0.052, 16.201, 1.057, 1.522, 3.299, 0.1, 4], [0.142181, -2.089598, 0.4]], [[-0.201, -0.275, 10.35, 0.615, 1.613, 1.945, 0.2, 4], [0.266847, 0.398844, 0.8]], [[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.488, -0.59, 18.046, 0.065, 1.27, 1.284, 0.2, 3], [-0.348659, -0.553321, 0.6]], [[0.604, -0.345, 10.339, 0.301, 1.167, 2.923, 0.2, 5], [-0.503739, -0.118324, 1.0]]], [[[-0.492, -0.144, 14.57, 1.424, 1.521, 1.605, 0.05, 3], [-0.421761, 1.012157, 0.15]], [[0.065, 0.375, 2.553, 0.664, 1.276, 4.564, 0.05, 7], [0.223112, 0.422278, 0.35]], [[0.836, -0.177, 4.422, 0.441, 0.853, 2.908, 0.2, 3], [0.32255, -1.356098, 0.6]], [[0.35, 0.024, 2.459, 0.489, 1.678, 3.184, 0.2, 2], [0.401172, 0.137673, 0.4]], [[-0.926, 0.952, 5.429, 0.55, 1.365, 4.948, 0.2, 1], [-0.633361, 1.884933, 0.2]], [[-0.417, 0.389, 9.943, 0.856, 1.643, 4.18, 0.2, 3], [0.231936, 0.708743, 0.6]], [[0.893, -0.338, 8.218, 0.106, 1.088, 1.181, 0.05, 7], [0.446933, -1.988356, 0.35]], [[0.195, 0.497, 1.02, 1.465, 1.928, 1.886, 0.2, 1], [0.311491, 0.651742, 0.2]]], [[[-0.571, 0.019, 10.668, 1.333, 0.813, 4.88, 0.1, 10], [0.238859, -0.217571, 1.0]], [[-0.893, 0.198, 5.986, 0.29, 0.849, 4.42, 0.05, 8], [-0.404311, 1.939625, 0.4]], [[-0.743, 0.606, 18.791, 0.354, 1.009, 2.833, 0.1, 3], [-0.053531, 3.257429, 0.3]], [[0.041, 0.318, 13.053, 1.284, 1.13, 3.854, 0.1, 10], [-0.108393, -0.480589, 1.0]], [[0.156, -0.808, 12.089, 0.635, 0.926, 3.013, 0.05, 7], [-0.092465, -0.474045, 0.35]], [[-0.187, -0.668, 4.72, 0.983, 1.179, 4.274, 0.1, 9], [-0.169823, 0.117475, 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.484, -0.908, 18.372, 0.481, 1.964, 2.315, 0.2, 2], [-0.051507, 2.343495, 0.4]], [[0.115, 0.588, 6.215, 0.886, 0.531, 3.494, 0.2, 4], [0.172374, -0.516999, 0.8]], [[0.906, -0.658, 3.163, 1.453, 1.529, 3.675, 0.2, 7], [-0.365644, -0.533183, 1.4]], [[-0.731, 0.764, 8.221, 1.247, 1.285, 0.666, 0.2, 4], [0.518969, 0.847763, 0.8]], [[0.057, 0.382, 14.705, 0.318, 0.962, 3.896, 0.2, 1], [0.125127, 0.260057, 0.2]], [[-0.772, 0.752, 2.823, 0.497, 1.621, 2.92, 0.1, 6], [0.065151, 1.550767, 0.6]], [[0.033, 0.153, 11.577, 0.971, 0.261, 3.633, 0.05, 2], [0.046706, 0.118752, 0.1]], [[-0.198, -0.028, 4.048, 0.079, 1.642, 1.588, 0.2, 8], [0.361524, -1.100738, 1.6]]], [[[0.96, 0.368, 6.136, 0.868, 0.713, 4.277, 0.1, 13], [-0.632372, -0.226167, 1.3]], [[0.113, -0.412, 13.151, 0.958, 1.195, 4.839, 0.2, 12], [-0.169026, -0.280606, 2.4]], [[0.33, 0.887, 2.568, 0.104, 0.752, 1.169, 0.2, 4], [0.797375, 0.086132, 0.8]], [[0.48, 0.991, 13.504, 0.938, 1.754, 1.99, 0.2, 8], [-0.112907, 0.598276, 1.6]], [[-0.595, 0.4, 14.047, 0.279, 0.316, 4.801, 0.05, 7], [-0.055358, 2.175528, 0.35]], [[-0.057, -0.526, 7.154, 1.328, 0.295, 1.971, 0.05, 11], [-0.128772, 0.203196, 0.55]], [[0.066, 0.743, 19.62, 0.364, 1.169, 2.555, 0.05, 9], [0.188006, -0.41408, 0.45]], [[-0.341, 0.921, 14.484, 0.78, 0.993, 4.954, 0.1, 11], [-0.092121, -0.961694, 1.1]]]]
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 fixtureActualExpectedOutcome
case 0[-0.178745, -0.292437, 0.15][-0.171504, -0.13078, 0.15]Failed
case 1[0.124671, 0.491936, 1.2][0.398036, 0.466803, 1.2]Failed
case 2[0.071706, -2.214018, 0.4][0.142181, -2.089598, 0.4]Failed
case 3[0.088064, 0.404267, 0.8][0.266847, 0.398844, 0.8]Failed
case 4[0.531021, -0.249351, 0.2][0.539279, -0.178827, 0.2]Failed
case 5[0.01085, -0.888473, 1.0][0.050911, -1.000788, 1.0]Failed
case 6[-0.492151, -0.939206, 0.6][-0.348659, -0.553321, 0.6]Failed
case 7[-0.516574, 0.371939, 1.0][-0.503739, -0.118324, 1.0]Failed

SHA-256 / 5f9ec3ba1deee96db19deb72a3b596f75ba163e8638c78c470c3f94f1989eeb2

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.sin(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.109, -0.682, 16.643, 0.151, 1.208, 3.199, 0.05, 3], [-0.171504, -0.13078, 0.15]], [[-0.584, -0.068, 3.984, 1.16, 1.256, 1.221, 0.2, 6], [0.398036, 0.466803, 1.2]], [[0.689, 0.052, 16.201, 1.057, 1.522, 3.299, 0.1, 4], [0.142181, -2.089598, 0.4]], [[-0.201, -0.275, 10.35, 0.615, 1.613, 1.945, 0.2, 4], [0.266847, 0.398844, 0.8]], [[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.488, -0.59, 18.046, 0.065, 1.27, 1.284, 0.2, 3], [-0.348659, -0.553321, 0.6]], [[0.604, -0.345, 10.339, 0.301, 1.167, 2.923, 0.2, 5], [-0.503739, -0.118324, 1.0]]], [[[-0.492, -0.144, 14.57, 1.424, 1.521, 1.605, 0.05, 3], [-0.421761, 1.012157, 0.15]], [[0.065, 0.375, 2.553, 0.664, 1.276, 4.564, 0.05, 7], [0.223112, 0.422278, 0.35]], [[0.836, -0.177, 4.422, 0.441, 0.853, 2.908, 0.2, 3], [0.32255, -1.356098, 0.6]], [[0.35, 0.024, 2.459, 0.489, 1.678, 3.184, 0.2, 2], [0.401172, 0.137673, 0.4]], [[-0.926, 0.952, 5.429, 0.55, 1.365, 4.948, 0.2, 1], [-0.633361, 1.884933, 0.2]], [[-0.417, 0.389, 9.943, 0.856, 1.643, 4.18, 0.2, 3], [0.231936, 0.708743, 0.6]], [[0.893, -0.338, 8.218, 0.106, 1.088, 1.181, 0.05, 7], [0.446933, -1.988356, 0.35]], [[0.195, 0.497, 1.02, 1.465, 1.928, 1.886, 0.2, 1], [0.311491, 0.651742, 0.2]]], [[[-0.571, 0.019, 10.668, 1.333, 0.813, 4.88, 0.1, 10], [0.238859, -0.217571, 1.0]], [[-0.893, 0.198, 5.986, 0.29, 0.849, 4.42, 0.05, 8], [-0.404311, 1.939625, 0.4]], [[-0.743, 0.606, 18.791, 0.354, 1.009, 2.833, 0.1, 3], [-0.053531, 3.257429, 0.3]], [[0.041, 0.318, 13.053, 1.284, 1.13, 3.854, 0.1, 10], [-0.108393, -0.480589, 1.0]], [[0.156, -0.808, 12.089, 0.635, 0.926, 3.013, 0.05, 7], [-0.092465, -0.474045, 0.35]], [[-0.187, -0.668, 4.72, 0.983, 1.179, 4.274, 0.1, 9], [-0.169823, 0.117475, 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.484, -0.908, 18.372, 0.481, 1.964, 2.315, 0.2, 2], [-0.051507, 2.343495, 0.4]], [[0.115, 0.588, 6.215, 0.886, 0.531, 3.494, 0.2, 4], [0.172374, -0.516999, 0.8]], [[0.906, -0.658, 3.163, 1.453, 1.529, 3.675, 0.2, 7], [-0.365644, -0.533183, 1.4]], [[-0.731, 0.764, 8.221, 1.247, 1.285, 0.666, 0.2, 4], [0.518969, 0.847763, 0.8]], [[0.057, 0.382, 14.705, 0.318, 0.962, 3.896, 0.2, 1], [0.125127, 0.260057, 0.2]], [[-0.772, 0.752, 2.823, 0.497, 1.621, 2.92, 0.1, 6], [0.065151, 1.550767, 0.6]], [[0.033, 0.153, 11.577, 0.971, 0.261, 3.633, 0.05, 2], [0.046706, 0.118752, 0.1]], [[-0.198, -0.028, 4.048, 0.079, 1.642, 1.588, 0.2, 8], [0.361524, -1.100738, 1.6]]], [[[0.96, 0.368, 6.136, 0.868, 0.713, 4.277, 0.1, 13], [-0.632372, -0.226167, 1.3]], [[0.113, -0.412, 13.151, 0.958, 1.195, 4.839, 0.2, 12], [-0.169026, -0.280606, 2.4]], [[0.33, 0.887, 2.568, 0.104, 0.752, 1.169, 0.2, 4], [0.797375, 0.086132, 0.8]], [[0.48, 0.991, 13.504, 0.938, 1.754, 1.99, 0.2, 8], [-0.112907, 0.598276, 1.6]], [[-0.595, 0.4, 14.047, 0.279, 0.316, 4.801, 0.05, 7], [-0.055358, 2.175528, 0.35]], [[-0.057, -0.526, 7.154, 1.328, 0.295, 1.971, 0.05, 11], [-0.128772, 0.203196, 0.55]], [[0.066, 0.743, 19.62, 0.364, 1.169, 2.555, 0.05, 9], [0.188006, -0.41408, 0.45]], [[-0.341, 0.921, 14.484, 0.78, 0.993, 4.954, 0.1, 11], [-0.092121, -0.961694, 1.1]]]]
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 fixtureActualExpectedOutcome
case 0[-0.182224, -0.251254, 0.15][-0.171504, -0.13078, 0.15]Failed
case 1[0.330561, 0.835347, 1.2][0.398036, 0.466803, 1.2]Failed
case 2[0.109214, -2.034082, 0.4][0.142181, -2.089598, 0.4]Failed
case 3[0.234308, 0.822863, 0.8][0.266847, 0.398844, 0.8]Failed
case 4[0.535548, -0.200422, 0.2][0.539279, -0.178827, 0.2]Failed
case 5[0.095299, -0.771764, 1.0][0.050911, -1.000788, 1.0]Failed
case 6[-0.425939, -0.515138, 0.6][-0.348659, -0.553321, 0.6]Failed
case 7[-0.341563, 0.432957, 1.0][-0.503739, -0.118324, 1.0]Failed

SHA-256 / a5acce2acaa4980ca7f595fe90333deb44d7f6e3f0c3e3e3bf7a4ba2e0776c88

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.109, -0.682, 16.643, 0.151, 1.208, 3.199, 0.05, 3], [-0.171504, -0.13078, 0.15]], [[-0.584, -0.068, 3.984, 1.16, 1.256, 1.221, 0.2, 6], [0.398036, 0.466803, 1.2]], [[0.689, 0.052, 16.201, 1.057, 1.522, 3.299, 0.1, 4], [0.142181, -2.089598, 0.4]], [[-0.201, -0.275, 10.35, 0.615, 1.613, 1.945, 0.2, 4], [0.266847, 0.398844, 0.8]], [[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.488, -0.59, 18.046, 0.065, 1.27, 1.284, 0.2, 3], [-0.348659, -0.553321, 0.6]], [[0.604, -0.345, 10.339, 0.301, 1.167, 2.923, 0.2, 5], [-0.503739, -0.118324, 1.0]]], [[[-0.492, -0.144, 14.57, 1.424, 1.521, 1.605, 0.05, 3], [-0.421761, 1.012157, 0.15]], [[0.065, 0.375, 2.553, 0.664, 1.276, 4.564, 0.05, 7], [0.223112, 0.422278, 0.35]], [[0.836, -0.177, 4.422, 0.441, 0.853, 2.908, 0.2, 3], [0.32255, -1.356098, 0.6]], [[0.35, 0.024, 2.459, 0.489, 1.678, 3.184, 0.2, 2], [0.401172, 0.137673, 0.4]], [[-0.926, 0.952, 5.429, 0.55, 1.365, 4.948, 0.2, 1], [-0.633361, 1.884933, 0.2]], [[-0.417, 0.389, 9.943, 0.856, 1.643, 4.18, 0.2, 3], [0.231936, 0.708743, 0.6]], [[0.893, -0.338, 8.218, 0.106, 1.088, 1.181, 0.05, 7], [0.446933, -1.988356, 0.35]], [[0.195, 0.497, 1.02, 1.465, 1.928, 1.886, 0.2, 1], [0.311491, 0.651742, 0.2]]], [[[-0.571, 0.019, 10.668, 1.333, 0.813, 4.88, 0.1, 10], [0.238859, -0.217571, 1.0]], [[-0.893, 0.198, 5.986, 0.29, 0.849, 4.42, 0.05, 8], [-0.404311, 1.939625, 0.4]], [[-0.743, 0.606, 18.791, 0.354, 1.009, 2.833, 0.1, 3], [-0.053531, 3.257429, 0.3]], [[0.041, 0.318, 13.053, 1.284, 1.13, 3.854, 0.1, 10], [-0.108393, -0.480589, 1.0]], [[0.156, -0.808, 12.089, 0.635, 0.926, 3.013, 0.05, 7], [-0.092465, -0.474045, 0.35]], [[-0.187, -0.668, 4.72, 0.983, 1.179, 4.274, 0.1, 9], [-0.169823, 0.117475, 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.484, -0.908, 18.372, 0.481, 1.964, 2.315, 0.2, 2], [-0.051507, 2.343495, 0.4]], [[0.115, 0.588, 6.215, 0.886, 0.531, 3.494, 0.2, 4], [0.172374, -0.516999, 0.8]], [[0.906, -0.658, 3.163, 1.453, 1.529, 3.675, 0.2, 7], [-0.365644, -0.533183, 1.4]], [[-0.731, 0.764, 8.221, 1.247, 1.285, 0.666, 0.2, 4], [0.518969, 0.847763, 0.8]], [[0.057, 0.382, 14.705, 0.318, 0.962, 3.896, 0.2, 1], [0.125127, 0.260057, 0.2]], [[-0.772, 0.752, 2.823, 0.497, 1.621, 2.92, 0.1, 6], [0.065151, 1.550767, 0.6]], [[0.033, 0.153, 11.577, 0.971, 0.261, 3.633, 0.05, 2], [0.046706, 0.118752, 0.1]], [[-0.198, -0.028, 4.048, 0.079, 1.642, 1.588, 0.2, 8], [0.361524, -1.100738, 1.6]]], [[[0.96, 0.368, 6.136, 0.868, 0.713, 4.277, 0.1, 13], [-0.632372, -0.226167, 1.3]], [[0.113, -0.412, 13.151, 0.958, 1.195, 4.839, 0.2, 12], [-0.169026, -0.280606, 2.4]], [[0.33, 0.887, 2.568, 0.104, 0.752, 1.169, 0.2, 4], [0.797375, 0.086132, 0.8]], [[0.48, 0.991, 13.504, 0.938, 1.754, 1.99, 0.2, 8], [-0.112907, 0.598276, 1.6]], [[-0.595, 0.4, 14.047, 0.279, 0.316, 4.801, 0.05, 7], [-0.055358, 2.175528, 0.35]], [[-0.057, -0.526, 7.154, 1.328, 0.295, 1.971, 0.05, 11], [-0.128772, 0.203196, 0.55]], [[0.066, 0.743, 19.62, 0.364, 1.169, 2.555, 0.05, 9], [0.188006, -0.41408, 0.45]], [[-0.341, 0.921, 14.484, 0.78, 0.993, 4.954, 0.1, 11], [-0.092121, -0.961694, 1.1]]]]
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 fixtureActualExpectedOutcome
case 0[-0.171504, -0.13078, 0.15][-0.171504, -0.13078, 0.15]Passed
case 1[0.398036, 0.466803, 1.2][0.398036, 0.466803, 1.2]Passed
case 2[0.142181, -2.089598, 0.4][0.142181, -2.089598, 0.4]Passed
case 3[0.266847, 0.398844, 0.8][0.266847, 0.398844, 0.8]Passed
case 4[0.539279, -0.178827, 0.2][0.539279, -0.178827, 0.2]Passed
case 5[0.050911, -1.000788, 1.0][0.050911, -1.000788, 1.0]Passed
case 6[-0.348659, -0.553321, 0.6][-0.348659, -0.553321, 0.6]Passed
case 7[-0.503739, -0.118324, 1.0][-0.503739, -0.118324, 1.0]Passed

SHA-256 / fd47370139edb7485c5c2b698c6b455f48940eb91e97a79fb89fa27dd5513ced

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:55.055891+00:00.

Case digest / b9cf9d781cfb7b60b26d3bd35686aecfbf2395d854b4f48d670882fae2793da7