FAILURE MAP
← Case archive

FA-87306 / Physics integrator stability / Open access

Crossing that lands exactly on a zero sample is missed · case 01

Sampled trajectories with exact zeros report missing periods.

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

ROOT CAUSE

The test requires b > 0 strictly.

VERIFIED REPAIR

A crossing ends at the first non-negative sample.

Unsuccessful approach: Also counting positive-to-zero samples adds downward touches.

Case contract

solve(xs, dt, omega): integrator frequency diagnostic. Upward crossings are samples with x[i-1]<0<=x[i], timed by linear interpolation. Period is the mean interval (last-first)/(count-1); relative error vs 2*pi/omega. Fewer than two crossings gives [None, count, None]. Return [period, count, error] 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(xs, dt, omega):
    ts = []
    for i in range(1, len(xs)):
        a, b = xs[i - 1], xs[i]
        if a < 0 < b:
            frac = -a / (b - a)
            ts.append((i - 1 + frac) * dt)
    if len(ts) < 2:
        return [None, len(ts), None]
    period = (ts[-1] - ts[0]) / (len(ts) - 1)
    ref = 2 * math.pi / omega
    return [round(period, 6), len(ts), round((period - ref) / ref, 6)]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[[1.0, 0.993, 0.975, 0.947, 0.91, 0.866, 0.814, 0.744, 0.684, 0.604, 0.519, 0.0, 0.323, 0.245, 0.144, 0.033, -0.078, -0.179, -0.284, -0.335, -0.436, -0.542, -0.623, -0.706, -0.747], 0.05, 1.984], [None, 0, None]], [[[-0.39, 0.0, 0.374, 0.65, 0.847, 0.882, 0.777, 0.597, 0.279, 0.008, -0.359, -0.539, -0.7, -0.723, -0.629, -0.458], 0.125, 3.136], [None, 1, None]], [[[0.939, 0.975, 0.882, 0.0, 0.367, 0.054, -0.24, -0.541, -0.725, -0.784, -0.763, -0.617, -0.445, -0.217, 0.142, 0.297, 0.546, 0.615, 0.635, 0.577, 0.381, 0.276, 0.016], 0.125, 2.926], [None, 1, None]], [[[0.24, -0.167, -0.533, 0.0, -0.963, -0.942, -0.767, -0.48, -0.111, 0.29], 0.125, 3.21], [0.659601, 2, -0.663018]], [[[0.947, 0.763, 0.488, 0.143, -0.251, -0.593, -0.845, -0.973, -0.992, -0.844, -0.617, -0.277, 0.09, 0.436, 0.738, 0.94, 0.994, 0.946, 0.691, 0.468, 0.118, -0.233, -0.656, -0.777, -0.969, -0.964, -0.869, -0.687, -0.238, 0.001, 0.284, 0.644, 0.935, 0.997, 0.905, 0.731, 0.617], 0.125, 2.921], [2.155131, 2, 0.001902]], [[[-0.506, 0.013, 0.526, 0.882, 0.974, 0.817, 0.392, -0.108, -0.585, -0.865, -0.923], 0.125, 4.269], [None, 1, None]], [[[-0.957, -0.879, -0.425, 0.174, 0.647, 0.778, 0.603, 0.141, -0.318, -0.568, -0.575, -0.294, 0.103, 0.378, 0.489, 0.38, 0.19, -0.111, -0.362, -0.386, -0.203, 0.028, 0.207, 0.314, 0.252, 0.141, -0.079, -0.195, -0.247, -0.19, 0.023], 0.25, 2.698], [2.265209, 4, -0.027319]], [[[0.192, 0.054, -0.081, -0.212, -0.334, -0.448, -0.564, -0.64, -0.721, -0.792, -0.843, -0.87, -0.879, 0.0, -0.861, -0.819, -0.783, -0.719, -0.649, -0.539, -0.449, -0.379, -0.217, -0.13, -0.025], 0.05, 2.708], [None, 1, None]]], [[[[-0.962, -0.875, -0.749, -0.588, -0.396, -0.205, 0.019, 0.209, 0.401, 0.583, 0.712, 0.83, 0.904, 0.936, 0.923, 0.851, 0.788, 0.646, 0.497, 0.251, 0.125, -0.139, -0.318, -0.472, -0.608, -0.702, -0.826], 0.1, 2.132], [None, 1, None]], [[[0.833, 0.587, 0.253, -0.107, -0.435, -0.725, -0.918, -1.0, -0.941, -0.758, -0.506, -0.16, 0.185, 0.493, 0.808, 0.969, 0.996, 0.917, 0.721, 0.334, 0.017, -0.252, -0.634, -0.831, -0.956, -0.988, -0.915, -0.721, -0.352, -0.084, 0.469, 0.0, 0.922], 0.25, 1.417], [4.422033, 2, -0.002732]], [[[0.37, 0.619, 0.814, 0.943, 0.999, 0.97, 0.874, 0.68, 0.445, 0.199, -0.112, -0.411, -0.627, -0.82, -0.956, -0.995, -0.97, -0.891, -0.688, -0.406, -0.137, 0.147, 0.434, 0.597, 0.829, 0.92, 0.997, 0.949, 0.852, 0.59, 0.425, 0.13, -0.051, -0.435, -0.654, -0.875], 0.1, 2.823], [None, 1, None]], [[[-0.864, -0.986, -0.957, -0.792, -0.502, -0.129, 0.0, 0.585], 0.1, 3.838], [None, 1, None]], [[[-1.0, 0.0, 1.0, 0.0, -1.0, 0.0, 1.0, 0.0, -1.0], 0.25, 3.14159], [1.0, 2, -0.5]], [[[0.907, 0.82, 0.716, 0.595, 0.463, 0.309, 0.175, 0.03, -0.135, -0.253, -0.384, -0.506, -0.632, -0.708, -0.763, -0.813, -0.837, -0.843, -0.822, -0.783, -0.74, -0.635], 0.05, 3.144], [None, 0, None]], [[[-0.671, 0.384, 0.997, 0.532, -0.541, -0.988, -0.211, 0.8, 0.938, 0.096, -0.863, -0.812, -0.028, 0.994, 0.728, -0.47, -0.999, -0.454, 0.59, 0.965, 0.507, -0.698, -0.866, 0.0, 0.938, 0.971, -0.436, -0.884], 0.25, 4.412], [1.397749, 5, -0.018513]], [[[1.0, 0.0, -1.0, 0.0, 1.0, 0.0, -1.0, 0.0, 1.0], 0.25, 3.14159], [1.0, 2, -0.5]]], [[[[-0.999, -0.944, -0.855, -0.737, -0.585, -0.43, -0.27, -0.079, 0.083, 0.251, 0.396, 0.493, 0.604, 0.657, 0.683, 0.687, 0.658, 0.606, 0.539, 0.437, 0.32], 0.125, 1.602], [None, 1, None]], [[[-0.835, -0.913, -0.966, -0.995, -0.999, -0.979, -0.932, -0.864, -0.769, -0.671, -0.515, -0.388, -0.242, -0.05, 0.071, 0.269, 0.389, 0.518, 0.667, 0.0, 0.861], 0.05, 3.147], [None, 1, None]], [[[-0.325, 0.016, 0.344, 0.628, 0.832, 0.953, 0.947, 0.844, 0.611, 0.325, 0.032, -0.241, -0.591, 0.0, -0.892, -0.901], 0.125, 2.705], [1.505865, 2, -0.351704]], [[[0.222, -0.828, -0.796, 0.22, 0.987, 0.477, -0.743, -0.924, -0.001, 0.0, 0.641], 0.25, 4.758], [1.554134, 2, 0.176882]], [[[-0.647, -0.966, -0.183, 0.816, 0.894, -0.01, -0.937, -0.69, 0.311, 0.985, 0.503, -0.552, -1.0, -0.116, 0.806, 0.903, -0.247, -0.803, -0.84, 0.066, 0.991, 0.325, -0.381, -0.989, -0.078, 0.0, 0.989], 0.25, 4.466], [1.426051, 5, 0.013617]], [[[0.395, 0.872, 0.925, 0.582, -0.055, -0.574, -0.849, -0.705, -0.29, 0.316, 0.674, 0.756, 0.481, -0.092, -0.43, -0.681, -0.565, -0.266, 0.299, 0.476, 0.606, 0.406, 0.034], 0.125, 5.467], [1.124031, 2, -0.02198]], [[[0.58, 0.087, -0.416, -0.797, -0.923, -0.782, -0.46, -0.024, 0.408, 0.757, 0.816, 0.649, 0.0, -0.079, -0.494, -0.653, -0.726, -0.525], 0.1, 5.284], [None, 1, None]], [[[0.028, -0.262, -0.513, -0.736, -0.881, -0.943, -0.926, -0.833], 0.05, 5.783], [None, 0, None]]], [[[[-0.605, -0.936, -0.973, -0.69, -0.234, 0.348, 0.811, 0.995, 0.9, 0.541, -0.114, -0.639, -0.918, -0.974, -0.655, -0.185, 0.0, 0.764, 1.0, 0.934, 0.425, 0.097, -0.518, -0.941, -0.963, -0.682, -0.323, 0.297, 0.773, 1.0, 0.949], 0.25, 2.24], [2.764863, 3, -0.014307]], [[[0.968, 0.677, -0.31, -0.942, -0.647, 0.378, 0.922, 0.608, -0.289, -0.89, -0.464, 0.0, 0.858], 0.25, 4.184], [1.592195, 2, 0.06025]], [[[0.269, -0.457, -0.935, -0.894, -0.358, 0.324, 0.847, 0.909, 0.475, -0.11, -0.715, -0.933, -0.643, -0.019, 0.725, 0.91, 0.701, 0.051, -0.671, -0.88, -0.776, -0.051, 0.325, 0.864], 0.125, 5.909], [1.038169, 3, -0.023657]], [[[0.989, 0.0, 0.877, 0.782, 0.653, 0.501, 0.362, 0.177, -0.001, -0.187], 0.05, 3.504], [None, 0, None]], [[[-0.577, -0.383, -0.169, 0.061, 0.295, 0.503, 0.664, 0.822, 0.921, 0.992, 0.999, 0.955, 0.886, 0.751, 0.549, 0.377, 0.177, -0.099, -0.299, -0.499, -0.696, -0.841, -0.95, -0.994, 0.0, -0.963, -0.872, -0.719, -0.621, -0.376], 0.125, 1.779], [2.658152, 2, -0.24738]], [[[1.0, 0.662, -0.107, -0.815, -0.973, -0.518, 0.309, 0.945, 0.923, 0.369], 0.25, 3.323], [None, 1, None]], [[[0.708, 0.504, 0.269, 0.016, -0.248, -0.497, -0.687, -0.852, -0.964, -1.0, -0.977, -0.875, -0.717, -0.493, -0.296, -0.003, 0.222, 0.493, 0.696, 0.853, 0.933, 1.0, 0.0, 0.898], 0.1, 2.564], [None, 1, None]], [[[1.0, 0.0, -1.0, 0.0, 1.0, 0.0, -1.0, 0.0, 1.0], 0.25, 3.14159], [1.0, 2, -0.5]]], [[[[0.952, 0.888, 0.801, 0.69, 0.558, 0.409, 0.0, 0.095, -0.059, -0.228, -0.415, -0.553, -0.681, -0.784, -0.89, -0.943, -0.993, -1.0, -0.985, -0.943, -0.866, -0.779, -0.638, -0.509, -0.401, -0.168], 0.05, 3.293], [None, 0, None]], [[[0.883, 0.471, -0.097, -0.625, -0.929, -0.935, -0.593, -0.109, 0.462, 0.84, 0.939, 0.7, 0.352, -0.231, -0.617, -0.887, 0.0, -0.497, 0.006, 0.386, 0.772, 0.874, 0.525, 0.312, -0.475, -0.783, -0.85, -0.745, -0.505, 0.159, 0.607, 0.748], 0.125, 4.611], [0.898735, 4, -0.340451]], [[[-0.246, -0.857, -0.926, -0.39, 0.337, 0.857, 0.82, 0.304, -0.411, -0.827, 0.0, -0.282, 0.545, 0.833, 0.722, 0.078, -0.454, -0.804, -0.558, 0.016], 0.25, 3.207], [1.286306, 4, -0.343457]], [[[0.119, -0.0, -0.116, -0.232, -0.347, -0.443, -0.555, -0.629, -0.718, -0.783, -0.847, -0.905, -0.934, -0.955, -0.965, -0.961, -0.939, -0.912, -0.876, -0.805, -0.75, -0.687, -0.596, -0.505, -0.366, -0.259, -0.201, -0.092], 0.05, 2.324], [None, 0, None]], [[[-0.074, -0.625, -0.916, -0.874, -0.533, -0.017, 0.521, 0.807, 0.773, 0.537, 0.084, -0.387, -0.708, -0.69, -0.42, -0.074, 0.35, 0.589, 0.635, 0.456, 0.05, -0.292, -0.548], 0.125, 4.852], [1.267866, 2, -0.020929]], [[[0.164, 0.484, 0.751, 0.915, 0.98, 0.917, 0.761, 0.502, 0.188, -0.109, -0.493, 0.0, -0.869, -0.937, -0.877, -0.729, -0.432, -0.19, 0.17, 0.376, 0.676, 0.852, 0.894, 0.853, 0.687, 0.463, 0.133, 0.002, -0.306, -0.664, -0.765], 0.1, 3.421], [0.652778, 2, -0.644583]], [[[-0.752, -0.957, -0.24, 0.72, 0.967, 0.329, -0.662, -0.985, -0.254, 0.591, 0.995, 0.503, -0.608, -0.984, -0.584, 0.392, 0.974, 0.668], 0.25, 4.059], [1.543545, 3, -0.002855]], [[[0.629, 0.911, 0.943, 0.724, 0.327, -0.083, -0.503, -0.764, -0.808, -0.65], 0.125, 4.086], [None, 0, None]]]]
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[None, 0, None][None, 0, None]Passed
case 1[None, 0, None][None, 1, None]Failed
case 2[None, 1, None][None, 1, None]Passed
case 3[None, 1, None][0.659601, 2, -0.663018]Failed
case 4[2.155131, 2, 0.001902][2.155131, 2, 0.001902]Passed
case 5[None, 1, None][None, 1, None]Passed
case 6[2.265209, 4, -0.027319][2.265209, 4, -0.027319]Passed
case 7[None, 0, None][None, 1, None]Failed

