FAILURE MAP
← Case archive

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.

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

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 fixtureActualExpectedOutcome
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 fixtureActualExpectedOutcome
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 fixtureActualExpectedOutcome
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