FAILURE MAP
← Case archive

FA-69816 / Orbital propagation / Open access

Co-orbital phasing manoeuvre: Safety check tests the semi-major axis instead of perigee · case 01

Phasing orbits that dip into the atmosphere are accepted.

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

ROOT CAUSE

The check compares a_ph with rmin.

VERIFIED REPAIR

Check the perigee radius 2a_ph - r.

Unsuccessful approach: Checking min(a_ph, r) still ignores the perigee.

Case contract

Input [r, theta, k, mu, rmin]: circular radius, target lead angle in degrees (positive = target ahead), k phasing revolutions. Phasing period Tph=T-theta_rad/(k n). a_ph from Tph; total dv = 2|v_ph(r)-v_circ| with vis-viva at r. Return None if the phasing perigee 2a_ph-r is below rmin, else [a_ph rounded 3, dv rounded 6, k*Tph rounded 3].

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):
    r,theta,k,mu,rmin=x
    n=math.sqrt(mu/r**3)
    T=2*math.pi/n
    Tph=T-math.radians(theta)/(k*n)
    aph=(mu*(Tph/(2*math.pi))**2)**(1/3)
    if aph<rmin: return None
    vc=math.sqrt(mu/r)
    vph=math.sqrt(mu*(2/r-1/aph))
    dv=2*abs(vph-vc)
    return [round(aph,3),round(dv,6),round(k*Tph,3)]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('co-orbital phasing manoeuvre [6778.0, 20.0, 1, 398600.4418, 6478.0]', [6778.0, 20.0, 1, 398600.4418, 6478.0], None), ('co-orbital phasing manoeuvre [6778.0, 20.0, 3, 398600.4418, 6478.0]', [6778.0, 20.0, 3, 398600.4418, 6478.0], [6694.061, 0.096463, 16351.842]), ('co-orbital phasing manoeuvre [6778.0, -30.0, 2, 398600.4418, 6478.0]', [6778.0, -30.0, 2, 398600.4418, 6478.0], [6964.994, 0.204521, 11569.7]), ('co-orbital phasing manoeuvre [42164.0, 10.0, 1, 398600.4418, 6478.0]', [42164.0, 10.0, 1, 398600.4418, 6478.0], [41379.525, 0.058569, 83770.138]), ('co-orbital phasing manoeuvre [42164.0, -45.0, 4, 398600.4418, 6478.0]', [42164.0, -45.0, 4, 398600.4418, 6478.0], [43037.904, 0.062119, 355424.729]), ('co-orbital phasing manoeuvre [6778.0, 90.0, 1, 398600.4418, 6478.0]', [6778.0, 90.0, 1, 398600.4418, 6478.0], None), ('co-orbital phasing manoeuvre [6778.0, 90.0, 5, 398600.4418, 6478.0]', [6778.0, 90.0, 5, 398600.4418, 6478.0], None)], [('co-orbital phasing manoeuvre [6778.0, 90.0, 5, 398600.4418, 6478.0]', [6778.0, 90.0, 5, 398600.4418, 6478.0], None), ('co-orbital phasing manoeuvre [42164.0, 10.0, 1, 398600.4418, 6478.0]', [42164.0, 10.0, 1, 398600.4418, 6478.0], [41379.525, 0.058569, 83770.138]), ('co-orbital phasing manoeuvre [42164.0, -45.0, 4, 398600.4418, 6478.0]', [42164.0, -45.0, 4, 398600.4418, 6478.0], [43037.904, 0.062119, 355424.729]), ('co-orbital phasing manoeuvre [6778.0, 90.0, 1, 398600.4418, 6478.0]', [6778.0, 90.0, 1, 398600.4418, 6478.0], None), ('co-orbital phasing manoeuvre [1.0, 60.0, 2, 1.0, 0.5]', [1.0, 60.0, 2, 1.0, 0.5], [0.944, 0.060642, 11.519]), ('co-orbital phasing manoeuvre [1.0, -60.0, 2, 1.0, 0.5]', [1.0, -60.0, 2, 1.0, 0.5], [1.055, 0.051305, 13.614]), ('co-orbital phasing manoeuvre [1.0, 170.0, 1, 1.0, 0.1]', [1.0, 170.0, 1, 1.0, 0.1], [0.653, 0.630624, 3.316])], [('co-orbital phasing manoeuvre [6778.0, 20.0, 1, 398600.4418, 6478.0]', [6778.0, 20.0, 1, 398600.4418, 6478.0], None), ('co-orbital phasing manoeuvre [6778.0, 90.0, 5, 398600.4418, 6478.0]', [6778.0, 90.0, 5, 398600.4418, 6478.0], None), ('co-orbital phasing manoeuvre [1.0, 60.0, 2, 1.0, 0.5]', [1.0, 60.0, 2, 1.0, 0.5], [0.944, 0.060642, 11.519]), ('co-orbital phasing manoeuvre [1.0, -60.0, 2, 1.0, 0.5]', [1.0, -60.0, 2, 1.0, 0.5], [1.055, 0.051305, 13.614]), ('co-orbital phasing manoeuvre [1.0, 170.0, 1, 1.0, 0.1]', [1.0, 170.0, 1, 1.0, 0.1], [0.653, 0.630624, 3.316]), ('co-orbital phasing manoeuvre [6778.0, 20.0, 3, 398600.4418, 6478.0]', [6778.0, 20.0, 3, 398600.4418, 6478.0], [6694.061, 0.096463, 16351.842]), ('co-orbital phasing manoeuvre [6778.0, -30.0, 2, 398600.4418, 6478.0]', [6778.0, -30.0, 2, 398600.4418, 6478.0], [6964.994, 0.204521, 11569.7])], [('co-orbital phasing manoeuvre [6778.0, 90.0, 5, 398600.4418, 6478.0]', [6778.0, 90.0, 5, 398600.4418, 6478.0], None), ('co-orbital phasing manoeuvre [1.0, 170.0, 1, 1.0, 0.1]', [1.0, 170.0, 1, 1.0, 0.1], [0.653, 0.630624, 3.316]), ('co-orbital phasing manoeuvre [6778.0, 20.0, 1, 398600.4418, 6478.0]', [6778.0, 20.0, 1, 398600.4418, 6478.0], None), ('co-orbital phasing manoeuvre [6778.0, 20.0, 3, 398600.4418, 6478.0]', [6778.0, 20.0, 3, 398600.4418, 6478.0], [6694.061, 0.096463, 16351.842]), ('co-orbital phasing manoeuvre [6778.0, -30.0, 2, 398600.4418, 6478.0]', [6778.0, -30.0, 2, 398600.4418, 6478.0], [6964.994, 0.204521, 11569.7]), ('co-orbital phasing manoeuvre [42164.0, 10.0, 1, 398600.4418, 6478.0]', [42164.0, 10.0, 1, 398600.4418, 6478.0], [41379.525, 0.058569, 83770.138]), ('co-orbital phasing manoeuvre [42164.0, -45.0, 4, 398600.4418, 6478.0]', [42164.0, -45.0, 4, 398600.4418, 6478.0], [43037.904, 0.062119, 355424.729])], [('co-orbital phasing manoeuvre [6778.0, 20.0, 1, 398600.4418, 6478.0]', [6778.0, 20.0, 1, 398600.4418, 6478.0], None), ('co-orbital phasing manoeuvre [6778.0, -30.0, 2, 398600.4418, 6478.0]', [6778.0, -30.0, 2, 398600.4418, 6478.0], [6964.994, 0.204521, 11569.7]), ('co-orbital phasing manoeuvre [42164.0, 10.0, 1, 398600.4418, 6478.0]', [42164.0, 10.0, 1, 398600.4418, 6478.0], [41379.525, 0.058569, 83770.138]), ('co-orbital phasing manoeuvre [42164.0, -45.0, 4, 398600.4418, 6478.0]', [42164.0, -45.0, 4, 398600.4418, 6478.0], [43037.904, 0.062119, 355424.729]), ('co-orbital phasing manoeuvre [6778.0, 90.0, 1, 398600.4418, 6478.0]', [6778.0, 90.0, 1, 398600.4418, 6478.0], None), ('co-orbital phasing manoeuvre [6778.0, 90.0, 5, 398600.4418, 6478.0]', [6778.0, 90.0, 5, 398600.4418, 6478.0], None), ('co-orbital phasing manoeuvre [1.0, 60.0, 2, 1.0, 0.5]', [1.0, 60.0, 2, 1.0, 0.5], [0.944, 0.060642, 11.519])]]
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
co-orbital phasing manoeuvre [6778.0, 20.0, 1, 398600.4418, 6478.0][6524.579, 0.300807, 5244.931]NoneFailed
co-orbital phasing manoeuvre [6778.0, 20.0, 3, 398600.4418, 6478.0][6694.061, 0.096463, 16351.842][6694.061, 0.096463, 16351.842]Passed
co-orbital phasing manoeuvre [6778.0, -30.0, 2, 398600.4418, 6478.0][6964.994, 0.204521, 11569.7][6964.994, 0.204521, 11569.7]Passed
co-orbital phasing manoeuvre [42164.0, 10.0, 1, 398600.4418, 6478.0][41379.525, 0.058569, 83770.138][41379.525, 0.058569, 83770.138]Passed
co-orbital phasing manoeuvre [42164.0, -45.0, 4, 398600.4418, 6478.0][43037.904, 0.062119, 355424.729][43037.904, 0.062119, 355424.729]Passed
co-orbital phasing manoeuvre [6778.0, 90.0, 1, 398600.4418, 6478.0]NoneNonePassed
co-orbital phasing manoeuvre [6778.0, 90.0, 5, 398600.4418, 6478.0][6550.141, 0.269129, 26378.916]NoneFailed

