FAILURE MAP
← Case archive

FA-69656 / Orbital propagation / Open access

Hohmann transfer budget: Arrival speed uses the departure radius · case 01

Arrival burn equals the departure burn geometry.

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

ROOT CAUSE

Vis-viva at arrival is evaluated at r1.

VERIFIED REPAIR

Evaluate vis-viva at r2 (equivalently vp*r1/r2).

Unsuccessful approach: Scaling by r2/r1 inverts angular momentum conservation.

Case contract

Input [r1, r2, mu] circular radii. Transfer a=(r1+r2)/2; burn 1 = |v_peri - v_circ1|, burn 2 = |v_circ2 - v_apo| using vis-viva at each end; time of flight is half the transfer period. Works inward (r2<r1) too. Return [dv1, dv2, total] rounded 6 and tof 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):
    r1,r2,mu=x
    at=(r1+r2)/2
    v1=math.sqrt(mu/r1); v2=math.sqrt(mu/r2)
    vp=math.sqrt(mu*(2/r1-1/at)); va=math.sqrt(mu*(2/r1-1/at))
    dv1=abs(vp-v1); dv2=abs(v2-va)
    tof=math.pi*math.sqrt(at**3/mu)
    return [round(dv1,6),round(dv2,6),round(dv1+dv2,6),round(tof,3)]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('hohmann transfer budget [6678.0, 42164.0, 398600.4418]', [6678.0, 42164.0, 398600.4418], [2.425769, 1.466839, 3.892608, 18990.052]), ('hohmann transfer budget [42164.0, 6678.0, 398600.4418]', [42164.0, 6678.0, 398600.4418], [1.466839, 2.425769, 3.892608, 18990.052]), ('hohmann transfer budget [7000.0, 7500.0, 398600.4418]', [7000.0, 7500.0, 398600.4418], [0.129002, 0.126795, 0.255797, 3071.765]), ('hohmann transfer budget [1.0, 1.524, 1.0]', [1.0, 1.524, 1.0], [0.098912, 0.088971, 0.187883, 4.454]), ('hohmann transfer budget [1.0, 5.2, 1.0]', [1.0, 5.2, 1.0], [0.295152, 0.189461, 0.484614, 17.147]), ('hohmann transfer budget [6778.0, 6778.0, 398600.4418]', [6778.0, 6778.0, 398600.4418], [0.0, 0.0, 0.0, 2776.728]), ('hohmann transfer budget [10000.0, 7000.0, 398600.4418]', [10000.0, 7000.0, 398600.4418], [0.58409, 0.638791, 1.222881, 3899.504])], [('hohmann transfer budget [42164.0, 6678.0, 398600.4418]', [42164.0, 6678.0, 398600.4418], [1.466839, 2.425769, 3.892608, 18990.052]), ('hohmann transfer budget [1.0, 1.524, 1.0]', [1.0, 1.524, 1.0], [0.098912, 0.088971, 0.187883, 4.454]), ('hohmann transfer budget [1.0, 5.2, 1.0]', [1.0, 5.2, 1.0], [0.295152, 0.189461, 0.484614, 17.147]), ('hohmann transfer budget [6778.0, 6778.0, 398600.4418]', [6778.0, 6778.0, 398600.4418], [0.0, 0.0, 0.0, 2776.728]), ('hohmann transfer budget [10000.0, 7000.0, 398600.4418]', [10000.0, 7000.0, 398600.4418], [0.58409, 0.638791, 1.222881, 3899.504]), ('hohmann transfer budget [7000.0, 8000.0, 398600.4418]', [7000.0, 8000.0, 398600.4418], [0.247477, 0.239347, 0.486825, 3232.011]), ('hohmann transfer budget [8000.0, 7000.0, 398600.4418]', [8000.0, 7000.0, 398600.4418], [0.239347, 0.247477, 0.486825, 3232.011])], [('hohmann transfer budget [7000.0, 7500.0, 398600.4418]', [7000.0, 7500.0, 398600.4418], [0.129002, 0.126795, 0.255797, 3071.765]), ('hohmann transfer budget [10000.0, 7000.0, 398600.4418]', [10000.0, 7000.0, 398600.4418], [0.58409, 0.638791, 1.222881, 3899.504]), ('hohmann transfer budget [7000.0, 8000.0, 398600.4418]', [7000.0, 8000.0, 398600.4418], [0.247477, 0.239347, 0.486825, 3232.011]), ('hohmann transfer budget [8000.0, 7000.0, 398600.4418]', [8000.0, 7000.0, 398600.4418], [0.239347, 0.247477, 0.486825, 3232.011]), ('hohmann transfer budget [1.0, 1.2, 1.0]', [1.0, 1.2, 1.0], [0.044466, 0.042483, 0.086949, 3.624]), ('hohmann transfer budget [1.3, 1.0, 1.0]', [1.3, 1.0, 1.0], [0.059197, 0.063219, 0.122416, 3.874]), ('hohmann transfer budget [6778.0, 7178.0, 398600.4418]', [6778.0, 7178.0, 398600.4418], [0.109121, 0.107568, 0.216689, 2900.53])], [('hohmann transfer budget [1.0, 1.524, 1.0]', [1.0, 1.524, 1.0], [0.098912, 0.088971, 0.187883, 4.454]), ('hohmann transfer budget [1.0, 1.2, 1.0]', [1.0, 1.2, 1.0], [0.044466, 0.042483, 0.086949, 3.624]), ('hohmann transfer budget [1.3, 1.0, 1.0]', [1.3, 1.0, 1.0], [0.059197, 0.063219, 0.122416, 3.874]), ('hohmann transfer budget [6778.0, 7178.0, 398600.4418]', [6778.0, 7178.0, 398600.4418], [0.109121, 0.107568, 0.216689, 2900.53]), ('hohmann transfer budget [6678.0, 42164.0, 398600.4418]', [6678.0, 42164.0, 398600.4418], [2.425769, 1.466839, 3.892608, 18990.052]), ('hohmann transfer budget [42164.0, 6678.0, 398600.4418]', [42164.0, 6678.0, 398600.4418], [1.466839, 2.425769, 3.892608, 18990.052]), ('hohmann transfer budget [7000.0, 7500.0, 398600.4418]', [7000.0, 7500.0, 398600.4418], [0.129002, 0.126795, 0.255797, 3071.765])], [('hohmann transfer budget [1.0, 5.2, 1.0]', [1.0, 5.2, 1.0], [0.295152, 0.189461, 0.484614, 17.147]), ('hohmann transfer budget [6678.0, 42164.0, 398600.4418]', [6678.0, 42164.0, 398600.4418], [2.425769, 1.466839, 3.892608, 18990.052]), ('hohmann transfer budget [42164.0, 6678.0, 398600.4418]', [42164.0, 6678.0, 398600.4418], [1.466839, 2.425769, 3.892608, 18990.052]), ('hohmann transfer budget [7000.0, 7500.0, 398600.4418]', [7000.0, 7500.0, 398600.4418], [0.129002, 0.126795, 0.255797, 3071.765]), ('hohmann transfer budget [1.0, 1.524, 1.0]', [1.0, 1.524, 1.0], [0.098912, 0.088971, 0.187883, 4.454]), ('hohmann transfer budget [6778.0, 6778.0, 398600.4418]', [6778.0, 6778.0, 398600.4418], [0.0, 0.0, 0.0, 2776.728]), ('hohmann transfer budget [10000.0, 7000.0, 398600.4418]', [10000.0, 7000.0, 398600.4418], [0.58409, 0.638791, 1.222881, 3899.504])]]
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
hohmann transfer budget [6678.0, 42164.0, 398600.4418][2.425769, 7.076942, 9.502711, 18990.052][2.425769, 1.466839, 3.892608, 18990.052]Failed
hohmann transfer budget [42164.0, 6678.0, 398600.4418][1.466839, 6.118012, 7.584851, 18990.052][1.466839, 2.425769, 3.892608, 18990.052]Failed
hohmann transfer budget [7000.0, 7500.0, 398600.4418][0.129002, 0.384875, 0.513877, 3071.765][0.129002, 0.126795, 0.255797, 3071.765]Failed
hohmann transfer budget [1.0, 1.524, 1.0][0.098912, 0.28887, 0.387781, 4.454][0.098912, 0.088971, 0.187883, 4.454]Failed
hohmann transfer budget [1.0, 5.2, 1.0][0.295152, 0.856623, 1.151775, 17.147][0.295152, 0.189461, 0.484614, 17.147]Failed
hohmann transfer budget [6778.0, 6778.0, 398600.4418][0.0, 0.0, 0.0, 2776.728][0.0, 0.0, 0.0, 2776.728]Passed
hohmann transfer budget [10000.0, 7000.0, 398600.4418][0.58409, 1.816663, 2.400753, 3899.504][0.58409, 0.638791, 1.222881, 3899.504]Failed