SHA-256 / 4aac48959cc146ef8e2495868ec26a8cbb266662f41e83bcbf08352d69a9e931

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(xs, dt, omega):
    ts = []
    for i in range(1, len(xs)):
        a, b = xs[i - 1], xs[i]
        if a < 0 <= b or (a > 0 and b == 0):
            frac = -a / (b - a)
            ts.append((i - 1 + frac) * dt)
    if len(ts) < 2:
        return [None, len(ts), None]
    period = (ts[-1] - ts[0]) / (len(ts) - 1)
    ref = 2 * math.pi / omega
    return [round(period, 6), len(ts), round((period - ref) / ref, 6)]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[[1.0, 0.993, 0.975, 0.947, 0.91, 0.866, 0.814, 0.744, 0.684, 0.604, 0.519, 0.0, 0.323, 0.245, 0.144, 0.033, -0.078, -0.179, -0.284, -0.335, -0.436, -0.542, -0.623, -0.706, -0.747], 0.05, 1.984], [None, 0, None]], [[[-0.39, 0.0, 0.374, 0.65, 0.847, 0.882, 0.777, 0.597, 0.279, 0.008, -0.359, -0.539, -0.7, -0.723, -0.629, -0.458], 0.125, 3.136], [None, 1, None]], [[[0.939, 0.975, 0.882, 0.0, 0.367, 0.054, -0.24, -0.541, -0.725, -0.784, -0.763, -0.617, -0.445, -0.217, 0.142, 0.297, 0.546, 0.615, 0.635, 0.577, 0.381, 0.276, 0.016], 0.125, 2.926], [None, 1, None]], [[[0.24, -0.167, -0.533, 0.0, -0.963, -0.942, -0.767, -0.48, -0.111, 0.29], 0.125, 3.21], [0.659601, 2, -0.663018]], [[[0.947, 0.763, 0.488, 0.143, -0.251, -0.593, -0.845, -0.973, -0.992, -0.844, -0.617, -0.277, 0.09, 0.436, 0.738, 0.94, 0.994, 0.946, 0.691, 0.468, 0.118, -0.233, -0.656, -0.777, -0.969, -0.964, -0.869, -0.687, -0.238, 0.001, 0.284, 0.644, 0.935, 0.997, 0.905, 0.731, 0.617], 0.125, 2.921], [2.155131, 2, 0.001902]], [[[-0.506, 0.013, 0.526, 0.882, 0.974, 0.817, 0.392, -0.108, -0.585, -0.865, -0.923], 0.125, 4.269], [None, 1, None]], [[[-0.957, -0.879, -0.425, 0.174, 0.647, 0.778, 0.603, 0.141, -0.318, -0.568, -0.575, -0.294, 0.103, 0.378, 0.489, 0.38, 0.19, -0.111, -0.362, -0.386, -0.203, 0.028, 0.207, 0.314, 0.252, 0.141, -0.079, -0.195, -0.247, -0.19, 0.023], 0.25, 2.698], [2.265209, 4, -0.027319]], [[[0.192, 0.054, -0.081, -0.212, -0.334, -0.448, -0.564, -0.64, -0.721, -0.792, -0.843, -0.87, -0.879, 0.0, -0.861, -0.819, -0.783, -0.719, -0.649, -0.539, -0.449, -0.379, -0.217, -0.13, -0.025], 0.05, 2.708], [None, 1, None]]], [[[[-0.962, -0.875, -0.749, -0.588, -0.396, -0.205, 0.019, 0.209, 0.401, 0.583, 0.712, 0.83, 0.904, 0.936, 0.923, 0.851, 0.788, 0.646, 0.497, 0.251, 0.125, -0.139, -0.318, -0.472, -0.608, -0.702, -0.826], 0.1, 2.132], [None, 1, None]], [[[0.833, 0.587, 0.253, -0.107, -0.435, -0.725, -0.918, -1.0, -0.941, -0.758, -0.506, -0.16, 0.185, 0.493, 0.808, 0.969, 0.996, 0.917, 0.721, 0.334, 0.017, -0.252, -0.634, -0.831, -0.956, -0.988, -0.915, -0.721, -0.352, -0.084, 0.469, 0.0, 0.922], 0.25, 1.417], [4.422033, 2, -0.002732]], [[[0.37, 0.619, 0.814, 0.943, 0.999, 0.97, 0.874, 0.68, 0.445, 0.199, -0.112, -0.411, -0.627, -0.82, -0.956, -0.995, -0.97, -0.891, -0.688, -0.406, -0.137, 0.147, 0.434, 0.597, 0.829, 0.92, 0.997, 0.949, 0.852, 0.59, 0.425, 0.13, -0.051, -0.435, -0.654, -0.875], 0.1, 2.823], [None, 1, None]], [[[-0.864, -0.986, -0.957, -0.792, -0.502, -0.129, 0.0, 0.585], 0.1, 3.838], [None, 1, None]], [[[-1.0, 0.0, 1.0, 0.0, -1.0, 0.0, 1.0, 0.0, -1.0], 0.25, 3.14159], [1.0, 2, -0.5]], [[[0.907, 0.82, 0.716, 0.595, 0.463, 0.309, 0.175, 0.03, -0.135, -0.253, -0.384, -0.506, -0.632, -0.708, -0.763, -0.813, -0.837, -0.843, -0.822, -0.783, -0.74, -0.635], 0.05, 3.144], [None, 0, None]], [[[-0.671, 0.384, 0.997, 0.532, -0.541, -0.988, -0.211, 0.8, 0.938, 0.096, -0.863, -0.812, -0.028, 0.994, 0.728, -0.47, -0.999, -0.454, 0.59, 0.965, 0.507, -0.698, -0.866, 0.0, 0.938, 0.971, -0.436, -0.884], 0.25, 4.412], [1.397749, 5, -0.018513]], [[[1.0, 0.0, -1.0, 0.0, 1.0, 0.0, -1.0, 0.0, 1.0], 0.25, 3.14159], [1.0, 2, -0.5]]], [[[[-0.999, -0.944, -0.855, -0.737, -0.585, -0.43, -0.27, -0.079, 0.083, 0.251, 0.396, 0.493, 0.604, 0.657, 0.683, 0.687, 0.658, 0.606, 0.539, 0.437, 0.32], 0.125, 1.602], [None, 1, None]], [[[-0.835, -0.913, -0.966, -0.995, -0.999, -0.979, -0.932, -0.864, -0.769, -0.671, -0.515, -0.388, -0.242, -0.05, 0.071, 0.269, 0.389, 0.518, 0.667, 0.0, 0.861], 0.05, 3.147], [None, 1, None]], [[[-0.325, 0.016, 0.344, 0.628, 0.832, 0.953, 0.947, 0.844, 0.611, 0.325, 0.032, -0.241, -0.591, 0.0, -0.892, -0.901], 0.125, 2.705], [1.505865, 2, -0.351704]], [[[0.222, -0.828, -0.796, 0.22, 0.987, 0.477, -0.743, -0.924, -0.001, 0.0, 0.641], 0.25, 4.758], [1.554134, 2, 0.176882]], [[[-0.647, -0.966, -0.183, 0.816, 0.894, -0.01, -0.937, -0.69, 0.311, 0.985, 0.503, -0.552, -1.0, -0.116, 0.806, 0.903, -0.247, -0.803, -0.84, 0.066, 0.991, 0.325, -0.381, -0.989, -0.078, 0.0, 0.989], 0.25, 4.466], [1.426051, 5, 0.013617]], [[[0.395, 0.872, 0.925, 0.582, -0.055, -0.574, -0.849, -0.705, -0.29, 0.316, 0.674, 0.756, 0.481, -0.092, -0.43, -0.681, -0.565, -0.266, 0.299, 0.476, 0.606, 0.406, 0.034], 0.125, 5.467], [1.124031, 2, -0.02198]], [[[0.58, 0.087, -0.416, -0.797, -0.923, -0.782, -0.46, -0.024, 0.408, 0.757, 0.816, 0.649, 0.0, -0.079, -0.494, -0.653, -0.726, -0.525], 0.1, 5.284], [None, 1, None]], [[[0.028, -0.262, -0.513, -0.736, -0.881, -0.943, -0.926, -0.833], 0.05, 5.783], [None, 0, None]]], [[[[-0.605, -0.936, -0.973, -0.69, -0.234, 0.348, 0.811, 0.995, 0.9, 0.541, -0.114, -0.639, -0.918, -0.974, -0.655, -0.185, 0.0, 0.764, 1.0, 0.934, 0.425, 0.097, -0.518, -0.941, -0.963, -0.682, -0.323, 0.297, 0.773, 1.0, 0.949], 0.25, 2.24], [2.764863, 3, -0.014307]], [[[0.968, 0.677, -0.31, -0.942, -0.647, 0.378, 0.922, 0.608, -0.289, -0.89, -0.464, 0.0, 0.858], 0.25, 4.184], [1.592195, 2, 0.06025]], [[[0.269, -0.457, -0.935, -0.894, -0.358, 0.324, 0.847, 0.909, 0.475, -0.11, -0.715, -0.933, -0.643, -0.019, 0.725, 0.91, 0.701, 0.051, -0.671, -0.88, -0.776, -0.051, 0.325, 0.864], 0.125, 5.909], [1.038169, 3, -0.023657]], [[[0.989, 0.0, 0.877, 0.782, 0.653, 0.501, 0.362, 0.177, -0.001, -0.187], 0.05, 3.504], [None, 0, None]], [[[-0.577, -0.383, -0.169, 0.061, 0.295, 0.503, 0.664, 0.822, 0.921, 0.992, 0.999, 0.955, 0.886, 0.751, 0.549, 0.377, 0.177, -0.099, -0.299, -0.499, -0.696, -0.841, -0.95, -0.994, 0.0, -0.963, -0.872, -0.719, -0.621, -0.376], 0.125, 1.779], [2.658152, 2, -0.24738]], [[[1.0, 0.662, -0.107, -0.815, -0.973, -0.518, 0.309, 0.945, 0.923, 0.369], 0.25, 3.323], [None, 1, None]], [[[0.708, 0.504, 0.269, 0.016, -0.248, -0.497, -0.687, -0.852, -0.964, -1.0, -0.977, -0.875, -0.717, -0.493, -0.296, -0.003, 0.222, 0.493, 0.696, 0.853, 0.933, 1.0, 0.0, 0.898], 0.1, 2.564], [None, 1, None]], [[[1.0, 0.0, -1.0, 0.0, 1.0, 0.0, -1.0, 0.0, 1.0], 0.25, 3.14159], [1.0, 2, -0.5]]], [[[[0.952, 0.888, 0.801, 0.69, 0.558, 0.409, 0.0, 0.095, -0.059, -0.228, -0.415, -0.553, -0.681, -0.784, -0.89, -0.943, -0.993, -1.0, -0.985, -0.943, -0.866, -0.779, -0.638, -0.509, -0.401, -0.168], 0.05, 3.293], [None, 0, None]], [[[0.883, 0.471, -0.097, -0.625, -0.929, -0.935, -0.593, -0.109, 0.462, 0.84, 0.939, 0.7, 0.352, -0.231, -0.617, -0.887, 0.0, -0.497, 0.006, 0.386, 0.772, 0.874, 0.525, 0.312, -0.475, -0.783, -0.85, -0.745, -0.505, 0.159, 0.607, 0.748], 0.125, 4.611], [0.898735, 4, -0.340451]], [[[-0.246, -0.857, -0.926, -0.39, 0.337, 0.857, 0.82, 0.304, -0.411, -0.827, 0.0, -0.282, 0.545, 0.833, 0.722, 0.078, -0.454, -0.804, -0.558, 0.016], 0.25, 3.207], [1.286306, 4, -0.343457]], [[[0.119, -0.0, -0.116, -0.232, -0.347, -0.443, -0.555, -0.629, -0.718, -0.783, -0.847, -0.905, -0.934, -0.955, -0.965, -0.961, -0.939, -0.912, -0.876, -0.805, -0.75, -0.687, -0.596, -0.505, -0.366, -0.259, -0.201, -0.092], 0.05, 2.324], [None, 0, None]], [[[-0.074, -0.625, -0.916, -0.874, -0.533, -0.017, 0.521, 0.807, 0.773, 0.537, 0.084, -0.387, -0.708, -0.69, -0.42, -0.074, 0.35, 0.589, 0.635, 0.456, 0.05, -0.292, -0.548], 0.125, 4.852], [1.267866, 2, -0.020929]], [[[0.164, 0.484, 0.751, 0.915, 0.98, 0.917, 0.761, 0.502, 0.188, -0.109, -0.493, 0.0, -0.869, -0.937, -0.877, -0.729, -0.432, -0.19, 0.17, 0.376, 0.676, 0.852, 0.894, 0.853, 0.687, 0.463, 0.133, 0.002, -0.306, -0.664, -0.765], 0.1, 3.421], [0.652778, 2, -0.644583]], [[[-0.752, -0.957, -0.24, 0.72, 0.967, 0.329, -0.662, -0.985, -0.254, 0.591, 0.995, 0.503, -0.608, -0.984, -0.584, 0.392, 0.974, 0.668], 0.25, 4.059], [1.543545, 3, -0.002855]], [[[0.629, 0.911, 0.943, 0.724, 0.327, -0.083, -0.503, -0.764, -0.808, -0.65], 0.125, 4.086], [None, 0, None]]]]
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[None, 1, None][None, 0, None]Failed
case 1[None, 1, None][None, 1, None]Passed
case 2[1.325557, 2, -0.382705][None, 1, None]Failed
case 3[0.659601, 2, -0.663018][0.659601, 2, -0.663018]Passed
case 4[2.155131, 2, 0.001902][2.155131, 2, 0.001902]Passed
case 5[None, 1, None][None, 1, None]Passed
case 6[2.265209, 4, -0.027319][2.265209, 4, -0.027319]Passed
case 7[None, 1, None][None, 1, None]Passed

