FAILURE MAP
← Case archive

FA-69566 / Orbital propagation / Open access

Velocity Verlet two-body propagation: Initial acceleration is evaluated at the velocity vector · case 01

The first step is kicked in a nonsensical direction.

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

ROOT CAUSE

The seed acceleration is computed from v0 rather than r0.

VERIFIED REPAIR

Seed a from the initial position.

Unsuccessful approach: Seeding with zero acceleration drops the first half-kick.

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(v)
    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][7000.0, -104996955.432144, -0.0, -174994.92572, 15311612013.900763][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][6999.999999, -111710812.925911, -0.0, -124123.125473, 7703275138.605796][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][485548051.268468, -62642361.453996, 404623.376057, -52209.467878, 83222952493.97086][-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.81798, -0.095962, 0.171091, -1.141326, -0.548248][-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][-1.726075, 0.677555, -0.21992, -0.568659, -0.353419][-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.27633, -0.460077, 1.648662, 0.149654, -0.493056][-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][7859888.911826, -52828670.861378, 26176.963039, -176099.569538, 15848145892.680258][6111.297912, 3317.130164, -3.439136, 6.583207, -29.740489]Failed

SHA-256 / 863d98aaf44103099f7508d76f07b38a9cd4e79dd451374bb7b7783ee2d7055a

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=[0.0,0.0]
    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][5722.255492, 4227.95803, -4.277817, 6.070259, -28.450547][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][4295.819446, 6641.558172, -5.439032, 5.441651, -20.796152][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][-6625.382286, 7038.802897, -4.260001, -3.896333, -24.570905][-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.958456, 0.35547, -0.296908, -0.933229, -0.498699][-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][-1.84678, 1.644678, -0.450977, -0.248155, -0.271892][-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.281394, -0.749274, 1.301335, -0.088641, -0.398755][-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][6175.017655, 3328.898502, -3.213991, 6.630095, -29.675955][6111.297912, 3317.130164, -3.439136, 6.583207, -29.740489]Failed

SHA-256 / 945d808c3aab81d1f7e5d7db5d09f71538e7fab879e2d90a3252fad492967066

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

Case digest / b6cfd79d617049f37b0b525b91843492d64156b77faf44dfae977edcaba98193