FAILURE MAP
← Case archive

FA-69561 / Orbital propagation / Open access

Velocity Verlet two-body propagation: Final energy uses the initial radius · case 01

Energy diagnostics hide integration drift because the potential never changes.

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

ROOT CAUSE

The potential term is evaluated at r0 instead of the propagated position.

VERIFIED REPAIR

Evaluate the potential at the final position.

Unsuccessful approach: Averaging the initial and final radii still mixes epochs.

Case contract

Input [r0, v0, mu, T, steps]; planar two-body. Velocity Verlet with h=T/steps: p += h v + h^2 a/2; a_new = a(p); v += h (a + a_new)/2; carry a_new. Return final [x,y,vx,vy] rounded to 6 plus specific energy v^2/2-mu/|r| rounded to 6.

Why this case matters

Orbit determination and mission planning chain many small conversions; one wrong branch or unit silently moves a spacecraft by kilometres.

1 / The failure

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(x):
    r0,v0,mu,T,steps=x
    h=T/steps
    def acc(q):
        rr=(q[0]**2+q[1]**2)**1.5
        return [-mu*q[0]/rr,-mu*q[1]/rr]
    p=list(r0); v=list(v0)
    a=acc(p)
    for _ in range(steps):
        p=[p[i]+h*v[i]+0.5*h*h*a[i] for i in range(2)]
        an=acc(p)
        v=[v[i]+0.5*h*(a[i]+an[i]) for i in range(2)]
        a=an
    en=(v[0]**2+v[1]**2)/2-mu/math.sqrt(r0[0]**2+r0[1]**2)
    return [round(c,6) for c in p+v]+[round(en,6)]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 7.546], 398600.4418, 600.0, 12]', [[7000.0, 0.0], [0.0, 7.546], 398600.4418, 600.0, 12], [5585.861325, 4220.456543, -4.545757, 6.021781, -28.471856]), ('velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 8.5], 398600.4418, 900.0, 20]', [[7000.0, 0.0], [0.0, 8.5], 398600.4418, 900.0, 20], [4100.742247, 6612.678063, -5.690094, 5.333971, -20.813351]), ('velocity verlet two-body propagation [[0.0, 9000.0], [-6.2, 0.8], 398600.4418, 1200.0, 15]', [[0.0, 9000.0], [-6.2, 0.8], 398600.4418, 1200.0, 15], [-6596.602558, 6758.244077, -4.170275, -4.186438, -24.748038]), ('velocity verlet two-body propagation [[1.0, 0.0], [0.0, 1.0], 1.0, 3.0, 30]', [[1.0, 0.0], [0.0, 1.0], 1.0, 3.0, 30], [-0.993552, 0.151005, -0.14987, -0.983712, -0.499988]), ('velocity verlet two-body propagation [[1.0, 0.0], [0.0, 1.2], 1.0, 5.0, 25]', [[1.0, 0.0], [0.0, 1.2], 1.0, 5.0, 25], [-2.100327, 1.143517, -0.394254, -0.35669, -0.276826]), ('velocity verlet two-body propagation [[-1.5, 0.5], [0.1, -0.7], 1.0, 2.0, 10]', [[-1.5, 0.5], [0.1, -0.7], 1.0, 2.0, 10], [-0.160223, -0.731051, 1.375248, 0.033556, -0.389962]), ('velocity verlet two-body propagation [[6800.0, 1200.0], [-1.1, 7.4], 398600.4418, 300.0, 6]', [[6800.0, 1200.0], [-1.1, 7.4], 398600.4418, 300.0, 6], [6111.297912, 3317.130164, -3.439136, 6.583207, -29.740489])], [('velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 8.5], 398600.4418, 900.0, 20]', [[7000.0, 0.0], [0.0, 8.5], 398600.4418, 900.0, 20], [4100.742247, 6612.678063, -5.690094, 5.333971, -20.813351]), ('velocity verlet two-body propagation [[1.0, 0.0], [0.0, 1.0], 1.0, 3.0, 30]', [[1.0, 0.0], [0.0, 1.0], 1.0, 3.0, 30], [-0.993552, 0.151005, -0.14987, -0.983712, -0.499988]), ('velocity verlet two-body propagation [[1.0, 0.0], [0.0, 1.2], 1.0, 5.0, 25]', [[1.0, 0.0], [0.0, 1.2], 1.0, 5.0, 25], [-2.100327, 1.143517, -0.394254, -0.35669, -0.276826]), ('velocity verlet two-body propagation [[-1.5, 0.5], [0.1, -0.7], 1.0, 2.0, 10]', [[-1.5, 0.5], [0.1, -0.7], 1.0, 2.0, 10], [-0.160223, -0.731051, 1.375248, 0.033556, -0.389962]), ('velocity verlet two-body propagation [[6800.0, 1200.0], [-1.1, 7.4], 398600.4418, 300.0, 6]', [[6800.0, 1200.0], [-1.1, 7.4], 398600.4418, 300.0, 6], [6111.297912, 3317.130164, -3.439136, 6.583207, -29.740489]), ('velocity verlet two-body propagation [[2.0, 0.0], [0.0, 0.5], 1.0, 4.0, 8]', [[2.0, 0.0], [0.0, 0.5], 1.0, 4.0, 8], [-0.104683, 0.976244, -0.959856, -0.601306, -0.377049]), ('velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 7.546], 398600.4418, 600.0, 12]', [[7000.0, 0.0], [0.0, 7.546], 398600.4418, 600.0, 12], [5585.861325, 4220.456543, -4.545757, 6.021781, -28.471856])], [('velocity verlet two-body propagation [[0.0, 9000.0], [-6.2, 0.8], 398600.4418, 1200.0, 15]', [[0.0, 9000.0], [-6.2, 0.8], 398600.4418, 1200.0, 15], [-6596.602558, 6758.244077, -4.170275, -4.186438, -24.748038]), ('velocity verlet two-body propagation [[6800.0, 1200.0], [-1.1, 7.4], 398600.4418, 300.0, 6]', [[6800.0, 1200.0], [-1.1, 7.4], 398600.4418, 300.0, 6], [6111.297912, 3317.130164, -3.439136, 6.583207, -29.740489]), ('velocity verlet two-body propagation [[2.0, 0.0], [0.0, 0.5], 1.0, 4.0, 8]', [[2.0, 0.0], [0.0, 0.5], 1.0, 4.0, 8], [-0.104683, 0.976244, -0.959856, -0.601306, -0.377049]), ('velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 7.546], 398600.4418, 600.0, 12]', [[7000.0, 0.0], [0.0, 7.546], 398600.4418, 600.0, 12], [5585.861325, 4220.456543, -4.545757, 6.021781, -28.471856]), ('velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 8.5], 398600.4418, 900.0, 20]', [[7000.0, 0.0], [0.0, 8.5], 398600.4418, 900.0, 20], [4100.742247, 6612.678063, -5.690094, 5.333971, -20.813351]), ('velocity verlet two-body propagation [[1.0, 0.0], [0.0, 1.0], 1.0, 3.0, 30]', [[1.0, 0.0], [0.0, 1.0], 1.0, 3.0, 30], [-0.993552, 0.151005, -0.14987, -0.983712, -0.499988]), ('velocity verlet two-body propagation [[1.0, 0.0], [0.0, 1.2], 1.0, 5.0, 25]', [[1.0, 0.0], [0.0, 1.2], 1.0, 5.0, 25], [-2.100327, 1.143517, -0.394254, -0.35669, -0.276826])], [('velocity verlet two-body propagation [[1.0, 0.0], [0.0, 1.0], 1.0, 3.0, 30]', [[1.0, 0.0], [0.0, 1.0], 1.0, 3.0, 30], [-0.993552, 0.151005, -0.14987, -0.983712, -0.499988]), ('velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 8.5], 398600.4418, 900.0, 20]', [[7000.0, 0.0], [0.0, 8.5], 398600.4418, 900.0, 20], [4100.742247, 6612.678063, -5.690094, 5.333971, -20.813351]), ('velocity verlet two-body propagation [[0.0, 9000.0], [-6.2, 0.8], 398600.4418, 1200.0, 15]', [[0.0, 9000.0], [-6.2, 0.8], 398600.4418, 1200.0, 15], [-6596.602558, 6758.244077, -4.170275, -4.186438, -24.748038]), ('velocity verlet two-body propagation [[1.0, 0.0], [0.0, 1.2], 1.0, 5.0, 25]', [[1.0, 0.0], [0.0, 1.2], 1.0, 5.0, 25], [-2.100327, 1.143517, -0.394254, -0.35669, -0.276826]), ('velocity verlet two-body propagation [[-1.5, 0.5], [0.1, -0.7], 1.0, 2.0, 10]', [[-1.5, 0.5], [0.1, -0.7], 1.0, 2.0, 10], [-0.160223, -0.731051, 1.375248, 0.033556, -0.389962]), ('velocity verlet two-body propagation [[6800.0, 1200.0], [-1.1, 7.4], 398600.4418, 300.0, 6]', [[6800.0, 1200.0], [-1.1, 7.4], 398600.4418, 300.0, 6], [6111.297912, 3317.130164, -3.439136, 6.583207, -29.740489]), ('velocity verlet two-body propagation [[2.0, 0.0], [0.0, 0.5], 1.0, 4.0, 8]', [[2.0, 0.0], [0.0, 0.5], 1.0, 4.0, 8], [-0.104683, 0.976244, -0.959856, -0.601306, -0.377049])], [('velocity verlet two-body propagation [[1.0, 0.0], [0.0, 1.2], 1.0, 5.0, 25]', [[1.0, 0.0], [0.0, 1.2], 1.0, 5.0, 25], [-2.100327, 1.143517, -0.394254, -0.35669, -0.276826]), ('velocity verlet two-body propagation [[-1.5, 0.5], [0.1, -0.7], 1.0, 2.0, 10]', [[-1.5, 0.5], [0.1, -0.7], 1.0, 2.0, 10], [-0.160223, -0.731051, 1.375248, 0.033556, -0.389962]), ('velocity verlet two-body propagation [[6800.0, 1200.0], [-1.1, 7.4], 398600.4418, 300.0, 6]', [[6800.0, 1200.0], [-1.1, 7.4], 398600.4418, 300.0, 6], [6111.297912, 3317.130164, -3.439136, 6.583207, -29.740489]), ('velocity verlet two-body propagation [[2.0, 0.0], [0.0, 0.5], 1.0, 4.0, 8]', [[2.0, 0.0], [0.0, 0.5], 1.0, 4.0, 8], [-0.104683, 0.976244, -0.959856, -0.601306, -0.377049]), ('velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 7.546], 398600.4418, 600.0, 12]', [[7000.0, 0.0], [0.0, 7.546], 398600.4418, 600.0, 12], [5585.861325, 4220.456543, -4.545757, 6.021781, -28.471856]), ('velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 8.5], 398600.4418, 900.0, 20]', [[7000.0, 0.0], [0.0, 8.5], 398600.4418, 900.0, 20], [4100.742247, 6612.678063, -5.690094, 5.333971, -20.813351]), ('velocity verlet two-body propagation [[0.0, 9000.0], [-6.2, 0.8], 398600.4418, 1200.0, 15]', [[0.0, 9000.0], [-6.2, 0.8], 398600.4418, 1200.0, 15], [-6596.602558, 6758.244077, -4.170275, -4.186438, -24.748038])]]
