FAILURE MAP
← Case archive

FA-54986 / Astronomical coordinate conventions / Open access

Detector mosaic sections: Readout geometry treats one-sided parallel overscan as symmetric · case 01

The adapter reports an incorrect science rows while other fields remain valid.

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

ROOT CAUSE

Readout geometry treats one-sided parallel overscan as symmetric. Faulty expression: d['rows']

VERIFIED REPAIR

Preserve the declared model convention at this site: d['rows']-d['parallel']

Unsuccessful approach: A partial convention repair still uses d['rows']-2*d['parallel']

Case contract

Two readout amplifiers cover a focal plane with overscan removed. Amplifier B is physically reversed. Detector labels are one-based; chip gap has no samples. Serial overscan is measured in columns and parallel overscan in rows. Output fields are defined by: a_science_column = d['x']-d['serial']; b_detector_column = d['a']+d['gap']+d['b']+1-d['x']; science_row = d['y']-d['parallel']; b_first_pixel = d['a']+d['gap']+1; mosaic_extent = d['a']+d['gap']+d['b']; science_rows = d['rows']-d['parallel']

Why this case matters

Catalog, detector, sky-coordinate, and spectroscopy adapters must preserve the association between numeric coordinates and their declared reference conventions.

1 / The failure

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(d):
    return {'a_science_column': d['x']-d['serial'], 'b_detector_column': d['a']+d['gap']+d['b']+1-d['x'], 'science_row': d['y']-d['parallel'], 'b_first_pixel': d['a']+d['gap']+1, 'mosaic_extent': d['a']+d['gap']+d['b'], 'science_rows': d['rows']}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = {1: [({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 3, 'y': 7, 'rows': 20}, {'a_science_column': 1, 'b_detector_column': 23, 'science_row': 3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 0, 'parallel': 0, 'x': 3, 'y': 7, 'rows': 20}, {'a_science_column': 3, 'b_detector_column': 23, 'science_row': 7, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 20}), ({'a': 12, 'b': 10, 'gap': 0, 'serial': 2, 'parallel': 4, 'x': 3, 'y': 7, 'rows': 20}, {'a_science_column': 1, 'b_detector_column': 20, 'science_row': 3, 'b_first_pixel': 13, 'mosaic_extent': 22, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 1, 'y': 1, 'rows': 20}, {'a_science_column': -1, 'b_detector_column': 25, 'science_row': -3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 4, 'b': 6, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 3, 'y': 7, 'rows': 9}, {'a_science_column': 1, 'b_detector_column': 11, 'science_row': 3, 'b_first_pixel': 8, 'mosaic_extent': 13, 'science_rows': 5}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 8, 'y': 20, 'rows': 20}, {'a_science_column': 6, 'b_detector_column': 18, 'science_row': 16, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16})], 2: [({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 4, 'y': 7, 'rows': 20}, {'a_science_column': 2, 'b_detector_column': 22, 'science_row': 3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 0, 'parallel': 0, 'x': 4, 'y': 7, 'rows': 20}, {'a_science_column': 4, 'b_detector_column': 22, 'science_row': 7, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 20}), ({'a': 12, 'b': 10, 'gap': 0, 'serial': 2, 'parallel': 4, 'x': 4, 'y': 7, 'rows': 20}, {'a_science_column': 2, 'b_detector_column': 19, 'science_row': 3, 'b_first_pixel': 13, 'mosaic_extent': 22, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 2, 'y': 1, 'rows': 20}, {'a_science_column': 0, 'b_detector_column': 24, 'science_row': -3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 4, 'b': 6, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 4, 'y': 7, 'rows': 9}, {'a_science_column': 2, 'b_detector_column': 10, 'science_row': 3, 'b_first_pixel': 8, 'mosaic_extent': 13, 'science_rows': 5}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 9, 'y': 20, 'rows': 20}, {'a_science_column': 7, 'b_detector_column': 17, 'science_row': 16, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16})], 3: [({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 5, 'y': 7, 'rows': 20}, {'a_science_column': 3, 'b_detector_column': 21, 'science_row': 3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 0, 'parallel': 0, 'x': 5, 'y': 7, 'rows': 20}, {'a_science_column': 5, 'b_detector_column': 21, 'science_row': 7, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 20}), ({'a': 12, 'b': 10, 'gap': 0, 'serial': 2, 'parallel': 4, 'x': 5, 'y': 7, 'rows': 20}, {'a_science_column': 3, 'b_detector_column': 18, 'science_row': 3, 'b_first_pixel': 13, 'mosaic_extent': 22, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 3, 'y': 1, 'rows': 20}, {'a_science_column': 1, 'b_detector_column': 23, 'science_row': -3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 4, 'b': 6, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 5, 'y': 7, 'rows': 9}, {'a_science_column': 3, 'b_detector_column': 9, 'science_row': 3, 'b_first_pixel': 8, 'mosaic_extent': 13, 'science_rows': 5}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 10, 'y': 20, 'rows': 20}, {'a_science_column': 8, 'b_detector_column': 16, 'science_row': 16, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16})], 4: [({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 6, 'y': 7, 'rows': 20}, {'a_science_column': 4, 'b_detector_column': 20, 'science_row': 3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 0, 'parallel': 0, 'x': 6, 'y': 7, 'rows': 20}, {'a_science_column': 6, 'b_detector_column': 20, 'science_row': 7, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 20}), ({'a': 12, 'b': 10, 'gap': 0, 'serial': 2, 'parallel': 4, 'x': 6, 'y': 7, 'rows': 20}, {'a_science_column': 4, 'b_detector_column': 17, 'science_row': 3, 'b_first_pixel': 13, 'mosaic_extent': 22, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 4, 'y': 1, 'rows': 20}, {'a_science_column': 2, 'b_detector_column': 22, 'science_row': -3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 4, 'b': 6, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 6, 'y': 7, 'rows': 9}, {'a_science_column': 4, 'b_detector_column': 8, 'science_row': 3, 'b_first_pixel': 8, 'mosaic_extent': 13, 'science_rows': 5}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 11, 'y': 20, 'rows': 20}, {'a_science_column': 9, 'b_detector_column': 15, 'science_row': 16, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16})], 5: [({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 7, 'y': 7, 'rows': 20}, {'a_science_column': 5, 'b_detector_column': 19, 'science_row': 3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 0, 'parallel': 0, 'x': 7, 'y': 7, 'rows': 20}, {'a_science_column': 7, 'b_detector_column': 19, 'science_row': 7, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 20}), ({'a': 12, 'b': 10, 'gap': 0, 'serial': 2, 'parallel': 4, 'x': 7, 'y': 7, 'rows': 20}, {'a_science_column': 5, 'b_detector_column': 16, 'science_row': 3, 'b_first_pixel': 13, 'mosaic_extent': 22, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 5, 'y': 1, 'rows': 20}, {'a_science_column': 3, 'b_detector_column': 21, 'science_row': -3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 4, 'b': 6, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 7, 'y': 7, 'rows': 9}, {'a_science_column': 5, 'b_detector_column': 7, 'science_row': 3, 'b_first_pixel': 8, 'mosaic_extent': 13, 'science_rows': 5}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 12, 'y': 20, 'rows': 20}, {'a_science_column': 10, 'b_detector_column': 14, 'science_row': 16, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16})]}
