FAILURE MAP
← Case archive

FA-54891 / Astronomical coordinate conventions / Open access

Binned detector centers: A binned sample footprint assumes square detector bins · case 01

The adapter reports an incorrect footprint pixels while other fields remain valid.

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

ROOT CAUSE

A binned sample footprint assumes square detector bins. Faulty expression: d['bx']+d['by']

VERIFIED REPAIR

Preserve the declared model convention at this site: d['bx']*d['by']

Unsuccessful approach: A partial convention repair still uses d['bx']**2

Case contract

Pixel centers are one-based. A bin of bx by by starts at zero-based crop sx,sy. Its first center is start+(bin+1)/2. The supplied dispersion and plate scales are per unbinned pixel; bin integral weights count physical contributing pixels. Output fields are defined by: reference_x = (d['rx']-d['sx']-(d['bx']+1)/2)/d['bx']+1; reference_y = (d['ry']-d['sy']-(d['by']+1)/2)/d['by']+1; plate_scale = d['scale']*d['bx']; spectral_step = d['disp']*d['by']; footprint_pixels = d['bx']*d['by']; last_center_x = d['sx']+(d['bx']+1)/2+(d['nx']-1)*d['bx']

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 {'reference_x': (d['rx']-d['sx']-(d['bx']+1)/2)/d['bx']+1, 'reference_y': (d['ry']-d['sy']-(d['by']+1)/2)/d['by']+1, 'plate_scale': d['scale']*d['bx'], 'spectral_step': d['disp']*d['by'], 'footprint_pixels': d['bx']+d['by'], 'last_center_x': d['sx']+(d['bx']+1)/2+(d['nx']-1)*d['bx']}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = {1: [({'rx': 13, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 2, 'by': 4, 'scale': 3, 'disp': 5, 'nx': 12, 'ny': 16}, {'reference_x': 5.75, 'reference_y': 4.875, 'plate_scale': 6, 'spectral_step': 20, 'footprint_pixels': 8, 'last_center_x': 25.5}), ({'rx': 13, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 1, 'by': 1, 'scale': 3, 'disp': 5, 'nx': 12, 'ny': 16}, {'reference_x': 11.0, 'reference_y': 18.0, 'plate_scale': 3, 'spectral_step': 5, 'footprint_pixels': 1, 'last_center_x': 14.0}), ({'rx': 13, 'ry': 21, 'sx': 0, 'sy': 0, 'bx': 2, 'by': 4, 'scale': 3, 'disp': 5, 'nx': 12, 'ny': 16}, {'reference_x': 6.75, 'reference_y': 5.625, 'plate_scale': 6, 'spectral_step': 20, 'footprint_pixels': 8, 'last_center_x': 23.5}), ({'rx': 13, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 3, 'by': 2, 'scale': 3, 'disp': 5, 'nx': 12, 'ny': 16}, {'reference_x': 4.0, 'reference_y': 9.25, 'plate_scale': 9, 'spectral_step': 10, 'footprint_pixels': 6, 'last_center_x': 37.0}), ({'rx': 13, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 2, 'by': 4, 'scale': -2, 'disp': -3, 'nx': 12, 'ny': 16}, {'reference_x': 5.75, 'reference_y': 4.875, 'plate_scale': -4, 'spectral_step': -12, 'footprint_pixels': 8, 'last_center_x': 25.5}), ({'rx': 13, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 2, 'by': 4, 'scale': 3, 'disp': 5, 'nx': 1, 'ny': 1}, {'reference_x': 5.75, 'reference_y': 4.875, 'plate_scale': 6, 'spectral_step': 20, 'footprint_pixels': 8, 'last_center_x': 3.5})], 2: [({'rx': 14, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 2, 'by': 4, 'scale': 3, 'disp': 5, 'nx': 12, 'ny': 16}, {'reference_x': 6.25, 'reference_y': 4.875, 'plate_scale': 6, 'spectral_step': 20, 'footprint_pixels': 8, 'last_center_x': 25.5}), ({'rx': 14, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 1, 'by': 1, 'scale': 3, 'disp': 5, 'nx': 12, 'ny': 16}, {'reference_x': 12.0, 'reference_y': 18.0, 'plate_scale': 3, 'spectral_step': 5, 'footprint_pixels': 1, 'last_center_x': 14.0}), ({'rx': 14, 'ry': 21, 'sx': 0, 'sy': 0, 'bx': 2, 'by': 4, 'scale': 3, 'disp': 5, 'nx': 12, 'ny': 16}, {'reference_x': 7.25, 'reference_y': 5.625, 'plate_scale': 6, 'spectral_step': 20, 'footprint_pixels': 8, 'last_center_x': 23.5}), ({'rx': 14, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 3, 'by': 2, 'scale': 3, 'disp': 5, 'nx': 12, 'ny': 16}, {'reference_x': 4.333333333333334, 'reference_y': 9.25, 'plate_scale': 9, 'spectral_step': 10, 'footprint_pixels': 6, 'last_center_x': 37.0}), ({'rx': 14, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 2, 'by': 4, 'scale': -2, 'disp': -3, 'nx': 12, 'ny': 16}, {'reference_x': 6.25, 'reference_y': 4.875, 'plate_scale': -4, 'spectral_step': -12, 'footprint_pixels': 8, 'last_center_x': 25.5}), ({'rx': 14, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 2, 'by': 4, 'scale': 3, 'disp': 5, 'nx': 1, 'ny': 1}, {'reference_x': 6.25, 'reference_y': 4.875, 'plate_scale': 6, 'spectral_step': 20, 'footprint_pixels': 8, 'last_center_x': 3.5})], 3: [({'rx': 15, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 2, 'by': 4, 'scale': 3, 'disp': 5, 'nx': 12, 'ny': 16}, {'reference_x': 6.75, 'reference_y': 4.875, 'plate_scale': 6, 'spectral_step': 20, 'footprint_pixels': 8, 'last_center_x': 25.5}), ({'rx': 15, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 1, 'by': 1, 'scale': 3, 'disp': 5, 'nx': 12, 'ny': 16}, {'reference_x': 13.0, 'reference_y': 18.0, 'plate_scale': 3, 'spectral_step': 5, 'footprint_pixels': 1, 'last_center_x': 14.0}), ({'rx': 15, 'ry': 21, 'sx': 0, 'sy': 0, 'bx': 2, 'by': 4, 'scale': 3, 'disp': 5, 'nx': 12, 'ny': 16}, {'reference_x': 7.75, 'reference_y': 5.625, 'plate_scale': 6, 'spectral_step': 20, 'footprint_pixels': 8, 'last_center_x': 23.5}), ({'rx': 15, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 3, 'by': 2, 'scale': 3, 'disp': 5, 'nx': 12, 'ny': 16}, {'reference_x': 4.666666666666666, 'reference_y': 9.25, 'plate_scale': 9, 'spectral_step': 10, 'footprint_pixels': 6, 'last_center_x': 37.0}), ({'rx': 15, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 2, 'by': 4, 'scale': -2, 'disp': -3, 'nx': 12, 'ny': 16}, {'reference_x': 6.75, 'reference_y': 4.875, 'plate_scale': -4, 'spectral_step': -12, 'footprint_pixels': 8, 'last_center_x': 25.5}), ({'rx': 15, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 2, 'by': 4, 'scale': 3, 'disp': 5, 'nx': 1, 'ny': 1}, {'reference_x': 6.75, 'reference_y': 4.875, 'plate_scale': 6, 'spectral_step': 20, 'footprint_pixels': 8, 'last_center_x': 3.5})], 4: [({'rx': 16, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 2, 'by': 4, 'scale': 3, 'disp': 5, 'nx': 12, 'ny': 16}, {'reference_x': 7.25, 'reference_y': 4.875, 'plate_scale': 6, 'spectral_step': 20, 'footprint_pixels': 8, 'last_center_x': 25.5}), ({'rx': 16, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 1, 'by': 1, 'scale': 3, 'disp': 5, 'nx': 12, 'ny': 16}, {'reference_x': 14.0, 'reference_y': 18.0, 'plate_scale': 3, 'spectral_step': 5, 'footprint_pixels': 1, 'last_center_x': 14.0}), ({'rx': 16, 'ry': 21, 'sx': 0, 'sy': 0, 'bx': 2, 'by': 4, 'scale': 3, 'disp': 5, 'nx': 12, 'ny': 16}, {'reference_x': 8.25, 'reference_y': 5.625, 'plate_scale': 6, 'spectral_step': 20, 'footprint_pixels': 8, 'last_center_x': 23.5}), ({'rx': 16, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 3, 'by': 2, 'scale': 3, 'disp': 5, 'nx': 12, 'ny': 16}, {'reference_x': 5.0, 'reference_y': 9.25, 'plate_scale': 9, 'spectral_step': 10, 'footprint_pixels': 6, 'last_center_x': 37.0}), ({'rx': 16, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 2, 'by': 4, 'scale': -2, 'disp': -3, 'nx': 12, 'ny': 16}, {'reference_x': 7.25, 'reference_y': 4.875, 'plate_scale': -4, 'spectral_step': -12, 'footprint_pixels': 8, 'last_center_x': 25.5}), ({'rx': 16, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 2, 'by': 4, 'scale': 3, 'disp': 5, 'nx': 1, 'ny': 1}, {'reference_x': 7.25, 'reference_y': 4.875, 'plate_scale': 6, 'spectral_step': 20, 'footprint_pixels': 8, 'last_center_x': 3.5})], 5: [({'rx': 17, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 2, 'by': 4, 'scale': 3, 'disp': 5, 'nx': 12, 'ny': 16}, {'reference_x': 7.75, 'reference_y': 4.875, 'plate_scale': 6, 'spectral_step': 20, 'footprint_pixels': 8, 'last_center_x': 25.5}), ({'rx': 17, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 1, 'by': 1, 'scale': 3, 'disp': 5, 'nx': 12, 'ny': 16}, {'reference_x': 15.0, 'reference_y': 18.0, 'plate_scale': 3, 'spectral_step': 5, 'footprint_pixels': 1, 'last_center_x': 14.0}), ({'rx': 17, 'ry': 21, 'sx': 0, 'sy': 0, 'bx': 2, 'by': 4, 'scale': 3, 'disp': 5, 'nx': 12, 'ny': 16}, {'reference_x': 8.75, 'reference_y': 5.625, 'plate_scale': 6, 'spectral_step': 20, 'footprint_pixels': 8, 'last_center_x': 23.5}), ({'rx': 17, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 3, 'by': 2, 'scale': 3, 'disp': 5, 'nx': 12, 'ny': 16}, {'reference_x': 5.333333333333333, 'reference_y': 9.25, 'plate_scale': 9, 'spectral_step': 10, 'footprint_pixels': 6, 'last_center_x': 37.0}), ({'rx': 17, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 2, 'by': 4, 'scale': -2, 'disp': -3, 'nx': 12, 'ny': 16}, {'reference_x': 7.75, 'reference_y': 4.875, 'plate_scale': -4, 'spectral_step': -12, 'footprint_pixels': 8, 'last_center_x': 25.5}), ({'rx': 17, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 2, 'by': 4, 'scale': 3, 'disp': 5, 'nx': 1, 'ny': 1}, {'reference_x': 7.75, 'reference_y': 4.875, 'plate_scale': 6, 'spectral_step': 20, 'footprint_pixels': 8, 'last_center_x': 3.5})]}
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{'footprint_pixels': 6, 'last_center_x': 25.5, 'plate_scale': 6, 'reference_x': 5.75, 'reference_y': 4.875, 'spectral_step': 20}{'footprint_pixels': 8, 'last_center_x': 25.5, 'plate_scale': 6, 'reference_x': 5.75, 'reference_y': 4.875, 'spectral_step': 20}Failed
astronomical fixture 1{'footprint_pixels': 2, 'last_center_x': 14.0, 'plate_scale': 3, 'reference_x': 11.0, 'reference_y': 18.0, 'spectral_step': 5}{'footprint_pixels': 1, 'last_center_x': 14.0, 'plate_scale': 3, 'reference_x': 11.0, 'reference_y': 18.0, 'spectral_step': 5}Failed
astronomical fixture 2{'footprint_pixels': 6, 'last_center_x': 23.5, 'plate_scale': 6, 'reference_x': 6.75, 'reference_y': 5.625, 'spectral_step': 20}{'footprint_pixels': 8, 'last_center_x': 23.5, 'plate_scale': 6, 'reference_x': 6.75, 'reference_y': 5.625, 'spectral_step': 20}Failed
astronomical fixture 3{'footprint_pixels': 5, 'last_center_x': 37.0, 'plate_scale': 9, 'reference_x': 4.0, 'reference_y': 9.25, 'spectral_step': 10}{'footprint_pixels': 6, 'last_center_x': 37.0, 'plate_scale': 9, 'reference_x': 4.0, 'reference_y': 9.25, 'spectral_step': 10}Failed
astronomical fixture 4{'footprint_pixels': 6, 'last_center_x': 25.5, 'plate_scale': -4, 'reference_x': 5.75, 'reference_y': 4.875, 'spectral_step': -12}{'footprint_pixels': 8, 'last_center_x': 25.5, 'plate_scale': -4, 'reference_x': 5.75, 'reference_y': 4.875, 'spectral_step': -12}Failed
astronomical fixture 5{'footprint_pixels': 6, 'last_center_x': 3.5, 'plate_scale': 6, 'reference_x': 5.75, 'reference_y': 4.875, 'spectral_step': 20}{'footprint_pixels': 8, 'last_center_x': 3.5, 'plate_scale': 6, 'reference_x': 5.75, 'reference_y': 4.875, 'spectral_step': 20}Failed

