FA-72221 / Error-correcting codes / Open access
CRC correction never considers the CRC byte · case 01
Frames whose CRC byte took the hit are declared uncorrectable.
ROOT CAUSE
The single-bit search only covers payload bits.
VERIFIED REPAIR
Search every bit of the frame, including the received CRC.
Unsuccessful approach: Stopping one bit early misses errors in the CRC least-significant bit.
Case contract
Frames of 2..15 bytes end with a CRC-8 (polynomial 0x07, initial value 0, MSB first, no final XOR) over the preceding bytes. A matching CRC is "clean"; otherwise try every single-bit flip across the whole frame, including the CRC byte, and accept the first that makes the CRC match ("corrected"). Otherwise "uncorrectable". Return [status, payload bytes or None].
Why this case matters
Sensor buses use short CRC-protected frames and correct single-bit upsets instead of retransmitting.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(frame):
def crc8(data):
c = 0
for byte in data:
c ^= byte
for _ in range(8):
c = ((c << 1) ^ 0x07) & 0xFF if c & 0x80 else (c << 1) & 0xFF
return c
if not 2 <= len(frame) <= 15:
return None
if crc8(frame[:-1]) == frame[-1]:
return ['clean', list(frame[:-1])]
for pos in range(8 * (len(frame) - 1)):
trial = list(frame)
trial[pos // 8] ^= 0x80 >> (pos % 8)
if crc8(trial[:-1]) == trial[-1]:
return ['corrected', trial[:-1]]
return ['uncorrectable', None]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression [[61, 51]]', [[61, 51]], ['corrected', [61]]], ['regression [[61, 177]]', [[61, 177]], ['corrected', [61]]], ['partial-repair [[2, 155, 243, 103, 139, 4, 158]]', [[2, 155, 243, 103, 139, 4, 158]], ['corrected', [2, 155, 243, 103, 139, 4]]], ['partial-repair [[210, 131, 94, 129, 185, 125, 64, 227, 15]]', [[210, 131, 94, 129, 185, 125, 64, 227, 15]], ['corrected', [210, 131, 94, 129, 185, 125, 64, 227]]], ['control [[49, 50, 51, 52, 53, 54, 55, 56, 57, 244]]', [[49, 50, 51, 52, 53, 54, 55, 56, 57, 244]], ['clean', [49, 50, 51, 52, 53, 54, 55, 56, 57]]], ['control [[61, 179]]', [[61, 179]], ['clean', [61]]], ['control [[167, 181, 113]]', [[167, 181, 113]], ['clean', [167, 181]]], ['control [[183, 181, 113]]', [[183, 181, 113]], ['corrected', [167, 181]]]], [['regression [[72, 197, 62, 201]]', [[72, 197, 62, 201]], ['corrected', [72, 197, 62]]], ['regression [[175, 80, 114, 95, 91]]', [[175, 80, 114, 95, 91]], ['corrected', [175, 80, 114, 95]]], ['partial-repair [[0, 1]]', [[0, 1]], ['corrected', [0]]], ['partial-repair [[2, 155, 243, 103, 139, 4, 158]]', [[2, 155, 243, 103, 139, 4, 158]], ['corrected', [2, 155, 243, 103, 139, 4]]], ['control [[175, 80, 114, 95, 27]]', [[175, 80, 114, 95, 27]], ['clean', [175, 80, 114, 95]]], ['control [[175, 80, 115, 95, 27]]', [[175, 80, 115, 95, 27]], ['corrected', [175, 80, 114, 95]]], ['control [[2, 155, 243, 103, 139, 4, 159]]', [[2, 155, 243, 103, 139, 4, 159]], ['clean', [2, 155, 243, 103, 139, 4]]], ['control [[2, 155, 243, 111, 139, 4, 159]]', [[2, 155, 243, 111, 139, 4, 159]], ['corrected', [2, 155, 243, 103, 139, 4]]]], [['regression [[210, 131, 94, 129, 185, 125, 64, 227, 15]]', [[210, 131, 94, 129, 185, 125, 64, 227, 15]], ['corrected', [210, 131, 94, 129, 185, 125, 64, 227]]], ['regression [[210, 125, 246, 195, 53, 171, 122, 103, 140, 202, 155]]', [[210, 125, 246, 195, 53, 171, 122, 103, 140, 202, 155]], ['corrected', [210, 125, 246, 195, 53, 171, 122, 103, 140, 202]]], ['partial-repair [[195, 130, 127, 215]]', [[195, 130, 127, 215]], ['corrected', [195, 130, 127]]], ['partial-repair [[0, 1]]', [[0, 1]], ['corrected', [0]]], ['control [[210, 131, 94, 129, 249, 125, 64, 227, 14]]', [[210, 131, 94, 129, 249, 125, 64, 227, 14]], ['corrected', [210, 131, 94, 129, 185, 125, 64, 227]]], ['control [[210, 125, 246, 195, 53, 171, 122, 103, 140, 202, 147]]', [[210, 125, 246, 195, 53, 171, 122, 103, 140, 202, 147]], ['clean', [210, 125, 246, 195, 53, 171, 122, 103, 140, 202]]], ['control [[195, 130, 127, 214]]', [[195, 130, 127, 214]], ['clean', [195, 130, 127]]], ['control [[127, 209, 201, 183, 47, 43]]', [[127, 209, 201, 183, 47, 43]], ['clean', [127, 209, 201, 183, 47]]]], [['regression [[195, 130, 127, 222]]', [[195, 130, 127, 222]], ['corrected', [195, 130, 127]]], ['regression [[195, 130, 127, 215]]', [[195, 130, 127, 215]], ['corrected', [195, 130, 127]]], ['partial-repair [[210, 131, 94, 129, 185, 125, 64, 227, 15]]', [[210, 131, 94, 129, 185, 125, 64, 227, 15]], ['corrected', [210, 131, 94, 129, 185, 125, 64, 227]]], ['control [[98, 66, 50, 252, 121, 189, 178, 236]]', [[98, 66, 50, 252, 121, 189, 178, 236]], ['clean', [98, 66, 50, 252, 121, 189, 178]]], ['control [[96, 66, 50, 252, 121, 189, 178, 236]]', [[96, 66, 50, 252, 121, 189, 178, 236]], ['corrected', [98, 66, 50, 252, 121, 189, 178]]], ['control [[49, 50, 51]]', [[49, 50, 51]], ['uncorrectable', None]], ['control [[1]]', [[1]], None], ['control [[0, 0]]', [[0, 0]], ['clean', [0]]]], [['regression [[98, 66, 50, 252, 121, 189, 178, 232]]', [[98, 66, 50, 252, 121, 189, 178, 232]], ['corrected', [98, 66, 50, 252, 121, 189, 178]]], ['regression [[0, 1]]', [[0, 1]], ['corrected', [0]]], ['partial-repair [[2, 155, 243, 103, 139, 4, 158]]', [[2, 155, 243, 103, 139, 4, 158]], ['corrected', [2, 155, 243, 103, 139, 4]]], ['partial-repair [[210, 131, 94, 129, 185, 125, 64, 227, 15]]', [[210, 131, 94, 129, 185, 125, 64, 227, 15]], ['corrected', [210, 131, 94, 129, 185, 125, 64, 227]]], ['control [[49, 50, 51, 52, 53, 54, 55, 56, 57, 244]]', [[49, 50, 51, 52, 53, 54, 55, 56, 57, 244]], ['clean', [49, 50, 51, 52, 53, 54, 55, 56, 57]]], ['control [[61, 179]]', [[61, 179]], ['clean', [61]]], ['control [[167, 181, 113]]', [[167, 181, 113]], ['clean', [167, 181]]], ['control [[183, 181, 113]]', [[183, 181, 113]], ['corrected', [167, 181]]]]]
for label, args, expected in fixtures[N - 1]:
check(label, solve(*args), 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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression [[61, 51]] | ['uncorrectable', None] | ['corrected', [61]] | Failed |
| regression [[61, 177]] | ['uncorrectable', None] | ['corrected', [61]] | Failed |
| partial-repair [[2, 155, 243, 103, 139, 4, 158]] | ['uncorrectable', None] | ['corrected', [2, 155, 243, 103, 139, 4]] | Failed |
| partial-repair [[210, 131, 94, 129, 185, 125, 64, 227, 15]] | ['uncorrectable', None] | ['corrected', [210, 131, 94, 129, 185, 125, 64, 227]] | Failed |
| control [[49, 50, 51, 52, 53, 54, 55, 56, 57, 244]] | ['clean', [49, 50, 51, 52, 53, 54, 55, 56, 57]] | ['clean', [49, 50, 51, 52, 53, 54, 55, 56, 57]] | Passed |
| control [[61, 179]] | ['clean', [61]] | ['clean', [61]] | Passed |
| control [[167, 181, 113]] | ['clean', [167, 181]] | ['clean', [167, 181]] | Passed |
| control [[183, 181, 113]] | ['corrected', [167, 181]] | ['corrected', [167, 181]] | Passed |
SHA-256 / c374761412aece982eea04212b05217a43c336bd5de9d1c2d78f196689307cd6
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(frame):
def crc8(data):
c = 0
for byte in data:
c ^= byte
for _ in range(8):
c = ((c << 1) ^ 0x07) & 0xFF if c & 0x80 else (c << 1) & 0xFF
return c
if not 2 <= len(frame) <= 15:
return None
if crc8(frame[:-1]) == frame[-1]:
return ['clean', list(frame[:-1])]
for pos in range(8 * len(frame) - 1):
trial = list(frame)
trial[pos // 8] ^= 0x80 >> (pos % 8)
if crc8(trial[:-1]) == trial[-1]:
return ['corrected', trial[:-1]]
return ['uncorrectable', None]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression [[61, 51]]', [[61, 51]], ['corrected', [61]]], ['regression [[61, 177]]', [[61, 177]], ['corrected', [61]]], ['partial-repair [[2, 155, 243, 103, 139, 4, 158]]', [[2, 155, 243, 103, 139, 4, 158]], ['corrected', [2, 155, 243, 103, 139, 4]]], ['partial-repair [[210, 131, 94, 129, 185, 125, 64, 227, 15]]', [[210, 131, 94, 129, 185, 125, 64, 227, 15]], ['corrected', [210, 131, 94, 129, 185, 125, 64, 227]]], ['control [[49, 50, 51, 52, 53, 54, 55, 56, 57, 244]]', [[49, 50, 51, 52, 53, 54, 55, 56, 57, 244]], ['clean', [49, 50, 51, 52, 53, 54, 55, 56, 57]]], ['control [[61, 179]]', [[61, 179]], ['clean', [61]]], ['control [[167, 181, 113]]', [[167, 181, 113]], ['clean', [167, 181]]], ['control [[183, 181, 113]]', [[183, 181, 113]], ['corrected', [167, 181]]]], [['regression [[72, 197, 62, 201]]', [[72, 197, 62, 201]], ['corrected', [72, 197, 62]]], ['regression [[175, 80, 114, 95, 91]]', [[175, 80, 114, 95, 91]], ['corrected', [175, 80, 114, 95]]], ['partial-repair [[0, 1]]', [[0, 1]], ['corrected', [0]]], ['partial-repair [[2, 155, 243, 103, 139, 4, 158]]', [[2, 155, 243, 103, 139, 4, 158]], ['corrected', [2, 155, 243, 103, 139, 4]]], ['control [[175, 80, 114, 95, 27]]', [[175, 80, 114, 95, 27]], ['clean', [175, 80, 114, 95]]], ['control [[175, 80, 115, 95, 27]]', [[175, 80, 115, 95, 27]], ['corrected', [175, 80, 114, 95]]], ['control [[2, 155, 243, 103, 139, 4, 159]]', [[2, 155, 243, 103, 139, 4, 159]], ['clean', [2, 155, 243, 103, 139, 4]]], ['control [[2, 155, 243, 111, 139, 4, 159]]', [[2, 155, 243, 111, 139, 4, 159]], ['corrected', [2, 155, 243, 103, 139, 4]]]], [['regression [[210, 131, 94, 129, 185, 125, 64, 227, 15]]', [[210, 131, 94, 129, 185, 125, 64, 227, 15]], ['corrected', [210, 131, 94, 129, 185, 125, 64, 227]]], ['regression [[210, 125, 246, 195, 53, 171, 122, 103, 140, 202, 155]]', [[210, 125, 246, 195, 53, 171, 122, 103, 140, 202, 155]], ['corrected', [210, 125, 246, 195, 53, 171, 122, 103, 140, 202]]], ['partial-repair [[195, 130, 127, 215]]', [[195, 130, 127, 215]], ['corrected', [195, 130, 127]]], ['partial-repair [[0, 1]]', [[0, 1]], ['corrected', [0]]], ['control [[210, 131, 94, 129, 249, 125, 64, 227, 14]]', [[210, 131, 94, 129, 249, 125, 64, 227, 14]], ['corrected', [210, 131, 94, 129, 185, 125, 64, 227]]], ['control [[210, 125, 246, 195, 53, 171, 122, 103, 140, 202, 147]]', [[210, 125, 246, 195, 53, 171, 122, 103, 140, 202, 147]], ['clean', [210, 125, 246, 195, 53, 171, 122, 103, 140, 202]]], ['control [[195, 130, 127, 214]]', [[195, 130, 127, 214]], ['clean', [195, 130, 127]]], ['control [[127, 209, 201, 183, 47, 43]]', [[127, 209, 201, 183, 47, 43]], ['clean', [127, 209, 201, 183, 47]]]], [['regression [[195, 130, 127, 222]]', [[195, 130, 127, 222]], ['corrected', [195, 130, 127]]], ['regression [[195, 130, 127, 215]]', [[195, 130, 127, 215]], ['corrected', [195, 130, 127]]], ['partial-repair [[210, 131, 94, 129, 185, 125, 64, 227, 15]]', [[210, 131, 94, 129, 185, 125, 64, 227, 15]], ['corrected', [210, 131, 94, 129, 185, 125, 64, 227]]], ['control [[98, 66, 50, 252, 121, 189, 178, 236]]', [[98, 66, 50, 252, 121, 189, 178, 236]], ['clean', [98, 66, 50, 252, 121, 189, 178]]], ['control [[96, 66, 50, 252, 121, 189, 178, 236]]', [[96, 66, 50, 252, 121, 189, 178, 236]], ['corrected', [98, 66, 50, 252, 121, 189, 178]]], ['control [[49, 50, 51]]', [[49, 50, 51]], ['uncorrectable', None]], ['control [[1]]', [[1]], None], ['control [[0, 0]]', [[0, 0]], ['clean', [0]]]], [['regression [[98, 66, 50, 252, 121, 189, 178, 232]]', [[98, 66, 50, 252, 121, 189, 178, 232]], ['corrected', [98, 66, 50, 252, 121, 189, 178]]], ['regression [[0, 1]]', [[0, 1]], ['corrected', [0]]], ['partial-repair [[2, 155, 243, 103, 139, 4, 158]]', [[2, 155, 243, 103, 139, 4, 158]], ['corrected', [2, 155, 243, 103, 139, 4]]], ['partial-repair [[210, 131, 94, 129, 185, 125, 64, 227, 15]]', [[210, 131, 94, 129, 185, 125, 64, 227, 15]], ['corrected', [210, 131, 94, 129, 185, 125, 64, 227]]], ['control [[49, 50, 51, 52, 53, 54, 55, 56, 57, 244]]', [[49, 50, 51, 52, 53, 54, 55, 56, 57, 244]], ['clean', [49, 50, 51, 52, 53, 54, 55, 56, 57]]], ['control [[61, 179]]', [[61, 179]], ['clean', [61]]], ['control [[167, 181, 113]]', [[167, 181, 113]], ['clean', [167, 181]]], ['control [[183, 181, 113]]', [[183, 181, 113]], ['corrected', [167, 181]]]]]
for label, args, expected in fixtures[N - 1]:
check(label, solve(*args), 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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression [[61, 51]] | ['corrected', [61]] | ['corrected', [61]] | Passed |
| regression [[61, 177]] | ['corrected', [61]] | ['corrected', [61]] | Passed |
| partial-repair [[2, 155, 243, 103, 139, 4, 158]] | ['uncorrectable', None] | ['corrected', [2, 155, 243, 103, 139, 4]] | Failed |
| partial-repair [[210, 131, 94, 129, 185, 125, 64, 227, 15]] | ['uncorrectable', None] | ['corrected', [210, 131, 94, 129, 185, 125, 64, 227]] | Failed |
| control [[49, 50, 51, 52, 53, 54, 55, 56, 57, 244]] | ['clean', [49, 50, 51, 52, 53, 54, 55, 56, 57]] | ['clean', [49, 50, 51, 52, 53, 54, 55, 56, 57]] | Passed |
| control [[61, 179]] | ['clean', [61]] | ['clean', [61]] | Passed |
| control [[167, 181, 113]] | ['clean', [167, 181]] | ['clean', [167, 181]] | Passed |
| control [[183, 181, 113]] | ['corrected', [167, 181]] | ['corrected', [167, 181]] | Passed |
SHA-256 / e96cb61789f477141b7e0d6cff0401a01a05f490414e93288b99ae80d5cd4b22
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(frame):
def crc8(data):
c = 0
for byte in data:
c ^= byte
for _ in range(8):
c = ((c << 1) ^ 0x07) & 0xFF if c & 0x80 else (c << 1) & 0xFF
return c
if not 2 <= len(frame) <= 15:
return None
if crc8(frame[:-1]) == frame[-1]:
return ['clean', list(frame[:-1])]
for pos in range(8 * len(frame)):
trial = list(frame)
trial[pos // 8] ^= 0x80 >> (pos % 8)
if crc8(trial[:-1]) == trial[-1]:
return ['corrected', trial[:-1]]
return ['uncorrectable', None]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression [[61, 51]]', [[61, 51]], ['corrected', [61]]], ['regression [[61, 177]]', [[61, 177]], ['corrected', [61]]], ['partial-repair [[2, 155, 243, 103, 139, 4, 158]]', [[2, 155, 243, 103, 139, 4, 158]], ['corrected', [2, 155, 243, 103, 139, 4]]], ['partial-repair [[210, 131, 94, 129, 185, 125, 64, 227, 15]]', [[210, 131, 94, 129, 185, 125, 64, 227, 15]], ['corrected', [210, 131, 94, 129, 185, 125, 64, 227]]], ['control [[49, 50, 51, 52, 53, 54, 55, 56, 57, 244]]', [[49, 50, 51, 52, 53, 54, 55, 56, 57, 244]], ['clean', [49, 50, 51, 52, 53, 54, 55, 56, 57]]], ['control [[61, 179]]', [[61, 179]], ['clean', [61]]], ['control [[167, 181, 113]]', [[167, 181, 113]], ['clean', [167, 181]]], ['control [[183, 181, 113]]', [[183, 181, 113]], ['corrected', [167, 181]]]], [['regression [[72, 197, 62, 201]]', [[72, 197, 62, 201]], ['corrected', [72, 197, 62]]], ['regression [[175, 80, 114, 95, 91]]', [[175, 80, 114, 95, 91]], ['corrected', [175, 80, 114, 95]]], ['partial-repair [[0, 1]]', [[0, 1]], ['corrected', [0]]], ['partial-repair [[2, 155, 243, 103, 139, 4, 158]]', [[2, 155, 243, 103, 139, 4, 158]], ['corrected', [2, 155, 243, 103, 139, 4]]], ['control [[175, 80, 114, 95, 27]]', [[175, 80, 114, 95, 27]], ['clean', [175, 80, 114, 95]]], ['control [[175, 80, 115, 95, 27]]', [[175, 80, 115, 95, 27]], ['corrected', [175, 80, 114, 95]]], ['control [[2, 155, 243, 103, 139, 4, 159]]', [[2, 155, 243, 103, 139, 4, 159]], ['clean', [2, 155, 243, 103, 139, 4]]], ['control [[2, 155, 243, 111, 139, 4, 159]]', [[2, 155, 243, 111, 139, 4, 159]], ['corrected', [2, 155, 243, 103, 139, 4]]]], [['regression [[210, 131, 94, 129, 185, 125, 64, 227, 15]]', [[210, 131, 94, 129, 185, 125, 64, 227, 15]], ['corrected', [210, 131, 94, 129, 185, 125, 64, 227]]], ['regression [[210, 125, 246, 195, 53, 171, 122, 103, 140, 202, 155]]', [[210, 125, 246, 195, 53, 171, 122, 103, 140, 202, 155]], ['corrected', [210, 125, 246, 195, 53, 171, 122, 103, 140, 202]]], ['partial-repair [[195, 130, 127, 215]]', [[195, 130, 127, 215]], ['corrected', [195, 130, 127]]], ['partial-repair [[0, 1]]', [[0, 1]], ['corrected', [0]]], ['control [[210, 131, 94, 129, 249, 125, 64, 227, 14]]', [[210, 131, 94, 129, 249, 125, 64, 227, 14]], ['corrected', [210, 131, 94, 129, 185, 125, 64, 227]]], ['control [[210, 125, 246, 195, 53, 171, 122, 103, 140, 202, 147]]', [[210, 125, 246, 195, 53, 171, 122, 103, 140, 202, 147]], ['clean', [210, 125, 246, 195, 53, 171, 122, 103, 140, 202]]], ['control [[195, 130, 127, 214]]', [[195, 130, 127, 214]], ['clean', [195, 130, 127]]], ['control [[127, 209, 201, 183, 47, 43]]', [[127, 209, 201, 183, 47, 43]], ['clean', [127, 209, 201, 183, 47]]]], [['regression [[195, 130, 127, 222]]', [[195, 130, 127, 222]], ['corrected', [195, 130, 127]]], ['regression [[195, 130, 127, 215]]', [[195, 130, 127, 215]], ['corrected', [195, 130, 127]]], ['partial-repair [[210, 131, 94, 129, 185, 125, 64, 227, 15]]', [[210, 131, 94, 129, 185, 125, 64, 227, 15]], ['corrected', [210, 131, 94, 129, 185, 125, 64, 227]]], ['control [[98, 66, 50, 252, 121, 189, 178, 236]]', [[98, 66, 50, 252, 121, 189, 178, 236]], ['clean', [98, 66, 50, 252, 121, 189, 178]]], ['control [[96, 66, 50, 252, 121, 189, 178, 236]]', [[96, 66, 50, 252, 121, 189, 178, 236]], ['corrected', [98, 66, 50, 252, 121, 189, 178]]], ['control [[49, 50, 51]]', [[49, 50, 51]], ['uncorrectable', None]], ['control [[1]]', [[1]], None], ['control [[0, 0]]', [[0, 0]], ['clean', [0]]]], [['regression [[98, 66, 50, 252, 121, 189, 178, 232]]', [[98, 66, 50, 252, 121, 189, 178, 232]], ['corrected', [98, 66, 50, 252, 121, 189, 178]]], ['regression [[0, 1]]', [[0, 1]], ['corrected', [0]]], ['partial-repair [[2, 155, 243, 103, 139, 4, 158]]', [[2, 155, 243, 103, 139, 4, 158]], ['corrected', [2, 155, 243, 103, 139, 4]]], ['partial-repair [[210, 131, 94, 129, 185, 125, 64, 227, 15]]', [[210, 131, 94, 129, 185, 125, 64, 227, 15]], ['corrected', [210, 131, 94, 129, 185, 125, 64, 227]]], ['control [[49, 50, 51, 52, 53, 54, 55, 56, 57, 244]]', [[49, 50, 51, 52, 53, 54, 55, 56, 57, 244]], ['clean', [49, 50, 51, 52, 53, 54, 55, 56, 57]]], ['control [[61, 179]]', [[61, 179]], ['clean', [61]]], ['control [[167, 181, 113]]', [[167, 181, 113]], ['clean', [167, 181]]], ['control [[183, 181, 113]]', [[183, 181, 113]], ['corrected', [167, 181]]]]]
for label, args, expected in fixtures[N - 1]:
check(label, solve(*args), 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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression [[61, 51]] | ['corrected', [61]] | ['corrected', [61]] | Passed |
| regression [[61, 177]] | ['corrected', [61]] | ['corrected', [61]] | Passed |
| partial-repair [[2, 155, 243, 103, 139, 4, 158]] | ['corrected', [2, 155, 243, 103, 139, 4]] | ['corrected', [2, 155, 243, 103, 139, 4]] | Passed |
| partial-repair [[210, 131, 94, 129, 185, 125, 64, 227, 15]] | ['corrected', [210, 131, 94, 129, 185, 125, 64, 227]] | ['corrected', [210, 131, 94, 129, 185, 125, 64, 227]] | Passed |
| control [[49, 50, 51, 52, 53, 54, 55, 56, 57, 244]] | ['clean', [49, 50, 51, 52, 53, 54, 55, 56, 57]] | ['clean', [49, 50, 51, 52, 53, 54, 55, 56, 57]] | Passed |
| control [[61, 179]] | ['clean', [61]] | ['clean', [61]] | Passed |
| control [[167, 181, 113]] | ['clean', [167, 181]] | ['clean', [167, 181]] | Passed |
| control [[183, 181, 113]] | ['corrected', [167, 181]] | ['corrected', [167, 181]] | Passed |
SHA-256 / 535840cc56ae486adbcebc6d028e6fd9b2a8b1351a811c14dfe6872a44138fe1
Verification & scope
A deterministic, bounded teaching model of the named code under the stated contract; not a production codec. 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:48:36.571953+00:00.
Case digest / d0c7feaff8a3d400c96e23bfd5f3505fbf7172a3f82a07e3e1e6644f5b568606