SHA-256 / 40b09ced3fbbb9579c48f6bb9026e4c0ea4cbc54b7159fcf92610588f368cfed

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(x):
    r1,r2,mu=x
    at=(r1+r2)/2
    v1=math.sqrt(mu/r1); v2=math.sqrt(mu/r2)
    vp=math.sqrt(mu*(2/r1-1/at)); va=vp*r2/r1
    dv1=abs(vp-v1); dv2=abs(v2-va)
    tof=math.pi*math.sqrt(at**3/mu)
    return [round(dv1,6),round(dv2,6),round(dv1+dv2,6),round(tof,3)]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('hohmann transfer budget [6678.0, 42164.0, 398600.4418]', [6678.0, 42164.0, 398600.4418], [2.425769, 1.466839, 3.892608, 18990.052]), ('hohmann transfer budget [42164.0, 6678.0, 398600.4418]', [42164.0, 6678.0, 398600.4418], [1.466839, 2.425769, 3.892608, 18990.052]), ('hohmann transfer budget [7000.0, 7500.0, 398600.4418]', [7000.0, 7500.0, 398600.4418], [0.129002, 0.126795, 0.255797, 3071.765]), ('hohmann transfer budget [1.0, 1.524, 1.0]', [1.0, 1.524, 1.0], [0.098912, 0.088971, 0.187883, 4.454]), ('hohmann transfer budget [1.0, 5.2, 1.0]', [1.0, 5.2, 1.0], [0.295152, 0.189461, 0.484614, 17.147]), ('hohmann transfer budget [6778.0, 6778.0, 398600.4418]', [6778.0, 6778.0, 398600.4418], [0.0, 0.0, 0.0, 2776.728]), ('hohmann transfer budget [10000.0, 7000.0, 398600.4418]', [10000.0, 7000.0, 398600.4418], [0.58409, 0.638791, 1.222881, 3899.504])], [('hohmann transfer budget [42164.0, 6678.0, 398600.4418]', [42164.0, 6678.0, 398600.4418], [1.466839, 2.425769, 3.892608, 18990.052]), ('hohmann transfer budget [1.0, 1.524, 1.0]', [1.0, 1.524, 1.0], [0.098912, 0.088971, 0.187883, 4.454]), ('hohmann transfer budget [1.0, 5.2, 1.0]', [1.0, 5.2, 1.0], [0.295152, 0.189461, 0.484614, 17.147]), ('hohmann transfer budget [6778.0, 6778.0, 398600.4418]', [6778.0, 6778.0, 398600.4418], [0.0, 0.0, 0.0, 2776.728]), ('hohmann transfer budget [10000.0, 7000.0, 398600.4418]', [10000.0, 7000.0, 398600.4418], [0.58409, 0.638791, 1.222881, 3899.504]), ('hohmann transfer budget [7000.0, 8000.0, 398600.4418]', [7000.0, 8000.0, 398600.4418], [0.247477, 0.239347, 0.486825, 3232.011]), ('hohmann transfer budget [8000.0, 7000.0, 398600.4418]', [8000.0, 7000.0, 398600.4418], [0.239347, 0.247477, 0.486825, 3232.011])], [('hohmann transfer budget [7000.0, 7500.0, 398600.4418]', [7000.0, 7500.0, 398600.4418], [0.129002, 0.126795, 0.255797, 3071.765]), ('hohmann transfer budget [10000.0, 7000.0, 398600.4418]', [10000.0, 7000.0, 398600.4418], [0.58409, 0.638791, 1.222881, 3899.504]), ('hohmann transfer budget [7000.0, 8000.0, 398600.4418]', [7000.0, 8000.0, 398600.4418], [0.247477, 0.239347, 0.486825, 3232.011]), ('hohmann transfer budget [8000.0, 7000.0, 398600.4418]', [8000.0, 7000.0, 398600.4418], [0.239347, 0.247477, 0.486825, 3232.011]), ('hohmann transfer budget [1.0, 1.2, 1.0]', [1.0, 1.2, 1.0], [0.044466, 0.042483, 0.086949, 3.624]), ('hohmann transfer budget [1.3, 1.0, 1.0]', [1.3, 1.0, 1.0], [0.059197, 0.063219, 0.122416, 3.874]), ('hohmann transfer budget [6778.0, 7178.0, 398600.4418]', [6778.0, 7178.0, 398600.4418], [0.109121, 0.107568, 0.216689, 2900.53])], [('hohmann transfer budget [1.0, 1.524, 1.0]', [1.0, 1.524, 1.0], [0.098912, 0.088971, 0.187883, 4.454]), ('hohmann transfer budget [1.0, 1.2, 1.0]', [1.0, 1.2, 1.0], [0.044466, 0.042483, 0.086949, 3.624]), ('hohmann transfer budget [1.3, 1.0, 1.0]', [1.3, 1.0, 1.0], [0.059197, 0.063219, 0.122416, 3.874]), ('hohmann transfer budget [6778.0, 7178.0, 398600.4418]', [6778.0, 7178.0, 398600.4418], [0.109121, 0.107568, 0.216689, 2900.53]), ('hohmann transfer budget [6678.0, 42164.0, 398600.4418]', [6678.0, 42164.0, 398600.4418], [2.425769, 1.466839, 3.892608, 18990.052]), ('hohmann transfer budget [42164.0, 6678.0, 398600.4418]', [42164.0, 6678.0, 398600.4418], [1.466839, 2.425769, 3.892608, 18990.052]), ('hohmann transfer budget [7000.0, 7500.0, 398600.4418]', [7000.0, 7500.0, 398600.4418], [0.129002, 0.126795, 0.255797, 3071.765])], [('hohmann transfer budget [1.0, 5.2, 1.0]', [1.0, 5.2, 1.0], [0.295152, 0.189461, 0.484614, 17.147]), ('hohmann transfer budget [6678.0, 42164.0, 398600.4418]', [6678.0, 42164.0, 398600.4418], [2.425769, 1.466839, 3.892608, 18990.052]), ('hohmann transfer budget [42164.0, 6678.0, 398600.4418]', [42164.0, 6678.0, 398600.4418], [1.466839, 2.425769, 3.892608, 18990.052]), ('hohmann transfer budget [7000.0, 7500.0, 398600.4418]', [7000.0, 7500.0, 398600.4418], [0.129002, 0.126795, 0.255797, 3071.765]), ('hohmann transfer budget [1.0, 1.524, 1.0]', [1.0, 1.524, 1.0], [0.098912, 0.088971, 0.187883, 4.454]), ('hohmann transfer budget [6778.0, 6778.0, 398600.4418]', [6778.0, 6778.0, 398600.4418], [0.0, 0.0, 0.0, 2776.728]), ('hohmann transfer budget [10000.0, 7000.0, 398600.4418]', [10000.0, 7000.0, 398600.4418], [0.58409, 0.638791, 1.222881, 3899.504])]]
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
hohmann transfer budget [6678.0, 42164.0, 398600.4418][2.425769, 61.021234, 63.447003, 18990.052][2.425769, 1.466839, 3.892608, 18990.052]Failed
hohmann transfer budget [42164.0, 6678.0, 398600.4418][1.466839, 7.471189, 8.938028, 18990.052][1.466839, 2.425769, 3.892608, 18990.052]Failed
hohmann transfer budget [7000.0, 7500.0, 398600.4418][0.129002, 0.933093, 1.062095, 3071.765][0.129002, 0.126795, 0.255797, 3071.765]Failed
hohmann transfer budget [1.0, 1.524, 1.0][0.098912, 0.8647, 0.963611, 4.454][0.098912, 0.088971, 0.187883, 4.454]Failed
hohmann transfer budget [1.0, 5.2, 1.0][0.295152, 6.296263, 6.591415, 17.147][0.295152, 0.189461, 0.484614, 17.147]Failed
hohmann transfer budget [6778.0, 6778.0, 398600.4418][0.0, 0.0, 0.0, 2776.728][0.0, 0.0, 0.0, 2776.728]Passed
hohmann transfer budget [10000.0, 7000.0, 398600.4418][0.58409, 3.53548, 4.11957, 3899.504][0.58409, 0.638791, 1.222881, 3899.504]Failed

