FAILURE MAP
← Case archive

FA-56096 / Astronomical coordinate conventions / Open access

Heterodyne sideband coordinate: Sky-to-IF inverse mapping drops the sideband sign · case 01

The adapter reports an incorrect inverse if while other fields remain valid.

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

ROOT CAUSE

Sky-to-IF inverse mapping drops the sideband sign. Faulty expression: d['R']-d['L']

VERIFIED REPAIR

Preserve the declared model convention at this site: d['s']*(d['R']-d['L'])

Unsuccessful approach: A partial convention repair still uses d['s']*(d['R']+d['L'])

Case contract

A radio receiver provides positive local oscillator L, intermediate frequency I, signed IF channel step d, sideband s equal +1 or -1, second mixer offset m, and source rest frequency R. Sky frequency is L+s*I; image sideband is L-s*I. This is exact mixer bookkeeping only. Output fields are defined by: sky_frequency = d['L']+d['s']*d['I']; sky_increment = d['s']*d['d']; image_frequency = d['L']-d['s']*d['I']; second_conversion = d['L']+d['s']*(d['I']+d['m']); rest_offset = d['L']+d['s']*d['I']-d['R']; inverse_if = d['s']*(d['R']-d['L'])

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 {'sky_frequency': d['L']+d['s']*d['I'], 'sky_increment': d['s']*d['d'], 'image_frequency': d['L']-d['s']*d['I'], 'second_conversion': d['L']+d['s']*(d['I']+d['m']), 'rest_offset': d['L']+d['s']*d['I']-d['R'], 'inverse_if': d['R']-d['L']}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = {1: [({'L': 100, 'I': 10, 'd': 2, 's': -1, 'm': 3, 'R': 120}, {'sky_frequency': 90, 'sky_increment': -2, 'image_frequency': 110, 'second_conversion': 87, 'rest_offset': -30, 'inverse_if': -20}), ({'L': 100, 'I': 10, 'd': 2, 's': 1, 'm': 3, 'R': 120}, {'sky_frequency': 110, 'sky_increment': 2, 'image_frequency': 90, 'second_conversion': 113, 'rest_offset': -10, 'inverse_if': 20}), ({'L': 100, 'I': 0, 'd': 2, 's': -1, 'm': 3, 'R': 120}, {'sky_frequency': 100, 'sky_increment': -2, 'image_frequency': 100, 'second_conversion': 97, 'rest_offset': -20, 'inverse_if': -20}), ({'L': 100, 'I': 10, 'd': -2, 's': -1, 'm': 3, 'R': 120}, {'sky_frequency': 90, 'sky_increment': 2, 'image_frequency': 110, 'second_conversion': 87, 'rest_offset': -30, 'inverse_if': -20}), ({'L': 100, 'I': 10, 'd': 2, 's': -1, 'm': 0, 'R': 120}, {'sky_frequency': 90, 'sky_increment': -2, 'image_frequency': 110, 'second_conversion': 90, 'rest_offset': -30, 'inverse_if': -20}), ({'L': 200, 'I': 10, 'd': 2, 's': -1, 'm': 3, 'R': 250}, {'sky_frequency': 190, 'sky_increment': -2, 'image_frequency': 210, 'second_conversion': 187, 'rest_offset': -60, 'inverse_if': -50})], 2: [({'L': 100, 'I': 11, 'd': 2, 's': -1, 'm': 3, 'R': 120}, {'sky_frequency': 89, 'sky_increment': -2, 'image_frequency': 111, 'second_conversion': 86, 'rest_offset': -31, 'inverse_if': -20}), ({'L': 100, 'I': 11, 'd': 2, 's': 1, 'm': 3, 'R': 120}, {'sky_frequency': 111, 'sky_increment': 2, 'image_frequency': 89, 'second_conversion': 114, 'rest_offset': -9, 'inverse_if': 20}), ({'L': 100, 'I': 1, 'd': 2, 's': -1, 'm': 3, 'R': 120}, {'sky_frequency': 99, 'sky_increment': -2, 'image_frequency': 101, 'second_conversion': 96, 'rest_offset': -21, 'inverse_if': -20}), ({'L': 100, 'I': 11, 'd': -2, 's': -1, 'm': 3, 'R': 120}, {'sky_frequency': 89, 'sky_increment': 2, 'image_frequency': 111, 'second_conversion': 86, 'rest_offset': -31, 'inverse_if': -20}), ({'L': 100, 'I': 11, 'd': 2, 's': -1, 'm': 0, 'R': 120}, {'sky_frequency': 89, 'sky_increment': -2, 'image_frequency': 111, 'second_conversion': 89, 'rest_offset': -31, 'inverse_if': -20}), ({'L': 200, 'I': 11, 'd': 2, 's': -1, 'm': 3, 'R': 250}, {'sky_frequency': 189, 'sky_increment': -2, 'image_frequency': 211, 'second_conversion': 186, 'rest_offset': -61, 'inverse_if': -50})], 3: [({'L': 100, 'I': 12, 'd': 2, 's': -1, 'm': 3, 'R': 120}, {'sky_frequency': 88, 'sky_increment': -2, 'image_frequency': 112, 'second_conversion': 85, 'rest_offset': -32, 'inverse_if': -20}), ({'L': 100, 'I': 12, 'd': 2, 's': 1, 'm': 3, 'R': 120}, {'sky_frequency': 112, 'sky_increment': 2, 'image_frequency': 88, 'second_conversion': 115, 'rest_offset': -8, 'inverse_if': 20}), ({'L': 100, 'I': 2, 'd': 2, 's': -1, 'm': 3, 'R': 120}, {'sky_frequency': 98, 'sky_increment': -2, 'image_frequency': 102, 'second_conversion': 95, 'rest_offset': -22, 'inverse_if': -20}), ({'L': 100, 'I': 12, 'd': -2, 's': -1, 'm': 3, 'R': 120}, {'sky_frequency': 88, 'sky_increment': 2, 'image_frequency': 112, 'second_conversion': 85, 'rest_offset': -32, 'inverse_if': -20}), ({'L': 100, 'I': 12, 'd': 2, 's': -1, 'm': 0, 'R': 120}, {'sky_frequency': 88, 'sky_increment': -2, 'image_frequency': 112, 'second_conversion': 88, 'rest_offset': -32, 'inverse_if': -20}), ({'L': 200, 'I': 12, 'd': 2, 's': -1, 'm': 3, 'R': 250}, {'sky_frequency': 188, 'sky_increment': -2, 'image_frequency': 212, 'second_conversion': 185, 'rest_offset': -62, 'inverse_if': -50})], 4: [({'L': 100, 'I': 13, 'd': 2, 's': -1, 'm': 3, 'R': 120}, {'sky_frequency': 87, 'sky_increment': -2, 'image_frequency': 113, 'second_conversion': 84, 'rest_offset': -33, 'inverse_if': -20}), ({'L': 100, 'I': 13, 'd': 2, 's': 1, 'm': 3, 'R': 120}, {'sky_frequency': 113, 'sky_increment': 2, 'image_frequency': 87, 'second_conversion': 116, 'rest_offset': -7, 'inverse_if': 20}), ({'L': 100, 'I': 3, 'd': 2, 's': -1, 'm': 3, 'R': 120}, {'sky_frequency': 97, 'sky_increment': -2, 'image_frequency': 103, 'second_conversion': 94, 'rest_offset': -23, 'inverse_if': -20}), ({'L': 100, 'I': 13, 'd': -2, 's': -1, 'm': 3, 'R': 120}, {'sky_frequency': 87, 'sky_increment': 2, 'image_frequency': 113, 'second_conversion': 84, 'rest_offset': -33, 'inverse_if': -20}), ({'L': 100, 'I': 13, 'd': 2, 's': -1, 'm': 0, 'R': 120}, {'sky_frequency': 87, 'sky_increment': -2, 'image_frequency': 113, 'second_conversion': 87, 'rest_offset': -33, 'inverse_if': -20}), ({'L': 200, 'I': 13, 'd': 2, 's': -1, 'm': 3, 'R': 250}, {'sky_frequency': 187, 'sky_increment': -2, 'image_frequency': 213, 'second_conversion': 184, 'rest_offset': -63, 'inverse_if': -50})], 5: [({'L': 100, 'I': 14, 'd': 2, 's': -1, 'm': 3, 'R': 120}, {'sky_frequency': 86, 'sky_increment': -2, 'image_frequency': 114, 'second_conversion': 83, 'rest_offset': -34, 'inverse_if': -20}), ({'L': 100, 'I': 14, 'd': 2, 's': 1, 'm': 3, 'R': 120}, {'sky_frequency': 114, 'sky_increment': 2, 'image_frequency': 86, 'second_conversion': 117, 'rest_offset': -6, 'inverse_if': 20}), ({'L': 100, 'I': 4, 'd': 2, 's': -1, 'm': 3, 'R': 120}, {'sky_frequency': 96, 'sky_increment': -2, 'image_frequency': 104, 'second_conversion': 93, 'rest_offset': -24, 'inverse_if': -20}), ({'L': 100, 'I': 14, 'd': -2, 's': -1, 'm': 3, 'R': 120}, {'sky_frequency': 86, 'sky_increment': 2, 'image_frequency': 114, 'second_conversion': 83, 'rest_offset': -34, 'inverse_if': -20}), ({'L': 100, 'I': 14, 'd': 2, 's': -1, 'm': 0, 'R': 120}, {'sky_frequency': 86, 'sky_increment': -2, 'image_frequency': 114, 'second_conversion': 86, 'rest_offset': -34, 'inverse_if': -20}), ({'L': 200, 'I': 14, 'd': 2, 's': -1, 'm': 3, 'R': 250}, {'sky_frequency': 186, 'sky_increment': -2, 'image_frequency': 214, 'second_conversion': 183, 'rest_offset': -64, 'inverse_if': -50})]}
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{'image_frequency': 110, 'inverse_if': 20, 'rest_offset': -30, 'second_conversion': 87, 'sky_frequency': 90, 'sky_increment': -2}{'image_frequency': 110, 'inverse_if': -20, 'rest_offset': -30, 'second_conversion': 87, 'sky_frequency': 90, 'sky_increment': -2}Failed
astronomical fixture 1{'image_frequency': 90, 'inverse_if': 20, 'rest_offset': -10, 'second_conversion': 113, 'sky_frequency': 110, 'sky_increment': 2}{'image_frequency': 90, 'inverse_if': 20, 'rest_offset': -10, 'second_conversion': 113, 'sky_frequency': 110, 'sky_increment': 2}Passed
astronomical fixture 2{'image_frequency': 100, 'inverse_if': 20, 'rest_offset': -20, 'second_conversion': 97, 'sky_frequency': 100, 'sky_increment': -2}{'image_frequency': 100, 'inverse_if': -20, 'rest_offset': -20, 'second_conversion': 97, 'sky_frequency': 100, 'sky_increment': -2}Failed
astronomical fixture 3{'image_frequency': 110, 'inverse_if': 20, 'rest_offset': -30, 'second_conversion': 87, 'sky_frequency': 90, 'sky_increment': 2}{'image_frequency': 110, 'inverse_if': -20, 'rest_offset': -30, 'second_conversion': 87, 'sky_frequency': 90, 'sky_increment': 2}Failed
astronomical fixture 4{'image_frequency': 110, 'inverse_if': 20, 'rest_offset': -30, 'second_conversion': 90, 'sky_frequency': 90, 'sky_increment': -2}{'image_frequency': 110, 'inverse_if': -20, 'rest_offset': -30, 'second_conversion': 90, 'sky_frequency': 90, 'sky_increment': -2}Failed
astronomical fixture 5{'image_frequency': 210, 'inverse_if': 50, 'rest_offset': -60, 'second_conversion': 187, 'sky_frequency': 190, 'sky_increment': -2}{'image_frequency': 210, 'inverse_if': -50, 'rest_offset': -60, 'second_conversion': 187, 'sky_frequency': 190, 'sky_increment': -2}Failed

