FA-69801 / Orbital propagation / Open access
Co-orbital phasing manoeuvre: The lead angle is not split across phasing revolutions · case 01
Multi-revolution phasing orbits are far too eccentric.
ROOT CAUSE
The period change uses theta/n without dividing by k.
VERIFIED REPAIR
Divide the lead time by k.
Unsuccessful approach: Dividing the whole shortened period by k shortens each orbit too much.
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)/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, 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, 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 [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]), ('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 [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, 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 [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, 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 [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 [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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| 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, 20.0, 1, 398600.4418, 6478.0] | None | None | Passed |
| co-orbital phasing manoeuvre [6778.0, -30.0, 2, 398600.4418, 6478.0] | [7149.51, 0.393439, 12032.488] | [6964.994, 0.204521, 11569.7] | Failed |
| 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] | [45608.258, 0.227968, 387736.067] | [43037.904, 0.062119, 355424.729] | Failed |
| 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 / e1ddc6197702c86dea0d9b3a0aca5bccd907d136ac828c552333fbe1af14fd3f
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)/n)/k
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, 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, 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 [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]), ('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 [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, 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 [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, 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 [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 [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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| 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, 20.0, 1, 398600.4418, 6478.0] | None | None | Passed |
| 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] | [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] | None | [43037.904, 0.062119, 355424.729] | Failed |
| 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 / 6f47a8f2178e3206e680ce95cc3969ab4d0d4b60617858d255ae85d9d522829b
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, 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, 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 [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]), ('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 [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, 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 [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, 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 [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 [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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| 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, 20.0, 1, 398600.4418, 6478.0] | None | None | 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 / 81f68b44790ecf8a3f6dee32d68bb4a009b55f06abf01fe5122849c2e6c15682
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.720160+00:00.
Case digest / b934535e2313b4656767f2d70437fd100cdaac690feae47a469ea26183e83c96