for i, (record, expected) in enumerate(fixtures[N]):
    check('astronomical fixture %s' % i, solve(record), expected)
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
astronomical fixture 0{'a_science_column': 1, 'b_detector_column': 23, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_row': 3, 'science_rows': 20}{'a_science_column': 1, 'b_detector_column': 23, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_row': 3, 'science_rows': 16}Failed
astronomical fixture 1{'a_science_column': 3, 'b_detector_column': 23, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_row': 7, 'science_rows': 20}{'a_science_column': 3, 'b_detector_column': 23, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_row': 7, 'science_rows': 20}Passed
astronomical fixture 2{'a_science_column': 1, 'b_detector_column': 20, 'b_first_pixel': 13, 'mosaic_extent': 22, 'science_row': 3, 'science_rows': 20}{'a_science_column': 1, 'b_detector_column': 20, 'b_first_pixel': 13, 'mosaic_extent': 22, 'science_row': 3, 'science_rows': 16}Failed
astronomical fixture 3{'a_science_column': -1, 'b_detector_column': 25, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_row': -3, 'science_rows': 20}{'a_science_column': -1, 'b_detector_column': 25, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_row': -3, 'science_rows': 16}Failed
astronomical fixture 4{'a_science_column': 1, 'b_detector_column': 11, 'b_first_pixel': 8, 'mosaic_extent': 13, 'science_row': 3, 'science_rows': 9}{'a_science_column': 1, 'b_detector_column': 11, 'b_first_pixel': 8, 'mosaic_extent': 13, 'science_row': 3, 'science_rows': 5}Failed
astronomical fixture 5{'a_science_column': 6, 'b_detector_column': 18, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_row': 16, 'science_rows': 20}{'a_science_column': 6, 'b_detector_column': 18, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_row': 16, 'science_rows': 16}Failed