SHA-256 / 11ea88b390b0ae1b4f06ecfe7fe06a897aca2c27baaaed501ce0f51b7aaabc19

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(d):
    return {'sky_frequency': d['L']+d['s']*d['I'], 'sky_increment': d['s']*d['d'], 'image_frequency': d['L']-d['s']*d['I'], 'second_conversion': d['L']+d['s']*(d['I']+d['m']), 'rest_offset': d['L']+d['s']*d['I']-d['R'], 'inverse_if': d['s']*(d['R']+d['L'])}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = {1: [({'L': 100, 'I': 10, 'd': 2, 's': -1, 'm': 3, 'R': 120}, {'sky_frequency': 90, 'sky_increment': -2, 'image_frequency': 110, 'second_conversion': 87, 'rest_offset': -30, 'inverse_if': -20}), ({'L': 100, 'I': 10, 'd': 2, 's': 1, 'm': 3, 'R': 120}, {'sky_frequency': 110, 'sky_increment': 2, 'image_frequency': 90, 'second_conversion': 113, 'rest_offset': -10, 'inverse_if': 20}), ({'L': 100, 'I': 0, 'd': 2, 's': -1, 'm': 3, 'R': 120}, {'sky_frequency': 100, 'sky_increment': -2, 'image_frequency': 100, 'second_conversion': 97, 'rest_offset': -20, 'inverse_if': -20}), ({'L': 100, 'I': 10, 'd': -2, 's': -1, 'm': 3, 'R': 120}, {'sky_frequency': 90, 'sky_increment': 2, 'image_frequency': 110, 'second_conversion': 87, 'rest_offset': -30, 'inverse_if': -20}), ({'L': 100, 'I': 10, 'd': 2, 's': -1, 'm': 0, 'R': 120}, {'sky_frequency': 90, 'sky_increment': -2, 'image_frequency': 110, 'second_conversion': 90, 'rest_offset': -30, 'inverse_if': -20}), ({'L': 200, 'I': 10, 'd': 2, 's': -1, 'm': 3, 'R': 250}, {'sky_frequency': 190, 'sky_increment': -2, 'image_frequency': 210, 'second_conversion': 187, 'rest_offset': -60, 'inverse_if': -50})], 2: [({'L': 100, 'I': 11, 'd': 2, 's': -1, 'm': 3, 'R': 120}, {'sky_frequency': 89, 'sky_increment': -2, 'image_frequency': 111, 'second_conversion': 86, 'rest_offset': -31, 'inverse_if': -20}), ({'L': 100, 'I': 11, 'd': 2, 's': 1, 'm': 3, 'R': 120}, {'sky_frequency': 111, 'sky_increment': 2, 'image_frequency': 89, 'second_conversion': 114, 'rest_offset': -9, 'inverse_if': 20}), ({'L': 100, 'I': 1, 'd': 2, 's': -1, 'm': 3, 'R': 120}, {'sky_frequency': 99, 'sky_increment': -2, 'image_frequency': 101, 'second_conversion': 96, 'rest_offset': -21, 'inverse_if': -20}), ({'L': 100, 'I': 11, 'd': -2, 's': -1, 'm': 3, 'R': 120}, {'sky_frequency': 89, 'sky_increment': 2, 'image_frequency': 111, 'second_conversion': 86, 'rest_offset': -31, 'inverse_if': -20}), ({'L': 100, 'I': 11, 'd': 2, 's': -1, 'm': 0, 'R': 120}, {'sky_frequency': 89, 'sky_increment': -2, 'image_frequency': 111, 'second_conversion': 89, 'rest_offset': -31, 'inverse_if': -20}), ({'L': 200, 'I': 11, 'd': 2, 's': -1, 'm': 3, 'R': 250}, {'sky_frequency': 189, 'sky_increment': -2, 'image_frequency': 211, 'second_conversion': 186, 'rest_offset': -61, 'inverse_if': -50})], 3: [({'L': 100, 'I': 12, 'd': 2, 's': -1, 'm': 3, 'R': 120}, {'sky_frequency': 88, 'sky_increment': -2, 'image_frequency': 112, 'second_conversion': 85, 'rest_offset': -32, 'inverse_if': -20}), ({'L': 100, 'I': 12, 'd': 2, 's': 1, 'm': 3, 'R': 120}, {'sky_frequency': 112, 'sky_increment': 2, 'image_frequency': 88, 'second_conversion': 115, 'rest_offset': -8, 'inverse_if': 20}), ({'L': 100, 'I': 2, 'd': 2, 's': -1, 'm': 3, 'R': 120}, {'sky_frequency': 98, 'sky_increment': -2, 'image_frequency': 102, 'second_conversion': 95, 'rest_offset': -22, 'inverse_if': -20}), ({'L': 100, 'I': 12, 'd': -2, 's': -1, 'm': 3, 'R': 120}, {'sky_frequency': 88, 'sky_increment': 2, 'image_frequency': 112, 'second_conversion': 85, 'rest_offset': -32, 'inverse_if': -20}), ({'L': 100, 'I': 12, 'd': 2, 's': -1, 'm': 0, 'R': 120}, {'sky_frequency': 88, 'sky_increment': -2, 'image_frequency': 112, 'second_conversion': 88, 'rest_offset': -32, 'inverse_if': -20}), ({'L': 200, 'I': 12, 'd': 2, 's': -1, 'm': 3, 'R': 250}, {'sky_frequency': 188, 'sky_increment': -2, 'image_frequency': 212, 'second_conversion': 185, 'rest_offset': -62, 'inverse_if': -50})], 4: [({'L': 100, 'I': 13, 'd': 2, 's': -1, 'm': 3, 'R': 120}, {'sky_frequency': 87, 'sky_increment': -2, 'image_frequency': 113, 'second_conversion': 84, 'rest_offset': -33, 'inverse_if': -20}), ({'L': 100, 'I': 13, 'd': 2, 's': 1, 'm': 3, 'R': 120}, {'sky_frequency': 113, 'sky_increment': 2, 'image_frequency': 87, 'second_conversion': 116, 'rest_offset': -7, 'inverse_if': 20}), ({'L': 100, 'I': 3, 'd': 2, 's': -1, 'm': 3, 'R': 120}, {'sky_frequency': 97, 'sky_increment': -2, 'image_frequency': 103, 'second_conversion': 94, 'rest_offset': -23, 'inverse_if': -20}), ({'L': 100, 'I': 13, 'd': -2, 's': -1, 'm': 3, 'R': 120}, {'sky_frequency': 87, 'sky_increment': 2, 'image_frequency': 113, 'second_conversion': 84, 'rest_offset': -33, 'inverse_if': -20}), ({'L': 100, 'I': 13, 'd': 2, 's': -1, 'm': 0, 'R': 120}, {'sky_frequency': 87, 'sky_increment': -2, 'image_frequency': 113, 'second_conversion': 87, 'rest_offset': -33, 'inverse_if': -20}), ({'L': 200, 'I': 13, 'd': 2, 's': -1, 'm': 3, 'R': 250}, {'sky_frequency': 187, 'sky_increment': -2, 'image_frequency': 213, 'second_conversion': 184, 'rest_offset': -63, 'inverse_if': -50})], 5: [({'L': 100, 'I': 14, 'd': 2, 's': -1, 'm': 3, 'R': 120}, {'sky_frequency': 86, 'sky_increment': -2, 'image_frequency': 114, 'second_conversion': 83, 'rest_offset': -34, 'inverse_if': -20}), ({'L': 100, 'I': 14, 'd': 2, 's': 1, 'm': 3, 'R': 120}, {'sky_frequency': 114, 'sky_increment': 2, 'image_frequency': 86, 'second_conversion': 117, 'rest_offset': -6, 'inverse_if': 20}), ({'L': 100, 'I': 4, 'd': 2, 's': -1, 'm': 3, 'R': 120}, {'sky_frequency': 96, 'sky_increment': -2, 'image_frequency': 104, 'second_conversion': 93, 'rest_offset': -24, 'inverse_if': -20}), ({'L': 100, 'I': 14, 'd': -2, 's': -1, 'm': 3, 'R': 120}, {'sky_frequency': 86, 'sky_increment': 2, 'image_frequency': 114, 'second_conversion': 83, 'rest_offset': -34, 'inverse_if': -20}), ({'L': 100, 'I': 14, 'd': 2, 's': -1, 'm': 0, 'R': 120}, {'sky_frequency': 86, 'sky_increment': -2, 'image_frequency': 114, 'second_conversion': 86, 'rest_offset': -34, 'inverse_if': -20}), ({'L': 200, 'I': 14, 'd': 2, 's': -1, 'm': 3, 'R': 250}, {'sky_frequency': 186, 'sky_increment': -2, 'image_frequency': 214, 'second_conversion': 183, 'rest_offset': -64, 'inverse_if': -50})]}
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{'image_frequency': 110, 'inverse_if': -220, 'rest_offset': -30, 'second_conversion': 87, 'sky_frequency': 90, 'sky_increment': -2}{'image_frequency': 110, 'inverse_if': -20, 'rest_offset': -30, 'second_conversion': 87, 'sky_frequency': 90, 'sky_increment': -2}Failed
astronomical fixture 1{'image_frequency': 90, 'inverse_if': 220, 'rest_offset': -10, 'second_conversion': 113, 'sky_frequency': 110, 'sky_increment': 2}{'image_frequency': 90, 'inverse_if': 20, 'rest_offset': -10, 'second_conversion': 113, 'sky_frequency': 110, 'sky_increment': 2}Failed
astronomical fixture 2{'image_frequency': 100, 'inverse_if': -220, 'rest_offset': -20, 'second_conversion': 97, 'sky_frequency': 100, 'sky_increment': -2}{'image_frequency': 100, 'inverse_if': -20, 'rest_offset': -20, 'second_conversion': 97, 'sky_frequency': 100, 'sky_increment': -2}Failed
astronomical fixture 3{'image_frequency': 110, 'inverse_if': -220, 'rest_offset': -30, 'second_conversion': 87, 'sky_frequency': 90, 'sky_increment': 2}{'image_frequency': 110, 'inverse_if': -20, 'rest_offset': -30, 'second_conversion': 87, 'sky_frequency': 90, 'sky_increment': 2}Failed
astronomical fixture 4{'image_frequency': 110, 'inverse_if': -220, 'rest_offset': -30, 'second_conversion': 90, 'sky_frequency': 90, 'sky_increment': -2}{'image_frequency': 110, 'inverse_if': -20, 'rest_offset': -30, 'second_conversion': 90, 'sky_frequency': 90, 'sky_increment': -2}Failed
astronomical fixture 5{'image_frequency': 210, 'inverse_if': -450, 'rest_offset': -60, 'second_conversion': 187, 'sky_frequency': 190, 'sky_increment': -2}{'image_frequency': 210, 'inverse_if': -50, 'rest_offset': -60, 'second_conversion': 187, 'sky_frequency': 190, 'sky_increment': -2}Failed

