FAILURE MAP
← Case archive

FA-55346 / Astronomical coordinate conventions / Open access

Ephemeris relative state: Retarded barycentric target position is propagated with relative rather than target velocity · case 01

The adapter reports an incorrect retarded target position while other fields remain valid.

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

ROOT CAUSE

Retarded barycentric target position is propagated with relative rather than target velocity. Faulty expression: d['tx']+d['tv']*d['dt']

VERIFIED REPAIR

Preserve the declared model convention at this site: d['tx']-d['tv']*d['dt']

Unsuccessful approach: A partial convention repair still uses d['tx']-(d['tv']-d['cv'])*d['dt']

Case contract

A supplied ephemeris state for target T and center C is barycentric. Observer topocenter adds station displacement s and station velocity v to C. Output relative vectors use this explicit one-dimensional reduction; light-time iteration and relativity are outside scope. Output fields are defined by: geocentric_position = d['tx']-d['cx']; geocentric_velocity = d['tv']-d['cv']; observer_position = d['cx']+d['s']; observer_velocity = d['cv']+d['v']; topocentric_position = d['tx']-d['cx']-d['s']; retarded_target_position = d['tx']-d['tv']*d['dt']

Why this case matters

Catalog, detector, sky-coordinate, and spectroscopy adapters must preserve the association between numeric coordinates and their declared reference conventions.