SHA-256 / ecf6b44657745d3a6bb89a256860d1290773da56fdc13801902853ef08400631

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(d):
    return {'a_science_column': d['x']-d['serial'], 'b_detector_column': d['a']+d['gap']+d['b']+1-d['x'], 'science_row': d['y']-d['parallel'], 'b_first_pixel': d['a']+d['gap']+1, 'mosaic_extent': d['a']+d['gap']+d['b'], 'science_rows': d['rows']-2*d['parallel']}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = {1: [({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 3, 'y': 7, 'rows': 20}, {'a_science_column': 1, 'b_detector_column': 23, 'science_row': 3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 0, 'parallel': 0, 'x': 3, 'y': 7, 'rows': 20}, {'a_science_column': 3, 'b_detector_column': 23, 'science_row': 7, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 20}), ({'a': 12, 'b': 10, 'gap': 0, 'serial': 2, 'parallel': 4, 'x': 3, 'y': 7, 'rows': 20}, {'a_science_column': 1, 'b_detector_column': 20, 'science_row': 3, 'b_first_pixel': 13, 'mosaic_extent': 22, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 1, 'y': 1, 'rows': 20}, {'a_science_column': -1, 'b_detector_column': 25, 'science_row': -3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 4, 'b': 6, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 3, 'y': 7, 'rows': 9}, {'a_science_column': 1, 'b_detector_column': 11, 'science_row': 3, 'b_first_pixel': 8, 'mosaic_extent': 13, 'science_rows': 5}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 8, 'y': 20, 'rows': 20}, {'a_science_column': 6, 'b_detector_column': 18, 'science_row': 16, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16})], 2: [({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 4, 'y': 7, 'rows': 20}, {'a_science_column': 2, 'b_detector_column': 22, 'science_row': 3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 0, 'parallel': 0, 'x': 4, 'y': 7, 'rows': 20}, {'a_science_column': 4, 'b_detector_column': 22, 'science_row': 7, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 20}), ({'a': 12, 'b': 10, 'gap': 0, 'serial': 2, 'parallel': 4, 'x': 4, 'y': 7, 'rows': 20}, {'a_science_column': 2, 'b_detector_column': 19, 'science_row': 3, 'b_first_pixel': 13, 'mosaic_extent': 22, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 2, 'y': 1, 'rows': 20}, {'a_science_column': 0, 'b_detector_column': 24, 'science_row': -3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 4, 'b': 6, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 4, 'y': 7, 'rows': 9}, {'a_science_column': 2, 'b_detector_column': 10, 'science_row': 3, 'b_first_pixel': 8, 'mosaic_extent': 13, 'science_rows': 5}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 9, 'y': 20, 'rows': 20}, {'a_science_column': 7, 'b_detector_column': 17, 'science_row': 16, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16})], 3: [({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 5, 'y': 7, 'rows': 20}, {'a_science_column': 3, 'b_detector_column': 21, 'science_row': 3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 0, 'parallel': 0, 'x': 5, 'y': 7, 'rows': 20}, {'a_science_column': 5, 'b_detector_column': 21, 'science_row': 7, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 20}), ({'a': 12, 'b': 10, 'gap': 0, 'serial': 2, 'parallel': 4, 'x': 5, 'y': 7, 'rows': 20}, {'a_science_column': 3, 'b_detector_column': 18, 'science_row': 3, 'b_first_pixel': 13, 'mosaic_extent': 22, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 3, 'y': 1, 'rows': 20}, {'a_science_column': 1, 'b_detector_column': 23, 'science_row': -3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 4, 'b': 6, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 5, 'y': 7, 'rows': 9}, {'a_science_column': 3, 'b_detector_column': 9, 'science_row': 3, 'b_first_pixel': 8, 'mosaic_extent': 13, 'science_rows': 5}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 10, 'y': 20, 'rows': 20}, {'a_science_column': 8, 'b_detector_column': 16, 'science_row': 16, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16})], 4: [({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 6, 'y': 7, 'rows': 20}, {'a_science_column': 4, 'b_detector_column': 20, 'science_row': 3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 0, 'parallel': 0, 'x': 6, 'y': 7, 'rows': 20}, {'a_science_column': 6, 'b_detector_column': 20, 'science_row': 7, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 20}), ({'a': 12, 'b': 10, 'gap': 0, 'serial': 2, 'parallel': 4, 'x': 6, 'y': 7, 'rows': 20}, {'a_science_column': 4, 'b_detector_column': 17, 'science_row': 3, 'b_first_pixel': 13, 'mosaic_extent': 22, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 4, 'y': 1, 'rows': 20}, {'a_science_column': 2, 'b_detector_column': 22, 'science_row': -3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 4, 'b': 6, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 6, 'y': 7, 'rows': 9}, {'a_science_column': 4, 'b_detector_column': 8, 'science_row': 3, 'b_first_pixel': 8, 'mosaic_extent': 13, 'science_rows': 5}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 11, 'y': 20, 'rows': 20}, {'a_science_column': 9, 'b_detector_column': 15, 'science_row': 16, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16})], 5: [({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 7, 'y': 7, 'rows': 20}, {'a_science_column': 5, 'b_detector_column': 19, 'science_row': 3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 0, 'parallel': 0, 'x': 7, 'y': 7, 'rows': 20}, {'a_science_column': 7, 'b_detector_column': 19, 'science_row': 7, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 20}), ({'a': 12, 'b': 10, 'gap': 0, 'serial': 2, 'parallel': 4, 'x': 7, 'y': 7, 'rows': 20}, {'a_science_column': 5, 'b_detector_column': 16, 'science_row': 3, 'b_first_pixel': 13, 'mosaic_extent': 22, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 5, 'y': 1, 'rows': 20}, {'a_science_column': 3, 'b_detector_column': 21, 'science_row': -3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 4, 'b': 6, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 7, 'y': 7, 'rows': 9}, {'a_science_column': 5, 'b_detector_column': 7, 'science_row': 3, 'b_first_pixel': 8, 'mosaic_extent': 13, 'science_rows': 5}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 12, 'y': 20, 'rows': 20}, {'a_science_column': 10, 'b_detector_column': 14, 'science_row': 16, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16})]}