SHA-256 / 17c0b17238250980ceca888a408cb6686075bef0d98b5a0f1513c2b15ec7d5a3

3 / The verified repair

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

N = 1
observations = []
def solve(d):
    return {'sky_frequency': d['L']+d['s']*d['I'], 'sky_increment': d['s']*d['d'], 'image_frequency': d['L']-d['s']*d['I'], 'second_conversion': d['L']+d['s']*(d['I']+d['m']), 'rest_offset': d['L']+d['s']*d['I']-d['R'], 'inverse_if': d['s']*(d['R']-d['L'])}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = {1: [({'L': 100, 'I': 10, 'd': 2, 's': -1, 'm': 3, 'R': 120}, {'sky_frequency': 90, 'sky_increment': -2, 'image_frequency': 110, 'second_conversion': 87, 'rest_offset': -30, 'inverse_if': -20}), ({'L': 100, 'I': 10, 'd': 2, 's': 1, 'm': 3, 'R': 120}, {'sky_frequency': 110, 'sky_increment': 2, 'image_frequency': 90, 'second_conversion': 113, 'rest_offset': -10, 'inverse_if': 20}), ({'L': 100, 'I': 0, 'd': 2, 's': -1, 'm': 3, 'R': 120}, {'sky_frequency': 100, 'sky_increment': -2, 'image_frequency': 100, 'second_conversion': 97, 'rest_offset': -20, 'inverse_if': -20}), ({'L': 100, 'I': 10, 'd': -2, 's': -1, 'm': 3, 'R': 120}, {'sky_frequency': 90, 'sky_increment': 2, 'image_frequency': 110, 'second_conversion': 87, 'rest_offset': -30, 'inverse_if': -20}), ({'L': 100, 'I': 10, 'd': 2, 's': -1, 'm': 0, 'R': 120}, {'sky_frequency': 90, 'sky_increment': -2, 'image_frequency': 110, 'second_conversion': 90, 'rest_offset': -30, 'inverse_if': -20}), ({'L': 200, 'I': 10, 'd': 2, 's': -1, 'm': 3, 'R': 250}, {'sky_frequency': 190, 'sky_increment': -2, 'image_frequency': 210, 'second_conversion': 187, 'rest_offset': -60, 'inverse_if': -50})], 2: [({'L': 100, 'I': 11, 'd': 2, 's': -1, 'm': 3, 'R': 120}, {'sky_frequency': 89, 'sky_increment': -2, 'image_frequency': 111, 'second_conversion': 86, 'rest_offset': -31, 'inverse_if': -20}), ({'L': 100, 'I': 11, 'd': 2, 's': 1, 'm': 3, 'R': 120}, {'sky_frequency': 111, 'sky_increment': 2, 'image_frequency': 89, 'second_conversion': 114, 'rest_offset': -9, 'inverse_if': 20}), ({'L': 100, 'I': 1, 'd': 2, 's': -1, 'm': 3, 'R': 120}, {'sky_frequency': 99, 'sky_increment': -2, 'image_frequency': 101, 'second_conversion': 96, 'rest_offset': -21, 'inverse_if': -20}), ({'L': 100, 'I': 11, 'd': -2, 's': -1, 'm': 3, 'R': 120}, {'sky_frequency': 89, 'sky_increment': 2, 'image_frequency': 111, 'second_conversion': 86, 'rest_offset': -31, 'inverse_if': -20}), ({'L': 100, 'I': 11, 'd': 2, 's': -1, 'm': 0, 'R': 120}, {'sky_frequency': 89, 'sky_increment': -2, 'image_frequency': 111, 'second_conversion': 89, 'rest_offset': -31, 'inverse_if': -20}), ({'L': 200, 'I': 11, 'd': 2, 's': -1, 'm': 3, 'R': 250}, {'sky_frequency': 189, 'sky_increment': -2, 'image_frequency': 211, 'second_conversion': 186, 'rest_offset': -61, 'inverse_if': -50})], 3: [({'L': 100, 'I': 12, 'd': 2, 's': -1, 'm': 3, 'R': 120}, {'sky_frequency': 88, 'sky_increment': -2, 'image_frequency': 112, 'second_conversion': 85, 'rest_offset': -32, 'inverse_if': -20}), ({'L': 100, 'I': 12, 'd': 2, 's': 1, 'm': 3, 'R': 120}, {'sky_frequency': 112, 'sky_increment': 2, 'image_frequency': 88, 'second_conversion': 115, 'rest_offset': -8, 'inverse_if': 20}), ({'L': 100, 'I': 2, 'd': 2, 's': -1, 'm': 3, 'R': 120}, {'sky_frequency': 98, 'sky_increment': -2, 'image_frequency': 102, 'second_conversion': 95, 'rest_offset': -22, 'inverse_if': -20}), ({'L': 100, 'I': 12, 'd': -2, 's': -1, 'm': 3, 'R': 120}, {'sky_frequency': 88, 'sky_increment': 2, 'image_frequency': 112, 'second_conversion': 85, 'rest_offset': -32, 'inverse_if': -20}), ({'L': 100, 'I': 12, 'd': 2, 's': -1, 'm': 0, 'R': 120}, {'sky_frequency': 88, 'sky_increment': -2, 'image_frequency': 112, 'second_conversion': 88, 'rest_offset': -32, 'inverse_if': -20}), ({'L': 200, 'I': 12, 'd': 2, 's': -1, 'm': 3, 'R': 250}, {'sky_frequency': 188, 'sky_increment': -2, 'image_frequency': 212, 'second_conversion': 185, 'rest_offset': -62, 'inverse_if': -50})], 4: [({'L': 100, 'I': 13, 'd': 2, 's': -1, 'm': 3, 'R': 120}, {'sky_frequency': 87, 'sky_increment': -2, 'image_frequency': 113, 'second_conversion': 84, 'rest_offset': -33, 'inverse_if': -20}), ({'L': 100, 'I': 13, 'd': 2, 's': 1, 'm': 3, 'R': 120}, {'sky_frequency': 113, 'sky_increment': 2, 'image_frequency': 87, 'second_conversion': 116, 'rest_offset': -7, 'inverse_if': 20}), ({'L': 100, 'I': 3, 'd': 2, 's': -1, 'm': 3, 'R': 120}, {'sky_frequency': 97, 'sky_increment': -2, 'image_frequency': 103, 'second_conversion': 94, 'rest_offset': -23, 'inverse_if': -20}), ({'L': 100, 'I': 13, 'd': -2, 's': -1, 'm': 3, 'R': 120}, {'sky_frequency': 87, 'sky_increment': 2, 'image_frequency': 113, 'second_conversion': 84, 'rest_offset': -33, 'inverse_if': -20}), ({'L': 100, 'I': 13, 'd': 2, 's': -1, 'm': 0, 'R': 120}, {'sky_frequency': 87, 'sky_increment': -2, 'image_frequency': 113, 'second_conversion': 87, 'rest_offset': -33, 'inverse_if': -20}), ({'L': 200, 'I': 13, 'd': 2, 's': -1, 'm': 3, 'R': 250}, {'sky_frequency': 187, 'sky_increment': -2, 'image_frequency': 213, 'second_conversion': 184, 'rest_offset': -63, 'inverse_if': -50})], 5: [({'L': 100, 'I': 14, 'd': 2, 's': -1, 'm': 3, 'R': 120}, {'sky_frequency': 86, 'sky_increment': -2, 'image_frequency': 114, 'second_conversion': 83, 'rest_offset': -34, 'inverse_if': -20}), ({'L': 100, 'I': 14, 'd': 2, 's': 1, 'm': 3, 'R': 120}, {'sky_frequency': 114, 'sky_increment': 2, 'image_frequency': 86, 'second_conversion': 117, 'rest_offset': -6, 'inverse_if': 20}), ({'L': 100, 'I': 4, 'd': 2, 's': -1, 'm': 3, 'R': 120}, {'sky_frequency': 96, 'sky_increment': -2, 'image_frequency': 104, 'second_conversion': 93, 'rest_offset': -24, 'inverse_if': -20}), ({'L': 100, 'I': 14, 'd': -2, 's': -1, 'm': 3, 'R': 120}, {'sky_frequency': 86, 'sky_increment': 2, 'image_frequency': 114, 'second_conversion': 83, 'rest_offset': -34, 'inverse_if': -20}), ({'L': 100, 'I': 14, 'd': 2, 's': -1, 'm': 0, 'R': 120}, {'sky_frequency': 86, 'sky_increment': -2, 'image_frequency': 114, 'second_conversion': 86, 'rest_offset': -34, 'inverse_if': -20}), ({'L': 200, 'I': 14, 'd': 2, 's': -1, 'm': 3, 'R': 250}, {'sky_frequency': 186, 'sky_increment': -2, 'image_frequency': 214, 'second_conversion': 183, 'rest_offset': -64, 'inverse_if': -50})]}
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{'image_frequency': 110, 'inverse_if': -20, 'rest_offset': -30, 'second_conversion': 87, 'sky_frequency': 90, 'sky_increment': -2}{'image_frequency': 110, 'inverse_if': -20, 'rest_offset': -30, 'second_conversion': 87, 'sky_frequency': 90, 'sky_increment': -2}Passed
astronomical fixture 1{'image_frequency': 90, 'inverse_if': 20, 'rest_offset': -10, 'second_conversion': 113, 'sky_frequency': 110, 'sky_increment': 2}{'image_frequency': 90, 'inverse_if': 20, 'rest_offset': -10, 'second_conversion': 113, 'sky_frequency': 110, 'sky_increment': 2}Passed
astronomical fixture 2{'image_frequency': 100, 'inverse_if': -20, 'rest_offset': -20, 'second_conversion': 97, 'sky_frequency': 100, 'sky_increment': -2}{'image_frequency': 100, 'inverse_if': -20, 'rest_offset': -20, 'second_conversion': 97, 'sky_frequency': 100, 'sky_increment': -2}Passed
astronomical fixture 3{'image_frequency': 110, 'inverse_if': -20, 'rest_offset': -30, 'second_conversion': 87, 'sky_frequency': 90, 'sky_increment': 2}{'image_frequency': 110, 'inverse_if': -20, 'rest_offset': -30, 'second_conversion': 87, 'sky_frequency': 90, 'sky_increment': 2}Passed
astronomical fixture 4{'image_frequency': 110, 'inverse_if': -20, 'rest_offset': -30, 'second_conversion': 90, 'sky_frequency': 90, 'sky_increment': -2}{'image_frequency': 110, 'inverse_if': -20, 'rest_offset': -30, 'second_conversion': 90, 'sky_frequency': 90, 'sky_increment': -2}Passed
astronomical fixture 5{'image_frequency': 210, 'inverse_if': -50, 'rest_offset': -60, 'second_conversion': 187, 'sky_frequency': 190, 'sky_increment': -2}{'image_frequency': 210, 'inverse_if': -50, 'rest_offset': -60, 'second_conversion': 187, 'sky_frequency': 190, 'sky_increment': -2}Passed

SHA-256 / 3158822c94d3397a21baf29dc84aea1851029357beb861e82163ae5fdd5115b5

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

Case digest / 83aff2ff932f6fad53ef3fc712298dbc7bd491fce92fcdbb8f1024866b392432