for label, args, expected in fixtures[N-1]:
    check(label, 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
velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 7.546], 398600.4418, 600.0, 12][5585.861325, 4220.456543, -4.545757, 6.021781, -28.480047][5585.861325, 4220.456543, -4.545757, 6.021781, -28.471856]Failed
velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 8.5], 398600.4418, 900.0, 20][4100.742247, 6612.678063, -5.690094, 5.333971, -26.528713][4100.742247, 6612.678063, -5.690094, 5.333971, -20.813351]Failed
velocity verlet two-body propagation [[0.0, 9000.0], [-6.2, 0.8], 398600.4418, 1200.0, 15][-6596.602558, 6758.244077, -4.170275, -4.186438, -26.830212][-6596.602558, 6758.244077, -4.170275, -4.186438, -24.748038]Failed
velocity verlet two-body propagation [[1.0, 0.0], [0.0, 1.0], 1.0, 3.0, 30][-0.993552, 0.151005, -0.14987, -0.983712, -0.504925][-0.993552, 0.151005, -0.14987, -0.983712, -0.499988]Failed
velocity verlet two-body propagation [[1.0, 0.0], [0.0, 1.2], 1.0, 5.0, 25][-2.100327, 1.143517, -0.394254, -0.35669, -0.858668][-2.100327, 1.143517, -0.394254, -0.35669, -0.276826]Failed
velocity verlet two-body propagation [[-1.5, 0.5], [0.1, -0.7], 1.0, 2.0, 10][-0.160223, -0.731051, 1.375248, 0.033556, 0.313762][-0.160223, -0.731051, 1.375248, 0.033556, -0.389962]Failed
velocity verlet two-body propagation [[6800.0, 1200.0], [-1.1, 7.4], 398600.4418, 300.0, 6][6111.297912, 3317.130164, -3.439136, 6.583207, -30.142625][6111.297912, 3317.130164, -3.439136, 6.583207, -29.740489]Failed