for i, (record, expected) in enumerate(fixtures[N]):
    check('astronomical fixture %s' % i, solve(record), expected)
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
astronomical fixture 0{'a_science_column': 1, 'b_detector_column': 23, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_row': 3, 'science_rows': 12}{'a_science_column': 1, 'b_detector_column': 23, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_row': 3, 'science_rows': 16}Failed
astronomical fixture 1{'a_science_column': 3, 'b_detector_column': 23, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_row': 7, 'science_rows': 20}{'a_science_column': 3, 'b_detector_column': 23, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_row': 7, 'science_rows': 20}Passed
astronomical fixture 2{'a_science_column': 1, 'b_detector_column': 20, 'b_first_pixel': 13, 'mosaic_extent': 22, 'science_row': 3, 'science_rows': 12}{'a_science_column': 1, 'b_detector_column': 20, 'b_first_pixel': 13, 'mosaic_extent': 22, 'science_row': 3, 'science_rows': 16}Failed
astronomical fixture 3{'a_science_column': -1, 'b_detector_column': 25, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_row': -3, 'science_rows': 12}{'a_science_column': -1, 'b_detector_column': 25, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_row': -3, 'science_rows': 16}Failed
astronomical fixture 4{'a_science_column': 1, 'b_detector_column': 11, 'b_first_pixel': 8, 'mosaic_extent': 13, 'science_row': 3, 'science_rows': 1}{'a_science_column': 1, 'b_detector_column': 11, 'b_first_pixel': 8, 'mosaic_extent': 13, 'science_row': 3, 'science_rows': 5}Failed
astronomical fixture 5{'a_science_column': 6, 'b_detector_column': 18, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_row': 16, 'science_rows': 12}{'a_science_column': 6, 'b_detector_column': 18, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_row': 16, 'science_rows': 16}Failed