SHA-256 / 0f087622068eb8203175a9128762fa71573e1752b03c3fd921b582ce9bf599f0

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(x):
    r1,r2,mu=x
    at=(r1+r2)/2
    v1=math.sqrt(mu/r1); v2=math.sqrt(mu/r2)
    vp=math.sqrt(mu*(2/r1-1/at)); va=math.sqrt(mu*(2/r2-1/at))
    dv1=abs(vp-v1); dv2=abs(v2-va)
    tof=math.pi*math.sqrt(at**3/mu)
    return [round(dv1,6),round(dv2,6),round(dv1+dv2,6),round(tof,3)]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('hohmann transfer budget [6678.0, 42164.0, 398600.4418]', [6678.0, 42164.0, 398600.4418], [2.425769, 1.466839, 3.892608, 18990.052]), ('hohmann transfer budget [42164.0, 6678.0, 398600.4418]', [42164.0, 6678.0, 398600.4418], [1.466839, 2.425769, 3.892608, 18990.052]), ('hohmann transfer budget [7000.0, 7500.0, 398600.4418]', [7000.0, 7500.0, 398600.4418], [0.129002, 0.126795, 0.255797, 3071.765]), ('hohmann transfer budget [1.0, 1.524, 1.0]', [1.0, 1.524, 1.0], [0.098912, 0.088971, 0.187883, 4.454]), ('hohmann transfer budget [1.0, 5.2, 1.0]', [1.0, 5.2, 1.0], [0.295152, 0.189461, 0.484614, 17.147]), ('hohmann transfer budget [6778.0, 6778.0, 398600.4418]', [6778.0, 6778.0, 398600.4418], [0.0, 0.0, 0.0, 2776.728]), ('hohmann transfer budget [10000.0, 7000.0, 398600.4418]', [10000.0, 7000.0, 398600.4418], [0.58409, 0.638791, 1.222881, 3899.504])], [('hohmann transfer budget [42164.0, 6678.0, 398600.4418]', [42164.0, 6678.0, 398600.4418], [1.466839, 2.425769, 3.892608, 18990.052]), ('hohmann transfer budget [1.0, 1.524, 1.0]', [1.0, 1.524, 1.0], [0.098912, 0.088971, 0.187883, 4.454]), ('hohmann transfer budget [1.0, 5.2, 1.0]', [1.0, 5.2, 1.0], [0.295152, 0.189461, 0.484614, 17.147]), ('hohmann transfer budget [6778.0, 6778.0, 398600.4418]', [6778.0, 6778.0, 398600.4418], [0.0, 0.0, 0.0, 2776.728]), ('hohmann transfer budget [10000.0, 7000.0, 398600.4418]', [10000.0, 7000.0, 398600.4418], [0.58409, 0.638791, 1.222881, 3899.504]), ('hohmann transfer budget [7000.0, 8000.0, 398600.4418]', [7000.0, 8000.0, 398600.4418], [0.247477, 0.239347, 0.486825, 3232.011]), ('hohmann transfer budget [8000.0, 7000.0, 398600.4418]', [8000.0, 7000.0, 398600.4418], [0.239347, 0.247477, 0.486825, 3232.011])], [('hohmann transfer budget [7000.0, 7500.0, 398600.4418]', [7000.0, 7500.0, 398600.4418], [0.129002, 0.126795, 0.255797, 3071.765]), ('hohmann transfer budget [10000.0, 7000.0, 398600.4418]', [10000.0, 7000.0, 398600.4418], [0.58409, 0.638791, 1.222881, 3899.504]), ('hohmann transfer budget [7000.0, 8000.0, 398600.4418]', [7000.0, 8000.0, 398600.4418], [0.247477, 0.239347, 0.486825, 3232.011]), ('hohmann transfer budget [8000.0, 7000.0, 398600.4418]', [8000.0, 7000.0, 398600.4418], [0.239347, 0.247477, 0.486825, 3232.011]), ('hohmann transfer budget [1.0, 1.2, 1.0]', [1.0, 1.2, 1.0], [0.044466, 0.042483, 0.086949, 3.624]), ('hohmann transfer budget [1.3, 1.0, 1.0]', [1.3, 1.0, 1.0], [0.059197, 0.063219, 0.122416, 3.874]), ('hohmann transfer budget [6778.0, 7178.0, 398600.4418]', [6778.0, 7178.0, 398600.4418], [0.109121, 0.107568, 0.216689, 2900.53])], [('hohmann transfer budget [1.0, 1.524, 1.0]', [1.0, 1.524, 1.0], [0.098912, 0.088971, 0.187883, 4.454]), ('hohmann transfer budget [1.0, 1.2, 1.0]', [1.0, 1.2, 1.0], [0.044466, 0.042483, 0.086949, 3.624]), ('hohmann transfer budget [1.3, 1.0, 1.0]', [1.3, 1.0, 1.0], [0.059197, 0.063219, 0.122416, 3.874]), ('hohmann transfer budget [6778.0, 7178.0, 398600.4418]', [6778.0, 7178.0, 398600.4418], [0.109121, 0.107568, 0.216689, 2900.53]), ('hohmann transfer budget [6678.0, 42164.0, 398600.4418]', [6678.0, 42164.0, 398600.4418], [2.425769, 1.466839, 3.892608, 18990.052]), ('hohmann transfer budget [42164.0, 6678.0, 398600.4418]', [42164.0, 6678.0, 398600.4418], [1.466839, 2.425769, 3.892608, 18990.052]), ('hohmann transfer budget [7000.0, 7500.0, 398600.4418]', [7000.0, 7500.0, 398600.4418], [0.129002, 0.126795, 0.255797, 3071.765])], [('hohmann transfer budget [1.0, 5.2, 1.0]', [1.0, 5.2, 1.0], [0.295152, 0.189461, 0.484614, 17.147]), ('hohmann transfer budget [6678.0, 42164.0, 398600.4418]', [6678.0, 42164.0, 398600.4418], [2.425769, 1.466839, 3.892608, 18990.052]), ('hohmann transfer budget [42164.0, 6678.0, 398600.4418]', [42164.0, 6678.0, 398600.4418], [1.466839, 2.425769, 3.892608, 18990.052]), ('hohmann transfer budget [7000.0, 7500.0, 398600.4418]', [7000.0, 7500.0, 398600.4418], [0.129002, 0.126795, 0.255797, 3071.765]), ('hohmann transfer budget [1.0, 1.524, 1.0]', [1.0, 1.524, 1.0], [0.098912, 0.088971, 0.187883, 4.454]), ('hohmann transfer budget [6778.0, 6778.0, 398600.4418]', [6778.0, 6778.0, 398600.4418], [0.0, 0.0, 0.0, 2776.728]), ('hohmann transfer budget [10000.0, 7000.0, 398600.4418]', [10000.0, 7000.0, 398600.4418], [0.58409, 0.638791, 1.222881, 3899.504])]]
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
hohmann transfer budget [6678.0, 42164.0, 398600.4418][2.425769, 1.466839, 3.892608, 18990.052][2.425769, 1.466839, 3.892608, 18990.052]Passed
hohmann transfer budget [42164.0, 6678.0, 398600.4418][1.466839, 2.425769, 3.892608, 18990.052][1.466839, 2.425769, 3.892608, 18990.052]Passed
hohmann transfer budget [7000.0, 7500.0, 398600.4418][0.129002, 0.126795, 0.255797, 3071.765][0.129002, 0.126795, 0.255797, 3071.765]Passed
hohmann transfer budget [1.0, 1.524, 1.0][0.098912, 0.088971, 0.187883, 4.454][0.098912, 0.088971, 0.187883, 4.454]Passed
hohmann transfer budget [1.0, 5.2, 1.0][0.295152, 0.189461, 0.484614, 17.147][0.295152, 0.189461, 0.484614, 17.147]Passed
hohmann transfer budget [6778.0, 6778.0, 398600.4418][0.0, 0.0, 0.0, 2776.728][0.0, 0.0, 0.0, 2776.728]Passed
hohmann transfer budget [10000.0, 7000.0, 398600.4418][0.58409, 0.638791, 1.222881, 3899.504][0.58409, 0.638791, 1.222881, 3899.504]Passed

SHA-256 / 15a7ad378045a2d939ee0ad15577ef5cfae0e5aedd02ccb41e7f1c095391cb77

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

Case digest / b0a65dfb9dd8d9cb54135c2ea929b82a7ca95cea10b7aa5a89257733b090e0eb