FAILURE MAP
← Case archive

FA-55066 / Astronomical coordinate conventions / Open access

Echelle order coordinate: Extraction lower edge confuses supplied half-height with full width · case 01

The adapter reports an incorrect lower aperture while other fields remain valid.

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

ROOT CAUSE

Extraction lower edge confuses supplied half-height with full width. Faulty expression: d['t0']-d['h']

VERIFIED REPAIR

Preserve the declared model convention at this site: d['t0']+d['t1']*d['x']-d['h']

Unsuccessful approach: A partial convention repair still uses d['t0']+d['t1']*d['x']-d['h']/2

Case contract

A reduced echelle extractor uses detector x along dispersion and y across orders. The blaze coordinate is centered on bx, trace is t0+t1*x, order-normalized wavelength is k/m, and rectangular extraction bounds use half-height h about that trace. Orders m are positive. Output fields are defined by: trace_offset = d['y']-d['t0']-d['t1']*d['x']; blaze_coordinate = d['x']-d['bx']; order_wavelength = d['k']/d['m']; lower_aperture = d['t0']+d['t1']*d['x']-d['h']; upper_aperture = d['t0']+d['t1']*d['x']+d['h']; neighbor_trace = d['t0']+d['t1']*d['x']+d['pitch']

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 {'trace_offset': d['y']-d['t0']-d['t1']*d['x'], 'blaze_coordinate': d['x']-d['bx'], 'order_wavelength': d['k']/d['m'], 'lower_aperture': d['t0']-d['h'], 'upper_aperture': d['t0']+d['t1']*d['x']+d['h'], 'neighbor_trace': d['t0']+d['t1']*d['x']+d['pitch']}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = {1: [({'x': 4, 'y': 8, 'bx': 2, 't0': 3, 't1': 2, 'k': 120, 'm': 3, 'h': 2, 'pitch': 5}, {'trace_offset': -3, 'blaze_coordinate': 2, 'order_wavelength': 40.0, 'lower_aperture': 9, 'upper_aperture': 13, 'neighbor_trace': 16}), ({'x': 4, 'y': 8, 'bx': 2, 't0': 3, 't1': 0, 'k': 120, 'm': 3, 'h': 2, 'pitch': 5}, {'trace_offset': 5, 'blaze_coordinate': 2, 'order_wavelength': 40.0, 'lower_aperture': 1, 'upper_aperture': 5, 'neighbor_trace': 8}), ({'x': 4, 'y': 8, 'bx': 2, 't0': 3, 't1': 2, 'k': 120, 'm': 3, 'h': 0, 'pitch': 5}, {'trace_offset': -3, 'blaze_coordinate': 2, 'order_wavelength': 40.0, 'lower_aperture': 11, 'upper_aperture': 11, 'neighbor_trace': 16}), ({'x': 4, 'y': 8, 'bx': 2, 't0': 3, 't1': 2, 'k': 120, 'm': 1, 'h': 2, 'pitch': 5}, {'trace_offset': -3, 'blaze_coordinate': 2, 'order_wavelength': 120.0, 'lower_aperture': 9, 'upper_aperture': 13, 'neighbor_trace': 16}), ({'x': 4, 'y': -2, 'bx': 2, 't0': 3, 't1': -1, 'k': 120, 'm': 3, 'h': 2, 'pitch': 5}, {'trace_offset': -1, 'blaze_coordinate': 2, 'order_wavelength': 40.0, 'lower_aperture': -3, 'upper_aperture': 1, 'neighbor_trace': 4}), ({'x': 4, 'y': 8, 'bx': -2, 't0': 3, 't1': 2, 'k': 120, 'm': 3, 'h': 2, 'pitch': 7}, {'trace_offset': -3, 'blaze_coordinate': 6, 'order_wavelength': 40.0, 'lower_aperture': 9, 'upper_aperture': 13, 'neighbor_trace': 18})], 2: [({'x': 5, 'y': 8, 'bx': 2, 't0': 3, 't1': 2, 'k': 120, 'm': 3, 'h': 2, 'pitch': 5}, {'trace_offset': -5, 'blaze_coordinate': 3, 'order_wavelength': 40.0, 'lower_aperture': 11, 'upper_aperture': 15, 'neighbor_trace': 18}), ({'x': 5, 'y': 8, 'bx': 2, 't0': 3, 't1': 0, 'k': 120, 'm': 3, 'h': 2, 'pitch': 5}, {'trace_offset': 5, 'blaze_coordinate': 3, 'order_wavelength': 40.0, 'lower_aperture': 1, 'upper_aperture': 5, 'neighbor_trace': 8}), ({'x': 5, 'y': 8, 'bx': 2, 't0': 3, 't1': 2, 'k': 120, 'm': 3, 'h': 0, 'pitch': 5}, {'trace_offset': -5, 'blaze_coordinate': 3, 'order_wavelength': 40.0, 'lower_aperture': 13, 'upper_aperture': 13, 'neighbor_trace': 18}), ({'x': 5, 'y': 8, 'bx': 2, 't0': 3, 't1': 2, 'k': 120, 'm': 1, 'h': 2, 'pitch': 5}, {'trace_offset': -5, 'blaze_coordinate': 3, 'order_wavelength': 120.0, 'lower_aperture': 11, 'upper_aperture': 15, 'neighbor_trace': 18}), ({'x': 5, 'y': -2, 'bx': 2, 't0': 3, 't1': -1, 'k': 120, 'm': 3, 'h': 2, 'pitch': 5}, {'trace_offset': 0, 'blaze_coordinate': 3, 'order_wavelength': 40.0, 'lower_aperture': -4, 'upper_aperture': 0, 'neighbor_trace': 3}), ({'x': 5, 'y': 8, 'bx': -2, 't0': 3, 't1': 2, 'k': 120, 'm': 3, 'h': 2, 'pitch': 7}, {'trace_offset': -5, 'blaze_coordinate': 7, 'order_wavelength': 40.0, 'lower_aperture': 11, 'upper_aperture': 15, 'neighbor_trace': 20})], 3: [({'x': 6, 'y': 8, 'bx': 2, 't0': 3, 't1': 2, 'k': 120, 'm': 3, 'h': 2, 'pitch': 5}, {'trace_offset': -7, 'blaze_coordinate': 4, 'order_wavelength': 40.0, 'lower_aperture': 13, 'upper_aperture': 17, 'neighbor_trace': 20}), ({'x': 6, 'y': 8, 'bx': 2, 't0': 3, 't1': 0, 'k': 120, 'm': 3, 'h': 2, 'pitch': 5}, {'trace_offset': 5, 'blaze_coordinate': 4, 'order_wavelength': 40.0, 'lower_aperture': 1, 'upper_aperture': 5, 'neighbor_trace': 8}), ({'x': 6, 'y': 8, 'bx': 2, 't0': 3, 't1': 2, 'k': 120, 'm': 3, 'h': 0, 'pitch': 5}, {'trace_offset': -7, 'blaze_coordinate': 4, 'order_wavelength': 40.0, 'lower_aperture': 15, 'upper_aperture': 15, 'neighbor_trace': 20}), ({'x': 6, 'y': 8, 'bx': 2, 't0': 3, 't1': 2, 'k': 120, 'm': 1, 'h': 2, 'pitch': 5}, {'trace_offset': -7, 'blaze_coordinate': 4, 'order_wavelength': 120.0, 'lower_aperture': 13, 'upper_aperture': 17, 'neighbor_trace': 20}), ({'x': 6, 'y': -2, 'bx': 2, 't0': 3, 't1': -1, 'k': 120, 'm': 3, 'h': 2, 'pitch': 5}, {'trace_offset': 1, 'blaze_coordinate': 4, 'order_wavelength': 40.0, 'lower_aperture': -5, 'upper_aperture': -1, 'neighbor_trace': 2}), ({'x': 6, 'y': 8, 'bx': -2, 't0': 3, 't1': 2, 'k': 120, 'm': 3, 'h': 2, 'pitch': 7}, {'trace_offset': -7, 'blaze_coordinate': 8, 'order_wavelength': 40.0, 'lower_aperture': 13, 'upper_aperture': 17, 'neighbor_trace': 22})], 4: [({'x': 7, 'y': 8, 'bx': 2, 't0': 3, 't1': 2, 'k': 120, 'm': 3, 'h': 2, 'pitch': 5}, {'trace_offset': -9, 'blaze_coordinate': 5, 'order_wavelength': 40.0, 'lower_aperture': 15, 'upper_aperture': 19, 'neighbor_trace': 22}), ({'x': 7, 'y': 8, 'bx': 2, 't0': 3, 't1': 0, 'k': 120, 'm': 3, 'h': 2, 'pitch': 5}, {'trace_offset': 5, 'blaze_coordinate': 5, 'order_wavelength': 40.0, 'lower_aperture': 1, 'upper_aperture': 5, 'neighbor_trace': 8}), ({'x': 7, 'y': 8, 'bx': 2, 't0': 3, 't1': 2, 'k': 120, 'm': 3, 'h': 0, 'pitch': 5}, {'trace_offset': -9, 'blaze_coordinate': 5, 'order_wavelength': 40.0, 'lower_aperture': 17, 'upper_aperture': 17, 'neighbor_trace': 22}), ({'x': 7, 'y': 8, 'bx': 2, 't0': 3, 't1': 2, 'k': 120, 'm': 1, 'h': 2, 'pitch': 5}, {'trace_offset': -9, 'blaze_coordinate': 5, 'order_wavelength': 120.0, 'lower_aperture': 15, 'upper_aperture': 19, 'neighbor_trace': 22}), ({'x': 7, 'y': -2, 'bx': 2, 't0': 3, 't1': -1, 'k': 120, 'm': 3, 'h': 2, 'pitch': 5}, {'trace_offset': 2, 'blaze_coordinate': 5, 'order_wavelength': 40.0, 'lower_aperture': -6, 'upper_aperture': -2, 'neighbor_trace': 1}), ({'x': 7, 'y': 8, 'bx': -2, 't0': 3, 't1': 2, 'k': 120, 'm': 3, 'h': 2, 'pitch': 7}, {'trace_offset': -9, 'blaze_coordinate': 9, 'order_wavelength': 40.0, 'lower_aperture': 15, 'upper_aperture': 19, 'neighbor_trace': 24})], 5: [({'x': 8, 'y': 8, 'bx': 2, 't0': 3, 't1': 2, 'k': 120, 'm': 3, 'h': 2, 'pitch': 5}, {'trace_offset': -11, 'blaze_coordinate': 6, 'order_wavelength': 40.0, 'lower_aperture': 17, 'upper_aperture': 21, 'neighbor_trace': 24}), ({'x': 8, 'y': 8, 'bx': 2, 't0': 3, 't1': 0, 'k': 120, 'm': 3, 'h': 2, 'pitch': 5}, {'trace_offset': 5, 'blaze_coordinate': 6, 'order_wavelength': 40.0, 'lower_aperture': 1, 'upper_aperture': 5, 'neighbor_trace': 8}), ({'x': 8, 'y': 8, 'bx': 2, 't0': 3, 't1': 2, 'k': 120, 'm': 3, 'h': 0, 'pitch': 5}, {'trace_offset': -11, 'blaze_coordinate': 6, 'order_wavelength': 40.0, 'lower_aperture': 19, 'upper_aperture': 19, 'neighbor_trace': 24}), ({'x': 8, 'y': 8, 'bx': 2, 't0': 3, 't1': 2, 'k': 120, 'm': 1, 'h': 2, 'pitch': 5}, {'trace_offset': -11, 'blaze_coordinate': 6, 'order_wavelength': 120.0, 'lower_aperture': 17, 'upper_aperture': 21, 'neighbor_trace': 24}), ({'x': 8, 'y': -2, 'bx': 2, 't0': 3, 't1': -1, 'k': 120, 'm': 3, 'h': 2, 'pitch': 5}, {'trace_offset': 3, 'blaze_coordinate': 6, 'order_wavelength': 40.0, 'lower_aperture': -7, 'upper_aperture': -3, 'neighbor_trace': 0}), ({'x': 8, 'y': 8, 'bx': -2, 't0': 3, 't1': 2, 'k': 120, 'm': 3, 'h': 2, 'pitch': 7}, {'trace_offset': -11, 'blaze_coordinate': 10, 'order_wavelength': 40.0, 'lower_aperture': 17, 'upper_aperture': 21, 'neighbor_trace': 26})]}
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{'blaze_coordinate': 2, 'lower_aperture': 1, 'neighbor_trace': 16, 'order_wavelength': 40.0, 'trace_offset': -3, 'upper_aperture': 13}{'blaze_coordinate': 2, 'lower_aperture': 9, 'neighbor_trace': 16, 'order_wavelength': 40.0, 'trace_offset': -3, 'upper_aperture': 13}Failed
astronomical fixture 1{'blaze_coordinate': 2, 'lower_aperture': 1, 'neighbor_trace': 8, 'order_wavelength': 40.0, 'trace_offset': 5, 'upper_aperture': 5}{'blaze_coordinate': 2, 'lower_aperture': 1, 'neighbor_trace': 8, 'order_wavelength': 40.0, 'trace_offset': 5, 'upper_aperture': 5}Passed
astronomical fixture 2{'blaze_coordinate': 2, 'lower_aperture': 3, 'neighbor_trace': 16, 'order_wavelength': 40.0, 'trace_offset': -3, 'upper_aperture': 11}{'blaze_coordinate': 2, 'lower_aperture': 11, 'neighbor_trace': 16, 'order_wavelength': 40.0, 'trace_offset': -3, 'upper_aperture': 11}Failed
astronomical fixture 3{'blaze_coordinate': 2, 'lower_aperture': 1, 'neighbor_trace': 16, 'order_wavelength': 120.0, 'trace_offset': -3, 'upper_aperture': 13}{'blaze_coordinate': 2, 'lower_aperture': 9, 'neighbor_trace': 16, 'order_wavelength': 120.0, 'trace_offset': -3, 'upper_aperture': 13}Failed
astronomical fixture 4{'blaze_coordinate': 2, 'lower_aperture': 1, 'neighbor_trace': 4, 'order_wavelength': 40.0, 'trace_offset': -1, 'upper_aperture': 1}{'blaze_coordinate': 2, 'lower_aperture': -3, 'neighbor_trace': 4, 'order_wavelength': 40.0, 'trace_offset': -1, 'upper_aperture': 1}Failed
astronomical fixture 5{'blaze_coordinate': 6, 'lower_aperture': 1, 'neighbor_trace': 18, 'order_wavelength': 40.0, 'trace_offset': -3, 'upper_aperture': 13}{'blaze_coordinate': 6, 'lower_aperture': 9, 'neighbor_trace': 18, 'order_wavelength': 40.0, 'trace_offset': -3, 'upper_aperture': 13}Failed