1 / The failure

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(d):
    return {'geocentric_position': d['tx']-d['cx'], 'geocentric_velocity': d['tv']-d['cv'], 'observer_position': d['cx']+d['s'], 'observer_velocity': d['cv']+d['v'], 'topocentric_position': d['tx']-d['cx']-d['s'], 'retarded_target_position': d['tx']+d['tv']*d['dt']}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = {1: [({'tx': 100, 'tv': 12, 'cx': 30, 'cv': 3, 's': 2, 'v': 1, 'dt': 4}, {'geocentric_position': 70, 'geocentric_velocity': 9, 'observer_position': 32, 'observer_velocity': 4, 'topocentric_position': 68, 'retarded_target_position': 52}), ({'tx': 100, 'tv': 12, 'cx': 30, 'cv': 3, 's': 0, 'v': 0, 'dt': 4}, {'geocentric_position': 70, 'geocentric_velocity': 9, 'observer_position': 30, 'observer_velocity': 3, 'topocentric_position': 70, 'retarded_target_position': 52}), ({'tx': 100, 'tv': 12, 'cx': 0, 'cv': 0, 's': 2, 'v': 1, 'dt': 4}, {'geocentric_position': 100, 'geocentric_velocity': 12, 'observer_position': 2, 'observer_velocity': 1, 'topocentric_position': 98, 'retarded_target_position': 52}), ({'tx': 30, 'tv': 3, 'cx': 30, 'cv': 3, 's': 2, 'v': 1, 'dt': 4}, {'geocentric_position': 0, 'geocentric_velocity': 0, 'observer_position': 32, 'observer_velocity': 4, 'topocentric_position': -2, 'retarded_target_position': 18}), ({'tx': 100, 'tv': 12, 'cx': 30, 'cv': 3, 's': -4, 'v': -2, 'dt': 4}, {'geocentric_position': 70, 'geocentric_velocity': 9, 'observer_position': 26, 'observer_velocity': 1, 'topocentric_position': 74, 'retarded_target_position': 52}), ({'tx': 100, 'tv': 12, 'cx': 30, 'cv': 3, 's': 2, 'v': 1, 'dt': 0}, {'geocentric_position': 70, 'geocentric_velocity': 9, 'observer_position': 32, 'observer_velocity': 4, 'topocentric_position': 68, 'retarded_target_position': 100})], 2: [({'tx': 101, 'tv': 12, 'cx': 30, 'cv': 3, 's': 2, 'v': 1, 'dt': 4}, {'geocentric_position': 71, 'geocentric_velocity': 9, 'observer_position': 32, 'observer_velocity': 4, 'topocentric_position': 69, 'retarded_target_position': 53}), ({'tx': 101, 'tv': 12, 'cx': 30, 'cv': 3, 's': 0, 'v': 0, 'dt': 4}, {'geocentric_position': 71, 'geocentric_velocity': 9, 'observer_position': 30, 'observer_velocity': 3, 'topocentric_position': 71, 'retarded_target_position': 53}), ({'tx': 101, 'tv': 12, 'cx': 0, 'cv': 0, 's': 2, 'v': 1, 'dt': 4}, {'geocentric_position': 101, 'geocentric_velocity': 12, 'observer_position': 2, 'observer_velocity': 1, 'topocentric_position': 99, 'retarded_target_position': 53}), ({'tx': 31, 'tv': 3, 'cx': 30, 'cv': 3, 's': 2, 'v': 1, 'dt': 4}, {'geocentric_position': 1, 'geocentric_velocity': 0, 'observer_position': 32, 'observer_velocity': 4, 'topocentric_position': -1, 'retarded_target_position': 19}), ({'tx': 101, 'tv': 12, 'cx': 30, 'cv': 3, 's': -4, 'v': -2, 'dt': 4}, {'geocentric_position': 71, 'geocentric_velocity': 9, 'observer_position': 26, 'observer_velocity': 1, 'topocentric_position': 75, 'retarded_target_position': 53}), ({'tx': 101, 'tv': 12, 'cx': 30, 'cv': 3, 's': 2, 'v': 1, 'dt': 0}, {'geocentric_position': 71, 'geocentric_velocity': 9, 'observer_position': 32, 'observer_velocity': 4, 'topocentric_position': 69, 'retarded_target_position': 101})], 3: [({'tx': 102, 'tv': 12, 'cx': 30, 'cv': 3, 's': 2, 'v': 1, 'dt': 4}, {'geocentric_position': 72, 'geocentric_velocity': 9, 'observer_position': 32, 'observer_velocity': 4, 'topocentric_position': 70, 'retarded_target_position': 54}), ({'tx': 102, 'tv': 12, 'cx': 30, 'cv': 3, 's': 0, 'v': 0, 'dt': 4}, {'geocentric_position': 72, 'geocentric_velocity': 9, 'observer_position': 30, 'observer_velocity': 3, 'topocentric_position': 72, 'retarded_target_position': 54}), ({'tx': 102, 'tv': 12, 'cx': 0, 'cv': 0, 's': 2, 'v': 1, 'dt': 4}, {'geocentric_position': 102, 'geocentric_velocity': 12, 'observer_position': 2, 'observer_velocity': 1, 'topocentric_position': 100, 'retarded_target_position': 54}), ({'tx': 32, 'tv': 3, 'cx': 30, 'cv': 3, 's': 2, 'v': 1, 'dt': 4}, {'geocentric_position': 2, 'geocentric_velocity': 0, 'observer_position': 32, 'observer_velocity': 4, 'topocentric_position': 0, 'retarded_target_position': 20}), ({'tx': 102, 'tv': 12, 'cx': 30, 'cv': 3, 's': -4, 'v': -2, 'dt': 4}, {'geocentric_position': 72, 'geocentric_velocity': 9, 'observer_position': 26, 'observer_velocity': 1, 'topocentric_position': 76, 'retarded_target_position': 54}), ({'tx': 102, 'tv': 12, 'cx': 30, 'cv': 3, 's': 2, 'v': 1, 'dt': 0}, {'geocentric_position': 72, 'geocentric_velocity': 9, 'observer_position': 32, 'observer_velocity': 4, 'topocentric_position': 70, 'retarded_target_position': 102})], 4: [({'tx': 103, 'tv': 12, 'cx': 30, 'cv': 3, 's': 2, 'v': 1, 'dt': 4}, {'geocentric_position': 73, 'geocentric_velocity': 9, 'observer_position': 32, 'observer_velocity': 4, 'topocentric_position': 71, 'retarded_target_position': 55}), ({'tx': 103, 'tv': 12, 'cx': 30, 'cv': 3, 's': 0, 'v': 0, 'dt': 4}, {'geocentric_position': 73, 'geocentric_velocity': 9, 'observer_position': 30, 'observer_velocity': 3, 'topocentric_position': 73, 'retarded_target_position': 55}), ({'tx': 103, 'tv': 12, 'cx': 0, 'cv': 0, 's': 2, 'v': 1, 'dt': 4}, {'geocentric_position': 103, 'geocentric_velocity': 12, 'observer_position': 2, 'observer_velocity': 1, 'topocentric_position': 101, 'retarded_target_position': 55}), ({'tx': 33, 'tv': 3, 'cx': 30, 'cv': 3, 's': 2, 'v': 1, 'dt': 4}, {'geocentric_position': 3, 'geocentric_velocity': 0, 'observer_position': 32, 'observer_velocity': 4, 'topocentric_position': 1, 'retarded_target_position': 21}), ({'tx': 103, 'tv': 12, 'cx': 30, 'cv': 3, 's': -4, 'v': -2, 'dt': 4}, {'geocentric_position': 73, 'geocentric_velocity': 9, 'observer_position': 26, 'observer_velocity': 1, 'topocentric_position': 77, 'retarded_target_position': 55}), ({'tx': 103, 'tv': 12, 'cx': 30, 'cv': 3, 's': 2, 'v': 1, 'dt': 0}, {'geocentric_position': 73, 'geocentric_velocity': 9, 'observer_position': 32, 'observer_velocity': 4, 'topocentric_position': 71, 'retarded_target_position': 103})], 5: [({'tx': 104, 'tv': 12, 'cx': 30, 'cv': 3, 's': 2, 'v': 1, 'dt': 4}, {'geocentric_position': 74, 'geocentric_velocity': 9, 'observer_position': 32, 'observer_velocity': 4, 'topocentric_position': 72, 'retarded_target_position': 56}), ({'tx': 104, 'tv': 12, 'cx': 30, 'cv': 3, 's': 0, 'v': 0, 'dt': 4}, {'geocentric_position': 74, 'geocentric_velocity': 9, 'observer_position': 30, 'observer_velocity': 3, 'topocentric_position': 74, 'retarded_target_position': 56}), ({'tx': 104, 'tv': 12, 'cx': 0, 'cv': 0, 's': 2, 'v': 1, 'dt': 4}, {'geocentric_position': 104, 'geocentric_velocity': 12, 'observer_position': 2, 'observer_velocity': 1, 'topocentric_position': 102, 'retarded_target_position': 56}), ({'tx': 34, 'tv': 3, 'cx': 30, 'cv': 3, 's': 2, 'v': 1, 'dt': 4}, {'geocentric_position': 4, 'geocentric_velocity': 0, 'observer_position': 32, 'observer_velocity': 4, 'topocentric_position': 2, 'retarded_target_position': 22}), ({'tx': 104, 'tv': 12, 'cx': 30, 'cv': 3, 's': -4, 'v': -2, 'dt': 4}, {'geocentric_position': 74, 'geocentric_velocity': 9, 'observer_position': 26, 'observer_velocity': 1, 'topocentric_position': 78, 'retarded_target_position': 56}), ({'tx': 104, 'tv': 12, 'cx': 30, 'cv': 3, 's': 2, 'v': 1, 'dt': 0}, {'geocentric_position': 74, 'geocentric_velocity': 9, 'observer_position': 32, 'observer_velocity': 4, 'topocentric_position': 72, 'retarded_target_position': 104})]}