SHA-256 / 6c84fd67b2ee6e106d7e49f7f5ca627d8249f057978b796b4bfe35101c4f9a63

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(xs, dt, omega):
    ts = []
    for i in range(1, len(xs)):
        a, b = xs[i - 1], xs[i]
        if a < 0 <= b:
            frac = -a / (b - a)
            ts.append((i - 1 + frac) * dt)
    if len(ts) < 2:
        return [None, len(ts), None]
    period = (ts[-1] - ts[0]) / (len(ts) - 1)
    ref = 2 * math.pi / omega
    return [round(period, 6), len(ts), round((period - ref) / ref, 6)]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[[1.0, 0.993, 0.975, 0.947, 0.91, 0.866, 0.814, 0.744, 0.684, 0.604, 0.519, 0.0, 0.323, 0.245, 0.144, 0.033, -0.078, -0.179, -0.284, -0.335, -0.436, -0.542, -0.623, -0.706, -0.747], 0.05, 1.984], [None, 0, None]], [[[-0.39, 0.0, 0.374, 0.65, 0.847, 0.882, 0.777, 0.597, 0.279, 0.008, -0.359, -0.539, -0.7, -0.723, -0.629, -0.458], 0.125, 3.136], [None, 1, None]], [[[0.939, 0.975, 0.882, 0.0, 0.367, 0.054, -0.24, -0.541, -0.725, -0.784, -0.763, -0.617, -0.445, -0.217, 0.142, 0.297, 0.546, 0.615, 0.635, 0.577, 0.381, 0.276, 0.016], 0.125, 2.926], [None, 1, None]], [[[0.24, -0.167, -0.533, 0.0, -0.963, -0.942, -0.767, -0.48, -0.111, 0.29], 0.125, 3.21], [0.659601, 2, -0.663018]], [[[0.947, 0.763, 0.488, 0.143, -0.251, -0.593, -0.845, -0.973, -0.992, -0.844, -0.617, -0.277, 0.09, 0.436, 0.738, 0.94, 0.994, 0.946, 0.691, 0.468, 0.118, -0.233, -0.656, -0.777, -0.969, -0.964, -0.869, -0.687, -0.238, 0.001, 0.284, 0.644, 0.935, 0.997, 0.905, 0.731, 0.617], 0.125, 2.921], [2.155131, 2, 0.001902]], [[[-0.506, 0.013, 0.526, 0.882, 0.974, 0.817, 0.392, -0.108, -0.585, -0.865, -0.923], 0.125, 4.269], [None, 1, None]], [[[-0.957, -0.879, -0.425, 0.174, 0.647, 0.778, 0.603, 0.141, -0.318, -0.568, -0.575, -0.294, 0.103, 0.378, 0.489, 0.38, 0.19, -0.111, -0.362, -0.386, -0.203, 0.028, 0.207, 0.314, 0.252, 0.141, -0.079, -0.195, -0.247, -0.19, 0.023], 0.25, 2.698], [2.265209, 4, -0.027319]], [[[0.192, 0.054, -0.081, -0.212, -0.334, -0.448, -0.564, -0.64, -0.721, -0.792, -0.843, -0.87, -0.879, 0.0, -0.861, -0.819, -0.783, -0.719, -0.649, -0.539, -0.449, -0.379, -0.217, -0.13, -0.025], 0.05, 2.708], [None, 1, None]]], [[[[-0.962, -0.875, -0.749, -0.588, -0.396, -0.205, 0.019, 0.209, 0.401, 0.583, 0.712, 0.83, 0.904, 0.936, 0.923, 0.851, 0.788, 0.646, 0.497, 0.251, 0.125, -0.139, -0.318, -0.472, -0.608, -0.702, -0.826], 0.1, 2.132], [None, 1, None]], [[[0.833, 0.587, 0.253, -0.107, -0.435, -0.725, -0.918, -1.0, -0.941, -0.758, -0.506, -0.16, 0.185, 0.493, 0.808, 0.969, 0.996, 0.917, 0.721, 0.334, 0.017, -0.252, -0.634, -0.831, -0.956, -0.988, -0.915, -0.721, -0.352, -0.084, 0.469, 0.0, 0.922], 0.25, 1.417], [4.422033, 2, -0.002732]], [[[0.37, 0.619, 0.814, 0.943, 0.999, 0.97, 0.874, 0.68, 0.445, 0.199, -0.112, -0.411, -0.627, -0.82, -0.956, -0.995, -0.97, -0.891, -0.688, -0.406, -0.137, 0.147, 0.434, 0.597, 0.829, 0.92, 0.997, 0.949, 0.852, 0.59, 0.425, 0.13, -0.051, -0.435, -0.654, -0.875], 0.1, 2.823], [None, 1, None]], [[[-0.864, -0.986, -0.957, -0.792, -0.502, -0.129, 0.0, 0.585], 0.1, 3.838], [None, 1, None]], [[[-1.0, 0.0, 1.0, 0.0, -1.0, 0.0, 1.0, 0.0, -1.0], 0.25, 3.14159], [1.0, 2, -0.5]], [[[0.907, 0.82, 0.716, 0.595, 0.463, 0.309, 0.175, 0.03, -0.135, -0.253, -0.384, -0.506, -0.632, -0.708, -0.763, -0.813, -0.837, -0.843, -0.822, -0.783, -0.74, -0.635], 0.05, 3.144], [None, 0, None]], [[[-0.671, 0.384, 0.997, 0.532, -0.541, -0.988, -0.211, 0.8, 0.938, 0.096, -0.863, -0.812, -0.028, 0.994, 0.728, -0.47, -0.999, -0.454, 0.59, 0.965, 0.507, -0.698, -0.866, 0.0, 0.938, 0.971, -0.436, -0.884], 0.25, 4.412], [1.397749, 5, -0.018513]], [[[1.0, 0.0, -1.0, 0.0, 1.0, 0.0, -1.0, 0.0, 1.0], 0.25, 3.14159], [1.0, 2, -0.5]]], [[[[-0.999, -0.944, -0.855, -0.737, -0.585, -0.43, -0.27, -0.079, 0.083, 0.251, 0.396, 0.493, 0.604, 0.657, 0.683, 0.687, 0.658, 0.606, 0.539, 0.437, 0.32], 0.125, 1.602], [None, 1, None]], [[[-0.835, -0.913, -0.966, -0.995, -0.999, -0.979, -0.932, -0.864, -0.769, -0.671, -0.515, -0.388, -0.242, -0.05, 0.071, 0.269, 0.389, 0.518, 0.667, 0.0, 0.861], 0.05, 3.147], [None, 1, None]], [[[-0.325, 0.016, 0.344, 0.628, 0.832, 0.953, 0.947, 0.844, 0.611, 0.325, 0.032, -0.241, -0.591, 0.0, -0.892, -0.901], 0.125, 2.705], [1.505865, 2, -0.351704]], [[[0.222, -0.828, -0.796, 0.22, 0.987, 0.477, -0.743, -0.924, -0.001, 0.0, 0.641], 0.25, 4.758], [1.554134, 2, 0.176882]], [[[-0.647, -0.966, -0.183, 0.816, 0.894, -0.01, -0.937, -0.69, 0.311, 0.985, 0.503, -0.552, -1.0, -0.116, 0.806, 0.903, -0.247, -0.803, -0.84, 0.066, 0.991, 0.325, -0.381, -0.989, -0.078, 0.0, 0.989], 0.25, 4.466], [1.426051, 5, 0.013617]], [[[0.395, 0.872, 0.925, 0.582, -0.055, -0.574, -0.849, -0.705, -0.29, 0.316, 0.674, 0.756, 0.481, -0.092, -0.43, -0.681, -0.565, -0.266, 0.299, 0.476, 0.606, 0.406, 0.034], 0.125, 5.467], [1.124031, 2, -0.02198]], [[[0.58, 0.087, -0.416, -0.797, -0.923, -0.782, -0.46, -0.024, 0.408, 0.757, 0.816, 0.649, 0.0, -0.079, -0.494, -0.653, -0.726, -0.525], 0.1, 5.284], [None, 1, None]], [[[0.028, -0.262, -0.513, -0.736, -0.881, -0.943, -0.926, -0.833], 0.05, 5.783], [None, 0, None]]], [[[[-0.605, -0.936, -0.973, -0.69, -0.234, 0.348, 0.811, 0.995, 0.9, 0.541, -0.114, -0.639, -0.918, -0.974, -0.655, -0.185, 0.0, 0.764, 1.0, 0.934, 0.425, 0.097, -0.518, -0.941, -0.963, -0.682, -0.323, 0.297, 0.773, 1.0, 0.949], 0.25, 2.24], [2.764863, 3, -0.014307]], [[[0.968, 0.677, -0.31, -0.942, -0.647, 0.378, 0.922, 0.608, -0.289, -0.89, -0.464, 0.0, 0.858], 0.25, 4.184], [1.592195, 2, 0.06025]], [[[0.269, -0.457, -0.935, -0.894, -0.358, 0.324, 0.847, 0.909, 0.475, -0.11, -0.715, -0.933, -0.643, -0.019, 0.725, 0.91, 0.701, 0.051, -0.671, -0.88, -0.776, -0.051, 0.325, 0.864], 0.125, 5.909], [1.038169, 3, -0.023657]], [[[0.989, 0.0, 0.877, 0.782, 0.653, 0.501, 0.362, 0.177, -0.001, -0.187], 0.05, 3.504], [None, 0, None]], [[[-0.577, -0.383, -0.169, 0.061, 0.295, 0.503, 0.664, 0.822, 0.921, 0.992, 0.999, 0.955, 0.886, 0.751, 0.549, 0.377, 0.177, -0.099, -0.299, -0.499, -0.696, -0.841, -0.95, -0.994, 0.0, -0.963, -0.872, -0.719, -0.621, -0.376], 0.125, 1.779], [2.658152, 2, -0.24738]], [[[1.0, 0.662, -0.107, -0.815, -0.973, -0.518, 0.309, 0.945, 0.923, 0.369], 0.25, 3.323], [None, 1, None]], [[[0.708, 0.504, 0.269, 0.016, -0.248, -0.497, -0.687, -0.852, -0.964, -1.0, -0.977, -0.875, -0.717, -0.493, -0.296, -0.003, 0.222, 0.493, 0.696, 0.853, 0.933, 1.0, 0.0, 0.898], 0.1, 2.564], [None, 1, None]], [[[1.0, 0.0, -1.0, 0.0, 1.0, 0.0, -1.0, 0.0, 1.0], 0.25, 3.14159], [1.0, 2, -0.5]]], [[[[0.952, 0.888, 0.801, 0.69, 0.558, 0.409, 0.0, 0.095, -0.059, -0.228, -0.415, -0.553, -0.681, -0.784, -0.89, -0.943, -0.993, -1.0, -0.985, -0.943, -0.866, -0.779, -0.638, -0.509, -0.401, -0.168], 0.05, 3.293], [None, 0, None]], [[[0.883, 0.471, -0.097, -0.625, -0.929, -0.935, -0.593, -0.109, 0.462, 0.84, 0.939, 0.7, 0.352, -0.231, -0.617, -0.887, 0.0, -0.497, 0.006, 0.386, 0.772, 0.874, 0.525, 0.312, -0.475, -0.783, -0.85, -0.745, -0.505, 0.159, 0.607, 0.748], 0.125, 4.611], [0.898735, 4, -0.340451]], [[[-0.246, -0.857, -0.926, -0.39, 0.337, 0.857, 0.82, 0.304, -0.411, -0.827, 0.0, -0.282, 0.545, 0.833, 0.722, 0.078, -0.454, -0.804, -0.558, 0.016], 0.25, 3.207], [1.286306, 4, -0.343457]], [[[0.119, -0.0, -0.116, -0.232, -0.347, -0.443, -0.555, -0.629, -0.718, -0.783, -0.847, -0.905, -0.934, -0.955, -0.965, -0.961, -0.939, -0.912, -0.876, -0.805, -0.75, -0.687, -0.596, -0.505, -0.366, -0.259, -0.201, -0.092], 0.05, 2.324], [None, 0, None]], [[[-0.074, -0.625, -0.916, -0.874, -0.533, -0.017, 0.521, 0.807, 0.773, 0.537, 0.084, -0.387, -0.708, -0.69, -0.42, -0.074, 0.35, 0.589, 0.635, 0.456, 0.05, -0.292, -0.548], 0.125, 4.852], [1.267866, 2, -0.020929]], [[[0.164, 0.484, 0.751, 0.915, 0.98, 0.917, 0.761, 0.502, 0.188, -0.109, -0.493, 0.0, -0.869, -0.937, -0.877, -0.729, -0.432, -0.19, 0.17, 0.376, 0.676, 0.852, 0.894, 0.853, 0.687, 0.463, 0.133, 0.002, -0.306, -0.664, -0.765], 0.1, 3.421], [0.652778, 2, -0.644583]], [[[-0.752, -0.957, -0.24, 0.72, 0.967, 0.329, -0.662, -0.985, -0.254, 0.591, 0.995, 0.503, -0.608, -0.984, -0.584, 0.392, 0.974, 0.668], 0.25, 4.059], [1.543545, 3, -0.002855]], [[[0.629, 0.911, 0.943, 0.724, 0.327, -0.083, -0.503, -0.764, -0.808, -0.65], 0.125, 4.086], [None, 0, None]]]]
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[None, 0, None][None, 0, None]Passed
case 1[None, 1, None][None, 1, None]Passed
case 2[None, 1, None][None, 1, None]Passed
case 3[0.659601, 2, -0.663018][0.659601, 2, -0.663018]Passed
case 4[2.155131, 2, 0.001902][2.155131, 2, 0.001902]Passed
case 5[None, 1, None][None, 1, None]Passed
case 6[2.265209, 4, -0.027319][2.265209, 4, -0.027319]Passed
case 7[None, 1, None][None, 1, None]Passed

SHA-256 / 91551b87550d005f15690ed53c24feb156a0c35d8ffe3daf16096b69a83c2871

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

Case digest / 3423d0f1b40f27509525c7a9b66b0d363db7b755af8b8f276cf411e49734f6c7