SHA-256 / f50267ed9f173231f833aa2831a066fe877f267544c3eab7b517136cc4e09b13

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(x):
    r,theta,k,mu,rmin=x
    n=math.sqrt(mu/r**3)
    T=2*math.pi/n
    Tph=T-math.radians(theta)/(k*n)
    aph=(mu*(Tph/(2*math.pi))**2)**(1/3)
    if min(aph,r)<rmin: return None
    vc=math.sqrt(mu/r)
    vph=math.sqrt(mu*(2/r-1/aph))
    dv=2*abs(vph-vc)
    return [round(aph,3),round(dv,6),round(k*Tph,3)]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('co-orbital phasing manoeuvre [6778.0, 20.0, 1, 398600.4418, 6478.0]', [6778.0, 20.0, 1, 398600.4418, 6478.0], None), ('co-orbital phasing manoeuvre [6778.0, 20.0, 3, 398600.4418, 6478.0]', [6778.0, 20.0, 3, 398600.4418, 6478.0], [6694.061, 0.096463, 16351.842]), ('co-orbital phasing manoeuvre [6778.0, -30.0, 2, 398600.4418, 6478.0]', [6778.0, -30.0, 2, 398600.4418, 6478.0], [6964.994, 0.204521, 11569.7]), ('co-orbital phasing manoeuvre [42164.0, 10.0, 1, 398600.4418, 6478.0]', [42164.0, 10.0, 1, 398600.4418, 6478.0], [41379.525, 0.058569, 83770.138]), ('co-orbital phasing manoeuvre [42164.0, -45.0, 4, 398600.4418, 6478.0]', [42164.0, -45.0, 4, 398600.4418, 6478.0], [43037.904, 0.062119, 355424.729]), ('co-orbital phasing manoeuvre [6778.0, 90.0, 1, 398600.4418, 6478.0]', [6778.0, 90.0, 1, 398600.4418, 6478.0], None), ('co-orbital phasing manoeuvre [6778.0, 90.0, 5, 398600.4418, 6478.0]', [6778.0, 90.0, 5, 398600.4418, 6478.0], None)], [('co-orbital phasing manoeuvre [6778.0, 90.0, 5, 398600.4418, 6478.0]', [6778.0, 90.0, 5, 398600.4418, 6478.0], None), ('co-orbital phasing manoeuvre [42164.0, 10.0, 1, 398600.4418, 6478.0]', [42164.0, 10.0, 1, 398600.4418, 6478.0], [41379.525, 0.058569, 83770.138]), ('co-orbital phasing manoeuvre [42164.0, -45.0, 4, 398600.4418, 6478.0]', [42164.0, -45.0, 4, 398600.4418, 6478.0], [43037.904, 0.062119, 355424.729]), ('co-orbital phasing manoeuvre [6778.0, 90.0, 1, 398600.4418, 6478.0]', [6778.0, 90.0, 1, 398600.4418, 6478.0], None), ('co-orbital phasing manoeuvre [1.0, 60.0, 2, 1.0, 0.5]', [1.0, 60.0, 2, 1.0, 0.5], [0.944, 0.060642, 11.519]), ('co-orbital phasing manoeuvre [1.0, -60.0, 2, 1.0, 0.5]', [1.0, -60.0, 2, 1.0, 0.5], [1.055, 0.051305, 13.614]), ('co-orbital phasing manoeuvre [1.0, 170.0, 1, 1.0, 0.1]', [1.0, 170.0, 1, 1.0, 0.1], [0.653, 0.630624, 3.316])], [('co-orbital phasing manoeuvre [6778.0, 20.0, 1, 398600.4418, 6478.0]', [6778.0, 20.0, 1, 398600.4418, 6478.0], None), ('co-orbital phasing manoeuvre [6778.0, 90.0, 5, 398600.4418, 6478.0]', [6778.0, 90.0, 5, 398600.4418, 6478.0], None), ('co-orbital phasing manoeuvre [1.0, 60.0, 2, 1.0, 0.5]', [1.0, 60.0, 2, 1.0, 0.5], [0.944, 0.060642, 11.519]), ('co-orbital phasing manoeuvre [1.0, -60.0, 2, 1.0, 0.5]', [1.0, -60.0, 2, 1.0, 0.5], [1.055, 0.051305, 13.614]), ('co-orbital phasing manoeuvre [1.0, 170.0, 1, 1.0, 0.1]', [1.0, 170.0, 1, 1.0, 0.1], [0.653, 0.630624, 3.316]), ('co-orbital phasing manoeuvre [6778.0, 20.0, 3, 398600.4418, 6478.0]', [6778.0, 20.0, 3, 398600.4418, 6478.0], [6694.061, 0.096463, 16351.842]), ('co-orbital phasing manoeuvre [6778.0, -30.0, 2, 398600.4418, 6478.0]', [6778.0, -30.0, 2, 398600.4418, 6478.0], [6964.994, 0.204521, 11569.7])], [('co-orbital phasing manoeuvre [6778.0, 90.0, 5, 398600.4418, 6478.0]', [6778.0, 90.0, 5, 398600.4418, 6478.0], None), ('co-orbital phasing manoeuvre [1.0, 170.0, 1, 1.0, 0.1]', [1.0, 170.0, 1, 1.0, 0.1], [0.653, 0.630624, 3.316]), ('co-orbital phasing manoeuvre [6778.0, 20.0, 1, 398600.4418, 6478.0]', [6778.0, 20.0, 1, 398600.4418, 6478.0], None), ('co-orbital phasing manoeuvre [6778.0, 20.0, 3, 398600.4418, 6478.0]', [6778.0, 20.0, 3, 398600.4418, 6478.0], [6694.061, 0.096463, 16351.842]), ('co-orbital phasing manoeuvre [6778.0, -30.0, 2, 398600.4418, 6478.0]', [6778.0, -30.0, 2, 398600.4418, 6478.0], [6964.994, 0.204521, 11569.7]), ('co-orbital phasing manoeuvre [42164.0, 10.0, 1, 398600.4418, 6478.0]', [42164.0, 10.0, 1, 398600.4418, 6478.0], [41379.525, 0.058569, 83770.138]), ('co-orbital phasing manoeuvre [42164.0, -45.0, 4, 398600.4418, 6478.0]', [42164.0, -45.0, 4, 398600.4418, 6478.0], [43037.904, 0.062119, 355424.729])], [('co-orbital phasing manoeuvre [6778.0, 20.0, 1, 398600.4418, 6478.0]', [6778.0, 20.0, 1, 398600.4418, 6478.0], None), ('co-orbital phasing manoeuvre [6778.0, -30.0, 2, 398600.4418, 6478.0]', [6778.0, -30.0, 2, 398600.4418, 6478.0], [6964.994, 0.204521, 11569.7]), ('co-orbital phasing manoeuvre [42164.0, 10.0, 1, 398600.4418, 6478.0]', [42164.0, 10.0, 1, 398600.4418, 6478.0], [41379.525, 0.058569, 83770.138]), ('co-orbital phasing manoeuvre [42164.0, -45.0, 4, 398600.4418, 6478.0]', [42164.0, -45.0, 4, 398600.4418, 6478.0], [43037.904, 0.062119, 355424.729]), ('co-orbital phasing manoeuvre [6778.0, 90.0, 1, 398600.4418, 6478.0]', [6778.0, 90.0, 1, 398600.4418, 6478.0], None), ('co-orbital phasing manoeuvre [6778.0, 90.0, 5, 398600.4418, 6478.0]', [6778.0, 90.0, 5, 398600.4418, 6478.0], None), ('co-orbital phasing manoeuvre [1.0, 60.0, 2, 1.0, 0.5]', [1.0, 60.0, 2, 1.0, 0.5], [0.944, 0.060642, 11.519])]]
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
co-orbital phasing manoeuvre [6778.0, 20.0, 1, 398600.4418, 6478.0][6524.579, 0.300807, 5244.931]NoneFailed
co-orbital phasing manoeuvre [6778.0, 20.0, 3, 398600.4418, 6478.0][6694.061, 0.096463, 16351.842][6694.061, 0.096463, 16351.842]Passed
co-orbital phasing manoeuvre [6778.0, -30.0, 2, 398600.4418, 6478.0][6964.994, 0.204521, 11569.7][6964.994, 0.204521, 11569.7]Passed
co-orbital phasing manoeuvre [42164.0, 10.0, 1, 398600.4418, 6478.0][41379.525, 0.058569, 83770.138][41379.525, 0.058569, 83770.138]Passed
co-orbital phasing manoeuvre [42164.0, -45.0, 4, 398600.4418, 6478.0][43037.904, 0.062119, 355424.729][43037.904, 0.062119, 355424.729]Passed
co-orbital phasing manoeuvre [6778.0, 90.0, 1, 398600.4418, 6478.0]NoneNonePassed
co-orbital phasing manoeuvre [6778.0, 90.0, 5, 398600.4418, 6478.0][6550.141, 0.269129, 26378.916]NoneFailed

