FA-12141 / Astronomical coordinate conventions / Open access
A frame label is changed without transforming its coordinates · case 01
A frame label is changed without transforming its coordinates.
ROOT CAUSE
Relabeling substitutes for applying a supplied frame transform.
VERIFIED REPAIR
Apply the transform only when the source and destination frame differ.
Unsuccessful approach: Applying the transform unconditionally moves coordinates already in the destination frame.
Case contract
Toy one-axis catalog adapter: transform offset maps source A to B; reverse mapping subtracts it; identical frames preserve x. Frames are A or B.
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, source, target, offset):
return [x, target]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('forward', solve(N, "A", "B", 10), [N+10,"B"])
check('reverse', solve(N, "B", "A", 10), [N-10,"A"])
check('already B', solve(N, "B", "B", 10), [N,"B"])
check('already A', solve(N, "A", "A", 10), [N,"A"])
check('zero calibration', solve(N, "A", "B", 0), [N,"B"])
check('negative calibration', solve(N, "A", "B", -3), [N-3,"B"])
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 |
|---|---|---|---|
| forward | [1, 'B'] | [11, 'B'] | Failed |
| reverse | [1, 'A'] | [-9, 'A'] | Failed |
| already B | [1, 'B'] | [1, 'B'] | Passed |
| already A | [1, 'A'] | [1, 'A'] | Passed |
| zero calibration | [1, 'B'] | [1, 'B'] | Passed |
| negative calibration | [1, 'B'] | [-2, 'B'] | Failed |
SHA-256 / 8491370aadf6becd548cb3cd927a178f4145d53410cacbdd3e1b232cd849bf8e
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x, source, target, offset):
return [x + (offset if target == 'B' else -offset), target]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('forward', solve(N, "A", "B", 10), [N+10,"B"])
check('reverse', solve(N, "B", "A", 10), [N-10,"A"])
check('already B', solve(N, "B", "B", 10), [N,"B"])
check('already A', solve(N, "A", "A", 10), [N,"A"])
check('zero calibration', solve(N, "A", "B", 0), [N,"B"])
check('negative calibration', solve(N, "A", "B", -3), [N-3,"B"])
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 |
|---|---|---|---|
| forward | [11, 'B'] | [11, 'B'] | Passed |
| reverse | [-9, 'A'] | [-9, 'A'] | Passed |
| already B | [11, 'B'] | [1, 'B'] | Failed |
| already A | [-9, 'A'] | [1, 'A'] | Failed |
| zero calibration | [1, 'B'] | [1, 'B'] | Passed |
| negative calibration | [-2, 'B'] | [-2, 'B'] | Passed |
SHA-256 / c8dde28c42fa0567611180e79c8f54dd67ce25ceae44cb5811ef487f1c162b7a
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x, source, target, offset):
return [x if source == target else x + (offset if target == 'B' else -offset), target]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('forward', solve(N, "A", "B", 10), [N+10,"B"])
check('reverse', solve(N, "B", "A", 10), [N-10,"A"])
check('already B', solve(N, "B", "B", 10), [N,"B"])
check('already A', solve(N, "A", "A", 10), [N,"A"])
check('zero calibration', solve(N, "A", "B", 0), [N,"B"])
check('negative calibration', solve(N, "A", "B", -3), [N-3,"B"])
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 |
|---|---|---|---|
| forward | [11, 'B'] | [11, 'B'] | Passed |
| reverse | [-9, 'A'] | [-9, 'A'] | Passed |
| already B | [1, 'B'] | [1, 'B'] | Passed |
| already A | [1, 'A'] | [1, 'A'] | Passed |
| zero calibration | [1, 'B'] | [1, 'B'] | Passed |
| negative calibration | [-2, 'B'] | [-2, 'B'] | Passed |
SHA-256 / 0feabb64b9a8e220278eadd44e867c7f68523e2c8489a977073c7a406b523328
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.287678+00:00.
Case digest / 4770aa6b1d8018766f00f62d0d97b00db2122059e8a967e44013559ec85bca1d