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.
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| different provenance | 7 | 11 | Failed |
| at reference | -3 | 1 | Failed |
| backward | -7 | -3 | Failed |
| zero reference | 5 | 11 | Failed |
| static | 1 | 1 | Passed |
| observation equals target | 1 | 11 | Failed |
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| different provenance | 31 | 11 | Failed |
| at reference | 21 | 1 | Failed |
| backward | 17 | -3 | Failed |
| zero reference | 11 | 11 | Passed |
| static | 1 | 1 | Passed |
| observation equals target | 31 | 11 | Failed |
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| different provenance | 11 | 11 | Passed |
| at reference | 1 | 1 | Passed |
| backward | -3 | -3 | Passed |
| zero reference | 11 | 11 | Passed |
| static | 1 | 1 | Passed |
| observation equals target | 11 | 11 | Passed |
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