SHA-256 / 476469470a8ba475a4cf30aaf1bb3b36210678d2b60328b57d2ed400dadfc1a9

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(x):
    r,theta,k,mu,rmin=x
    n=math.sqrt(mu/r**3)
    T=2*math.pi/n
    Tph=T-math.radians(theta)/(k*n)
    aph=(mu*(Tph/(2*math.pi))**2)**(1/3)
    if 2*aph-r<rmin: return None
    vc=math.sqrt(mu/r)
    vph=math.sqrt(mu*(2/r-1/aph))
    dv=2*abs(vph-vc)
    return [round(aph,3),round(dv,6),round(k*Tph,3)]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('co-orbital phasing manoeuvre [6778.0, 20.0, 1, 398600.4418, 6478.0]', [6778.0, 20.0, 1, 398600.4418, 6478.0], None), ('co-orbital phasing manoeuvre [6778.0, 20.0, 3, 398600.4418, 6478.0]', [6778.0, 20.0, 3, 398600.4418, 6478.0], [6694.061, 0.096463, 16351.842]), ('co-orbital phasing manoeuvre [6778.0, -30.0, 2, 398600.4418, 6478.0]', [6778.0, -30.0, 2, 398600.4418, 6478.0], [6964.994, 0.204521, 11569.7]), ('co-orbital phasing manoeuvre [42164.0, 10.0, 1, 398600.4418, 6478.0]', [42164.0, 10.0, 1, 398600.4418, 6478.0], [41379.525, 0.058569, 83770.138]), ('co-orbital phasing manoeuvre [42164.0, -45.0, 4, 398600.4418, 6478.0]', [42164.0, -45.0, 4, 398600.4418, 6478.0], [43037.904, 0.062119, 355424.729]), ('co-orbital phasing manoeuvre [6778.0, 90.0, 1, 398600.4418, 6478.0]', [6778.0, 90.0, 1, 398600.4418, 6478.0], None), ('co-orbital phasing manoeuvre [6778.0, 90.0, 5, 398600.4418, 6478.0]', [6778.0, 90.0, 5, 398600.4418, 6478.0], None)], [('co-orbital phasing manoeuvre [6778.0, 90.0, 5, 398600.4418, 6478.0]', [6778.0, 90.0, 5, 398600.4418, 6478.0], None), ('co-orbital phasing manoeuvre [42164.0, 10.0, 1, 398600.4418, 6478.0]', [42164.0, 10.0, 1, 398600.4418, 6478.0], [41379.525, 0.058569, 83770.138]), ('co-orbital phasing manoeuvre [42164.0, -45.0, 4, 398600.4418, 6478.0]', [42164.0, -45.0, 4, 398600.4418, 6478.0], [43037.904, 0.062119, 355424.729]), ('co-orbital phasing manoeuvre [6778.0, 90.0, 1, 398600.4418, 6478.0]', [6778.0, 90.0, 1, 398600.4418, 6478.0], None), ('co-orbital phasing manoeuvre [1.0, 60.0, 2, 1.0, 0.5]', [1.0, 60.0, 2, 1.0, 0.5], [0.944, 0.060642, 11.519]), ('co-orbital phasing manoeuvre [1.0, -60.0, 2, 1.0, 0.5]', [1.0, -60.0, 2, 1.0, 0.5], [1.055, 0.051305, 13.614]), ('co-orbital phasing manoeuvre [1.0, 170.0, 1, 1.0, 0.1]', [1.0, 170.0, 1, 1.0, 0.1], [0.653, 0.630624, 3.316])], [('co-orbital phasing manoeuvre [6778.0, 20.0, 1, 398600.4418, 6478.0]', [6778.0, 20.0, 1, 398600.4418, 6478.0], None), ('co-orbital phasing manoeuvre [6778.0, 90.0, 5, 398600.4418, 6478.0]', [6778.0, 90.0, 5, 398600.4418, 6478.0], None), ('co-orbital phasing manoeuvre [1.0, 60.0, 2, 1.0, 0.5]', [1.0, 60.0, 2, 1.0, 0.5], [0.944, 0.060642, 11.519]), ('co-orbital phasing manoeuvre [1.0, -60.0, 2, 1.0, 0.5]', [1.0, -60.0, 2, 1.0, 0.5], [1.055, 0.051305, 13.614]), ('co-orbital phasing manoeuvre [1.0, 170.0, 1, 1.0, 0.1]', [1.0, 170.0, 1, 1.0, 0.1], [0.653, 0.630624, 3.316]), ('co-orbital phasing manoeuvre [6778.0, 20.0, 3, 398600.4418, 6478.0]', [6778.0, 20.0, 3, 398600.4418, 6478.0], [6694.061, 0.096463, 16351.842]), ('co-orbital phasing manoeuvre [6778.0, -30.0, 2, 398600.4418, 6478.0]', [6778.0, -30.0, 2, 398600.4418, 6478.0], [6964.994, 0.204521, 11569.7])], [('co-orbital phasing manoeuvre [6778.0, 90.0, 5, 398600.4418, 6478.0]', [6778.0, 90.0, 5, 398600.4418, 6478.0], None), ('co-orbital phasing manoeuvre [1.0, 170.0, 1, 1.0, 0.1]', [1.0, 170.0, 1, 1.0, 0.1], [0.653, 0.630624, 3.316]), ('co-orbital phasing manoeuvre [6778.0, 20.0, 1, 398600.4418, 6478.0]', [6778.0, 20.0, 1, 398600.4418, 6478.0], None), ('co-orbital phasing manoeuvre [6778.0, 20.0, 3, 398600.4418, 6478.0]', [6778.0, 20.0, 3, 398600.4418, 6478.0], [6694.061, 0.096463, 16351.842]), ('co-orbital phasing manoeuvre [6778.0, -30.0, 2, 398600.4418, 6478.0]', [6778.0, -30.0, 2, 398600.4418, 6478.0], [6964.994, 0.204521, 11569.7]), ('co-orbital phasing manoeuvre [42164.0, 10.0, 1, 398600.4418, 6478.0]', [42164.0, 10.0, 1, 398600.4418, 6478.0], [41379.525, 0.058569, 83770.138]), ('co-orbital phasing manoeuvre [42164.0, -45.0, 4, 398600.4418, 6478.0]', [42164.0, -45.0, 4, 398600.4418, 6478.0], [43037.904, 0.062119, 355424.729])], [('co-orbital phasing manoeuvre [6778.0, 20.0, 1, 398600.4418, 6478.0]', [6778.0, 20.0, 1, 398600.4418, 6478.0], None), ('co-orbital phasing manoeuvre [6778.0, -30.0, 2, 398600.4418, 6478.0]', [6778.0, -30.0, 2, 398600.4418, 6478.0], [6964.994, 0.204521, 11569.7]), ('co-orbital phasing manoeuvre [42164.0, 10.0, 1, 398600.4418, 6478.0]', [42164.0, 10.0, 1, 398600.4418, 6478.0], [41379.525, 0.058569, 83770.138]), ('co-orbital phasing manoeuvre [42164.0, -45.0, 4, 398600.4418, 6478.0]', [42164.0, -45.0, 4, 398600.4418, 6478.0], [43037.904, 0.062119, 355424.729]), ('co-orbital phasing manoeuvre [6778.0, 90.0, 1, 398600.4418, 6478.0]', [6778.0, 90.0, 1, 398600.4418, 6478.0], None), ('co-orbital phasing manoeuvre [6778.0, 90.0, 5, 398600.4418, 6478.0]', [6778.0, 90.0, 5, 398600.4418, 6478.0], None), ('co-orbital phasing manoeuvre [1.0, 60.0, 2, 1.0, 0.5]', [1.0, 60.0, 2, 1.0, 0.5], [0.944, 0.060642, 11.519])]]
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
co-orbital phasing manoeuvre [6778.0, 20.0, 1, 398600.4418, 6478.0]NoneNonePassed
co-orbital phasing manoeuvre [6778.0, 20.0, 3, 398600.4418, 6478.0][6694.061, 0.096463, 16351.842][6694.061, 0.096463, 16351.842]Passed
co-orbital phasing manoeuvre [6778.0, -30.0, 2, 398600.4418, 6478.0][6964.994, 0.204521, 11569.7][6964.994, 0.204521, 11569.7]Passed
co-orbital phasing manoeuvre [42164.0, 10.0, 1, 398600.4418, 6478.0][41379.525, 0.058569, 83770.138][41379.525, 0.058569, 83770.138]Passed
co-orbital phasing manoeuvre [42164.0, -45.0, 4, 398600.4418, 6478.0][43037.904, 0.062119, 355424.729][43037.904, 0.062119, 355424.729]Passed
co-orbital phasing manoeuvre [6778.0, 90.0, 1, 398600.4418, 6478.0]NoneNonePassed
co-orbital phasing manoeuvre [6778.0, 90.0, 5, 398600.4418, 6478.0]NoneNonePassed

SHA-256 / 53101d9b37e4826fa0777fe9a4270999c1c0294f2ae0ee85c436792e01abfcbc

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

Case digest / 21b662138c66e8216bc4f19085e622a12ba2c9e11b5cad0bb1eefb778513b0b3