SHA-256 / 88963c5ab85f47be22d80fa6479dd8e261eef8a7ef434be966a79110853b6ebf

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(d):
    return {'a_science_column': d['x']-d['serial'], 'b_detector_column': d['a']+d['gap']+d['b']+1-d['x'], 'science_row': d['y']-d['parallel'], 'b_first_pixel': d['a']+d['gap']+1, 'mosaic_extent': d['a']+d['gap']+d['b'], 'science_rows': d['rows']-d['parallel']}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = {1: [({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 3, 'y': 7, 'rows': 20}, {'a_science_column': 1, 'b_detector_column': 23, 'science_row': 3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 0, 'parallel': 0, 'x': 3, 'y': 7, 'rows': 20}, {'a_science_column': 3, 'b_detector_column': 23, 'science_row': 7, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 20}), ({'a': 12, 'b': 10, 'gap': 0, 'serial': 2, 'parallel': 4, 'x': 3, 'y': 7, 'rows': 20}, {'a_science_column': 1, 'b_detector_column': 20, 'science_row': 3, 'b_first_pixel': 13, 'mosaic_extent': 22, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 1, 'y': 1, 'rows': 20}, {'a_science_column': -1, 'b_detector_column': 25, 'science_row': -3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 4, 'b': 6, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 3, 'y': 7, 'rows': 9}, {'a_science_column': 1, 'b_detector_column': 11, 'science_row': 3, 'b_first_pixel': 8, 'mosaic_extent': 13, 'science_rows': 5}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 8, 'y': 20, 'rows': 20}, {'a_science_column': 6, 'b_detector_column': 18, 'science_row': 16, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16})], 2: [({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 4, 'y': 7, 'rows': 20}, {'a_science_column': 2, 'b_detector_column': 22, 'science_row': 3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 0, 'parallel': 0, 'x': 4, 'y': 7, 'rows': 20}, {'a_science_column': 4, 'b_detector_column': 22, 'science_row': 7, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 20}), ({'a': 12, 'b': 10, 'gap': 0, 'serial': 2, 'parallel': 4, 'x': 4, 'y': 7, 'rows': 20}, {'a_science_column': 2, 'b_detector_column': 19, 'science_row': 3, 'b_first_pixel': 13, 'mosaic_extent': 22, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 2, 'y': 1, 'rows': 20}, {'a_science_column': 0, 'b_detector_column': 24, 'science_row': -3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 4, 'b': 6, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 4, 'y': 7, 'rows': 9}, {'a_science_column': 2, 'b_detector_column': 10, 'science_row': 3, 'b_first_pixel': 8, 'mosaic_extent': 13, 'science_rows': 5}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 9, 'y': 20, 'rows': 20}, {'a_science_column': 7, 'b_detector_column': 17, 'science_row': 16, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16})], 3: [({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 5, 'y': 7, 'rows': 20}, {'a_science_column': 3, 'b_detector_column': 21, 'science_row': 3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 0, 'parallel': 0, 'x': 5, 'y': 7, 'rows': 20}, {'a_science_column': 5, 'b_detector_column': 21, 'science_row': 7, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 20}), ({'a': 12, 'b': 10, 'gap': 0, 'serial': 2, 'parallel': 4, 'x': 5, 'y': 7, 'rows': 20}, {'a_science_column': 3, 'b_detector_column': 18, 'science_row': 3, 'b_first_pixel': 13, 'mosaic_extent': 22, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 3, 'y': 1, 'rows': 20}, {'a_science_column': 1, 'b_detector_column': 23, 'science_row': -3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 4, 'b': 6, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 5, 'y': 7, 'rows': 9}, {'a_science_column': 3, 'b_detector_column': 9, 'science_row': 3, 'b_first_pixel': 8, 'mosaic_extent': 13, 'science_rows': 5}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 10, 'y': 20, 'rows': 20}, {'a_science_column': 8, 'b_detector_column': 16, 'science_row': 16, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16})], 4: [({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 6, 'y': 7, 'rows': 20}, {'a_science_column': 4, 'b_detector_column': 20, 'science_row': 3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 0, 'parallel': 0, 'x': 6, 'y': 7, 'rows': 20}, {'a_science_column': 6, 'b_detector_column': 20, 'science_row': 7, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 20}), ({'a': 12, 'b': 10, 'gap': 0, 'serial': 2, 'parallel': 4, 'x': 6, 'y': 7, 'rows': 20}, {'a_science_column': 4, 'b_detector_column': 17, 'science_row': 3, 'b_first_pixel': 13, 'mosaic_extent': 22, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 4, 'y': 1, 'rows': 20}, {'a_science_column': 2, 'b_detector_column': 22, 'science_row': -3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 4, 'b': 6, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 6, 'y': 7, 'rows': 9}, {'a_science_column': 4, 'b_detector_column': 8, 'science_row': 3, 'b_first_pixel': 8, 'mosaic_extent': 13, 'science_rows': 5}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 11, 'y': 20, 'rows': 20}, {'a_science_column': 9, 'b_detector_column': 15, 'science_row': 16, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16})], 5: [({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 7, 'y': 7, 'rows': 20}, {'a_science_column': 5, 'b_detector_column': 19, 'science_row': 3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 0, 'parallel': 0, 'x': 7, 'y': 7, 'rows': 20}, {'a_science_column': 7, 'b_detector_column': 19, 'science_row': 7, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 20}), ({'a': 12, 'b': 10, 'gap': 0, 'serial': 2, 'parallel': 4, 'x': 7, 'y': 7, 'rows': 20}, {'a_science_column': 5, 'b_detector_column': 16, 'science_row': 3, 'b_first_pixel': 13, 'mosaic_extent': 22, 'science_rows': 16}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 5, 'y': 1, 'rows': 20}, {'a_science_column': 3, 'b_detector_column': 21, 'science_row': -3, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16}), ({'a': 4, 'b': 6, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 7, 'y': 7, 'rows': 9}, {'a_science_column': 5, 'b_detector_column': 7, 'science_row': 3, 'b_first_pixel': 8, 'mosaic_extent': 13, 'science_rows': 5}), ({'a': 12, 'b': 10, 'gap': 3, 'serial': 2, 'parallel': 4, 'x': 12, 'y': 20, 'rows': 20}, {'a_science_column': 10, 'b_detector_column': 14, 'science_row': 16, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_rows': 16})]}
for i, (record, expected) in enumerate(fixtures[N]):
    check('astronomical fixture %s' % i, solve(record), expected)
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
astronomical fixture 0{'a_science_column': 1, 'b_detector_column': 23, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_row': 3, 'science_rows': 16}{'a_science_column': 1, 'b_detector_column': 23, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_row': 3, 'science_rows': 16}Passed
astronomical fixture 1{'a_science_column': 3, 'b_detector_column': 23, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_row': 7, 'science_rows': 20}{'a_science_column': 3, 'b_detector_column': 23, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_row': 7, 'science_rows': 20}Passed
astronomical fixture 2{'a_science_column': 1, 'b_detector_column': 20, 'b_first_pixel': 13, 'mosaic_extent': 22, 'science_row': 3, 'science_rows': 16}{'a_science_column': 1, 'b_detector_column': 20, 'b_first_pixel': 13, 'mosaic_extent': 22, 'science_row': 3, 'science_rows': 16}Passed
astronomical fixture 3{'a_science_column': -1, 'b_detector_column': 25, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_row': -3, 'science_rows': 16}{'a_science_column': -1, 'b_detector_column': 25, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_row': -3, 'science_rows': 16}Passed
astronomical fixture 4{'a_science_column': 1, 'b_detector_column': 11, 'b_first_pixel': 8, 'mosaic_extent': 13, 'science_row': 3, 'science_rows': 5}{'a_science_column': 1, 'b_detector_column': 11, 'b_first_pixel': 8, 'mosaic_extent': 13, 'science_row': 3, 'science_rows': 5}Passed
astronomical fixture 5{'a_science_column': 6, 'b_detector_column': 18, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_row': 16, 'science_rows': 16}{'a_science_column': 6, 'b_detector_column': 18, 'b_first_pixel': 16, 'mosaic_extent': 25, 'science_row': 16, 'science_rows': 16}Passed

SHA-256 / 06cee28a92eb32f257fe691649a654ceed580e79b0217e4d34974b4c9bef9297

Verification & scope

Explicitly stipulated finite algebraic adapter; no standards conformance, physical accuracy, or production-library claim. Inputs are the documented finite valid model domain. 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:45:53.400810+00:00.

Case digest / f809693e262b1a754acb8cd8da7664b7275ada0d2f06df972f98bb0dc252d841