SHA-256 / 71517ab95d1d61a831e3638553dd7740b52ec4a418f03ff851a1c15fd772db77

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(x):
    r0,v0,mu,T,steps=x
    h=T/steps
    def acc(q):
        rr=(q[0]**2+q[1]**2)**1.5
        return [-mu*q[0]/rr,-mu*q[1]/rr]
    p=list(r0); v=list(v0)
    a=acc(p)
    for _ in range(steps):
        p=[p[i]+h*v[i]+0.5*h*h*a[i] for i in range(2)]
        an=acc(p)
        v=[v[i]+0.5*h*(a[i]+an[i]) for i in range(2)]
        a=an
    en=(v[0]**2+v[1]**2)/2-mu/((math.sqrt(p[0]**2+p[1]**2)+math.sqrt(r0[0]**2+r0[1]**2))/2)
    return [round(c,6) for c in p+v]+[round(en,6)]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 7.546], 398600.4418, 600.0, 12]', [[7000.0, 0.0], [0.0, 7.546], 398600.4418, 600.0, 12], [5585.861325, 4220.456543, -4.545757, 6.021781, -28.471856]), ('velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 8.5], 398600.4418, 900.0, 20]', [[7000.0, 0.0], [0.0, 8.5], 398600.4418, 900.0, 20], [4100.742247, 6612.678063, -5.690094, 5.333971, -20.813351]), ('velocity verlet two-body propagation [[0.0, 9000.0], [-6.2, 0.8], 398600.4418, 1200.0, 15]', [[0.0, 9000.0], [-6.2, 0.8], 398600.4418, 1200.0, 15], [-6596.602558, 6758.244077, -4.170275, -4.186438, -24.748038]), ('velocity verlet two-body propagation [[1.0, 0.0], [0.0, 1.0], 1.0, 3.0, 30]', [[1.0, 0.0], [0.0, 1.0], 1.0, 3.0, 30], [-0.993552, 0.151005, -0.14987, -0.983712, -0.499988]), ('velocity verlet two-body propagation [[1.0, 0.0], [0.0, 1.2], 1.0, 5.0, 25]', [[1.0, 0.0], [0.0, 1.2], 1.0, 5.0, 25], [-2.100327, 1.143517, -0.394254, -0.35669, -0.276826]), ('velocity verlet two-body propagation [[-1.5, 0.5], [0.1, -0.7], 1.0, 2.0, 10]', [[-1.5, 0.5], [0.1, -0.7], 1.0, 2.0, 10], [-0.160223, -0.731051, 1.375248, 0.033556, -0.389962]), ('velocity verlet two-body propagation [[6800.0, 1200.0], [-1.1, 7.4], 398600.4418, 300.0, 6]', [[6800.0, 1200.0], [-1.1, 7.4], 398600.4418, 300.0, 6], [6111.297912, 3317.130164, -3.439136, 6.583207, -29.740489])], [('velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 8.5], 398600.4418, 900.0, 20]', [[7000.0, 0.0], [0.0, 8.5], 398600.4418, 900.0, 20], [4100.742247, 6612.678063, -5.690094, 5.333971, -20.813351]), ('velocity verlet two-body propagation [[1.0, 0.0], [0.0, 1.0], 1.0, 3.0, 30]', [[1.0, 0.0], [0.0, 1.0], 1.0, 3.0, 30], [-0.993552, 0.151005, -0.14987, -0.983712, -0.499988]), ('velocity verlet two-body propagation [[1.0, 0.0], [0.0, 1.2], 1.0, 5.0, 25]', [[1.0, 0.0], [0.0, 1.2], 1.0, 5.0, 25], [-2.100327, 1.143517, -0.394254, -0.35669, -0.276826]), ('velocity verlet two-body propagation [[-1.5, 0.5], [0.1, -0.7], 1.0, 2.0, 10]', [[-1.5, 0.5], [0.1, -0.7], 1.0, 2.0, 10], [-0.160223, -0.731051, 1.375248, 0.033556, -0.389962]), ('velocity verlet two-body propagation [[6800.0, 1200.0], [-1.1, 7.4], 398600.4418, 300.0, 6]', [[6800.0, 1200.0], [-1.1, 7.4], 398600.4418, 300.0, 6], [6111.297912, 3317.130164, -3.439136, 6.583207, -29.740489]), ('velocity verlet two-body propagation [[2.0, 0.0], [0.0, 0.5], 1.0, 4.0, 8]', [[2.0, 0.0], [0.0, 0.5], 1.0, 4.0, 8], [-0.104683, 0.976244, -0.959856, -0.601306, -0.377049]), ('velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 7.546], 398600.4418, 600.0, 12]', [[7000.0, 0.0], [0.0, 7.546], 398600.4418, 600.0, 12], [5585.861325, 4220.456543, -4.545757, 6.021781, -28.471856])], [('velocity verlet two-body propagation [[0.0, 9000.0], [-6.2, 0.8], 398600.4418, 1200.0, 15]', [[0.0, 9000.0], [-6.2, 0.8], 398600.4418, 1200.0, 15], [-6596.602558, 6758.244077, -4.170275, -4.186438, -24.748038]), ('velocity verlet two-body propagation [[6800.0, 1200.0], [-1.1, 7.4], 398600.4418, 300.0, 6]', [[6800.0, 1200.0], [-1.1, 7.4], 398600.4418, 300.0, 6], [6111.297912, 3317.130164, -3.439136, 6.583207, -29.740489]), ('velocity verlet two-body propagation [[2.0, 0.0], [0.0, 0.5], 1.0, 4.0, 8]', [[2.0, 0.0], [0.0, 0.5], 1.0, 4.0, 8], [-0.104683, 0.976244, -0.959856, -0.601306, -0.377049]), ('velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 7.546], 398600.4418, 600.0, 12]', [[7000.0, 0.0], [0.0, 7.546], 398600.4418, 600.0, 12], [5585.861325, 4220.456543, -4.545757, 6.021781, -28.471856]), ('velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 8.5], 398600.4418, 900.0, 20]', [[7000.0, 0.0], [0.0, 8.5], 398600.4418, 900.0, 20], [4100.742247, 6612.678063, -5.690094, 5.333971, -20.813351]), ('velocity verlet two-body propagation [[1.0, 0.0], [0.0, 1.0], 1.0, 3.0, 30]', [[1.0, 0.0], [0.0, 1.0], 1.0, 3.0, 30], [-0.993552, 0.151005, -0.14987, -0.983712, -0.499988]), ('velocity verlet two-body propagation [[1.0, 0.0], [0.0, 1.2], 1.0, 5.0, 25]', [[1.0, 0.0], [0.0, 1.2], 1.0, 5.0, 25], [-2.100327, 1.143517, -0.394254, -0.35669, -0.276826])], [('velocity verlet two-body propagation [[1.0, 0.0], [0.0, 1.0], 1.0, 3.0, 30]', [[1.0, 0.0], [0.0, 1.0], 1.0, 3.0, 30], [-0.993552, 0.151005, -0.14987, -0.983712, -0.499988]), ('velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 8.5], 398600.4418, 900.0, 20]', [[7000.0, 0.0], [0.0, 8.5], 398600.4418, 900.0, 20], [4100.742247, 6612.678063, -5.690094, 5.333971, -20.813351]), ('velocity verlet two-body propagation [[0.0, 9000.0], [-6.2, 0.8], 398600.4418, 1200.0, 15]', [[0.0, 9000.0], [-6.2, 0.8], 398600.4418, 1200.0, 15], [-6596.602558, 6758.244077, -4.170275, -4.186438, -24.748038]), ('velocity verlet two-body propagation [[1.0, 0.0], [0.0, 1.2], 1.0, 5.0, 25]', [[1.0, 0.0], [0.0, 1.2], 1.0, 5.0, 25], [-2.100327, 1.143517, -0.394254, -0.35669, -0.276826]), ('velocity verlet two-body propagation [[-1.5, 0.5], [0.1, -0.7], 1.0, 2.0, 10]', [[-1.5, 0.5], [0.1, -0.7], 1.0, 2.0, 10], [-0.160223, -0.731051, 1.375248, 0.033556, -0.389962]), ('velocity verlet two-body propagation [[6800.0, 1200.0], [-1.1, 7.4], 398600.4418, 300.0, 6]', [[6800.0, 1200.0], [-1.1, 7.4], 398600.4418, 300.0, 6], [6111.297912, 3317.130164, -3.439136, 6.583207, -29.740489]), ('velocity verlet two-body propagation [[2.0, 0.0], [0.0, 0.5], 1.0, 4.0, 8]', [[2.0, 0.0], [0.0, 0.5], 1.0, 4.0, 8], [-0.104683, 0.976244, -0.959856, -0.601306, -0.377049])], [('velocity verlet two-body propagation [[1.0, 0.0], [0.0, 1.2], 1.0, 5.0, 25]', [[1.0, 0.0], [0.0, 1.2], 1.0, 5.0, 25], [-2.100327, 1.143517, -0.394254, -0.35669, -0.276826]), ('velocity verlet two-body propagation [[-1.5, 0.5], [0.1, -0.7], 1.0, 2.0, 10]', [[-1.5, 0.5], [0.1, -0.7], 1.0, 2.0, 10], [-0.160223, -0.731051, 1.375248, 0.033556, -0.389962]), ('velocity verlet two-body propagation [[6800.0, 1200.0], [-1.1, 7.4], 398600.4418, 300.0, 6]', [[6800.0, 1200.0], [-1.1, 7.4], 398600.4418, 300.0, 6], [6111.297912, 3317.130164, -3.439136, 6.583207, -29.740489]), ('velocity verlet two-body propagation [[2.0, 0.0], [0.0, 0.5], 1.0, 4.0, 8]', [[2.0, 0.0], [0.0, 0.5], 1.0, 4.0, 8], [-0.104683, 0.976244, -0.959856, -0.601306, -0.377049]), ('velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 7.546], 398600.4418, 600.0, 12]', [[7000.0, 0.0], [0.0, 7.546], 398600.4418, 600.0, 12], [5585.861325, 4220.456543, -4.545757, 6.021781, -28.471856]), ('velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 8.5], 398600.4418, 900.0, 20]', [[7000.0, 0.0], [0.0, 8.5], 398600.4418, 900.0, 20], [4100.742247, 6612.678063, -5.690094, 5.333971, -20.813351]), ('velocity verlet two-body propagation [[0.0, 9000.0], [-6.2, 0.8], 398600.4418, 1200.0, 15]', [[0.0, 9000.0], [-6.2, 0.8], 398600.4418, 1200.0, 15], [-6596.602558, 6758.244077, -4.170275, -4.186438, -24.748038])]]