SHA-256 / b6ea207a9a1ff29ad2d775d7f309dfebcbf61e35b831b0e6afd6ebff7150e92e

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(d):
    return {'trace_offset': d['y']-d['t0']-d['t1']*d['x'], 'blaze_coordinate': d['x']-d['bx'], 'order_wavelength': d['k']/d['m'], 'lower_aperture': d['t0']+d['t1']*d['x']-d['h']/2, 'upper_aperture': d['t0']+d['t1']*d['x']+d['h'], 'neighbor_trace': d['t0']+d['t1']*d['x']+d['pitch']}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = {1: [({'x': 4, 'y': 8, 'bx': 2, 't0': 3, 't1': 2, 'k': 120, 'm': 3, 'h': 2, 'pitch': 5}, {'trace_offset': -3, 'blaze_coordinate': 2, 'order_wavelength': 40.0, 'lower_aperture': 9, 'upper_aperture': 13, 'neighbor_trace': 16}), ({'x': 4, 'y': 8, 'bx': 2, 't0': 3, 't1': 0, 'k': 120, 'm': 3, 'h': 2, 'pitch': 5}, {'trace_offset': 5, 'blaze_coordinate': 2, 'order_wavelength': 40.0, 'lower_aperture': 1, 'upper_aperture': 5, 'neighbor_trace': 8}), ({'x': 4, 'y': 8, 'bx': 2, 't0': 3, 't1': 2, 'k': 120, 'm': 3, 'h': 0, 'pitch': 5}, {'trace_offset': -3, 'blaze_coordinate': 2, 'order_wavelength': 40.0, 'lower_aperture': 11, 'upper_aperture': 11, 'neighbor_trace': 16}), ({'x': 4, 'y': 8, 'bx': 2, 't0': 3, 't1': 2, 'k': 120, 'm': 1, 'h': 2, 'pitch': 5}, {'trace_offset': -3, 'blaze_coordinate': 2, 'order_wavelength': 120.0, 'lower_aperture': 9, 'upper_aperture': 13, 'neighbor_trace': 16}), ({'x': 4, 'y': -2, 'bx': 2, 't0': 3, 't1': -1, 'k': 120, 'm': 3, 'h': 2, 'pitch': 5}, {'trace_offset': -1, 'blaze_coordinate': 2, 'order_wavelength': 40.0, 'lower_aperture': -3, 'upper_aperture': 1, 'neighbor_trace': 4}), ({'x': 4, 'y': 8, 'bx': -2, 't0': 3, 't1': 2, 'k': 120, 'm': 3, 'h': 2, 'pitch': 7}, {'trace_offset': -3, 'blaze_coordinate': 6, 'order_wavelength': 40.0, 'lower_aperture': 9, 'upper_aperture': 13, 'neighbor_trace': 18})], 2: [({'x': 5, 'y': 8, 'bx': 2, 't0': 3, 't1': 2, 'k': 120, 'm': 3, 'h': 2, 'pitch': 5}, {'trace_offset': -5, 'blaze_coordinate': 3, 'order_wavelength': 40.0, 'lower_aperture': 11, 'upper_aperture': 15, 'neighbor_trace': 18}), ({'x': 5, 'y': 8, 'bx': 2, 't0': 3, 't1': 0, 'k': 120, 'm': 3, 'h': 2, 'pitch': 5}, {'trace_offset': 5, 'blaze_coordinate': 3, 'order_wavelength': 40.0, 'lower_aperture': 1, 'upper_aperture': 5, 'neighbor_trace': 8}), ({'x': 5, 'y': 8, 'bx': 2, 't0': 3, 't1': 2, 'k': 120, 'm': 3, 'h': 0, 'pitch': 5}, {'trace_offset': -5, 'blaze_coordinate': 3, 'order_wavelength': 40.0, 'lower_aperture': 13, 'upper_aperture': 13, 'neighbor_trace': 18}), ({'x': 5, 'y': 8, 'bx': 2, 't0': 3, 't1': 2, 'k': 120, 'm': 1, 'h': 2, 'pitch': 5}, {'trace_offset': -5, 'blaze_coordinate': 3, 'order_wavelength': 120.0, 'lower_aperture': 11, 'upper_aperture': 15, 'neighbor_trace': 18}), ({'x': 5, 'y': -2, 'bx': 2, 't0': 3, 't1': -1, 'k': 120, 'm': 3, 'h': 2, 'pitch': 5}, {'trace_offset': 0, 'blaze_coordinate': 3, 'order_wavelength': 40.0, 'lower_aperture': -4, 'upper_aperture': 0, 'neighbor_trace': 3}), ({'x': 5, 'y': 8, 'bx': -2, 't0': 3, 't1': 2, 'k': 120, 'm': 3, 'h': 2, 'pitch': 7}, {'trace_offset': -5, 'blaze_coordinate': 7, 'order_wavelength': 40.0, 'lower_aperture': 11, 'upper_aperture': 15, 'neighbor_trace': 20})], 3: [({'x': 6, 'y': 8, 'bx': 2, 't0': 3, 't1': 2, 'k': 120, 'm': 3, 'h': 2, 'pitch': 5}, {'trace_offset': -7, 'blaze_coordinate': 4, 'order_wavelength': 40.0, 'lower_aperture': 13, 'upper_aperture': 17, 'neighbor_trace': 20}), ({'x': 6, 'y': 8, 'bx': 2, 't0': 3, 't1': 0, 'k': 120, 'm': 3, 'h': 2, 'pitch': 5}, {'trace_offset': 5, 'blaze_coordinate': 4, 'order_wavelength': 40.0, 'lower_aperture': 1, 'upper_aperture': 5, 'neighbor_trace': 8}), ({'x': 6, 'y': 8, 'bx': 2, 't0': 3, 't1': 2, 'k': 120, 'm': 3, 'h': 0, 'pitch': 5}, {'trace_offset': -7, 'blaze_coordinate': 4, 'order_wavelength': 40.0, 'lower_aperture': 15, 'upper_aperture': 15, 'neighbor_trace': 20}), ({'x': 6, 'y': 8, 'bx': 2, 't0': 3, 't1': 2, 'k': 120, 'm': 1, 'h': 2, 'pitch': 5}, {'trace_offset': -7, 'blaze_coordinate': 4, 'order_wavelength': 120.0, 'lower_aperture': 13, 'upper_aperture': 17, 'neighbor_trace': 20}), ({'x': 6, 'y': -2, 'bx': 2, 't0': 3, 't1': -1, 'k': 120, 'm': 3, 'h': 2, 'pitch': 5}, {'trace_offset': 1, 'blaze_coordinate': 4, 'order_wavelength': 40.0, 'lower_aperture': -5, 'upper_aperture': -1, 'neighbor_trace': 2}), ({'x': 6, 'y': 8, 'bx': -2, 't0': 3, 't1': 2, 'k': 120, 'm': 3, 'h': 2, 'pitch': 7}, {'trace_offset': -7, 'blaze_coordinate': 8, 'order_wavelength': 40.0, 'lower_aperture': 13, 'upper_aperture': 17, 'neighbor_trace': 22})], 4: [({'x': 7, 'y': 8, 'bx': 2, 't0': 3, 't1': 2, 'k': 120, 'm': 3, 'h': 2, 'pitch': 5}, {'trace_offset': -9, 'blaze_coordinate': 5, 'order_wavelength': 40.0, 'lower_aperture': 15, 'upper_aperture': 19, 'neighbor_trace': 22}), ({'x': 7, 'y': 8, 'bx': 2, 't0': 3, 't1': 0, 'k': 120, 'm': 3, 'h': 2, 'pitch': 5}, {'trace_offset': 5, 'blaze_coordinate': 5, 'order_wavelength': 40.0, 'lower_aperture': 1, 'upper_aperture': 5, 'neighbor_trace': 8}), ({'x': 7, 'y': 8, 'bx': 2, 't0': 3, 't1': 2, 'k': 120, 'm': 3, 'h': 0, 'pitch': 5}, {'trace_offset': -9, 'blaze_coordinate': 5, 'order_wavelength': 40.0, 'lower_aperture': 17, 'upper_aperture': 17, 'neighbor_trace': 22}), ({'x': 7, 'y': 8, 'bx': 2, 't0': 3, 't1': 2, 'k': 120, 'm': 1, 'h': 2, 'pitch': 5}, {'trace_offset': -9, 'blaze_coordinate': 5, 'order_wavelength': 120.0, 'lower_aperture': 15, 'upper_aperture': 19, 'neighbor_trace': 22}), ({'x': 7, 'y': -2, 'bx': 2, 't0': 3, 't1': -1, 'k': 120, 'm': 3, 'h': 2, 'pitch': 5}, {'trace_offset': 2, 'blaze_coordinate': 5, 'order_wavelength': 40.0, 'lower_aperture': -6, 'upper_aperture': -2, 'neighbor_trace': 1}), ({'x': 7, 'y': 8, 'bx': -2, 't0': 3, 't1': 2, 'k': 120, 'm': 3, 'h': 2, 'pitch': 7}, {'trace_offset': -9, 'blaze_coordinate': 9, 'order_wavelength': 40.0, 'lower_aperture': 15, 'upper_aperture': 19, 'neighbor_trace': 24})], 5: [({'x': 8, 'y': 8, 'bx': 2, 't0': 3, 't1': 2, 'k': 120, 'm': 3, 'h': 2, 'pitch': 5}, {'trace_offset': -11, 'blaze_coordinate': 6, 'order_wavelength': 40.0, 'lower_aperture': 17, 'upper_aperture': 21, 'neighbor_trace': 24}), ({'x': 8, 'y': 8, 'bx': 2, 't0': 3, 't1': 0, 'k': 120, 'm': 3, 'h': 2, 'pitch': 5}, {'trace_offset': 5, 'blaze_coordinate': 6, 'order_wavelength': 40.0, 'lower_aperture': 1, 'upper_aperture': 5, 'neighbor_trace': 8}), ({'x': 8, 'y': 8, 'bx': 2, 't0': 3, 't1': 2, 'k': 120, 'm': 3, 'h': 0, 'pitch': 5}, {'trace_offset': -11, 'blaze_coordinate': 6, 'order_wavelength': 40.0, 'lower_aperture': 19, 'upper_aperture': 19, 'neighbor_trace': 24}), ({'x': 8, 'y': 8, 'bx': 2, 't0': 3, 't1': 2, 'k': 120, 'm': 1, 'h': 2, 'pitch': 5}, {'trace_offset': -11, 'blaze_coordinate': 6, 'order_wavelength': 120.0, 'lower_aperture': 17, 'upper_aperture': 21, 'neighbor_trace': 24}), ({'x': 8, 'y': -2, 'bx': 2, 't0': 3, 't1': -1, 'k': 120, 'm': 3, 'h': 2, 'pitch': 5}, {'trace_offset': 3, 'blaze_coordinate': 6, 'order_wavelength': 40.0, 'lower_aperture': -7, 'upper_aperture': -3, 'neighbor_trace': 0}), ({'x': 8, 'y': 8, 'bx': -2, 't0': 3, 't1': 2, 'k': 120, 'm': 3, 'h': 2, 'pitch': 7}, {'trace_offset': -11, 'blaze_coordinate': 10, 'order_wavelength': 40.0, 'lower_aperture': 17, 'upper_aperture': 21, 'neighbor_trace': 26})]}
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{'blaze_coordinate': 2, 'lower_aperture': 10.0, 'neighbor_trace': 16, 'order_wavelength': 40.0, 'trace_offset': -3, 'upper_aperture': 13}{'blaze_coordinate': 2, 'lower_aperture': 9, 'neighbor_trace': 16, 'order_wavelength': 40.0, 'trace_offset': -3, 'upper_aperture': 13}Failed
astronomical fixture 1{'blaze_coordinate': 2, 'lower_aperture': 2.0, 'neighbor_trace': 8, 'order_wavelength': 40.0, 'trace_offset': 5, 'upper_aperture': 5}{'blaze_coordinate': 2, 'lower_aperture': 1, 'neighbor_trace': 8, 'order_wavelength': 40.0, 'trace_offset': 5, 'upper_aperture': 5}Failed
astronomical fixture 2{'blaze_coordinate': 2, 'lower_aperture': 11.0, 'neighbor_trace': 16, 'order_wavelength': 40.0, 'trace_offset': -3, 'upper_aperture': 11}{'blaze_coordinate': 2, 'lower_aperture': 11, 'neighbor_trace': 16, 'order_wavelength': 40.0, 'trace_offset': -3, 'upper_aperture': 11}Passed
astronomical fixture 3{'blaze_coordinate': 2, 'lower_aperture': 10.0, 'neighbor_trace': 16, 'order_wavelength': 120.0, 'trace_offset': -3, 'upper_aperture': 13}{'blaze_coordinate': 2, 'lower_aperture': 9, 'neighbor_trace': 16, 'order_wavelength': 120.0, 'trace_offset': -3, 'upper_aperture': 13}Failed
astronomical fixture 4{'blaze_coordinate': 2, 'lower_aperture': -2.0, 'neighbor_trace': 4, 'order_wavelength': 40.0, 'trace_offset': -1, 'upper_aperture': 1}{'blaze_coordinate': 2, 'lower_aperture': -3, 'neighbor_trace': 4, 'order_wavelength': 40.0, 'trace_offset': -1, 'upper_aperture': 1}Failed
astronomical fixture 5{'blaze_coordinate': 6, 'lower_aperture': 10.0, 'neighbor_trace': 18, 'order_wavelength': 40.0, 'trace_offset': -3, 'upper_aperture': 13}{'blaze_coordinate': 6, 'lower_aperture': 9, 'neighbor_trace': 18, 'order_wavelength': 40.0, 'trace_offset': -3, 'upper_aperture': 13}Failed

