FAILURE MAP
← Case archive

FA-12161 / Astronomical coordinate conventions / Open access

Propagation confuses a catalog reference epoch with its observation epoch · case 01

Propagation confuses a catalog reference epoch with its observation epoch.

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

ROOT CAUSE

Motion is integrated from observation time instead of the position reference epoch.

VERIFIED REPAIR

Use the position reference epoch for the integration interval.

Unsuccessful approach: Assuming a universal reference epoch fixes one catalog but breaks others.

Case contract

Toy linear catalog: position x is defined at reference epoch ref; observed is provenance only; return x+rate*(target-ref). Epochs are arbitrary integer model ticks.

Why this case matters

Astronomical catalog and observation adapters must preserve the declared coordinate convention across software boundaries.

1 / The failure

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

N = 1
observations = []
def solve(x, rate, ref, observed, target):
    return x+rate*(target-observed)
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('different provenance', solve(N, 2, 10, 12, 15), N+10)
check('at reference', solve(N, 2, 10, 12, 10), N)
check('backward', solve(N, 2, 10, 12, 8), N-4)
check('zero reference', solve(N, 2, 0, 3, 5), N+10)
check('static', solve(N, 0, 10, 12, 15), N)
check('observation equals target', solve(N, 2, 10, 15, 15), N+10)
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
different provenance711Failed
at reference-31Failed
backward-7-3Failed
zero reference511Failed
static11Passed
observation equals target111Failed

SHA-256 / b3628c37aa64fdee62d12060212a433db4980b38d15884cbf48d02d965f7c68a

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(x, rate, ref, observed, target):
    return x+rate*target
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('different provenance', solve(N, 2, 10, 12, 15), N+10)
check('at reference', solve(N, 2, 10, 12, 10), N)
check('backward', solve(N, 2, 10, 12, 8), N-4)
check('zero reference', solve(N, 2, 0, 3, 5), N+10)
check('static', solve(N, 0, 10, 12, 15), N)
check('observation equals target', solve(N, 2, 10, 15, 15), N+10)
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
different provenance3111Failed
at reference211Failed
backward17-3Failed
zero reference1111Passed
static11Passed
observation equals target3111Failed

SHA-256 / 7dd8bf3fbd3b7d98d2f13eb418195cc7f100957dfb4ec0cbac48771017ac4538

3 / The verified repair

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

N = 1
observations = []
def solve(x, rate, ref, observed, target):
    return x+rate*(target-ref)
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('different provenance', solve(N, 2, 10, 12, 15), N+10)
check('at reference', solve(N, 2, 10, 12, 10), N)
check('backward', solve(N, 2, 10, 12, 8), N-4)
check('zero reference', solve(N, 2, 0, 3, 5), N+10)
check('static', solve(N, 0, 10, 12, 15), N)
check('observation equals target', solve(N, 2, 10, 15, 15), N+10)
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
different provenance1111Passed
at reference11Passed
backward-3-3Passed
zero reference1111Passed
static11Passed
observation equals target1111Passed

SHA-256 / 198a70ea7a3c0e8a53d6c040f36907e8827c621eb5c0437743300894be6db8db

Verification & scope

Deterministic stipulated adapter model; no ephemeris, physical accuracy, or production astronomy library claims. 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:38:54.331406+00:00.

Case digest / e8387dd16098cb832b571440f36c2d18e1dd8fe613b1df55ccd6e1f9ace0bfff