for label, args, expected in fixtures[N-1]:
    check(label, 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
velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 7.546], 398600.4418, 600.0, 12][5585.861325, 4220.456543, -4.545757, 6.021781, -28.475952][5585.861325, 4220.456543, -4.545757, 6.021781, -28.471856]Failed
velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 8.5], 398600.4418, 900.0, 20][4100.742247, 6612.678063, -5.690094, 5.333971, -23.520042][4100.742247, 6612.678063, -5.690094, 5.333971, -20.813351]Failed
velocity verlet two-body propagation [[0.0, 9000.0], [-6.2, 0.8], 398600.4418, 1200.0, 15][-6596.602558, 6758.244077, -4.170275, -4.186438, -25.764064][-6596.602558, 6758.244077, -4.170275, -4.186438, -24.748038]Failed
velocity verlet two-body propagation [[1.0, 0.0], [0.0, 1.0], 1.0, 3.0, 30][-0.993552, 0.151005, -0.14987, -0.983712, -0.50245][-0.993552, 0.151005, -0.14987, -0.983712, -0.499988]Failed
velocity verlet two-body propagation [[1.0, 0.0], [0.0, 1.2], 1.0, 5.0, 25][-2.100327, 1.143517, -0.394254, -0.35669, -0.448388][-2.100327, 1.143517, -0.394254, -0.35669, -0.276826]Failed
velocity verlet two-body propagation [[-1.5, 0.5], [0.1, -0.7], 1.0, 2.0, 10][-0.160223, -0.731051, 1.375248, 0.033556, 0.087679][-0.160223, -0.731051, 1.375248, 0.033556, -0.389962]Failed
velocity verlet two-body propagation [[6800.0, 1200.0], [-1.1, 7.4], 398600.4418, 300.0, 6][6111.297912, 3317.130164, -3.439136, 6.583207, -29.940854][6111.297912, 3317.130164, -3.439136, 6.583207, -29.740489]Failed

