FA-69796 / Orbital propagation / Open access
Co-orbital phasing manoeuvre: Chaser raises its orbit to catch a target ahead · case 01
The target gets further ahead after the phasing orbit.
ROOT CAUSE
The lead angle is added to the period.
VERIFIED REPAIR
Shorten the period when the target is ahead.
Unsuccessful approach: Subtracting the lead angle in degrees mixes units.
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 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, 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 [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]), ('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 [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, 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, 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 [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 [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, -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 [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, -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 [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]), ('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])]]
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| co-orbital phasing manoeuvre [6778.0, 20.0, 1, 398600.4418, 6478.0] | [7026.768, 0.269131, 5861.981] | None | Failed |
| co-orbital phasing manoeuvre [6778.0, 20.0, 3, 398600.4418, 6478.0] | [6861.423, 0.092955, 16968.893] | [6694.061, 0.096463, 16351.842] | Failed |
| co-orbital phasing manoeuvre [6778.0, -30.0, 2, 398600.4418, 6478.0] | None | [6964.994, 0.204521, 11569.7] | Failed |
| co-orbital phasing manoeuvre [42164.0, 10.0, 1, 398600.4418, 6478.0] | [42941.244, 0.055402, 88557.003] | [41379.525, 0.058569, 83770.138] | Failed |
| co-orbital phasing manoeuvre [42164.0, -45.0, 4, 398600.4418, 6478.0] | [41280.944, 0.066127, 333883.836] | [43037.904, 0.062119, 355424.729] | Failed |
| co-orbital phasing manoeuvre [6778.0, 90.0, 1, 398600.4418, 6478.0] | [7865.172, 1.025708, 6941.82] | None | Failed |
| co-orbital phasing manoeuvre [6778.0, 90.0, 5, 398600.4418, 6478.0] | [7002.091, 0.24349, 29155.643] | None | Failed |
SHA-256 / 9ce88adc36d0ead00aebd91c2f0b187a4be32a247ae95c87f3bce823692c8466
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-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, 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 [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]), ('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 [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, 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, 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 [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 [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, -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 [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, -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 [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]), ('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])]]
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| co-orbital phasing manoeuvre [6778.0, 20.0, 1, 398600.4418, 6478.0] | [11406.45, 2.847422, -12123.743] | None | Failed |
| co-orbital phasing manoeuvre [6778.0, 20.0, 3, 398600.4418, 6478.0] | None | [6694.061, 0.096463, 16351.842] | Failed |
| co-orbital phasing manoeuvre [6778.0, -30.0, 2, 398600.4418, 6478.0] | [15287.603, 3.798298, 37622.711] | [6964.994, 0.204521, 11569.7] | Failed |
| co-orbital phasing manoeuvre [42164.0, 10.0, 1, 398600.4418, 6478.0] | [29712.27, 1.462416, -50970.011] | [41379.525, 0.058569, 83770.138] | Failed |
| co-orbital phasing manoeuvre [42164.0, -45.0, 4, 398600.4418, 6478.0] | [83572.317, 1.370672, 961755.4] | [43037.904, 0.062119, 355424.729] | Failed |
| co-orbital phasing manoeuvre [6778.0, 90.0, 1, 398600.4418, 6478.0] | [38094.018, 5.365612, -73993.94] | None | Failed |
| co-orbital phasing manoeuvre [6778.0, 90.0, 5, 398600.4418, 6478.0] | [10268.839, 2.416539, -51780.117] | None | Failed |
SHA-256 / ac7b7970b87ac776c1b4f61f0de173f60850bd7d8face289f13a0305384ee4f5
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, 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 [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]), ('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 [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, 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, 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 [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 [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, -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 [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, -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 [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]), ('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])]]
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| co-orbital phasing manoeuvre [6778.0, 20.0, 1, 398600.4418, 6478.0] | None | None | Passed |
| 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] | None | None | Passed |
| co-orbital phasing manoeuvre [6778.0, 90.0, 5, 398600.4418, 6478.0] | None | None | Passed |
SHA-256 / b0e475801c0a1c4e99785f32e54073f9c8969b7740cd9b57a1e3dd7823814d1c
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.679402+00:00.
Case digest / 35c45c04715c2eca1d5c61f257b5fef774db5578ffd7cf2737d0120bb89fc702