FAILURE MAP
← Case archive

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.

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

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 fixtureActualExpectedOutcome
projected motion1325Failed
raw motion1313Passed
singularity13NoneFailed
equatorial factor1313Passed
back propagation-5-11Failed
stationary11Passed

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 fixtureActualExpectedOutcome
projected motion7.025Failed
raw motion1313Passed
singularityNoneNonePassed
equatorial factor1313Passed
back propagation-2.0-11Failed
stationary1.01Passed

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 fixtureActualExpectedOutcome
projected motion25.025Passed
raw motion1313Passed
singularityNoneNonePassed
equatorial factor13.013Passed
back propagation-11.0-11Passed
stationary1.01Passed

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