FA-69391 / Orbital propagation / Open access
Mean anomaly propagation between epochs: Epoch difference ignores leap days · case 01
Propagation across 29 February drifts by a whole day of motion.
ROOT CAUSE
Days are counted as 365*year + day, ignoring leap years.
VERIFIED REPAIR
Count days with the Gregorian calendar.
Unsuccessful approach: Adding year//4 leap days breaks at non-leap century years such as 2100.
Case contract
Input [[y1,d1],[y2,d2],M0,n,ndot2]: epochs as calendar year and fractional 1-based day of year; M0 degrees at epoch 1; n revolutions per day; ndot2 is the published first derivative divided by two (rev/day^2). dt = epoch2-epoch1 in days (Gregorian calendar). M = (M0 + 360*(n*dt + ndot2*dt^2)) mod 360. Return [dt rounded 6, M rounded 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
import datetime
N = 1
observations = []
def solve(x):
(y1,d1),(y2,d2),m0,n,nd2=x
def od(y,d): return y*365+d-1
dt=od(y2,d2)-od(y1,d1)
m=(m0+360.0*(n*dt+nd2*dt*dt))%360.0
return [round(dt,6),round(m,6)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('mean anomaly propagation between epochs [[2024, 360.0], [2025, 3.0], 20.0, 1.1, 0.0]', [[2024, 360.0], [2025, 3.0], 20.0, 1.1, 0.0], [9.0, 344.0]), ('mean anomaly propagation between epochs [[2100, 360.0], [2101, 2.0], 20.0, 0.9, 0.0]', [[2100, 360.0], [2101, 2.0], 20.0, 0.9, 0.0], [7.0, 128.0]), ('mean anomaly propagation between epochs [[2026, 10.25], [2026, 12.75], 30.0, 15.5, 0.0]', [[2026, 10.25], [2026, 12.75], 30.0, 15.5, 0.0], [2.5, 300.0]), ('mean anomaly propagation between epochs [[2023, 360.5], [2024, 2.5], 100.0, 1.00273, 0.0]', [[2023, 360.5], [2024, 2.5], 100.0, 1.00273, 0.0], [7.0, 106.8796]), ('mean anomaly propagation between epochs [[2024, 59.0], [2024, 61.0], 0.0, 2.0, 0.0]', [[2024, 59.0], [2024, 61.0], 0.0, 2.0, 0.0], [2.0, 0.0]), ('mean anomaly propagation between epochs [[2099, 365.0], [2100, 60.0], 10.0, 0.5, 0.0]', [[2099, 365.0], [2100, 60.0], 10.0, 0.5, 0.0], [60.0, 10.0]), ('mean anomaly propagation between epochs [[2100, 59.0], [2100, 61.0], 10.0, 0.25, 0.0]', [[2100, 59.0], [2100, 61.0], 10.0, 0.25, 0.0], [2.0, 190.0])], [('mean anomaly propagation between epochs [[2024, 360.0], [2025, 3.0], 20.0, 1.1, 0.0]', [[2024, 360.0], [2025, 3.0], 20.0, 1.1, 0.0], [9.0, 344.0]), ('mean anomaly propagation between epochs [[2100, 360.0], [2101, 2.0], 20.0, 0.9, 0.0]', [[2100, 360.0], [2101, 2.0], 20.0, 0.9, 0.0], [7.0, 128.0]), ('mean anomaly propagation between epochs [[2099, 365.0], [2100, 60.0], 10.0, 0.5, 0.0]', [[2099, 365.0], [2100, 60.0], 10.0, 0.5, 0.0], [60.0, 10.0]), ('mean anomaly propagation between epochs [[2100, 59.0], [2100, 61.0], 10.0, 0.25, 0.0]', [[2100, 59.0], [2100, 61.0], 10.0, 0.25, 0.0], [2.0, 190.0]), ('mean anomaly propagation between epochs [[2026, 100.0], [2026, 90.5], 45.0, 13.2, 0.0]', [[2026, 100.0], [2026, 90.5], 45.0, 13.2, 0.0], [-9.5, 261.0]), ('mean anomaly propagation between epochs [[2026, 1.0], [2026, 3.0], 350.0, 14.25, 0.0001]', [[2026, 1.0], [2026, 3.0], 350.0, 14.25, 0.0001], [2.0, 170.144]), ('mean anomaly propagation between epochs [[2025, 200.0], [2025, 210.0], 0.0, 15.0, -5e-05]', [[2025, 200.0], [2025, 210.0], 0.0, 15.0, -5e-05], [10.0, 358.2])], [('mean anomaly propagation between epochs [[2024, 360.0], [2025, 3.0], 20.0, 1.1, 0.0]', [[2024, 360.0], [2025, 3.0], 20.0, 1.1, 0.0], [9.0, 344.0]), ('mean anomaly propagation between epochs [[2100, 360.0], [2101, 2.0], 20.0, 0.9, 0.0]', [[2100, 360.0], [2101, 2.0], 20.0, 0.9, 0.0], [7.0, 128.0]), ('mean anomaly propagation between epochs [[2026, 1.0], [2026, 3.0], 350.0, 14.25, 0.0001]', [[2026, 1.0], [2026, 3.0], 350.0, 14.25, 0.0001], [2.0, 170.144]), ('mean anomaly propagation between epochs [[2025, 200.0], [2025, 210.0], 0.0, 15.0, -5e-05]', [[2025, 200.0], [2025, 210.0], 0.0, 15.0, -5e-05], [10.0, 358.2]), ('mean anomaly propagation between epochs [[2026, 5.0], [2026, 5.0], 12.5, 15.0, 0.0]', [[2026, 5.0], [2026, 5.0], 12.5, 15.0, 0.0], [0.0, 12.5]), ('mean anomaly propagation between epochs [[2026, 50.3], [2026, 51.1], 90.0, 11.1, 0.0]', [[2026, 50.3], [2026, 51.1], 90.0, 11.1, 0.0], [0.8, 46.8]), ('mean anomaly propagation between epochs [[2026, 50.7], [2026, 50.2], 270.0, 16.0, 0.0]', [[2026, 50.7], [2026, 50.2], 270.0, 16.0, 0.0], [-0.5, 270.0])], [('mean anomaly propagation between epochs [[2024, 360.0], [2025, 3.0], 20.0, 1.1, 0.0]', [[2024, 360.0], [2025, 3.0], 20.0, 1.1, 0.0], [9.0, 344.0]), ('mean anomaly propagation between epochs [[2100, 360.0], [2101, 2.0], 20.0, 0.9, 0.0]', [[2100, 360.0], [2101, 2.0], 20.0, 0.9, 0.0], [7.0, 128.0]), ('mean anomaly propagation between epochs [[2026, 50.3], [2026, 51.1], 90.0, 11.1, 0.0]', [[2026, 50.3], [2026, 51.1], 90.0, 11.1, 0.0], [0.8, 46.8]), ('mean anomaly propagation between epochs [[2026, 50.7], [2026, 50.2], 270.0, 16.0, 0.0]', [[2026, 50.7], [2026, 50.2], 270.0, 16.0, 0.0], [-0.5, 270.0]), ('mean anomaly propagation between epochs [[2000, 59.5], [2000, 61.5], 5.0, 1.0, 2e-05]', [[2000, 59.5], [2000, 61.5], 5.0, 1.0, 2e-05], [2.0, 5.0288]), ('mean anomaly propagation between epochs [[2026, 100.0], [2026, 99.5], 300.0, 0.1, 0.0]', [[2026, 100.0], [2026, 99.5], 300.0, 0.1, 0.0], [-0.5, 282.0]), ('mean anomaly propagation between epochs [[2027, 10.0], [2027, 9.0], 350.0, 0.05, 0.0]', [[2027, 10.0], [2027, 9.0], 350.0, 0.05, 0.0], [-1.0, 332.0])], [('mean anomaly propagation between epochs [[2024, 360.0], [2025, 3.0], 20.0, 1.1, 0.0]', [[2024, 360.0], [2025, 3.0], 20.0, 1.1, 0.0], [9.0, 344.0]), ('mean anomaly propagation between epochs [[2100, 360.0], [2101, 2.0], 20.0, 0.9, 0.0]', [[2100, 360.0], [2101, 2.0], 20.0, 0.9, 0.0], [7.0, 128.0]), ('mean anomaly propagation between epochs [[2026, 100.0], [2026, 99.5], 300.0, 0.1, 0.0]', [[2026, 100.0], [2026, 99.5], 300.0, 0.1, 0.0], [-0.5, 282.0]), ('mean anomaly propagation between epochs [[2027, 10.0], [2027, 9.0], 350.0, 0.05, 0.0]', [[2027, 10.0], [2027, 9.0], 350.0, 0.05, 0.0], [-1.0, 332.0]), ('mean anomaly propagation between epochs [[2026, 10.25], [2026, 12.75], 30.0, 15.5, 0.0]', [[2026, 10.25], [2026, 12.75], 30.0, 15.5, 0.0], [2.5, 300.0]), ('mean anomaly propagation between epochs [[2023, 360.5], [2024, 2.5], 100.0, 1.00273, 0.0]', [[2023, 360.5], [2024, 2.5], 100.0, 1.00273, 0.0], [7.0, 106.8796]), ('mean anomaly propagation between epochs [[2024, 59.0], [2024, 61.0], 0.0, 2.0, 0.0]', [[2024, 59.0], [2024, 61.0], 0.0, 2.0, 0.0], [2.0, 0.0])]]
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 |
|---|---|---|---|
| mean anomaly propagation between epochs [[2024, 360.0], [2025, 3.0], 20.0, 1.1, 0.0] | [8.0, 308.0] | [9.0, 344.0] | Failed |
| mean anomaly propagation between epochs [[2100, 360.0], [2101, 2.0], 20.0, 0.9, 0.0] | [7.0, 128.0] | [7.0, 128.0] | Passed |
| mean anomaly propagation between epochs [[2026, 10.25], [2026, 12.75], 30.0, 15.5, 0.0] | [2.5, 300.0] | [2.5, 300.0] | Passed |
| mean anomaly propagation between epochs [[2023, 360.5], [2024, 2.5], 100.0, 1.00273, 0.0] | [7.0, 106.8796] | [7.0, 106.8796] | Passed |
| mean anomaly propagation between epochs [[2024, 59.0], [2024, 61.0], 0.0, 2.0, 0.0] | [2.0, 0.0] | [2.0, 0.0] | Passed |
| mean anomaly propagation between epochs [[2099, 365.0], [2100, 60.0], 10.0, 0.5, 0.0] | [60.0, 10.0] | [60.0, 10.0] | Passed |
| mean anomaly propagation between epochs [[2100, 59.0], [2100, 61.0], 10.0, 0.25, 0.0] | [2.0, 190.0] | [2.0, 190.0] | Passed |
SHA-256 / 4e58aa7cdbfaf5504cc168be2696f3dad015bc0b01f1c4c21ea280912dbfe9b4
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
import math
import datetime
N = 1
observations = []
def solve(x):
(y1,d1),(y2,d2),m0,n,nd2=x
def od(y,d): return y*365+(y-1)//4+d-1
dt=od(y2,d2)-od(y1,d1)
m=(m0+360.0*(n*dt+nd2*dt*dt))%360.0
return [round(dt,6),round(m,6)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('mean anomaly propagation between epochs [[2024, 360.0], [2025, 3.0], 20.0, 1.1, 0.0]', [[2024, 360.0], [2025, 3.0], 20.0, 1.1, 0.0], [9.0, 344.0]), ('mean anomaly propagation between epochs [[2100, 360.0], [2101, 2.0], 20.0, 0.9, 0.0]', [[2100, 360.0], [2101, 2.0], 20.0, 0.9, 0.0], [7.0, 128.0]), ('mean anomaly propagation between epochs [[2026, 10.25], [2026, 12.75], 30.0, 15.5, 0.0]', [[2026, 10.25], [2026, 12.75], 30.0, 15.5, 0.0], [2.5, 300.0]), ('mean anomaly propagation between epochs [[2023, 360.5], [2024, 2.5], 100.0, 1.00273, 0.0]', [[2023, 360.5], [2024, 2.5], 100.0, 1.00273, 0.0], [7.0, 106.8796]), ('mean anomaly propagation between epochs [[2024, 59.0], [2024, 61.0], 0.0, 2.0, 0.0]', [[2024, 59.0], [2024, 61.0], 0.0, 2.0, 0.0], [2.0, 0.0]), ('mean anomaly propagation between epochs [[2099, 365.0], [2100, 60.0], 10.0, 0.5, 0.0]', [[2099, 365.0], [2100, 60.0], 10.0, 0.5, 0.0], [60.0, 10.0]), ('mean anomaly propagation between epochs [[2100, 59.0], [2100, 61.0], 10.0, 0.25, 0.0]', [[2100, 59.0], [2100, 61.0], 10.0, 0.25, 0.0], [2.0, 190.0])], [('mean anomaly propagation between epochs [[2024, 360.0], [2025, 3.0], 20.0, 1.1, 0.0]', [[2024, 360.0], [2025, 3.0], 20.0, 1.1, 0.0], [9.0, 344.0]), ('mean anomaly propagation between epochs [[2100, 360.0], [2101, 2.0], 20.0, 0.9, 0.0]', [[2100, 360.0], [2101, 2.0], 20.0, 0.9, 0.0], [7.0, 128.0]), ('mean anomaly propagation between epochs [[2099, 365.0], [2100, 60.0], 10.0, 0.5, 0.0]', [[2099, 365.0], [2100, 60.0], 10.0, 0.5, 0.0], [60.0, 10.0]), ('mean anomaly propagation between epochs [[2100, 59.0], [2100, 61.0], 10.0, 0.25, 0.0]', [[2100, 59.0], [2100, 61.0], 10.0, 0.25, 0.0], [2.0, 190.0]), ('mean anomaly propagation between epochs [[2026, 100.0], [2026, 90.5], 45.0, 13.2, 0.0]', [[2026, 100.0], [2026, 90.5], 45.0, 13.2, 0.0], [-9.5, 261.0]), ('mean anomaly propagation between epochs [[2026, 1.0], [2026, 3.0], 350.0, 14.25, 0.0001]', [[2026, 1.0], [2026, 3.0], 350.0, 14.25, 0.0001], [2.0, 170.144]), ('mean anomaly propagation between epochs [[2025, 200.0], [2025, 210.0], 0.0, 15.0, -5e-05]', [[2025, 200.0], [2025, 210.0], 0.0, 15.0, -5e-05], [10.0, 358.2])], [('mean anomaly propagation between epochs [[2024, 360.0], [2025, 3.0], 20.0, 1.1, 0.0]', [[2024, 360.0], [2025, 3.0], 20.0, 1.1, 0.0], [9.0, 344.0]), ('mean anomaly propagation between epochs [[2100, 360.0], [2101, 2.0], 20.0, 0.9, 0.0]', [[2100, 360.0], [2101, 2.0], 20.0, 0.9, 0.0], [7.0, 128.0]), ('mean anomaly propagation between epochs [[2026, 1.0], [2026, 3.0], 350.0, 14.25, 0.0001]', [[2026, 1.0], [2026, 3.0], 350.0, 14.25, 0.0001], [2.0, 170.144]), ('mean anomaly propagation between epochs [[2025, 200.0], [2025, 210.0], 0.0, 15.0, -5e-05]', [[2025, 200.0], [2025, 210.0], 0.0, 15.0, -5e-05], [10.0, 358.2]), ('mean anomaly propagation between epochs [[2026, 5.0], [2026, 5.0], 12.5, 15.0, 0.0]', [[2026, 5.0], [2026, 5.0], 12.5, 15.0, 0.0], [0.0, 12.5]), ('mean anomaly propagation between epochs [[2026, 50.3], [2026, 51.1], 90.0, 11.1, 0.0]', [[2026, 50.3], [2026, 51.1], 90.0, 11.1, 0.0], [0.8, 46.8]), ('mean anomaly propagation between epochs [[2026, 50.7], [2026, 50.2], 270.0, 16.0, 0.0]', [[2026, 50.7], [2026, 50.2], 270.0, 16.0, 0.0], [-0.5, 270.0])], [('mean anomaly propagation between epochs [[2024, 360.0], [2025, 3.0], 20.0, 1.1, 0.0]', [[2024, 360.0], [2025, 3.0], 20.0, 1.1, 0.0], [9.0, 344.0]), ('mean anomaly propagation between epochs [[2100, 360.0], [2101, 2.0], 20.0, 0.9, 0.0]', [[2100, 360.0], [2101, 2.0], 20.0, 0.9, 0.0], [7.0, 128.0]), ('mean anomaly propagation between epochs [[2026, 50.3], [2026, 51.1], 90.0, 11.1, 0.0]', [[2026, 50.3], [2026, 51.1], 90.0, 11.1, 0.0], [0.8, 46.8]), ('mean anomaly propagation between epochs [[2026, 50.7], [2026, 50.2], 270.0, 16.0, 0.0]', [[2026, 50.7], [2026, 50.2], 270.0, 16.0, 0.0], [-0.5, 270.0]), ('mean anomaly propagation between epochs [[2000, 59.5], [2000, 61.5], 5.0, 1.0, 2e-05]', [[2000, 59.5], [2000, 61.5], 5.0, 1.0, 2e-05], [2.0, 5.0288]), ('mean anomaly propagation between epochs [[2026, 100.0], [2026, 99.5], 300.0, 0.1, 0.0]', [[2026, 100.0], [2026, 99.5], 300.0, 0.1, 0.0], [-0.5, 282.0]), ('mean anomaly propagation between epochs [[2027, 10.0], [2027, 9.0], 350.0, 0.05, 0.0]', [[2027, 10.0], [2027, 9.0], 350.0, 0.05, 0.0], [-1.0, 332.0])], [('mean anomaly propagation between epochs [[2024, 360.0], [2025, 3.0], 20.0, 1.1, 0.0]', [[2024, 360.0], [2025, 3.0], 20.0, 1.1, 0.0], [9.0, 344.0]), ('mean anomaly propagation between epochs [[2100, 360.0], [2101, 2.0], 20.0, 0.9, 0.0]', [[2100, 360.0], [2101, 2.0], 20.0, 0.9, 0.0], [7.0, 128.0]), ('mean anomaly propagation between epochs [[2026, 100.0], [2026, 99.5], 300.0, 0.1, 0.0]', [[2026, 100.0], [2026, 99.5], 300.0, 0.1, 0.0], [-0.5, 282.0]), ('mean anomaly propagation between epochs [[2027, 10.0], [2027, 9.0], 350.0, 0.05, 0.0]', [[2027, 10.0], [2027, 9.0], 350.0, 0.05, 0.0], [-1.0, 332.0]), ('mean anomaly propagation between epochs [[2026, 10.25], [2026, 12.75], 30.0, 15.5, 0.0]', [[2026, 10.25], [2026, 12.75], 30.0, 15.5, 0.0], [2.5, 300.0]), ('mean anomaly propagation between epochs [[2023, 360.5], [2024, 2.5], 100.0, 1.00273, 0.0]', [[2023, 360.5], [2024, 2.5], 100.0, 1.00273, 0.0], [7.0, 106.8796]), ('mean anomaly propagation between epochs [[2024, 59.0], [2024, 61.0], 0.0, 2.0, 0.0]', [[2024, 59.0], [2024, 61.0], 0.0, 2.0, 0.0], [2.0, 0.0])]]
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 |
|---|---|---|---|
| mean anomaly propagation between epochs [[2024, 360.0], [2025, 3.0], 20.0, 1.1, 0.0] | [9.0, 344.0] | [9.0, 344.0] | Passed |
| mean anomaly propagation between epochs [[2100, 360.0], [2101, 2.0], 20.0, 0.9, 0.0] | [8.0, 92.0] | [7.0, 128.0] | Failed |
| mean anomaly propagation between epochs [[2026, 10.25], [2026, 12.75], 30.0, 15.5, 0.0] | [2.5, 300.0] | [2.5, 300.0] | Passed |
| mean anomaly propagation between epochs [[2023, 360.5], [2024, 2.5], 100.0, 1.00273, 0.0] | [7.0, 106.8796] | [7.0, 106.8796] | Passed |
| mean anomaly propagation between epochs [[2024, 59.0], [2024, 61.0], 0.0, 2.0, 0.0] | [2.0, 0.0] | [2.0, 0.0] | Passed |
| mean anomaly propagation between epochs [[2099, 365.0], [2100, 60.0], 10.0, 0.5, 0.0] | [60.0, 10.0] | [60.0, 10.0] | Passed |
| mean anomaly propagation between epochs [[2100, 59.0], [2100, 61.0], 10.0, 0.25, 0.0] | [2.0, 190.0] | [2.0, 190.0] | Passed |
SHA-256 / 8cceb0e85904f5634395200f6e4cb8564675eea39900a9bd7dc6233ec96842f3
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
import math
import datetime
N = 1
observations = []
def solve(x):
(y1,d1),(y2,d2),m0,n,nd2=x
def od(y,d): return datetime.date(y,1,1).toordinal()+d-1
dt=od(y2,d2)-od(y1,d1)
m=(m0+360.0*(n*dt+nd2*dt*dt))%360.0
return [round(dt,6),round(m,6)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('mean anomaly propagation between epochs [[2024, 360.0], [2025, 3.0], 20.0, 1.1, 0.0]', [[2024, 360.0], [2025, 3.0], 20.0, 1.1, 0.0], [9.0, 344.0]), ('mean anomaly propagation between epochs [[2100, 360.0], [2101, 2.0], 20.0, 0.9, 0.0]', [[2100, 360.0], [2101, 2.0], 20.0, 0.9, 0.0], [7.0, 128.0]), ('mean anomaly propagation between epochs [[2026, 10.25], [2026, 12.75], 30.0, 15.5, 0.0]', [[2026, 10.25], [2026, 12.75], 30.0, 15.5, 0.0], [2.5, 300.0]), ('mean anomaly propagation between epochs [[2023, 360.5], [2024, 2.5], 100.0, 1.00273, 0.0]', [[2023, 360.5], [2024, 2.5], 100.0, 1.00273, 0.0], [7.0, 106.8796]), ('mean anomaly propagation between epochs [[2024, 59.0], [2024, 61.0], 0.0, 2.0, 0.0]', [[2024, 59.0], [2024, 61.0], 0.0, 2.0, 0.0], [2.0, 0.0]), ('mean anomaly propagation between epochs [[2099, 365.0], [2100, 60.0], 10.0, 0.5, 0.0]', [[2099, 365.0], [2100, 60.0], 10.0, 0.5, 0.0], [60.0, 10.0]), ('mean anomaly propagation between epochs [[2100, 59.0], [2100, 61.0], 10.0, 0.25, 0.0]', [[2100, 59.0], [2100, 61.0], 10.0, 0.25, 0.0], [2.0, 190.0])], [('mean anomaly propagation between epochs [[2024, 360.0], [2025, 3.0], 20.0, 1.1, 0.0]', [[2024, 360.0], [2025, 3.0], 20.0, 1.1, 0.0], [9.0, 344.0]), ('mean anomaly propagation between epochs [[2100, 360.0], [2101, 2.0], 20.0, 0.9, 0.0]', [[2100, 360.0], [2101, 2.0], 20.0, 0.9, 0.0], [7.0, 128.0]), ('mean anomaly propagation between epochs [[2099, 365.0], [2100, 60.0], 10.0, 0.5, 0.0]', [[2099, 365.0], [2100, 60.0], 10.0, 0.5, 0.0], [60.0, 10.0]), ('mean anomaly propagation between epochs [[2100, 59.0], [2100, 61.0], 10.0, 0.25, 0.0]', [[2100, 59.0], [2100, 61.0], 10.0, 0.25, 0.0], [2.0, 190.0]), ('mean anomaly propagation between epochs [[2026, 100.0], [2026, 90.5], 45.0, 13.2, 0.0]', [[2026, 100.0], [2026, 90.5], 45.0, 13.2, 0.0], [-9.5, 261.0]), ('mean anomaly propagation between epochs [[2026, 1.0], [2026, 3.0], 350.0, 14.25, 0.0001]', [[2026, 1.0], [2026, 3.0], 350.0, 14.25, 0.0001], [2.0, 170.144]), ('mean anomaly propagation between epochs [[2025, 200.0], [2025, 210.0], 0.0, 15.0, -5e-05]', [[2025, 200.0], [2025, 210.0], 0.0, 15.0, -5e-05], [10.0, 358.2])], [('mean anomaly propagation between epochs [[2024, 360.0], [2025, 3.0], 20.0, 1.1, 0.0]', [[2024, 360.0], [2025, 3.0], 20.0, 1.1, 0.0], [9.0, 344.0]), ('mean anomaly propagation between epochs [[2100, 360.0], [2101, 2.0], 20.0, 0.9, 0.0]', [[2100, 360.0], [2101, 2.0], 20.0, 0.9, 0.0], [7.0, 128.0]), ('mean anomaly propagation between epochs [[2026, 1.0], [2026, 3.0], 350.0, 14.25, 0.0001]', [[2026, 1.0], [2026, 3.0], 350.0, 14.25, 0.0001], [2.0, 170.144]), ('mean anomaly propagation between epochs [[2025, 200.0], [2025, 210.0], 0.0, 15.0, -5e-05]', [[2025, 200.0], [2025, 210.0], 0.0, 15.0, -5e-05], [10.0, 358.2]), ('mean anomaly propagation between epochs [[2026, 5.0], [2026, 5.0], 12.5, 15.0, 0.0]', [[2026, 5.0], [2026, 5.0], 12.5, 15.0, 0.0], [0.0, 12.5]), ('mean anomaly propagation between epochs [[2026, 50.3], [2026, 51.1], 90.0, 11.1, 0.0]', [[2026, 50.3], [2026, 51.1], 90.0, 11.1, 0.0], [0.8, 46.8]), ('mean anomaly propagation between epochs [[2026, 50.7], [2026, 50.2], 270.0, 16.0, 0.0]', [[2026, 50.7], [2026, 50.2], 270.0, 16.0, 0.0], [-0.5, 270.0])], [('mean anomaly propagation between epochs [[2024, 360.0], [2025, 3.0], 20.0, 1.1, 0.0]', [[2024, 360.0], [2025, 3.0], 20.0, 1.1, 0.0], [9.0, 344.0]), ('mean anomaly propagation between epochs [[2100, 360.0], [2101, 2.0], 20.0, 0.9, 0.0]', [[2100, 360.0], [2101, 2.0], 20.0, 0.9, 0.0], [7.0, 128.0]), ('mean anomaly propagation between epochs [[2026, 50.3], [2026, 51.1], 90.0, 11.1, 0.0]', [[2026, 50.3], [2026, 51.1], 90.0, 11.1, 0.0], [0.8, 46.8]), ('mean anomaly propagation between epochs [[2026, 50.7], [2026, 50.2], 270.0, 16.0, 0.0]', [[2026, 50.7], [2026, 50.2], 270.0, 16.0, 0.0], [-0.5, 270.0]), ('mean anomaly propagation between epochs [[2000, 59.5], [2000, 61.5], 5.0, 1.0, 2e-05]', [[2000, 59.5], [2000, 61.5], 5.0, 1.0, 2e-05], [2.0, 5.0288]), ('mean anomaly propagation between epochs [[2026, 100.0], [2026, 99.5], 300.0, 0.1, 0.0]', [[2026, 100.0], [2026, 99.5], 300.0, 0.1, 0.0], [-0.5, 282.0]), ('mean anomaly propagation between epochs [[2027, 10.0], [2027, 9.0], 350.0, 0.05, 0.0]', [[2027, 10.0], [2027, 9.0], 350.0, 0.05, 0.0], [-1.0, 332.0])], [('mean anomaly propagation between epochs [[2024, 360.0], [2025, 3.0], 20.0, 1.1, 0.0]', [[2024, 360.0], [2025, 3.0], 20.0, 1.1, 0.0], [9.0, 344.0]), ('mean anomaly propagation between epochs [[2100, 360.0], [2101, 2.0], 20.0, 0.9, 0.0]', [[2100, 360.0], [2101, 2.0], 20.0, 0.9, 0.0], [7.0, 128.0]), ('mean anomaly propagation between epochs [[2026, 100.0], [2026, 99.5], 300.0, 0.1, 0.0]', [[2026, 100.0], [2026, 99.5], 300.0, 0.1, 0.0], [-0.5, 282.0]), ('mean anomaly propagation between epochs [[2027, 10.0], [2027, 9.0], 350.0, 0.05, 0.0]', [[2027, 10.0], [2027, 9.0], 350.0, 0.05, 0.0], [-1.0, 332.0]), ('mean anomaly propagation between epochs [[2026, 10.25], [2026, 12.75], 30.0, 15.5, 0.0]', [[2026, 10.25], [2026, 12.75], 30.0, 15.5, 0.0], [2.5, 300.0]), ('mean anomaly propagation between epochs [[2023, 360.5], [2024, 2.5], 100.0, 1.00273, 0.0]', [[2023, 360.5], [2024, 2.5], 100.0, 1.00273, 0.0], [7.0, 106.8796]), ('mean anomaly propagation between epochs [[2024, 59.0], [2024, 61.0], 0.0, 2.0, 0.0]', [[2024, 59.0], [2024, 61.0], 0.0, 2.0, 0.0], [2.0, 0.0])]]
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 |
|---|---|---|---|
| mean anomaly propagation between epochs [[2024, 360.0], [2025, 3.0], 20.0, 1.1, 0.0] | [9.0, 344.0] | [9.0, 344.0] | Passed |
| mean anomaly propagation between epochs [[2100, 360.0], [2101, 2.0], 20.0, 0.9, 0.0] | [7.0, 128.0] | [7.0, 128.0] | Passed |
| mean anomaly propagation between epochs [[2026, 10.25], [2026, 12.75], 30.0, 15.5, 0.0] | [2.5, 300.0] | [2.5, 300.0] | Passed |
| mean anomaly propagation between epochs [[2023, 360.5], [2024, 2.5], 100.0, 1.00273, 0.0] | [7.0, 106.8796] | [7.0, 106.8796] | Passed |
| mean anomaly propagation between epochs [[2024, 59.0], [2024, 61.0], 0.0, 2.0, 0.0] | [2.0, 0.0] | [2.0, 0.0] | Passed |
| mean anomaly propagation between epochs [[2099, 365.0], [2100, 60.0], 10.0, 0.5, 0.0] | [60.0, 10.0] | [60.0, 10.0] | Passed |
| mean anomaly propagation between epochs [[2100, 59.0], [2100, 61.0], 10.0, 0.25, 0.0] | [2.0, 190.0] | [2.0, 190.0] | Passed |
SHA-256 / f73f9355028914cd72d6181f0ab756e0cd264b7dc298629ed2251757aa4e07fe
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:10.914421+00:00.
Case digest / 33f9fdfe3d42e5e94d48cccdc4c37f8f5bcc04e8cb833b51f566f27ea2cd3af3