FAILURE MAP
← Case archive

FA-79541 / Barcode symbology encoding / Open access

ITF data elements ignore the configured wide ratio · case 01

Symbols printed at a 3:1 ratio have data elements at 2:1 but a 3:1 stop bar.

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

ROOT CAUSE

Wide data elements use a hard-coded width of 2.

VERIFIED REPAIR

Use the configured ratio for every wide element.

Unsuccessful approach: round() turns 2.5 into 2 with banker's rounding.

Case contract

Encode ASCII digits as Interleaved 2 of 5 element widths (narrow 1, wide = ratio in {2, 2.5, 3}). An odd-length input gets a leading 0. Start is narrow bar/space/bar/space; each digit pair interleaves the first digit's pattern in the bars with the second digit's pattern in the spaces; stop is wide bar, narrow space, narrow bar. Digit patterns use weights 1,2,4,7 plus parity (0 = NNWWN). Invalid input returns None.

Why this case matters

Retail, logistics, pharmacy and document workflows depend on encoders that produce exactly the module pattern, code-set switches, separators and quiet zones scanners expect; one misplaced module or separator makes a label unreadable or, worse, scan as different data.

1 / The failure

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

N = 1
observations = []
def solve(digits, ratio):
    if not digits or not all(c in '0123456789' for c in digits) or ratio not in (2, 2.5, 3):
        return None
    P = {'0': 'NNWWN', '1': 'WNNNW', '2': 'NWNNW', '3': 'WWNNN', '4': 'NNWNW',
         '5': 'WNWNN', '6': 'NWWNN', '7': 'NNNWW', '8': 'WNNWN', '9': 'NWNWN'}
    if len(digits) % 2:
        digits = '0' + digits
    wid = {'N': 1, 'W': 2}
    out = [1, 1, 1, 1]
    for i in range(0, len(digits), 2):
        a, b = P[digits[i]], P[digits[i + 1]]
        for k in range(5):
            out.append(wid[a[k]])
            out.append(wid[b[k]])
    out += [ratio, 1, 1]
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[('809220', 3), [1, 1, 1, 1, 3, 1, 1, 1, 1, 3, 3, 3, 1, 1, 1, 1, 3, 3, 1, 1, 3, 1, 1, 3, 1, 1, 3, 1, 1, 3, 1, 3, 3, 1, 3, 1, 1]], [('2', 2.5), [1, 1, 1, 1, 1, 1, 1, 2.5, 2.5, 1, 2.5, 1, 1, 2.5, 2.5, 1, 1]], [('670621', 2.5), [1, 1, 1, 1, 1, 1, 2.5, 1, 2.5, 1, 1, 2.5, 1, 2.5, 1, 1, 1, 2.5, 2.5, 2.5, 2.5, 1, 1, 1, 1, 2.5, 2.5, 1, 1, 1, 1, 1, 2.5, 2.5, 2.5, 1, 1]], [('596257', 4), None], [('37775', 4), None], [('683', 4), None], [('395208', 4), None], [('960081', 3), [1, 1, 1, 1, 1, 1, 3, 3, 1, 3, 3, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 1, 1, 3, 3, 1, 1, 1, 1, 3, 1, 1, 3, 3, 1, 1]]], [[('954', 3), [1, 1, 1, 1, 1, 1, 1, 3, 3, 1, 3, 3, 1, 1, 3, 1, 1, 1, 3, 3, 1, 1, 1, 3, 3, 1, 1]], [('6596', 2.5), [1, 1, 1, 1, 1, 2.5, 2.5, 1, 2.5, 2.5, 1, 1, 1, 1, 1, 1, 2.5, 2.5, 1, 2.5, 2.5, 1, 1, 1, 2.5, 1, 1]], [('7765', 2.5), [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2.5, 2.5, 2.5, 2.5, 1, 2.5, 2.5, 1, 2.5, 2.5, 1, 1, 1, 1, 2.5, 1, 1]], [('83883', 4), None], [('246919', 2), [1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 1, 2, 2, 2, 1, 1, 2, 1, 1, 2, 1, 1, 2, 1, 1, 1, 2, 2, 1, 2, 1, 1]], [('6812', 2), [1, 1, 1, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 2, 2, 2, 1, 1]], [('13', 4), None], [('76847', 3), [1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 3, 3, 1, 3, 1, 3, 3, 1, 3, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 1, 3, 3, 3, 3, 1, 1]]], [[('486862', 3), [1, 1, 1, 1, 1, 3, 1, 1, 3, 1, 1, 3, 3, 1, 1, 3, 3, 1, 3, 1, 1, 3, 1, 1, 1, 1, 3, 3, 3, 1, 1, 1, 1, 3, 3, 1, 1]], [('268679', 2.5), [1, 1, 1, 1, 1, 1, 2.5, 2.5, 1, 2.5, 1, 1, 2.5, 1, 2.5, 1, 1, 2.5, 1, 2.5, 2.5, 1, 1, 1, 1, 1, 1, 2.5, 1, 1, 2.5, 2.5, 2.5, 1, 2.5, 1, 1]], [('875', 2.5), [1, 1, 1, 1, 1, 2.5, 1, 1, 2.5, 1, 2.5, 2.5, 1, 1, 1, 2.5, 1, 1, 1, 2.5, 2.5, 1, 2.5, 1, 2.5, 1, 1]], [('205464', 2), [1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 1, 2, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, 1, 2, 2, 1, 1]], [('313090', 2), [1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 1, 1, 1, 1, 2, 1, 1, 2, 2, 2, 1, 1, 2, 1, 1]], [('05', 2), [1, 1, 1, 1, 1, 2, 1, 1, 2, 2, 2, 1, 1, 1, 2, 1, 1]], [('1819', 4), None], [('15', 3), [1, 1, 1, 1, 3, 3, 1, 1, 1, 3, 1, 1, 3, 1, 3, 1, 1]]], [[('6592', 2.5), [1, 1, 1, 1, 1, 2.5, 2.5, 1, 2.5, 2.5, 1, 1, 1, 1, 1, 1, 2.5, 2.5, 1, 1, 2.5, 1, 1, 2.5, 2.5, 1, 1]], [('2', 2.5), [1, 1, 1, 1, 1, 1, 1, 2.5, 2.5, 1, 2.5, 1, 1, 2.5, 2.5, 1, 1]], [('559', 2.5), [1, 1, 1, 1, 1, 2.5, 1, 1, 2.5, 2.5, 2.5, 1, 1, 1, 2.5, 1, 1, 2.5, 2.5, 1, 1, 2.5, 1, 1, 2.5, 1, 1]], [('866370', 2), [1, 1, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 1, 2, 1, 1]], [('84', 2), [1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1]], [('6', 4), None], [('00', 4), None], [('17', 3), [1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 1, 1]]], [[('48', 3), [1, 1, 1, 1, 1, 3, 1, 1, 3, 1, 1, 3, 3, 1, 3, 1, 1]], [('15631', 2.5), [1, 1, 1, 1, 1, 2.5, 1, 1, 2.5, 1, 2.5, 1, 1, 2.5, 2.5, 1, 1, 2.5, 2.5, 2.5, 1, 1, 1, 1, 2.5, 2.5, 2.5, 1, 1, 1, 1, 1, 1, 2.5, 2.5, 1, 1]], [('12702', 2.5), [1, 1, 1, 1, 1, 2.5, 1, 1, 2.5, 1, 2.5, 1, 1, 2.5, 1, 1, 2.5, 1, 1, 1, 1, 2.5, 2.5, 2.5, 1, 1, 1, 2.5, 2.5, 1, 2.5, 1, 1, 2.5, 2.5, 1, 1]], [('40', 2), [1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 2, 2, 1, 2, 1, 1]], [('87', 2), [1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 2, 1, 2, 2, 1, 1]], [('6644', 2), [1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 2, 2, 2, 1, 1]], [('8', 2), [1, 1, 1, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 1]], [('420', 3), [1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 1, 1, 3, 1, 1, 3, 1, 1, 3, 1, 3, 3, 1, 3, 1, 1]]]]
labels = ["regression: wide element width", "repair trap", "combined fault", "control", "control", "boundary", "boundary", "control"]
for i, (args, expected) in enumerate(fixtures[N-1]):
    check("%s %d" % (labels[i % len(labels)], i), 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: wide element width 0[1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 3, 1, 1][1, 1, 1, 1, 3, 1, 1, 1, 1, 3, 3, 3, 1, 1, 1, 1, 3, 3, 1, 1, 3, 1, 1, 3, 1, 1, 3, 1, 1, 3, 1, 3, 3, 1, 3, 1, 1]Failed
repair trap 1[1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 2, 1, 1, 2, 2.5, 1, 1][1, 1, 1, 1, 1, 1, 1, 2.5, 2.5, 1, 2.5, 1, 1, 2.5, 2.5, 1, 1]Failed
combined fault 2[1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 2, 2, 2.5, 1, 1][1, 1, 1, 1, 1, 1, 2.5, 1, 2.5, 1, 1, 2.5, 1, 2.5, 1, 1, 1, 2.5, 2.5, 2.5, 2.5, 1, 1, 1, 1, 2.5, 2.5, 1, 1, 1, 1, 1, 2.5, 2.5, 2.5, 1, 1]Failed
control 3NoneNonePassed
control 4NoneNonePassed
boundary 5NoneNonePassed
boundary 6NoneNonePassed
control 7[1, 1, 1, 1, 1, 1, 2, 2, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 2, 2, 1, 1, 1, 1, 2, 1, 1, 2, 3, 1, 1][1, 1, 1, 1, 1, 1, 3, 3, 1, 3, 3, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 1, 1, 3, 3, 1, 1, 1, 1, 3, 1, 1, 3, 3, 1, 1]Failed

SHA-256 / c2acb10e65fe26b146a5119179528f34b9966ef785b801231df998ee64033bee

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(digits, ratio):
    if not digits or not all(c in '0123456789' for c in digits) or ratio not in (2, 2.5, 3):
        return None
    P = {'0': 'NNWWN', '1': 'WNNNW', '2': 'NWNNW', '3': 'WWNNN', '4': 'NNWNW',
         '5': 'WNWNN', '6': 'NWWNN', '7': 'NNNWW', '8': 'WNNWN', '9': 'NWNWN'}
    if len(digits) % 2:
        digits = '0' + digits
    wid = {'N': 1, 'W': round(ratio)}
    out = [1, 1, 1, 1]
    for i in range(0, len(digits), 2):
        a, b = P[digits[i]], P[digits[i + 1]]
        for k in range(5):
            out.append(wid[a[k]])
            out.append(wid[b[k]])
    out += [ratio, 1, 1]
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[('809220', 3), [1, 1, 1, 1, 3, 1, 1, 1, 1, 3, 3, 3, 1, 1, 1, 1, 3, 3, 1, 1, 3, 1, 1, 3, 1, 1, 3, 1, 1, 3, 1, 3, 3, 1, 3, 1, 1]], [('2', 2.5), [1, 1, 1, 1, 1, 1, 1, 2.5, 2.5, 1, 2.5, 1, 1, 2.5, 2.5, 1, 1]], [('670621', 2.5), [1, 1, 1, 1, 1, 1, 2.5, 1, 2.5, 1, 1, 2.5, 1, 2.5, 1, 1, 1, 2.5, 2.5, 2.5, 2.5, 1, 1, 1, 1, 2.5, 2.5, 1, 1, 1, 1, 1, 2.5, 2.5, 2.5, 1, 1]], [('596257', 4), None], [('37775', 4), None], [('683', 4), None], [('395208', 4), None], [('960081', 3), [1, 1, 1, 1, 1, 1, 3, 3, 1, 3, 3, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 1, 1, 3, 3, 1, 1, 1, 1, 3, 1, 1, 3, 3, 1, 1]]], [[('954', 3), [1, 1, 1, 1, 1, 1, 1, 3, 3, 1, 3, 3, 1, 1, 3, 1, 1, 1, 3, 3, 1, 1, 1, 3, 3, 1, 1]], [('6596', 2.5), [1, 1, 1, 1, 1, 2.5, 2.5, 1, 2.5, 2.5, 1, 1, 1, 1, 1, 1, 2.5, 2.5, 1, 2.5, 2.5, 1, 1, 1, 2.5, 1, 1]], [('7765', 2.5), [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2.5, 2.5, 2.5, 2.5, 1, 2.5, 2.5, 1, 2.5, 2.5, 1, 1, 1, 1, 2.5, 1, 1]], [('83883', 4), None], [('246919', 2), [1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 1, 2, 2, 2, 1, 1, 2, 1, 1, 2, 1, 1, 2, 1, 1, 1, 2, 2, 1, 2, 1, 1]], [('6812', 2), [1, 1, 1, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 2, 2, 2, 1, 1]], [('13', 4), None], [('76847', 3), [1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 3, 3, 1, 3, 1, 3, 3, 1, 3, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 1, 3, 3, 3, 3, 1, 1]]], [[('486862', 3), [1, 1, 1, 1, 1, 3, 1, 1, 3, 1, 1, 3, 3, 1, 1, 3, 3, 1, 3, 1, 1, 3, 1, 1, 1, 1, 3, 3, 3, 1, 1, 1, 1, 3, 3, 1, 1]], [('268679', 2.5), [1, 1, 1, 1, 1, 1, 2.5, 2.5, 1, 2.5, 1, 1, 2.5, 1, 2.5, 1, 1, 2.5, 1, 2.5, 2.5, 1, 1, 1, 1, 1, 1, 2.5, 1, 1, 2.5, 2.5, 2.5, 1, 2.5, 1, 1]], [('875', 2.5), [1, 1, 1, 1, 1, 2.5, 1, 1, 2.5, 1, 2.5, 2.5, 1, 1, 1, 2.5, 1, 1, 1, 2.5, 2.5, 1, 2.5, 1, 2.5, 1, 1]], [('205464', 2), [1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 1, 2, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, 1, 2, 2, 1, 1]], [('313090', 2), [1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 1, 1, 1, 1, 2, 1, 1, 2, 2, 2, 1, 1, 2, 1, 1]], [('05', 2), [1, 1, 1, 1, 1, 2, 1, 1, 2, 2, 2, 1, 1, 1, 2, 1, 1]], [('1819', 4), None], [('15', 3), [1, 1, 1, 1, 3, 3, 1, 1, 1, 3, 1, 1, 3, 1, 3, 1, 1]]], [[('6592', 2.5), [1, 1, 1, 1, 1, 2.5, 2.5, 1, 2.5, 2.5, 1, 1, 1, 1, 1, 1, 2.5, 2.5, 1, 1, 2.5, 1, 1, 2.5, 2.5, 1, 1]], [('2', 2.5), [1, 1, 1, 1, 1, 1, 1, 2.5, 2.5, 1, 2.5, 1, 1, 2.5, 2.5, 1, 1]], [('559', 2.5), [1, 1, 1, 1, 1, 2.5, 1, 1, 2.5, 2.5, 2.5, 1, 1, 1, 2.5, 1, 1, 2.5, 2.5, 1, 1, 2.5, 1, 1, 2.5, 1, 1]], [('866370', 2), [1, 1, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 1, 2, 1, 1]], [('84', 2), [1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1]], [('6', 4), None], [('00', 4), None], [('17', 3), [1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 1, 1]]], [[('48', 3), [1, 1, 1, 1, 1, 3, 1, 1, 3, 1, 1, 3, 3, 1, 3, 1, 1]], [('15631', 2.5), [1, 1, 1, 1, 1, 2.5, 1, 1, 2.5, 1, 2.5, 1, 1, 2.5, 2.5, 1, 1, 2.5, 2.5, 2.5, 1, 1, 1, 1, 2.5, 2.5, 2.5, 1, 1, 1, 1, 1, 1, 2.5, 2.5, 1, 1]], [('12702', 2.5), [1, 1, 1, 1, 1, 2.5, 1, 1, 2.5, 1, 2.5, 1, 1, 2.5, 1, 1, 2.5, 1, 1, 1, 1, 2.5, 2.5, 2.5, 1, 1, 1, 2.5, 2.5, 1, 2.5, 1, 1, 2.5, 2.5, 1, 1]], [('40', 2), [1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 2, 2, 1, 2, 1, 1]], [('87', 2), [1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 2, 1, 2, 2, 1, 1]], [('6644', 2), [1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 2, 2, 2, 1, 1]], [('8', 2), [1, 1, 1, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 1]], [('420', 3), [1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 1, 1, 3, 1, 1, 3, 1, 1, 3, 1, 3, 3, 1, 3, 1, 1]]]]
labels = ["regression: wide element width", "repair trap", "combined fault", "control", "control", "boundary", "boundary", "control"]
for i, (args, expected) in enumerate(fixtures[N-1]):
    check("%s %d" % (labels[i % len(labels)], i), 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: wide element width 0[1, 1, 1, 1, 3, 1, 1, 1, 1, 3, 3, 3, 1, 1, 1, 1, 3, 3, 1, 1, 3, 1, 1, 3, 1, 1, 3, 1, 1, 3, 1, 3, 3, 1, 3, 1, 1][1, 1, 1, 1, 3, 1, 1, 1, 1, 3, 3, 3, 1, 1, 1, 1, 3, 3, 1, 1, 3, 1, 1, 3, 1, 1, 3, 1, 1, 3, 1, 3, 3, 1, 3, 1, 1]Passed
repair trap 1[1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 2, 1, 1, 2, 2.5, 1, 1][1, 1, 1, 1, 1, 1, 1, 2.5, 2.5, 1, 2.5, 1, 1, 2.5, 2.5, 1, 1]Failed
combined fault 2[1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 2, 2, 2.5, 1, 1][1, 1, 1, 1, 1, 1, 2.5, 1, 2.5, 1, 1, 2.5, 1, 2.5, 1, 1, 1, 2.5, 2.5, 2.5, 2.5, 1, 1, 1, 1, 2.5, 2.5, 1, 1, 1, 1, 1, 2.5, 2.5, 2.5, 1, 1]Failed
control 3NoneNonePassed
control 4NoneNonePassed
boundary 5NoneNonePassed
boundary 6NoneNonePassed
control 7[1, 1, 1, 1, 1, 1, 3, 3, 1, 3, 3, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 1, 1, 3, 3, 1, 1, 1, 1, 3, 1, 1, 3, 3, 1, 1][1, 1, 1, 1, 1, 1, 3, 3, 1, 3, 3, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 1, 1, 3, 3, 1, 1, 1, 1, 3, 1, 1, 3, 3, 1, 1]Passed

SHA-256 / 29d69e0818ce14966ea483ea67131b5a0b12e94da502c5022bd0cb149bddf659

3 / The verified repair

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

N = 1
observations = []
def solve(digits, ratio):
    if not digits or not all(c in '0123456789' for c in digits) or ratio not in (2, 2.5, 3):
        return None
    P = {'0': 'NNWWN', '1': 'WNNNW', '2': 'NWNNW', '3': 'WWNNN', '4': 'NNWNW',
         '5': 'WNWNN', '6': 'NWWNN', '7': 'NNNWW', '8': 'WNNWN', '9': 'NWNWN'}
    if len(digits) % 2:
        digits = '0' + digits
    wid = {'N': 1, 'W': ratio}
    out = [1, 1, 1, 1]
    for i in range(0, len(digits), 2):
        a, b = P[digits[i]], P[digits[i + 1]]
        for k in range(5):
            out.append(wid[a[k]])
            out.append(wid[b[k]])
    out += [ratio, 1, 1]
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[('809220', 3), [1, 1, 1, 1, 3, 1, 1, 1, 1, 3, 3, 3, 1, 1, 1, 1, 3, 3, 1, 1, 3, 1, 1, 3, 1, 1, 3, 1, 1, 3, 1, 3, 3, 1, 3, 1, 1]], [('2', 2.5), [1, 1, 1, 1, 1, 1, 1, 2.5, 2.5, 1, 2.5, 1, 1, 2.5, 2.5, 1, 1]], [('670621', 2.5), [1, 1, 1, 1, 1, 1, 2.5, 1, 2.5, 1, 1, 2.5, 1, 2.5, 1, 1, 1, 2.5, 2.5, 2.5, 2.5, 1, 1, 1, 1, 2.5, 2.5, 1, 1, 1, 1, 1, 2.5, 2.5, 2.5, 1, 1]], [('596257', 4), None], [('37775', 4), None], [('683', 4), None], [('395208', 4), None], [('960081', 3), [1, 1, 1, 1, 1, 1, 3, 3, 1, 3, 3, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 1, 1, 3, 3, 1, 1, 1, 1, 3, 1, 1, 3, 3, 1, 1]]], [[('954', 3), [1, 1, 1, 1, 1, 1, 1, 3, 3, 1, 3, 3, 1, 1, 3, 1, 1, 1, 3, 3, 1, 1, 1, 3, 3, 1, 1]], [('6596', 2.5), [1, 1, 1, 1, 1, 2.5, 2.5, 1, 2.5, 2.5, 1, 1, 1, 1, 1, 1, 2.5, 2.5, 1, 2.5, 2.5, 1, 1, 1, 2.5, 1, 1]], [('7765', 2.5), [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2.5, 2.5, 2.5, 2.5, 1, 2.5, 2.5, 1, 2.5, 2.5, 1, 1, 1, 1, 2.5, 1, 1]], [('83883', 4), None], [('246919', 2), [1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 1, 2, 2, 2, 1, 1, 2, 1, 1, 2, 1, 1, 2, 1, 1, 1, 2, 2, 1, 2, 1, 1]], [('6812', 2), [1, 1, 1, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 2, 2, 2, 1, 1]], [('13', 4), None], [('76847', 3), [1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 3, 3, 1, 3, 1, 3, 3, 1, 3, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 1, 3, 3, 3, 3, 1, 1]]], [[('486862', 3), [1, 1, 1, 1, 1, 3, 1, 1, 3, 1, 1, 3, 3, 1, 1, 3, 3, 1, 3, 1, 1, 3, 1, 1, 1, 1, 3, 3, 3, 1, 1, 1, 1, 3, 3, 1, 1]], [('268679', 2.5), [1, 1, 1, 1, 1, 1, 2.5, 2.5, 1, 2.5, 1, 1, 2.5, 1, 2.5, 1, 1, 2.5, 1, 2.5, 2.5, 1, 1, 1, 1, 1, 1, 2.5, 1, 1, 2.5, 2.5, 2.5, 1, 2.5, 1, 1]], [('875', 2.5), [1, 1, 1, 1, 1, 2.5, 1, 1, 2.5, 1, 2.5, 2.5, 1, 1, 1, 2.5, 1, 1, 1, 2.5, 2.5, 1, 2.5, 1, 2.5, 1, 1]], [('205464', 2), [1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 1, 2, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, 1, 2, 2, 1, 1]], [('313090', 2), [1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 1, 1, 1, 1, 2, 1, 1, 2, 2, 2, 1, 1, 2, 1, 1]], [('05', 2), [1, 1, 1, 1, 1, 2, 1, 1, 2, 2, 2, 1, 1, 1, 2, 1, 1]], [('1819', 4), None], [('15', 3), [1, 1, 1, 1, 3, 3, 1, 1, 1, 3, 1, 1, 3, 1, 3, 1, 1]]], [[('6592', 2.5), [1, 1, 1, 1, 1, 2.5, 2.5, 1, 2.5, 2.5, 1, 1, 1, 1, 1, 1, 2.5, 2.5, 1, 1, 2.5, 1, 1, 2.5, 2.5, 1, 1]], [('2', 2.5), [1, 1, 1, 1, 1, 1, 1, 2.5, 2.5, 1, 2.5, 1, 1, 2.5, 2.5, 1, 1]], [('559', 2.5), [1, 1, 1, 1, 1, 2.5, 1, 1, 2.5, 2.5, 2.5, 1, 1, 1, 2.5, 1, 1, 2.5, 2.5, 1, 1, 2.5, 1, 1, 2.5, 1, 1]], [('866370', 2), [1, 1, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 1, 2, 1, 1]], [('84', 2), [1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1]], [('6', 4), None], [('00', 4), None], [('17', 3), [1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 1, 1]]], [[('48', 3), [1, 1, 1, 1, 1, 3, 1, 1, 3, 1, 1, 3, 3, 1, 3, 1, 1]], [('15631', 2.5), [1, 1, 1, 1, 1, 2.5, 1, 1, 2.5, 1, 2.5, 1, 1, 2.5, 2.5, 1, 1, 2.5, 2.5, 2.5, 1, 1, 1, 1, 2.5, 2.5, 2.5, 1, 1, 1, 1, 1, 1, 2.5, 2.5, 1, 1]], [('12702', 2.5), [1, 1, 1, 1, 1, 2.5, 1, 1, 2.5, 1, 2.5, 1, 1, 2.5, 1, 1, 2.5, 1, 1, 1, 1, 2.5, 2.5, 2.5, 1, 1, 1, 2.5, 2.5, 1, 2.5, 1, 1, 2.5, 2.5, 1, 1]], [('40', 2), [1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 2, 2, 1, 2, 1, 1]], [('87', 2), [1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 2, 1, 2, 2, 1, 1]], [('6644', 2), [1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 2, 2, 2, 1, 1]], [('8', 2), [1, 1, 1, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 1]], [('420', 3), [1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 1, 1, 3, 1, 1, 3, 1, 1, 3, 1, 3, 3, 1, 3, 1, 1]]]]
labels = ["regression: wide element width", "repair trap", "combined fault", "control", "control", "boundary", "boundary", "control"]
for i, (args, expected) in enumerate(fixtures[N-1]):
    check("%s %d" % (labels[i % len(labels)], i), 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: wide element width 0[1, 1, 1, 1, 3, 1, 1, 1, 1, 3, 3, 3, 1, 1, 1, 1, 3, 3, 1, 1, 3, 1, 1, 3, 1, 1, 3, 1, 1, 3, 1, 3, 3, 1, 3, 1, 1][1, 1, 1, 1, 3, 1, 1, 1, 1, 3, 3, 3, 1, 1, 1, 1, 3, 3, 1, 1, 3, 1, 1, 3, 1, 1, 3, 1, 1, 3, 1, 3, 3, 1, 3, 1, 1]Passed
repair trap 1[1, 1, 1, 1, 1, 1, 1, 2.5, 2.5, 1, 2.5, 1, 1, 2.5, 2.5, 1, 1][1, 1, 1, 1, 1, 1, 1, 2.5, 2.5, 1, 2.5, 1, 1, 2.5, 2.5, 1, 1]Passed
combined fault 2[1, 1, 1, 1, 1, 1, 2.5, 1, 2.5, 1, 1, 2.5, 1, 2.5, 1, 1, 1, 2.5, 2.5, 2.5, 2.5, 1, 1, 1, 1, 2.5, 2.5, 1, 1, 1, 1, 1, 2.5, 2.5, 2.5, 1, 1][1, 1, 1, 1, 1, 1, 2.5, 1, 2.5, 1, 1, 2.5, 1, 2.5, 1, 1, 1, 2.5, 2.5, 2.5, 2.5, 1, 1, 1, 1, 2.5, 2.5, 1, 1, 1, 1, 1, 2.5, 2.5, 2.5, 1, 1]Passed
control 3NoneNonePassed
control 4NoneNonePassed
boundary 5NoneNonePassed
boundary 6NoneNonePassed
control 7[1, 1, 1, 1, 1, 1, 3, 3, 1, 3, 3, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 1, 1, 3, 3, 1, 1, 1, 1, 3, 1, 1, 3, 3, 1, 1][1, 1, 1, 1, 1, 1, 3, 3, 1, 3, 3, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 1, 1, 3, 3, 1, 1, 1, 1, 3, 1, 1, 3, 3, 1, 1]Passed

SHA-256 / 4899218ca38190958eca6eefc0b5eaf12b317ad733feec9227e4e8f35f5ab6ff

Verification & scope

A deterministic bounded teaching model with a stipulated contract; it makes no claim of conformance to any published specification. 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:49:45.628720+00:00.

Case digest / c8f30b0d3752a5b3a4c3cc10f28776df617bd4df7314881f399dbdec8cee36f0