FA-12156 / Astronomical coordinate conventions / Open access
A projected catalog motion is propagated as raw coordinate motion · case 01
A projected catalog motion is propagated as raw coordinate motion.
ROOT CAUSE
A projected tangential component is mistaken for a coordinate derivative.
VERIFIED REPAIR
Divide projected motion by the supplied projection factor and reject its singular zero.
Unsuccessful approach: Multiplying by the projection factor applies the projection twice.
Case contract
Stipulated linear RA adapter: raw rate is p/c for projected convention and p for raw convention. c=0 with projected rate yields None. No spherical integration claimed.
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(ra, p, c, dt, convention):
return ra+p*dt
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('projected motion', solve(N, 6, 0.5, 2, "projected"), N+24)
check('raw motion', solve(N, 6, 0.5, 2, "raw"), N+12)
check('singularity', solve(N, 6, 0, 2, "projected"), None)
check('equatorial factor', solve(N, 6, 1, 2, "projected"), N+12)
check('back propagation', solve(N, 6, 0.5, -1, "projected"), N-12)
check('stationary', solve(N, 0, 0.5, 2, "projected"), N)
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 |
|---|---|---|---|
| projected motion | 13 | 25 | Failed |
| raw motion | 13 | 13 | Passed |
| singularity | 13 | None | Failed |
| equatorial factor | 13 | 13 | Passed |
| back propagation | -5 | -11 | Failed |
| stationary | 1 | 1 | Passed |
SHA-256 / dfff709c12b5a665286260108b1ca1995ff598b4e17b79e60339b5c6eff49439
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(ra, p, c, dt, convention):
return None if convention == 'projected' and c == 0 else ra+p*(c if convention == 'projected' else 1)*dt
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('projected motion', solve(N, 6, 0.5, 2, "projected"), N+24)
check('raw motion', solve(N, 6, 0.5, 2, "raw"), N+12)
check('singularity', solve(N, 6, 0, 2, "projected"), None)
check('equatorial factor', solve(N, 6, 1, 2, "projected"), N+12)
check('back propagation', solve(N, 6, 0.5, -1, "projected"), N-12)
check('stationary', solve(N, 0, 0.5, 2, "projected"), N)
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 |
|---|---|---|---|
| projected motion | 7.0 | 25 | Failed |
| raw motion | 13 | 13 | Passed |
| singularity | None | None | Passed |
| equatorial factor | 13 | 13 | Passed |
| back propagation | -2.0 | -11 | Failed |
| stationary | 1.0 | 1 | Passed |
SHA-256 / 16173ef3f20282e59117a0515aa8bf077cebee77bb9fbf5ab2c18537d62a6261
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(ra, p, c, dt, convention):
return None if convention == 'projected' and c == 0 else ra+(p/c if convention == 'projected' else p)*dt
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('projected motion', solve(N, 6, 0.5, 2, "projected"), N+24)
check('raw motion', solve(N, 6, 0.5, 2, "raw"), N+12)
check('singularity', solve(N, 6, 0, 2, "projected"), None)
check('equatorial factor', solve(N, 6, 1, 2, "projected"), N+12)
check('back propagation', solve(N, 6, 0.5, -1, "projected"), N-12)
check('stationary', solve(N, 0, 0.5, 2, "projected"), N)
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 |
|---|---|---|---|
| projected motion | 25.0 | 25 | Passed |
| raw motion | 13 | 13 | Passed |
| singularity | None | None | Passed |
| equatorial factor | 13.0 | 13 | Passed |
| back propagation | -11.0 | -11 | Passed |
| stationary | 1.0 | 1 | Passed |
SHA-256 / f7ce006681a77043b383977784d6e872869e353e1d23b82cb94f57c123a2dc77
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.321742+00:00.
Case digest / 8222d55a6b2b1b7b5cfac7aafb8ac911e1bf225567411f7980e5211b552cb06e