FAILURE MAP
← Case archive

FA-69411 / Orbital propagation / Open access

Mean anomaly propagation between epochs: Epoch fractions of a day are discarded · case 01

Propagation from sub-day epochs is off by hours of motion.

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

ROOT CAUSE

Day-of-year values are truncated to whole days.

VERIFIED REPAIR

Keep the fractional day.

Unsuccessful approach: Rounding to the nearest whole day still discards the time of day.

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 datetime.date(y,1,1).toordinal()+int(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 [[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 [[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 [[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 [[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, 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.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, 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.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 [[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 [[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 [[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 [[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 [[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, 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 [[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 [[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 fixtureActualExpectedOutcome
mean anomaly propagation between epochs [[2026, 10.25], [2026, 12.75], 30.0, 15.5, 0.0][2, 30.0][2.5, 300.0]Failed
mean anomaly propagation between epochs [[2023, 360.5], [2024, 2.5], 100.0, 1.00273, 0.0][7, 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][2.0, 0.0]Passed
mean anomaly propagation between epochs [[2099, 365.0], [2100, 60.0], 10.0, 0.5, 0.0][60, 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, 190.0][2.0, 190.0]Passed
mean anomaly propagation between epochs [[2026, 100.0], [2026, 90.5], 45.0, 13.2, 0.0][-10, 45.0][-9.5, 261.0]Failed
mean anomaly propagation between epochs [[2026, 1.0], [2026, 3.0], 350.0, 14.25, 0.0001][2, 170.144][2.0, 170.144]Passed

SHA-256 / ffaf83b2383688e03e13d84b09f3e7955e26dfcd9911cf3d4f5660379f0d85af

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 datetime.date(y,1,1).toordinal()+round(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 [[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 [[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 [[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 [[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, 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.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, 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.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 [[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 [[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 [[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 [[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 [[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, 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 [[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 [[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 fixtureActualExpectedOutcome
mean anomaly propagation between epochs [[2026, 10.25], [2026, 12.75], 30.0, 15.5, 0.0][3, 210.0][2.5, 300.0]Failed
mean anomaly propagation between epochs [[2023, 360.5], [2024, 2.5], 100.0, 1.00273, 0.0][7, 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][2.0, 0.0]Passed
mean anomaly propagation between epochs [[2099, 365.0], [2100, 60.0], 10.0, 0.5, 0.0][60, 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, 190.0][2.0, 190.0]Passed
mean anomaly propagation between epochs [[2026, 100.0], [2026, 90.5], 45.0, 13.2, 0.0][-10, 45.0][-9.5, 261.0]Failed
mean anomaly propagation between epochs [[2026, 1.0], [2026, 3.0], 350.0, 14.25, 0.0001][2, 170.144][2.0, 170.144]Passed

SHA-256 / 25db7ae5f608837be535ae19a37702670d35c75c4a81712e341956152cc6fdec

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 [[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 [[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 [[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 [[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, 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.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, 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.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 [[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 [[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 [[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 [[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 [[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, 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 [[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 [[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 fixtureActualExpectedOutcome
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
mean anomaly propagation between epochs [[2026, 100.0], [2026, 90.5], 45.0, 13.2, 0.0][-9.5, 261.0][-9.5, 261.0]Passed
mean anomaly propagation between epochs [[2026, 1.0], [2026, 3.0], 350.0, 14.25, 0.0001][2.0, 170.144][2.0, 170.144]Passed

SHA-256 / 937e2eef9aed9be1b7b03b5f5bcccbd83a22cd5a9ce17dc349546f62fb202b91

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

Case digest / d4c5064bd9c5ef6cd89cf37a03970274b728e558fa8a282667016cfb094eacaa