FAILURE MAP
← Case archive

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.

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

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 fixtureActualExpectedOutcome
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 fixtureActualExpectedOutcome
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 fixtureActualExpectedOutcome
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