SHA-256 / 861405e09b1820dbb108d8987b13fe947008b78e358cff5c053d742b7d16e55f

3 / The verified repair

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

N = 1
observations = []
def solve(d):
    return {'trace_offset': d['y']-d['t0']-d['t1']*d['x'], 'blaze_coordinate': d['x']-d['bx'], 'order_wavelength': d['k']/d['m'], 'lower_aperture': d['t0']+d['t1']*d['x']-d['h'], 'upper_aperture': d['t0']+d['t1']*d['x']+d['h'], 'neighbor_trace': d['t0']+d['t1']*d['x']+d['pitch']}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = {1: [({'x': 4, 'y': 8, 'bx': 2, 't0': 3, 't1': 2, 'k': 120, 'm': 3, 'h': 2, 'pitch': 5}, {'trace_offset': -3, 'blaze_coordinate': 2, 'order_wavelength': 40.0, 'lower_aperture': 9, 'upper_aperture': 13, 'neighbor_trace': 16}), ({'x': 4, 'y': 8, 'bx': 2, 't0': 3, 't1': 0, 'k': 120, 'm': 3, 'h': 2, 'pitch': 5}, {'trace_offset': 5, 'blaze_coordinate': 2, 'order_wavelength': 40.0, 'lower_aperture': 1, 'upper_aperture': 5, 'neighbor_trace': 8}), ({'x': 4, 'y': 8, 'bx': 2, 't0': 3, 't1': 2, 'k': 120, 'm': 3, 'h': 0, 'pitch': 5}, {'trace_offset': -3, 'blaze_coordinate': 2, 'order_wavelength': 40.0, 'lower_aperture': 11, 'upper_aperture': 11, 'neighbor_trace': 16}), ({'x': 4, 'y': 8, 'bx': 2, 't0': 3, 't1': 2, 'k': 120, 'm': 1, 'h': 2, 'pitch': 5}, {'trace_offset': -3, 'blaze_coordinate': 2, 'order_wavelength': 120.0, 'lower_aperture': 9, 'upper_aperture': 13, 'neighbor_trace': 16}), ({'x': 4, 'y': -2, 'bx': 2, 't0': 3, 't1': -1, 'k': 120, 'm': 3, 'h': 2, 'pitch': 5}, {'trace_offset': -1, 'blaze_coordinate': 2, 'order_wavelength': 40.0, 'lower_aperture': -3, 'upper_aperture': 1, 'neighbor_trace': 4}), ({'x': 4, 'y': 8, 'bx': -2, 't0': 3, 't1': 2, 'k': 120, 'm': 3, 'h': 2, 'pitch': 7}, {'trace_offset': -3, 'blaze_coordinate': 6, 'order_wavelength': 40.0, 'lower_aperture': 9, 'upper_aperture': 13, 'neighbor_trace': 18})], 2: [({'x': 5, 'y': 8, 'bx': 2, 't0': 3, 't1': 2, 'k': 120, 'm': 3, 'h': 2, 'pitch': 5}, {'trace_offset': -5, 'blaze_coordinate': 3, 'order_wavelength': 40.0, 'lower_aperture': 11, 'upper_aperture': 15, 'neighbor_trace': 18}), ({'x': 5, 'y': 8, 'bx': 2, 't0': 3, 't1': 0, 'k': 120, 'm': 3, 'h': 2, 'pitch': 5}, {'trace_offset': 5, 'blaze_coordinate': 3, 'order_wavelength': 40.0, 'lower_aperture': 1, 'upper_aperture': 5, 'neighbor_trace': 8}), ({'x': 5, 'y': 8, 'bx': 2, 't0': 3, 't1': 2, 'k': 120, 'm': 3, 'h': 0, 'pitch': 5}, {'trace_offset': -5, 'blaze_coordinate': 3, 'order_wavelength': 40.0, 'lower_aperture': 13, 'upper_aperture': 13, 'neighbor_trace': 18}), ({'x': 5, 'y': 8, 'bx': 2, 't0': 3, 't1': 2, 'k': 120, 'm': 1, 'h': 2, 'pitch': 5}, {'trace_offset': -5, 'blaze_coordinate': 3, 'order_wavelength': 120.0, 'lower_aperture': 11, 'upper_aperture': 15, 'neighbor_trace': 18}), ({'x': 5, 'y': -2, 'bx': 2, 't0': 3, 't1': -1, 'k': 120, 'm': 3, 'h': 2, 'pitch': 5}, {'trace_offset': 0, 'blaze_coordinate': 3, 'order_wavelength': 40.0, 'lower_aperture': -4, 'upper_aperture': 0, 'neighbor_trace': 3}), ({'x': 5, 'y': 8, 'bx': -2, 't0': 3, 't1': 2, 'k': 120, 'm': 3, 'h': 2, 'pitch': 7}, {'trace_offset': -5, 'blaze_coordinate': 7, 'order_wavelength': 40.0, 'lower_aperture': 11, 'upper_aperture': 15, 'neighbor_trace': 20})], 3: [({'x': 6, 'y': 8, 'bx': 2, 't0': 3, 't1': 2, 'k': 120, 'm': 3, 'h': 2, 'pitch': 5}, {'trace_offset': -7, 'blaze_coordinate': 4, 'order_wavelength': 40.0, 'lower_aperture': 13, 'upper_aperture': 17, 'neighbor_trace': 20}), ({'x': 6, 'y': 8, 'bx': 2, 't0': 3, 't1': 0, 'k': 120, 'm': 3, 'h': 2, 'pitch': 5}, {'trace_offset': 5, 'blaze_coordinate': 4, 'order_wavelength': 40.0, 'lower_aperture': 1, 'upper_aperture': 5, 'neighbor_trace': 8}), ({'x': 6, 'y': 8, 'bx': 2, 't0': 3, 't1': 2, 'k': 120, 'm': 3, 'h': 0, 'pitch': 5}, {'trace_offset': -7, 'blaze_coordinate': 4, 'order_wavelength': 40.0, 'lower_aperture': 15, 'upper_aperture': 15, 'neighbor_trace': 20}), ({'x': 6, 'y': 8, 'bx': 2, 't0': 3, 't1': 2, 'k': 120, 'm': 1, 'h': 2, 'pitch': 5}, {'trace_offset': -7, 'blaze_coordinate': 4, 'order_wavelength': 120.0, 'lower_aperture': 13, 'upper_aperture': 17, 'neighbor_trace': 20}), ({'x': 6, 'y': -2, 'bx': 2, 't0': 3, 't1': -1, 'k': 120, 'm': 3, 'h': 2, 'pitch': 5}, {'trace_offset': 1, 'blaze_coordinate': 4, 'order_wavelength': 40.0, 'lower_aperture': -5, 'upper_aperture': -1, 'neighbor_trace': 2}), ({'x': 6, 'y': 8, 'bx': -2, 't0': 3, 't1': 2, 'k': 120, 'm': 3, 'h': 2, 'pitch': 7}, {'trace_offset': -7, 'blaze_coordinate': 8, 'order_wavelength': 40.0, 'lower_aperture': 13, 'upper_aperture': 17, 'neighbor_trace': 22})], 4: [({'x': 7, 'y': 8, 'bx': 2, 't0': 3, 't1': 2, 'k': 120, 'm': 3, 'h': 2, 'pitch': 5}, {'trace_offset': -9, 'blaze_coordinate': 5, 'order_wavelength': 40.0, 'lower_aperture': 15, 'upper_aperture': 19, 'neighbor_trace': 22}), ({'x': 7, 'y': 8, 'bx': 2, 't0': 3, 't1': 0, 'k': 120, 'm': 3, 'h': 2, 'pitch': 5}, {'trace_offset': 5, 'blaze_coordinate': 5, 'order_wavelength': 40.0, 'lower_aperture': 1, 'upper_aperture': 5, 'neighbor_trace': 8}), ({'x': 7, 'y': 8, 'bx': 2, 't0': 3, 't1': 2, 'k': 120, 'm': 3, 'h': 0, 'pitch': 5}, {'trace_offset': -9, 'blaze_coordinate': 5, 'order_wavelength': 40.0, 'lower_aperture': 17, 'upper_aperture': 17, 'neighbor_trace': 22}), ({'x': 7, 'y': 8, 'bx': 2, 't0': 3, 't1': 2, 'k': 120, 'm': 1, 'h': 2, 'pitch': 5}, {'trace_offset': -9, 'blaze_coordinate': 5, 'order_wavelength': 120.0, 'lower_aperture': 15, 'upper_aperture': 19, 'neighbor_trace': 22}), ({'x': 7, 'y': -2, 'bx': 2, 't0': 3, 't1': -1, 'k': 120, 'm': 3, 'h': 2, 'pitch': 5}, {'trace_offset': 2, 'blaze_coordinate': 5, 'order_wavelength': 40.0, 'lower_aperture': -6, 'upper_aperture': -2, 'neighbor_trace': 1}), ({'x': 7, 'y': 8, 'bx': -2, 't0': 3, 't1': 2, 'k': 120, 'm': 3, 'h': 2, 'pitch': 7}, {'trace_offset': -9, 'blaze_coordinate': 9, 'order_wavelength': 40.0, 'lower_aperture': 15, 'upper_aperture': 19, 'neighbor_trace': 24})], 5: [({'x': 8, 'y': 8, 'bx': 2, 't0': 3, 't1': 2, 'k': 120, 'm': 3, 'h': 2, 'pitch': 5}, {'trace_offset': -11, 'blaze_coordinate': 6, 'order_wavelength': 40.0, 'lower_aperture': 17, 'upper_aperture': 21, 'neighbor_trace': 24}), ({'x': 8, 'y': 8, 'bx': 2, 't0': 3, 't1': 0, 'k': 120, 'm': 3, 'h': 2, 'pitch': 5}, {'trace_offset': 5, 'blaze_coordinate': 6, 'order_wavelength': 40.0, 'lower_aperture': 1, 'upper_aperture': 5, 'neighbor_trace': 8}), ({'x': 8, 'y': 8, 'bx': 2, 't0': 3, 't1': 2, 'k': 120, 'm': 3, 'h': 0, 'pitch': 5}, {'trace_offset': -11, 'blaze_coordinate': 6, 'order_wavelength': 40.0, 'lower_aperture': 19, 'upper_aperture': 19, 'neighbor_trace': 24}), ({'x': 8, 'y': 8, 'bx': 2, 't0': 3, 't1': 2, 'k': 120, 'm': 1, 'h': 2, 'pitch': 5}, {'trace_offset': -11, 'blaze_coordinate': 6, 'order_wavelength': 120.0, 'lower_aperture': 17, 'upper_aperture': 21, 'neighbor_trace': 24}), ({'x': 8, 'y': -2, 'bx': 2, 't0': 3, 't1': -1, 'k': 120, 'm': 3, 'h': 2, 'pitch': 5}, {'trace_offset': 3, 'blaze_coordinate': 6, 'order_wavelength': 40.0, 'lower_aperture': -7, 'upper_aperture': -3, 'neighbor_trace': 0}), ({'x': 8, 'y': 8, 'bx': -2, 't0': 3, 't1': 2, 'k': 120, 'm': 3, 'h': 2, 'pitch': 7}, {'trace_offset': -11, 'blaze_coordinate': 10, 'order_wavelength': 40.0, 'lower_aperture': 17, 'upper_aperture': 21, 'neighbor_trace': 26})]}
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{'blaze_coordinate': 2, 'lower_aperture': 9, 'neighbor_trace': 16, 'order_wavelength': 40.0, 'trace_offset': -3, 'upper_aperture': 13}{'blaze_coordinate': 2, 'lower_aperture': 9, 'neighbor_trace': 16, 'order_wavelength': 40.0, 'trace_offset': -3, 'upper_aperture': 13}Passed
astronomical fixture 1{'blaze_coordinate': 2, 'lower_aperture': 1, 'neighbor_trace': 8, 'order_wavelength': 40.0, 'trace_offset': 5, 'upper_aperture': 5}{'blaze_coordinate': 2, 'lower_aperture': 1, 'neighbor_trace': 8, 'order_wavelength': 40.0, 'trace_offset': 5, 'upper_aperture': 5}Passed
astronomical fixture 2{'blaze_coordinate': 2, 'lower_aperture': 11, 'neighbor_trace': 16, 'order_wavelength': 40.0, 'trace_offset': -3, 'upper_aperture': 11}{'blaze_coordinate': 2, 'lower_aperture': 11, 'neighbor_trace': 16, 'order_wavelength': 40.0, 'trace_offset': -3, 'upper_aperture': 11}Passed
astronomical fixture 3{'blaze_coordinate': 2, 'lower_aperture': 9, 'neighbor_trace': 16, 'order_wavelength': 120.0, 'trace_offset': -3, 'upper_aperture': 13}{'blaze_coordinate': 2, 'lower_aperture': 9, 'neighbor_trace': 16, 'order_wavelength': 120.0, 'trace_offset': -3, 'upper_aperture': 13}Passed
astronomical fixture 4{'blaze_coordinate': 2, 'lower_aperture': -3, 'neighbor_trace': 4, 'order_wavelength': 40.0, 'trace_offset': -1, 'upper_aperture': 1}{'blaze_coordinate': 2, 'lower_aperture': -3, 'neighbor_trace': 4, 'order_wavelength': 40.0, 'trace_offset': -1, 'upper_aperture': 1}Passed
astronomical fixture 5{'blaze_coordinate': 6, 'lower_aperture': 9, 'neighbor_trace': 18, 'order_wavelength': 40.0, 'trace_offset': -3, 'upper_aperture': 13}{'blaze_coordinate': 6, 'lower_aperture': 9, 'neighbor_trace': 18, 'order_wavelength': 40.0, 'trace_offset': -3, 'upper_aperture': 13}Passed

SHA-256 / d3dcd2b989a717849347303175dc6a9cd7af9b4e7e218e5e500a1aa39c54912a

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

Case digest / 06144a1924c785919aeeb5af2289ada7b3f92509065356dc33e78726c48da2b3