SHA-256 / e47face79172e60572a18c816938b7ffc3ccd12f9bdd0e2ca43d761e176e3182

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(x):
    r0,v0,mu,T,steps=x
    h=T/steps
    def acc(q):
        rr=(q[0]**2+q[1]**2)**1.5
        return [-mu*q[0]/rr,-mu*q[1]/rr]
    p=list(r0); v=list(v0)
    a=acc(p)
    for _ in range(steps):
        p=[p[i]+h*v[i]+0.5*h*h*a[i] for i in range(2)]
        an=acc(p)
        v=[v[i]+0.5*h*(a[i]+an[i]) for i in range(2)]
        a=an
    en=(v[0]**2+v[1]**2)/2-mu/math.sqrt(p[0]**2+p[1]**2)
    return [round(c,6) for c in p+v]+[round(en,6)]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 7.546], 398600.4418, 600.0, 12]', [[7000.0, 0.0], [0.0, 7.546], 398600.4418, 600.0, 12], [5585.861325, 4220.456543, -4.545757, 6.021781, -28.471856]), ('velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 8.5], 398600.4418, 900.0, 20]', [[7000.0, 0.0], [0.0, 8.5], 398600.4418, 900.0, 20], [4100.742247, 6612.678063, -5.690094, 5.333971, -20.813351]), ('velocity verlet two-body propagation [[0.0, 9000.0], [-6.2, 0.8], 398600.4418, 1200.0, 15]', [[0.0, 9000.0], [-6.2, 0.8], 398600.4418, 1200.0, 15], [-6596.602558, 6758.244077, -4.170275, -4.186438, -24.748038]), ('velocity verlet two-body propagation [[1.0, 0.0], [0.0, 1.0], 1.0, 3.0, 30]', [[1.0, 0.0], [0.0, 1.0], 1.0, 3.0, 30], [-0.993552, 0.151005, -0.14987, -0.983712, -0.499988]), ('velocity verlet two-body propagation [[1.0, 0.0], [0.0, 1.2], 1.0, 5.0, 25]', [[1.0, 0.0], [0.0, 1.2], 1.0, 5.0, 25], [-2.100327, 1.143517, -0.394254, -0.35669, -0.276826]), ('velocity verlet two-body propagation [[-1.5, 0.5], [0.1, -0.7], 1.0, 2.0, 10]', [[-1.5, 0.5], [0.1, -0.7], 1.0, 2.0, 10], [-0.160223, -0.731051, 1.375248, 0.033556, -0.389962]), ('velocity verlet two-body propagation [[6800.0, 1200.0], [-1.1, 7.4], 398600.4418, 300.0, 6]', [[6800.0, 1200.0], [-1.1, 7.4], 398600.4418, 300.0, 6], [6111.297912, 3317.130164, -3.439136, 6.583207, -29.740489])], [('velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 8.5], 398600.4418, 900.0, 20]', [[7000.0, 0.0], [0.0, 8.5], 398600.4418, 900.0, 20], [4100.742247, 6612.678063, -5.690094, 5.333971, -20.813351]), ('velocity verlet two-body propagation [[1.0, 0.0], [0.0, 1.0], 1.0, 3.0, 30]', [[1.0, 0.0], [0.0, 1.0], 1.0, 3.0, 30], [-0.993552, 0.151005, -0.14987, -0.983712, -0.499988]), ('velocity verlet two-body propagation [[1.0, 0.0], [0.0, 1.2], 1.0, 5.0, 25]', [[1.0, 0.0], [0.0, 1.2], 1.0, 5.0, 25], [-2.100327, 1.143517, -0.394254, -0.35669, -0.276826]), ('velocity verlet two-body propagation [[-1.5, 0.5], [0.1, -0.7], 1.0, 2.0, 10]', [[-1.5, 0.5], [0.1, -0.7], 1.0, 2.0, 10], [-0.160223, -0.731051, 1.375248, 0.033556, -0.389962]), ('velocity verlet two-body propagation [[6800.0, 1200.0], [-1.1, 7.4], 398600.4418, 300.0, 6]', [[6800.0, 1200.0], [-1.1, 7.4], 398600.4418, 300.0, 6], [6111.297912, 3317.130164, -3.439136, 6.583207, -29.740489]), ('velocity verlet two-body propagation [[2.0, 0.0], [0.0, 0.5], 1.0, 4.0, 8]', [[2.0, 0.0], [0.0, 0.5], 1.0, 4.0, 8], [-0.104683, 0.976244, -0.959856, -0.601306, -0.377049]), ('velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 7.546], 398600.4418, 600.0, 12]', [[7000.0, 0.0], [0.0, 7.546], 398600.4418, 600.0, 12], [5585.861325, 4220.456543, -4.545757, 6.021781, -28.471856])], [('velocity verlet two-body propagation [[0.0, 9000.0], [-6.2, 0.8], 398600.4418, 1200.0, 15]', [[0.0, 9000.0], [-6.2, 0.8], 398600.4418, 1200.0, 15], [-6596.602558, 6758.244077, -4.170275, -4.186438, -24.748038]), ('velocity verlet two-body propagation [[6800.0, 1200.0], [-1.1, 7.4], 398600.4418, 300.0, 6]', [[6800.0, 1200.0], [-1.1, 7.4], 398600.4418, 300.0, 6], [6111.297912, 3317.130164, -3.439136, 6.583207, -29.740489]), ('velocity verlet two-body propagation [[2.0, 0.0], [0.0, 0.5], 1.0, 4.0, 8]', [[2.0, 0.0], [0.0, 0.5], 1.0, 4.0, 8], [-0.104683, 0.976244, -0.959856, -0.601306, -0.377049]), ('velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 7.546], 398600.4418, 600.0, 12]', [[7000.0, 0.0], [0.0, 7.546], 398600.4418, 600.0, 12], [5585.861325, 4220.456543, -4.545757, 6.021781, -28.471856]), ('velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 8.5], 398600.4418, 900.0, 20]', [[7000.0, 0.0], [0.0, 8.5], 398600.4418, 900.0, 20], [4100.742247, 6612.678063, -5.690094, 5.333971, -20.813351]), ('velocity verlet two-body propagation [[1.0, 0.0], [0.0, 1.0], 1.0, 3.0, 30]', [[1.0, 0.0], [0.0, 1.0], 1.0, 3.0, 30], [-0.993552, 0.151005, -0.14987, -0.983712, -0.499988]), ('velocity verlet two-body propagation [[1.0, 0.0], [0.0, 1.2], 1.0, 5.0, 25]', [[1.0, 0.0], [0.0, 1.2], 1.0, 5.0, 25], [-2.100327, 1.143517, -0.394254, -0.35669, -0.276826])], [('velocity verlet two-body propagation [[1.0, 0.0], [0.0, 1.0], 1.0, 3.0, 30]', [[1.0, 0.0], [0.0, 1.0], 1.0, 3.0, 30], [-0.993552, 0.151005, -0.14987, -0.983712, -0.499988]), ('velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 8.5], 398600.4418, 900.0, 20]', [[7000.0, 0.0], [0.0, 8.5], 398600.4418, 900.0, 20], [4100.742247, 6612.678063, -5.690094, 5.333971, -20.813351]), ('velocity verlet two-body propagation [[0.0, 9000.0], [-6.2, 0.8], 398600.4418, 1200.0, 15]', [[0.0, 9000.0], [-6.2, 0.8], 398600.4418, 1200.0, 15], [-6596.602558, 6758.244077, -4.170275, -4.186438, -24.748038]), ('velocity verlet two-body propagation [[1.0, 0.0], [0.0, 1.2], 1.0, 5.0, 25]', [[1.0, 0.0], [0.0, 1.2], 1.0, 5.0, 25], [-2.100327, 1.143517, -0.394254, -0.35669, -0.276826]), ('velocity verlet two-body propagation [[-1.5, 0.5], [0.1, -0.7], 1.0, 2.0, 10]', [[-1.5, 0.5], [0.1, -0.7], 1.0, 2.0, 10], [-0.160223, -0.731051, 1.375248, 0.033556, -0.389962]), ('velocity verlet two-body propagation [[6800.0, 1200.0], [-1.1, 7.4], 398600.4418, 300.0, 6]', [[6800.0, 1200.0], [-1.1, 7.4], 398600.4418, 300.0, 6], [6111.297912, 3317.130164, -3.439136, 6.583207, -29.740489]), ('velocity verlet two-body propagation [[2.0, 0.0], [0.0, 0.5], 1.0, 4.0, 8]', [[2.0, 0.0], [0.0, 0.5], 1.0, 4.0, 8], [-0.104683, 0.976244, -0.959856, -0.601306, -0.377049])], [('velocity verlet two-body propagation [[1.0, 0.0], [0.0, 1.2], 1.0, 5.0, 25]', [[1.0, 0.0], [0.0, 1.2], 1.0, 5.0, 25], [-2.100327, 1.143517, -0.394254, -0.35669, -0.276826]), ('velocity verlet two-body propagation [[-1.5, 0.5], [0.1, -0.7], 1.0, 2.0, 10]', [[-1.5, 0.5], [0.1, -0.7], 1.0, 2.0, 10], [-0.160223, -0.731051, 1.375248, 0.033556, -0.389962]), ('velocity verlet two-body propagation [[6800.0, 1200.0], [-1.1, 7.4], 398600.4418, 300.0, 6]', [[6800.0, 1200.0], [-1.1, 7.4], 398600.4418, 300.0, 6], [6111.297912, 3317.130164, -3.439136, 6.583207, -29.740489]), ('velocity verlet two-body propagation [[2.0, 0.0], [0.0, 0.5], 1.0, 4.0, 8]', [[2.0, 0.0], [0.0, 0.5], 1.0, 4.0, 8], [-0.104683, 0.976244, -0.959856, -0.601306, -0.377049]), ('velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 7.546], 398600.4418, 600.0, 12]', [[7000.0, 0.0], [0.0, 7.546], 398600.4418, 600.0, 12], [5585.861325, 4220.456543, -4.545757, 6.021781, -28.471856]), ('velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 8.5], 398600.4418, 900.0, 20]', [[7000.0, 0.0], [0.0, 8.5], 398600.4418, 900.0, 20], [4100.742247, 6612.678063, -5.690094, 5.333971, -20.813351]), ('velocity verlet two-body propagation [[0.0, 9000.0], [-6.2, 0.8], 398600.4418, 1200.0, 15]', [[0.0, 9000.0], [-6.2, 0.8], 398600.4418, 1200.0, 15], [-6596.602558, 6758.244077, -4.170275, -4.186438, -24.748038])]]