SHA-256 / 3b7d1fab25e036de6ad4ae28bad6aed6224ee3aa48768b61e2ef3a65dda311d4

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(d):
    return {'reference_x': (d['rx']-d['sx']-(d['bx']+1)/2)/d['bx']+1, 'reference_y': (d['ry']-d['sy']-(d['by']+1)/2)/d['by']+1, 'plate_scale': d['scale']*d['bx'], 'spectral_step': d['disp']*d['by'], 'footprint_pixels': d['bx']**2, 'last_center_x': d['sx']+(d['bx']+1)/2+(d['nx']-1)*d['bx']}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = {1: [({'rx': 13, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 2, 'by': 4, 'scale': 3, 'disp': 5, 'nx': 12, 'ny': 16}, {'reference_x': 5.75, 'reference_y': 4.875, 'plate_scale': 6, 'spectral_step': 20, 'footprint_pixels': 8, 'last_center_x': 25.5}), ({'rx': 13, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 1, 'by': 1, 'scale': 3, 'disp': 5, 'nx': 12, 'ny': 16}, {'reference_x': 11.0, 'reference_y': 18.0, 'plate_scale': 3, 'spectral_step': 5, 'footprint_pixels': 1, 'last_center_x': 14.0}), ({'rx': 13, 'ry': 21, 'sx': 0, 'sy': 0, 'bx': 2, 'by': 4, 'scale': 3, 'disp': 5, 'nx': 12, 'ny': 16}, {'reference_x': 6.75, 'reference_y': 5.625, 'plate_scale': 6, 'spectral_step': 20, 'footprint_pixels': 8, 'last_center_x': 23.5}), ({'rx': 13, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 3, 'by': 2, 'scale': 3, 'disp': 5, 'nx': 12, 'ny': 16}, {'reference_x': 4.0, 'reference_y': 9.25, 'plate_scale': 9, 'spectral_step': 10, 'footprint_pixels': 6, 'last_center_x': 37.0}), ({'rx': 13, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 2, 'by': 4, 'scale': -2, 'disp': -3, 'nx': 12, 'ny': 16}, {'reference_x': 5.75, 'reference_y': 4.875, 'plate_scale': -4, 'spectral_step': -12, 'footprint_pixels': 8, 'last_center_x': 25.5}), ({'rx': 13, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 2, 'by': 4, 'scale': 3, 'disp': 5, 'nx': 1, 'ny': 1}, {'reference_x': 5.75, 'reference_y': 4.875, 'plate_scale': 6, 'spectral_step': 20, 'footprint_pixels': 8, 'last_center_x': 3.5})], 2: [({'rx': 14, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 2, 'by': 4, 'scale': 3, 'disp': 5, 'nx': 12, 'ny': 16}, {'reference_x': 6.25, 'reference_y': 4.875, 'plate_scale': 6, 'spectral_step': 20, 'footprint_pixels': 8, 'last_center_x': 25.5}), ({'rx': 14, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 1, 'by': 1, 'scale': 3, 'disp': 5, 'nx': 12, 'ny': 16}, {'reference_x': 12.0, 'reference_y': 18.0, 'plate_scale': 3, 'spectral_step': 5, 'footprint_pixels': 1, 'last_center_x': 14.0}), ({'rx': 14, 'ry': 21, 'sx': 0, 'sy': 0, 'bx': 2, 'by': 4, 'scale': 3, 'disp': 5, 'nx': 12, 'ny': 16}, {'reference_x': 7.25, 'reference_y': 5.625, 'plate_scale': 6, 'spectral_step': 20, 'footprint_pixels': 8, 'last_center_x': 23.5}), ({'rx': 14, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 3, 'by': 2, 'scale': 3, 'disp': 5, 'nx': 12, 'ny': 16}, {'reference_x': 4.333333333333334, 'reference_y': 9.25, 'plate_scale': 9, 'spectral_step': 10, 'footprint_pixels': 6, 'last_center_x': 37.0}), ({'rx': 14, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 2, 'by': 4, 'scale': -2, 'disp': -3, 'nx': 12, 'ny': 16}, {'reference_x': 6.25, 'reference_y': 4.875, 'plate_scale': -4, 'spectral_step': -12, 'footprint_pixels': 8, 'last_center_x': 25.5}), ({'rx': 14, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 2, 'by': 4, 'scale': 3, 'disp': 5, 'nx': 1, 'ny': 1}, {'reference_x': 6.25, 'reference_y': 4.875, 'plate_scale': 6, 'spectral_step': 20, 'footprint_pixels': 8, 'last_center_x': 3.5})], 3: [({'rx': 15, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 2, 'by': 4, 'scale': 3, 'disp': 5, 'nx': 12, 'ny': 16}, {'reference_x': 6.75, 'reference_y': 4.875, 'plate_scale': 6, 'spectral_step': 20, 'footprint_pixels': 8, 'last_center_x': 25.5}), ({'rx': 15, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 1, 'by': 1, 'scale': 3, 'disp': 5, 'nx': 12, 'ny': 16}, {'reference_x': 13.0, 'reference_y': 18.0, 'plate_scale': 3, 'spectral_step': 5, 'footprint_pixels': 1, 'last_center_x': 14.0}), ({'rx': 15, 'ry': 21, 'sx': 0, 'sy': 0, 'bx': 2, 'by': 4, 'scale': 3, 'disp': 5, 'nx': 12, 'ny': 16}, {'reference_x': 7.75, 'reference_y': 5.625, 'plate_scale': 6, 'spectral_step': 20, 'footprint_pixels': 8, 'last_center_x': 23.5}), ({'rx': 15, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 3, 'by': 2, 'scale': 3, 'disp': 5, 'nx': 12, 'ny': 16}, {'reference_x': 4.666666666666666, 'reference_y': 9.25, 'plate_scale': 9, 'spectral_step': 10, 'footprint_pixels': 6, 'last_center_x': 37.0}), ({'rx': 15, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 2, 'by': 4, 'scale': -2, 'disp': -3, 'nx': 12, 'ny': 16}, {'reference_x': 6.75, 'reference_y': 4.875, 'plate_scale': -4, 'spectral_step': -12, 'footprint_pixels': 8, 'last_center_x': 25.5}), ({'rx': 15, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 2, 'by': 4, 'scale': 3, 'disp': 5, 'nx': 1, 'ny': 1}, {'reference_x': 6.75, 'reference_y': 4.875, 'plate_scale': 6, 'spectral_step': 20, 'footprint_pixels': 8, 'last_center_x': 3.5})], 4: [({'rx': 16, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 2, 'by': 4, 'scale': 3, 'disp': 5, 'nx': 12, 'ny': 16}, {'reference_x': 7.25, 'reference_y': 4.875, 'plate_scale': 6, 'spectral_step': 20, 'footprint_pixels': 8, 'last_center_x': 25.5}), ({'rx': 16, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 1, 'by': 1, 'scale': 3, 'disp': 5, 'nx': 12, 'ny': 16}, {'reference_x': 14.0, 'reference_y': 18.0, 'plate_scale': 3, 'spectral_step': 5, 'footprint_pixels': 1, 'last_center_x': 14.0}), ({'rx': 16, 'ry': 21, 'sx': 0, 'sy': 0, 'bx': 2, 'by': 4, 'scale': 3, 'disp': 5, 'nx': 12, 'ny': 16}, {'reference_x': 8.25, 'reference_y': 5.625, 'plate_scale': 6, 'spectral_step': 20, 'footprint_pixels': 8, 'last_center_x': 23.5}), ({'rx': 16, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 3, 'by': 2, 'scale': 3, 'disp': 5, 'nx': 12, 'ny': 16}, {'reference_x': 5.0, 'reference_y': 9.25, 'plate_scale': 9, 'spectral_step': 10, 'footprint_pixels': 6, 'last_center_x': 37.0}), ({'rx': 16, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 2, 'by': 4, 'scale': -2, 'disp': -3, 'nx': 12, 'ny': 16}, {'reference_x': 7.25, 'reference_y': 4.875, 'plate_scale': -4, 'spectral_step': -12, 'footprint_pixels': 8, 'last_center_x': 25.5}), ({'rx': 16, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 2, 'by': 4, 'scale': 3, 'disp': 5, 'nx': 1, 'ny': 1}, {'reference_x': 7.25, 'reference_y': 4.875, 'plate_scale': 6, 'spectral_step': 20, 'footprint_pixels': 8, 'last_center_x': 3.5})], 5: [({'rx': 17, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 2, 'by': 4, 'scale': 3, 'disp': 5, 'nx': 12, 'ny': 16}, {'reference_x': 7.75, 'reference_y': 4.875, 'plate_scale': 6, 'spectral_step': 20, 'footprint_pixels': 8, 'last_center_x': 25.5}), ({'rx': 17, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 1, 'by': 1, 'scale': 3, 'disp': 5, 'nx': 12, 'ny': 16}, {'reference_x': 15.0, 'reference_y': 18.0, 'plate_scale': 3, 'spectral_step': 5, 'footprint_pixels': 1, 'last_center_x': 14.0}), ({'rx': 17, 'ry': 21, 'sx': 0, 'sy': 0, 'bx': 2, 'by': 4, 'scale': 3, 'disp': 5, 'nx': 12, 'ny': 16}, {'reference_x': 8.75, 'reference_y': 5.625, 'plate_scale': 6, 'spectral_step': 20, 'footprint_pixels': 8, 'last_center_x': 23.5}), ({'rx': 17, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 3, 'by': 2, 'scale': 3, 'disp': 5, 'nx': 12, 'ny': 16}, {'reference_x': 5.333333333333333, 'reference_y': 9.25, 'plate_scale': 9, 'spectral_step': 10, 'footprint_pixels': 6, 'last_center_x': 37.0}), ({'rx': 17, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 2, 'by': 4, 'scale': -2, 'disp': -3, 'nx': 12, 'ny': 16}, {'reference_x': 7.75, 'reference_y': 4.875, 'plate_scale': -4, 'spectral_step': -12, 'footprint_pixels': 8, 'last_center_x': 25.5}), ({'rx': 17, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 2, 'by': 4, 'scale': 3, 'disp': 5, 'nx': 1, 'ny': 1}, {'reference_x': 7.75, 'reference_y': 4.875, 'plate_scale': 6, 'spectral_step': 20, 'footprint_pixels': 8, 'last_center_x': 3.5})]}
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{'footprint_pixels': 4, 'last_center_x': 25.5, 'plate_scale': 6, 'reference_x': 5.75, 'reference_y': 4.875, 'spectral_step': 20}{'footprint_pixels': 8, 'last_center_x': 25.5, 'plate_scale': 6, 'reference_x': 5.75, 'reference_y': 4.875, 'spectral_step': 20}Failed
astronomical fixture 1{'footprint_pixels': 1, 'last_center_x': 14.0, 'plate_scale': 3, 'reference_x': 11.0, 'reference_y': 18.0, 'spectral_step': 5}{'footprint_pixels': 1, 'last_center_x': 14.0, 'plate_scale': 3, 'reference_x': 11.0, 'reference_y': 18.0, 'spectral_step': 5}Passed
astronomical fixture 2{'footprint_pixels': 4, 'last_center_x': 23.5, 'plate_scale': 6, 'reference_x': 6.75, 'reference_y': 5.625, 'spectral_step': 20}{'footprint_pixels': 8, 'last_center_x': 23.5, 'plate_scale': 6, 'reference_x': 6.75, 'reference_y': 5.625, 'spectral_step': 20}Failed
astronomical fixture 3{'footprint_pixels': 9, 'last_center_x': 37.0, 'plate_scale': 9, 'reference_x': 4.0, 'reference_y': 9.25, 'spectral_step': 10}{'footprint_pixels': 6, 'last_center_x': 37.0, 'plate_scale': 9, 'reference_x': 4.0, 'reference_y': 9.25, 'spectral_step': 10}Failed
astronomical fixture 4{'footprint_pixels': 4, 'last_center_x': 25.5, 'plate_scale': -4, 'reference_x': 5.75, 'reference_y': 4.875, 'spectral_step': -12}{'footprint_pixels': 8, 'last_center_x': 25.5, 'plate_scale': -4, 'reference_x': 5.75, 'reference_y': 4.875, 'spectral_step': -12}Failed
astronomical fixture 5{'footprint_pixels': 4, 'last_center_x': 3.5, 'plate_scale': 6, 'reference_x': 5.75, 'reference_y': 4.875, 'spectral_step': 20}{'footprint_pixels': 8, 'last_center_x': 3.5, 'plate_scale': 6, 'reference_x': 5.75, 'reference_y': 4.875, 'spectral_step': 20}Failed