for i, (record, expected) in enumerate(fixtures[N]):
    check('astronomical fixture %s' % i, solve(record), 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
astronomical fixture 0{'geocentric_position': 70, 'geocentric_velocity': 9, 'observer_position': 32, 'observer_velocity': 4, 'retarded_target_position': 148, 'topocentric_position': 68}{'geocentric_position': 70, 'geocentric_velocity': 9, 'observer_position': 32, 'observer_velocity': 4, 'retarded_target_position': 52, 'topocentric_position': 68}Failed
astronomical fixture 1{'geocentric_position': 70, 'geocentric_velocity': 9, 'observer_position': 30, 'observer_velocity': 3, 'retarded_target_position': 148, 'topocentric_position': 70}{'geocentric_position': 70, 'geocentric_velocity': 9, 'observer_position': 30, 'observer_velocity': 3, 'retarded_target_position': 52, 'topocentric_position': 70}Failed
astronomical fixture 2{'geocentric_position': 100, 'geocentric_velocity': 12, 'observer_position': 2, 'observer_velocity': 1, 'retarded_target_position': 148, 'topocentric_position': 98}{'geocentric_position': 100, 'geocentric_velocity': 12, 'observer_position': 2, 'observer_velocity': 1, 'retarded_target_position': 52, 'topocentric_position': 98}Failed
astronomical fixture 3{'geocentric_position': 0, 'geocentric_velocity': 0, 'observer_position': 32, 'observer_velocity': 4, 'retarded_target_position': 42, 'topocentric_position': -2}{'geocentric_position': 0, 'geocentric_velocity': 0, 'observer_position': 32, 'observer_velocity': 4, 'retarded_target_position': 18, 'topocentric_position': -2}Failed
astronomical fixture 4{'geocentric_position': 70, 'geocentric_velocity': 9, 'observer_position': 26, 'observer_velocity': 1, 'retarded_target_position': 148, 'topocentric_position': 74}{'geocentric_position': 70, 'geocentric_velocity': 9, 'observer_position': 26, 'observer_velocity': 1, 'retarded_target_position': 52, 'topocentric_position': 74}Failed
astronomical fixture 5{'geocentric_position': 70, 'geocentric_velocity': 9, 'observer_position': 32, 'observer_velocity': 4, 'retarded_target_position': 100, 'topocentric_position': 68}{'geocentric_position': 70, 'geocentric_velocity': 9, 'observer_position': 32, 'observer_velocity': 4, 'retarded_target_position': 100, 'topocentric_position': 68}Passed

SHA-256 / 0e611d30fb4ba741f99f1edfdab2b5cbbf1eadd294e58d119e23882d3e1add04

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(d):
    return {'geocentric_position': d['tx']-d['cx'], 'geocentric_velocity': d['tv']-d['cv'], 'observer_position': d['cx']+d['s'], 'observer_velocity': d['cv']+d['v'], 'topocentric_position': d['tx']-d['cx']-d['s'], 'retarded_target_position': d['tx']-(d['tv']-d['cv'])*d['dt']}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = {1: [({'tx': 100, 'tv': 12, 'cx': 30, 'cv': 3, 's': 2, 'v': 1, 'dt': 4}, {'geocentric_position': 70, 'geocentric_velocity': 9, 'observer_position': 32, 'observer_velocity': 4, 'topocentric_position': 68, 'retarded_target_position': 52}), ({'tx': 100, 'tv': 12, 'cx': 30, 'cv': 3, 's': 0, 'v': 0, 'dt': 4}, {'geocentric_position': 70, 'geocentric_velocity': 9, 'observer_position': 30, 'observer_velocity': 3, 'topocentric_position': 70, 'retarded_target_position': 52}), ({'tx': 100, 'tv': 12, 'cx': 0, 'cv': 0, 's': 2, 'v': 1, 'dt': 4}, {'geocentric_position': 100, 'geocentric_velocity': 12, 'observer_position': 2, 'observer_velocity': 1, 'topocentric_position': 98, 'retarded_target_position': 52}), ({'tx': 30, 'tv': 3, 'cx': 30, 'cv': 3, 's': 2, 'v': 1, 'dt': 4}, {'geocentric_position': 0, 'geocentric_velocity': 0, 'observer_position': 32, 'observer_velocity': 4, 'topocentric_position': -2, 'retarded_target_position': 18}), ({'tx': 100, 'tv': 12, 'cx': 30, 'cv': 3, 's': -4, 'v': -2, 'dt': 4}, {'geocentric_position': 70, 'geocentric_velocity': 9, 'observer_position': 26, 'observer_velocity': 1, 'topocentric_position': 74, 'retarded_target_position': 52}), ({'tx': 100, 'tv': 12, 'cx': 30, 'cv': 3, 's': 2, 'v': 1, 'dt': 0}, {'geocentric_position': 70, 'geocentric_velocity': 9, 'observer_position': 32, 'observer_velocity': 4, 'topocentric_position': 68, 'retarded_target_position': 100})], 2: [({'tx': 101, 'tv': 12, 'cx': 30, 'cv': 3, 's': 2, 'v': 1, 'dt': 4}, {'geocentric_position': 71, 'geocentric_velocity': 9, 'observer_position': 32, 'observer_velocity': 4, 'topocentric_position': 69, 'retarded_target_position': 53}), ({'tx': 101, 'tv': 12, 'cx': 30, 'cv': 3, 's': 0, 'v': 0, 'dt': 4}, {'geocentric_position': 71, 'geocentric_velocity': 9, 'observer_position': 30, 'observer_velocity': 3, 'topocentric_position': 71, 'retarded_target_position': 53}), ({'tx': 101, 'tv': 12, 'cx': 0, 'cv': 0, 's': 2, 'v': 1, 'dt': 4}, {'geocentric_position': 101, 'geocentric_velocity': 12, 'observer_position': 2, 'observer_velocity': 1, 'topocentric_position': 99, 'retarded_target_position': 53}), ({'tx': 31, 'tv': 3, 'cx': 30, 'cv': 3, 's': 2, 'v': 1, 'dt': 4}, {'geocentric_position': 1, 'geocentric_velocity': 0, 'observer_position': 32, 'observer_velocity': 4, 'topocentric_position': -1, 'retarded_target_position': 19}), ({'tx': 101, 'tv': 12, 'cx': 30, 'cv': 3, 's': -4, 'v': -2, 'dt': 4}, {'geocentric_position': 71, 'geocentric_velocity': 9, 'observer_position': 26, 'observer_velocity': 1, 'topocentric_position': 75, 'retarded_target_position': 53}), ({'tx': 101, 'tv': 12, 'cx': 30, 'cv': 3, 's': 2, 'v': 1, 'dt': 0}, {'geocentric_position': 71, 'geocentric_velocity': 9, 'observer_position': 32, 'observer_velocity': 4, 'topocentric_position': 69, 'retarded_target_position': 101})], 3: [({'tx': 102, 'tv': 12, 'cx': 30, 'cv': 3, 's': 2, 'v': 1, 'dt': 4}, {'geocentric_position': 72, 'geocentric_velocity': 9, 'observer_position': 32, 'observer_velocity': 4, 'topocentric_position': 70, 'retarded_target_position': 54}), ({'tx': 102, 'tv': 12, 'cx': 30, 'cv': 3, 's': 0, 'v': 0, 'dt': 4}, {'geocentric_position': 72, 'geocentric_velocity': 9, 'observer_position': 30, 'observer_velocity': 3, 'topocentric_position': 72, 'retarded_target_position': 54}), ({'tx': 102, 'tv': 12, 'cx': 0, 'cv': 0, 's': 2, 'v': 1, 'dt': 4}, {'geocentric_position': 102, 'geocentric_velocity': 12, 'observer_position': 2, 'observer_velocity': 1, 'topocentric_position': 100, 'retarded_target_position': 54}), ({'tx': 32, 'tv': 3, 'cx': 30, 'cv': 3, 's': 2, 'v': 1, 'dt': 4}, {'geocentric_position': 2, 'geocentric_velocity': 0, 'observer_position': 32, 'observer_velocity': 4, 'topocentric_position': 0, 'retarded_target_position': 20}), ({'tx': 102, 'tv': 12, 'cx': 30, 'cv': 3, 's': -4, 'v': -2, 'dt': 4}, {'geocentric_position': 72, 'geocentric_velocity': 9, 'observer_position': 26, 'observer_velocity': 1, 'topocentric_position': 76, 'retarded_target_position': 54}), ({'tx': 102, 'tv': 12, 'cx': 30, 'cv': 3, 's': 2, 'v': 1, 'dt': 0}, {'geocentric_position': 72, 'geocentric_velocity': 9, 'observer_position': 32, 'observer_velocity': 4, 'topocentric_position': 70, 'retarded_target_position': 102})], 4: [({'tx': 103, 'tv': 12, 'cx': 30, 'cv': 3, 's': 2, 'v': 1, 'dt': 4}, {'geocentric_position': 73, 'geocentric_velocity': 9, 'observer_position': 32, 'observer_velocity': 4, 'topocentric_position': 71, 'retarded_target_position': 55}), ({'tx': 103, 'tv': 12, 'cx': 30, 'cv': 3, 's': 0, 'v': 0, 'dt': 4}, {'geocentric_position': 73, 'geocentric_velocity': 9, 'observer_position': 30, 'observer_velocity': 3, 'topocentric_position': 73, 'retarded_target_position': 55}), ({'tx': 103, 'tv': 12, 'cx': 0, 'cv': 0, 's': 2, 'v': 1, 'dt': 4}, {'geocentric_position': 103, 'geocentric_velocity': 12, 'observer_position': 2, 'observer_velocity': 1, 'topocentric_position': 101, 'retarded_target_position': 55}), ({'tx': 33, 'tv': 3, 'cx': 30, 'cv': 3, 's': 2, 'v': 1, 'dt': 4}, {'geocentric_position': 3, 'geocentric_velocity': 0, 'observer_position': 32, 'observer_velocity': 4, 'topocentric_position': 1, 'retarded_target_position': 21}), ({'tx': 103, 'tv': 12, 'cx': 30, 'cv': 3, 's': -4, 'v': -2, 'dt': 4}, {'geocentric_position': 73, 'geocentric_velocity': 9, 'observer_position': 26, 'observer_velocity': 1, 'topocentric_position': 77, 'retarded_target_position': 55}), ({'tx': 103, 'tv': 12, 'cx': 30, 'cv': 3, 's': 2, 'v': 1, 'dt': 0}, {'geocentric_position': 73, 'geocentric_velocity': 9, 'observer_position': 32, 'observer_velocity': 4, 'topocentric_position': 71, 'retarded_target_position': 103})], 5: [({'tx': 104, 'tv': 12, 'cx': 30, 'cv': 3, 's': 2, 'v': 1, 'dt': 4}, {'geocentric_position': 74, 'geocentric_velocity': 9, 'observer_position': 32, 'observer_velocity': 4, 'topocentric_position': 72, 'retarded_target_position': 56}), ({'tx': 104, 'tv': 12, 'cx': 30, 'cv': 3, 's': 0, 'v': 0, 'dt': 4}, {'geocentric_position': 74, 'geocentric_velocity': 9, 'observer_position': 30, 'observer_velocity': 3, 'topocentric_position': 74, 'retarded_target_position': 56}), ({'tx': 104, 'tv': 12, 'cx': 0, 'cv': 0, 's': 2, 'v': 1, 'dt': 4}, {'geocentric_position': 104, 'geocentric_velocity': 12, 'observer_position': 2, 'observer_velocity': 1, 'topocentric_position': 102, 'retarded_target_position': 56}), ({'tx': 34, 'tv': 3, 'cx': 30, 'cv': 3, 's': 2, 'v': 1, 'dt': 4}, {'geocentric_position': 4, 'geocentric_velocity': 0, 'observer_position': 32, 'observer_velocity': 4, 'topocentric_position': 2, 'retarded_target_position': 22}), ({'tx': 104, 'tv': 12, 'cx': 30, 'cv': 3, 's': -4, 'v': -2, 'dt': 4}, {'geocentric_position': 74, 'geocentric_velocity': 9, 'observer_position': 26, 'observer_velocity': 1, 'topocentric_position': 78, 'retarded_target_position': 56}), ({'tx': 104, 'tv': 12, 'cx': 30, 'cv': 3, 's': 2, 'v': 1, 'dt': 0}, {'geocentric_position': 74, 'geocentric_velocity': 9, 'observer_position': 32, 'observer_velocity': 4, 'topocentric_position': 72, 'retarded_target_position': 104})]}
for i, (record, expected) in enumerate(fixtures[N]):
    check('astronomical fixture %s' % i, solve(record), 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
astronomical fixture 0{'geocentric_position': 70, 'geocentric_velocity': 9, 'observer_position': 32, 'observer_velocity': 4, 'retarded_target_position': 64, 'topocentric_position': 68}{'geocentric_position': 70, 'geocentric_velocity': 9, 'observer_position': 32, 'observer_velocity': 4, 'retarded_target_position': 52, 'topocentric_position': 68}Failed
astronomical fixture 1{'geocentric_position': 70, 'geocentric_velocity': 9, 'observer_position': 30, 'observer_velocity': 3, 'retarded_target_position': 64, 'topocentric_position': 70}{'geocentric_position': 70, 'geocentric_velocity': 9, 'observer_position': 30, 'observer_velocity': 3, 'retarded_target_position': 52, 'topocentric_position': 70}Failed
astronomical fixture 2{'geocentric_position': 100, 'geocentric_velocity': 12, 'observer_position': 2, 'observer_velocity': 1, 'retarded_target_position': 52, 'topocentric_position': 98}{'geocentric_position': 100, 'geocentric_velocity': 12, 'observer_position': 2, 'observer_velocity': 1, 'retarded_target_position': 52, 'topocentric_position': 98}Passed
astronomical fixture 3{'geocentric_position': 0, 'geocentric_velocity': 0, 'observer_position': 32, 'observer_velocity': 4, 'retarded_target_position': 30, 'topocentric_position': -2}{'geocentric_position': 0, 'geocentric_velocity': 0, 'observer_position': 32, 'observer_velocity': 4, 'retarded_target_position': 18, 'topocentric_position': -2}Failed
astronomical fixture 4{'geocentric_position': 70, 'geocentric_velocity': 9, 'observer_position': 26, 'observer_velocity': 1, 'retarded_target_position': 64, 'topocentric_position': 74}{'geocentric_position': 70, 'geocentric_velocity': 9, 'observer_position': 26, 'observer_velocity': 1, 'retarded_target_position': 52, 'topocentric_position': 74}Failed
astronomical fixture 5{'geocentric_position': 70, 'geocentric_velocity': 9, 'observer_position': 32, 'observer_velocity': 4, 'retarded_target_position': 100, 'topocentric_position': 68}{'geocentric_position': 70, 'geocentric_velocity': 9, 'observer_position': 32, 'observer_velocity': 4, 'retarded_target_position': 100, 'topocentric_position': 68}Passed

SHA-256 / 824f11b8f2f2128b566fed03d39d8e2b1d18c7e787c7d2bddad3a5f615ac00fc

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(d):
    return {'geocentric_position': d['tx']-d['cx'], 'geocentric_velocity': d['tv']-d['cv'], 'observer_position': d['cx']+d['s'], 'observer_velocity': d['cv']+d['v'], 'topocentric_position': d['tx']-d['cx']-d['s'], 'retarded_target_position': d['tx']-d['tv']*d['dt']}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = {1: [({'tx': 100, 'tv': 12, 'cx': 30, 'cv': 3, 's': 2, 'v': 1, 'dt': 4}, {'geocentric_position': 70, 'geocentric_velocity': 9, 'observer_position': 32, 'observer_velocity': 4, 'topocentric_position': 68, 'retarded_target_position': 52}), ({'tx': 100, 'tv': 12, 'cx': 30, 'cv': 3, 's': 0, 'v': 0, 'dt': 4}, {'geocentric_position': 70, 'geocentric_velocity': 9, 'observer_position': 30, 'observer_velocity': 3, 'topocentric_position': 70, 'retarded_target_position': 52}), ({'tx': 100, 'tv': 12, 'cx': 0, 'cv': 0, 's': 2, 'v': 1, 'dt': 4}, {'geocentric_position': 100, 'geocentric_velocity': 12, 'observer_position': 2, 'observer_velocity': 1, 'topocentric_position': 98, 'retarded_target_position': 52}), ({'tx': 30, 'tv': 3, 'cx': 30, 'cv': 3, 's': 2, 'v': 1, 'dt': 4}, {'geocentric_position': 0, 'geocentric_velocity': 0, 'observer_position': 32, 'observer_velocity': 4, 'topocentric_position': -2, 'retarded_target_position': 18}), ({'tx': 100, 'tv': 12, 'cx': 30, 'cv': 3, 's': -4, 'v': -2, 'dt': 4}, {'geocentric_position': 70, 'geocentric_velocity': 9, 'observer_position': 26, 'observer_velocity': 1, 'topocentric_position': 74, 'retarded_target_position': 52}), ({'tx': 100, 'tv': 12, 'cx': 30, 'cv': 3, 's': 2, 'v': 1, 'dt': 0}, {'geocentric_position': 70, 'geocentric_velocity': 9, 'observer_position': 32, 'observer_velocity': 4, 'topocentric_position': 68, 'retarded_target_position': 100})], 2: [({'tx': 101, 'tv': 12, 'cx': 30, 'cv': 3, 's': 2, 'v': 1, 'dt': 4}, {'geocentric_position': 71, 'geocentric_velocity': 9, 'observer_position': 32, 'observer_velocity': 4, 'topocentric_position': 69, 'retarded_target_position': 53}), ({'tx': 101, 'tv': 12, 'cx': 30, 'cv': 3, 's': 0, 'v': 0, 'dt': 4}, {'geocentric_position': 71, 'geocentric_velocity': 9, 'observer_position': 30, 'observer_velocity': 3, 'topocentric_position': 71, 'retarded_target_position': 53}), ({'tx': 101, 'tv': 12, 'cx': 0, 'cv': 0, 's': 2, 'v': 1, 'dt': 4}, {'geocentric_position': 101, 'geocentric_velocity': 12, 'observer_position': 2, 'observer_velocity': 1, 'topocentric_position': 99, 'retarded_target_position': 53}), ({'tx': 31, 'tv': 3, 'cx': 30, 'cv': 3, 's': 2, 'v': 1, 'dt': 4}, {'geocentric_position': 1, 'geocentric_velocity': 0, 'observer_position': 32, 'observer_velocity': 4, 'topocentric_position': -1, 'retarded_target_position': 19}), ({'tx': 101, 'tv': 12, 'cx': 30, 'cv': 3, 's': -4, 'v': -2, 'dt': 4}, {'geocentric_position': 71, 'geocentric_velocity': 9, 'observer_position': 26, 'observer_velocity': 1, 'topocentric_position': 75, 'retarded_target_position': 53}), ({'tx': 101, 'tv': 12, 'cx': 30, 'cv': 3, 's': 2, 'v': 1, 'dt': 0}, {'geocentric_position': 71, 'geocentric_velocity': 9, 'observer_position': 32, 'observer_velocity': 4, 'topocentric_position': 69, 'retarded_target_position': 101})], 3: [({'tx': 102, 'tv': 12, 'cx': 30, 'cv': 3, 's': 2, 'v': 1, 'dt': 4}, {'geocentric_position': 72, 'geocentric_velocity': 9, 'observer_position': 32, 'observer_velocity': 4, 'topocentric_position': 70, 'retarded_target_position': 54}), ({'tx': 102, 'tv': 12, 'cx': 30, 'cv': 3, 's': 0, 'v': 0, 'dt': 4}, {'geocentric_position': 72, 'geocentric_velocity': 9, 'observer_position': 30, 'observer_velocity': 3, 'topocentric_position': 72, 'retarded_target_position': 54}), ({'tx': 102, 'tv': 12, 'cx': 0, 'cv': 0, 's': 2, 'v': 1, 'dt': 4}, {'geocentric_position': 102, 'geocentric_velocity': 12, 'observer_position': 2, 'observer_velocity': 1, 'topocentric_position': 100, 'retarded_target_position': 54}), ({'tx': 32, 'tv': 3, 'cx': 30, 'cv': 3, 's': 2, 'v': 1, 'dt': 4}, {'geocentric_position': 2, 'geocentric_velocity': 0, 'observer_position': 32, 'observer_velocity': 4, 'topocentric_position': 0, 'retarded_target_position': 20}), ({'tx': 102, 'tv': 12, 'cx': 30, 'cv': 3, 's': -4, 'v': -2, 'dt': 4}, {'geocentric_position': 72, 'geocentric_velocity': 9, 'observer_position': 26, 'observer_velocity': 1, 'topocentric_position': 76, 'retarded_target_position': 54}), ({'tx': 102, 'tv': 12, 'cx': 30, 'cv': 3, 's': 2, 'v': 1, 'dt': 0}, {'geocentric_position': 72, 'geocentric_velocity': 9, 'observer_position': 32, 'observer_velocity': 4, 'topocentric_position': 70, 'retarded_target_position': 102})], 4: [({'tx': 103, 'tv': 12, 'cx': 30, 'cv': 3, 's': 2, 'v': 1, 'dt': 4}, {'geocentric_position': 73, 'geocentric_velocity': 9, 'observer_position': 32, 'observer_velocity': 4, 'topocentric_position': 71, 'retarded_target_position': 55}), ({'tx': 103, 'tv': 12, 'cx': 30, 'cv': 3, 's': 0, 'v': 0, 'dt': 4}, {'geocentric_position': 73, 'geocentric_velocity': 9, 'observer_position': 30, 'observer_velocity': 3, 'topocentric_position': 73, 'retarded_target_position': 55}), ({'tx': 103, 'tv': 12, 'cx': 0, 'cv': 0, 's': 2, 'v': 1, 'dt': 4}, {'geocentric_position': 103, 'geocentric_velocity': 12, 'observer_position': 2, 'observer_velocity': 1, 'topocentric_position': 101, 'retarded_target_position': 55}), ({'tx': 33, 'tv': 3, 'cx': 30, 'cv': 3, 's': 2, 'v': 1, 'dt': 4}, {'geocentric_position': 3, 'geocentric_velocity': 0, 'observer_position': 32, 'observer_velocity': 4, 'topocentric_position': 1, 'retarded_target_position': 21}), ({'tx': 103, 'tv': 12, 'cx': 30, 'cv': 3, 's': -4, 'v': -2, 'dt': 4}, {'geocentric_position': 73, 'geocentric_velocity': 9, 'observer_position': 26, 'observer_velocity': 1, 'topocentric_position': 77, 'retarded_target_position': 55}), ({'tx': 103, 'tv': 12, 'cx': 30, 'cv': 3, 's': 2, 'v': 1, 'dt': 0}, {'geocentric_position': 73, 'geocentric_velocity': 9, 'observer_position': 32, 'observer_velocity': 4, 'topocentric_position': 71, 'retarded_target_position': 103})], 5: [({'tx': 104, 'tv': 12, 'cx': 30, 'cv': 3, 's': 2, 'v': 1, 'dt': 4}, {'geocentric_position': 74, 'geocentric_velocity': 9, 'observer_position': 32, 'observer_velocity': 4, 'topocentric_position': 72, 'retarded_target_position': 56}), ({'tx': 104, 'tv': 12, 'cx': 30, 'cv': 3, 's': 0, 'v': 0, 'dt': 4}, {'geocentric_position': 74, 'geocentric_velocity': 9, 'observer_position': 30, 'observer_velocity': 3, 'topocentric_position': 74, 'retarded_target_position': 56}), ({'tx': 104, 'tv': 12, 'cx': 0, 'cv': 0, 's': 2, 'v': 1, 'dt': 4}, {'geocentric_position': 104, 'geocentric_velocity': 12, 'observer_position': 2, 'observer_velocity': 1, 'topocentric_position': 102, 'retarded_target_position': 56}), ({'tx': 34, 'tv': 3, 'cx': 30, 'cv': 3, 's': 2, 'v': 1, 'dt': 4}, {'geocentric_position': 4, 'geocentric_velocity': 0, 'observer_position': 32, 'observer_velocity': 4, 'topocentric_position': 2, 'retarded_target_position': 22}), ({'tx': 104, 'tv': 12, 'cx': 30, 'cv': 3, 's': -4, 'v': -2, 'dt': 4}, {'geocentric_position': 74, 'geocentric_velocity': 9, 'observer_position': 26, 'observer_velocity': 1, 'topocentric_position': 78, 'retarded_target_position': 56}), ({'tx': 104, 'tv': 12, 'cx': 30, 'cv': 3, 's': 2, 'v': 1, 'dt': 0}, {'geocentric_position': 74, 'geocentric_velocity': 9, 'observer_position': 32, 'observer_velocity': 4, 'topocentric_position': 72, 'retarded_target_position': 104})]}
for i, (record, expected) in enumerate(fixtures[N]):
    check('astronomical fixture %s' % i, solve(record), 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
astronomical fixture 0{'geocentric_position': 70, 'geocentric_velocity': 9, 'observer_position': 32, 'observer_velocity': 4, 'retarded_target_position': 52, 'topocentric_position': 68}{'geocentric_position': 70, 'geocentric_velocity': 9, 'observer_position': 32, 'observer_velocity': 4, 'retarded_target_position': 52, 'topocentric_position': 68}Passed
astronomical fixture 1{'geocentric_position': 70, 'geocentric_velocity': 9, 'observer_position': 30, 'observer_velocity': 3, 'retarded_target_position': 52, 'topocentric_position': 70}{'geocentric_position': 70, 'geocentric_velocity': 9, 'observer_position': 30, 'observer_velocity': 3, 'retarded_target_position': 52, 'topocentric_position': 70}Passed
astronomical fixture 2{'geocentric_position': 100, 'geocentric_velocity': 12, 'observer_position': 2, 'observer_velocity': 1, 'retarded_target_position': 52, 'topocentric_position': 98}{'geocentric_position': 100, 'geocentric_velocity': 12, 'observer_position': 2, 'observer_velocity': 1, 'retarded_target_position': 52, 'topocentric_position': 98}Passed
astronomical fixture 3{'geocentric_position': 0, 'geocentric_velocity': 0, 'observer_position': 32, 'observer_velocity': 4, 'retarded_target_position': 18, 'topocentric_position': -2}{'geocentric_position': 0, 'geocentric_velocity': 0, 'observer_position': 32, 'observer_velocity': 4, 'retarded_target_position': 18, 'topocentric_position': -2}Passed
astronomical fixture 4{'geocentric_position': 70, 'geocentric_velocity': 9, 'observer_position': 26, 'observer_velocity': 1, 'retarded_target_position': 52, 'topocentric_position': 74}{'geocentric_position': 70, 'geocentric_velocity': 9, 'observer_position': 26, 'observer_velocity': 1, 'retarded_target_position': 52, 'topocentric_position': 74}Passed
astronomical fixture 5{'geocentric_position': 70, 'geocentric_velocity': 9, 'observer_position': 32, 'observer_velocity': 4, 'retarded_target_position': 100, 'topocentric_position': 68}{'geocentric_position': 70, 'geocentric_velocity': 9, 'observer_position': 32, 'observer_velocity': 4, 'retarded_target_position': 100, 'topocentric_position': 68}Passed

SHA-256 / cb63397cd0eae231c0b6019223cf7d2bf4d2aa96b8993ae8e86ac8b6a0cd6115

Verification & scope

Explicitly stipulated finite algebraic adapter; no standards conformance, physical accuracy, or production-library claim. Inputs are the documented finite valid model domain. 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:45:57.014398+00:00.

Case digest / 24f440704754ea07024429c728de9ea08046eae002373d4a9d40e5b6d4fe045d