for label, args, expected in fixtures[N-1]:
    check(label, 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
velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 7.546], 398600.4418, 600.0, 12][5585.861325, 4220.456543, -4.545757, 6.021781, -28.471856][5585.861325, 4220.456543, -4.545757, 6.021781, -28.471856]Passed
velocity verlet two-body propagation [[7000.0, 0.0], [0.0, 8.5], 398600.4418, 900.0, 20][4100.742247, 6612.678063, -5.690094, 5.333971, -20.813351][4100.742247, 6612.678063, -5.690094, 5.333971, -20.813351]Passed
velocity verlet two-body propagation [[0.0, 9000.0], [-6.2, 0.8], 398600.4418, 1200.0, 15][-6596.602558, 6758.244077, -4.170275, -4.186438, -24.748038][-6596.602558, 6758.244077, -4.170275, -4.186438, -24.748038]Passed
velocity verlet two-body propagation [[1.0, 0.0], [0.0, 1.0], 1.0, 3.0, 30][-0.993552, 0.151005, -0.14987, -0.983712, -0.499988][-0.993552, 0.151005, -0.14987, -0.983712, -0.499988]Passed
velocity verlet two-body propagation [[1.0, 0.0], [0.0, 1.2], 1.0, 5.0, 25][-2.100327, 1.143517, -0.394254, -0.35669, -0.276826][-2.100327, 1.143517, -0.394254, -0.35669, -0.276826]Passed
velocity verlet two-body propagation [[-1.5, 0.5], [0.1, -0.7], 1.0, 2.0, 10][-0.160223, -0.731051, 1.375248, 0.033556, -0.389962][-0.160223, -0.731051, 1.375248, 0.033556, -0.389962]Passed
velocity verlet two-body propagation [[6800.0, 1200.0], [-1.1, 7.4], 398600.4418, 300.0, 6][6111.297912, 3317.130164, -3.439136, 6.583207, -29.740489][6111.297912, 3317.130164, -3.439136, 6.583207, -29.740489]Passed

SHA-256 / 1f28a6014b215676f2f2a79a2e1707b4fc1e7dcaa1cf29a1bf9e877a2fdbeb0c

Verification & scope

A deterministic toy two-body model with stipulated constants and conventions; not flight dynamics software or a validated SGP4 implementation. 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:48:12.581185+00:00.

Case digest / 18bfa22bdb31c98a9e1e16376811b2e7bcd0da79c8cde798c4777761300221fc