SHA-256 / a853d774a04aeeebb5691912fe1cb7ef4aedc991ed02161b7b2ed53b6a53b7f3

3 / The verified repair

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

N = 1
observations = []
def solve(d):
    return {'reference_x': (d['rx']-d['sx']-(d['bx']+1)/2)/d['bx']+1, 'reference_y': (d['ry']-d['sy']-(d['by']+1)/2)/d['by']+1, 'plate_scale': d['scale']*d['bx'], 'spectral_step': d['disp']*d['by'], 'footprint_pixels': d['bx']*d['by'], 'last_center_x': d['sx']+(d['bx']+1)/2+(d['nx']-1)*d['bx']}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = {1: [({'rx': 13, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 2, 'by': 4, 'scale': 3, 'disp': 5, 'nx': 12, 'ny': 16}, {'reference_x': 5.75, 'reference_y': 4.875, 'plate_scale': 6, 'spectral_step': 20, 'footprint_pixels': 8, 'last_center_x': 25.5}), ({'rx': 13, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 1, 'by': 1, 'scale': 3, 'disp': 5, 'nx': 12, 'ny': 16}, {'reference_x': 11.0, 'reference_y': 18.0, 'plate_scale': 3, 'spectral_step': 5, 'footprint_pixels': 1, 'last_center_x': 14.0}), ({'rx': 13, 'ry': 21, 'sx': 0, 'sy': 0, 'bx': 2, 'by': 4, 'scale': 3, 'disp': 5, 'nx': 12, 'ny': 16}, {'reference_x': 6.75, 'reference_y': 5.625, 'plate_scale': 6, 'spectral_step': 20, 'footprint_pixels': 8, 'last_center_x': 23.5}), ({'rx': 13, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 3, 'by': 2, 'scale': 3, 'disp': 5, 'nx': 12, 'ny': 16}, {'reference_x': 4.0, 'reference_y': 9.25, 'plate_scale': 9, 'spectral_step': 10, 'footprint_pixels': 6, 'last_center_x': 37.0}), ({'rx': 13, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 2, 'by': 4, 'scale': -2, 'disp': -3, 'nx': 12, 'ny': 16}, {'reference_x': 5.75, 'reference_y': 4.875, 'plate_scale': -4, 'spectral_step': -12, 'footprint_pixels': 8, 'last_center_x': 25.5}), ({'rx': 13, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 2, 'by': 4, 'scale': 3, 'disp': 5, 'nx': 1, 'ny': 1}, {'reference_x': 5.75, 'reference_y': 4.875, 'plate_scale': 6, 'spectral_step': 20, 'footprint_pixels': 8, 'last_center_x': 3.5})], 2: [({'rx': 14, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 2, 'by': 4, 'scale': 3, 'disp': 5, 'nx': 12, 'ny': 16}, {'reference_x': 6.25, 'reference_y': 4.875, 'plate_scale': 6, 'spectral_step': 20, 'footprint_pixels': 8, 'last_center_x': 25.5}), ({'rx': 14, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 1, 'by': 1, 'scale': 3, 'disp': 5, 'nx': 12, 'ny': 16}, {'reference_x': 12.0, 'reference_y': 18.0, 'plate_scale': 3, 'spectral_step': 5, 'footprint_pixels': 1, 'last_center_x': 14.0}), ({'rx': 14, 'ry': 21, 'sx': 0, 'sy': 0, 'bx': 2, 'by': 4, 'scale': 3, 'disp': 5, 'nx': 12, 'ny': 16}, {'reference_x': 7.25, 'reference_y': 5.625, 'plate_scale': 6, 'spectral_step': 20, 'footprint_pixels': 8, 'last_center_x': 23.5}), ({'rx': 14, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 3, 'by': 2, 'scale': 3, 'disp': 5, 'nx': 12, 'ny': 16}, {'reference_x': 4.333333333333334, 'reference_y': 9.25, 'plate_scale': 9, 'spectral_step': 10, 'footprint_pixels': 6, 'last_center_x': 37.0}), ({'rx': 14, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 2, 'by': 4, 'scale': -2, 'disp': -3, 'nx': 12, 'ny': 16}, {'reference_x': 6.25, 'reference_y': 4.875, 'plate_scale': -4, 'spectral_step': -12, 'footprint_pixels': 8, 'last_center_x': 25.5}), ({'rx': 14, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 2, 'by': 4, 'scale': 3, 'disp': 5, 'nx': 1, 'ny': 1}, {'reference_x': 6.25, 'reference_y': 4.875, 'plate_scale': 6, 'spectral_step': 20, 'footprint_pixels': 8, 'last_center_x': 3.5})], 3: [({'rx': 15, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 2, 'by': 4, 'scale': 3, 'disp': 5, 'nx': 12, 'ny': 16}, {'reference_x': 6.75, 'reference_y': 4.875, 'plate_scale': 6, 'spectral_step': 20, 'footprint_pixels': 8, 'last_center_x': 25.5}), ({'rx': 15, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 1, 'by': 1, 'scale': 3, 'disp': 5, 'nx': 12, 'ny': 16}, {'reference_x': 13.0, 'reference_y': 18.0, 'plate_scale': 3, 'spectral_step': 5, 'footprint_pixels': 1, 'last_center_x': 14.0}), ({'rx': 15, 'ry': 21, 'sx': 0, 'sy': 0, 'bx': 2, 'by': 4, 'scale': 3, 'disp': 5, 'nx': 12, 'ny': 16}, {'reference_x': 7.75, 'reference_y': 5.625, 'plate_scale': 6, 'spectral_step': 20, 'footprint_pixels': 8, 'last_center_x': 23.5}), ({'rx': 15, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 3, 'by': 2, 'scale': 3, 'disp': 5, 'nx': 12, 'ny': 16}, {'reference_x': 4.666666666666666, 'reference_y': 9.25, 'plate_scale': 9, 'spectral_step': 10, 'footprint_pixels': 6, 'last_center_x': 37.0}), ({'rx': 15, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 2, 'by': 4, 'scale': -2, 'disp': -3, 'nx': 12, 'ny': 16}, {'reference_x': 6.75, 'reference_y': 4.875, 'plate_scale': -4, 'spectral_step': -12, 'footprint_pixels': 8, 'last_center_x': 25.5}), ({'rx': 15, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 2, 'by': 4, 'scale': 3, 'disp': 5, 'nx': 1, 'ny': 1}, {'reference_x': 6.75, 'reference_y': 4.875, 'plate_scale': 6, 'spectral_step': 20, 'footprint_pixels': 8, 'last_center_x': 3.5})], 4: [({'rx': 16, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 2, 'by': 4, 'scale': 3, 'disp': 5, 'nx': 12, 'ny': 16}, {'reference_x': 7.25, 'reference_y': 4.875, 'plate_scale': 6, 'spectral_step': 20, 'footprint_pixels': 8, 'last_center_x': 25.5}), ({'rx': 16, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 1, 'by': 1, 'scale': 3, 'disp': 5, 'nx': 12, 'ny': 16}, {'reference_x': 14.0, 'reference_y': 18.0, 'plate_scale': 3, 'spectral_step': 5, 'footprint_pixels': 1, 'last_center_x': 14.0}), ({'rx': 16, 'ry': 21, 'sx': 0, 'sy': 0, 'bx': 2, 'by': 4, 'scale': 3, 'disp': 5, 'nx': 12, 'ny': 16}, {'reference_x': 8.25, 'reference_y': 5.625, 'plate_scale': 6, 'spectral_step': 20, 'footprint_pixels': 8, 'last_center_x': 23.5}), ({'rx': 16, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 3, 'by': 2, 'scale': 3, 'disp': 5, 'nx': 12, 'ny': 16}, {'reference_x': 5.0, 'reference_y': 9.25, 'plate_scale': 9, 'spectral_step': 10, 'footprint_pixels': 6, 'last_center_x': 37.0}), ({'rx': 16, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 2, 'by': 4, 'scale': -2, 'disp': -3, 'nx': 12, 'ny': 16}, {'reference_x': 7.25, 'reference_y': 4.875, 'plate_scale': -4, 'spectral_step': -12, 'footprint_pixels': 8, 'last_center_x': 25.5}), ({'rx': 16, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 2, 'by': 4, 'scale': 3, 'disp': 5, 'nx': 1, 'ny': 1}, {'reference_x': 7.25, 'reference_y': 4.875, 'plate_scale': 6, 'spectral_step': 20, 'footprint_pixels': 8, 'last_center_x': 3.5})], 5: [({'rx': 17, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 2, 'by': 4, 'scale': 3, 'disp': 5, 'nx': 12, 'ny': 16}, {'reference_x': 7.75, 'reference_y': 4.875, 'plate_scale': 6, 'spectral_step': 20, 'footprint_pixels': 8, 'last_center_x': 25.5}), ({'rx': 17, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 1, 'by': 1, 'scale': 3, 'disp': 5, 'nx': 12, 'ny': 16}, {'reference_x': 15.0, 'reference_y': 18.0, 'plate_scale': 3, 'spectral_step': 5, 'footprint_pixels': 1, 'last_center_x': 14.0}), ({'rx': 17, 'ry': 21, 'sx': 0, 'sy': 0, 'bx': 2, 'by': 4, 'scale': 3, 'disp': 5, 'nx': 12, 'ny': 16}, {'reference_x': 8.75, 'reference_y': 5.625, 'plate_scale': 6, 'spectral_step': 20, 'footprint_pixels': 8, 'last_center_x': 23.5}), ({'rx': 17, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 3, 'by': 2, 'scale': 3, 'disp': 5, 'nx': 12, 'ny': 16}, {'reference_x': 5.333333333333333, 'reference_y': 9.25, 'plate_scale': 9, 'spectral_step': 10, 'footprint_pixels': 6, 'last_center_x': 37.0}), ({'rx': 17, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 2, 'by': 4, 'scale': -2, 'disp': -3, 'nx': 12, 'ny': 16}, {'reference_x': 7.75, 'reference_y': 4.875, 'plate_scale': -4, 'spectral_step': -12, 'footprint_pixels': 8, 'last_center_x': 25.5}), ({'rx': 17, 'ry': 21, 'sx': 2, 'sy': 3, 'bx': 2, 'by': 4, 'scale': 3, 'disp': 5, 'nx': 1, 'ny': 1}, {'reference_x': 7.75, 'reference_y': 4.875, 'plate_scale': 6, 'spectral_step': 20, 'footprint_pixels': 8, 'last_center_x': 3.5})]}
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{'footprint_pixels': 8, 'last_center_x': 25.5, 'plate_scale': 6, 'reference_x': 5.75, 'reference_y': 4.875, 'spectral_step': 20}{'footprint_pixels': 8, 'last_center_x': 25.5, 'plate_scale': 6, 'reference_x': 5.75, 'reference_y': 4.875, 'spectral_step': 20}Passed
astronomical fixture 1{'footprint_pixels': 1, 'last_center_x': 14.0, 'plate_scale': 3, 'reference_x': 11.0, 'reference_y': 18.0, 'spectral_step': 5}{'footprint_pixels': 1, 'last_center_x': 14.0, 'plate_scale': 3, 'reference_x': 11.0, 'reference_y': 18.0, 'spectral_step': 5}Passed
astronomical fixture 2{'footprint_pixels': 8, 'last_center_x': 23.5, 'plate_scale': 6, 'reference_x': 6.75, 'reference_y': 5.625, 'spectral_step': 20}{'footprint_pixels': 8, 'last_center_x': 23.5, 'plate_scale': 6, 'reference_x': 6.75, 'reference_y': 5.625, 'spectral_step': 20}Passed
astronomical fixture 3{'footprint_pixels': 6, 'last_center_x': 37.0, 'plate_scale': 9, 'reference_x': 4.0, 'reference_y': 9.25, 'spectral_step': 10}{'footprint_pixels': 6, 'last_center_x': 37.0, 'plate_scale': 9, 'reference_x': 4.0, 'reference_y': 9.25, 'spectral_step': 10}Passed
astronomical fixture 4{'footprint_pixels': 8, 'last_center_x': 25.5, 'plate_scale': -4, 'reference_x': 5.75, 'reference_y': 4.875, 'spectral_step': -12}{'footprint_pixels': 8, 'last_center_x': 25.5, 'plate_scale': -4, 'reference_x': 5.75, 'reference_y': 4.875, 'spectral_step': -12}Passed
astronomical fixture 5{'footprint_pixels': 8, 'last_center_x': 3.5, 'plate_scale': 6, 'reference_x': 5.75, 'reference_y': 4.875, 'spectral_step': 20}{'footprint_pixels': 8, 'last_center_x': 3.5, 'plate_scale': 6, 'reference_x': 5.75, 'reference_y': 4.875, 'spectral_step': 20}Passed

SHA-256 / 49f80b7ef16f4e256d4da9c2ba1c508146995137e9faae92c24345df83a36eb9

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:52.491672+00:00.

Case digest / 08c9459a8daca18cc2c44c1b7e85a70a7b7a32827efb1e306015bfe0add6020b