FAILURE MAP
← Case archive

FA-79621 / Barcode symbology encoding / Open access

Over-long count field is accepted · case 01

A missing separator after AI 30 merges the next field into the count without an error.

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

ROOT CAUSE

Variable fields have no maximum length check.

VERIFIED REPAIR

Enforce each AI's own maximum length.

Unsuccessful approach: A global maximum of 20 is wrong for AIs 30, 37 and 400.

Case contract

Parse scanner output of a GS1-128 symbol: it must start with the symbology identifier "]C1"; FNC1 separators arrive as GS (0x1D) and redundant separators are skipped. AIs are recognised by the shortest matching prefix among the predefined fixed-length AIs (00:18, 01/02:14, 11/13/15/17:6, 3103:6) and variable AIs (10/21 max 20, 30/37 max 8, 400 max 30). A fixed field must be complete and contain no GS; a variable field runs to the next GS or the end and must have 1..max characters. Return [[ai, value], ...] or an error.

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(s):
    fixed_len = {'00': 18, '01': 14, '02': 14, '11': 6, '13': 6, '15': 6, '17': 6, '3103': 6}
    var_max = {'10': 20, '21': 20, '30': 8, '37': 8, '400': 30}
    if not s.startswith(']C1'):
        return {'error': 'not-gs1'}
    i = 3
    out = []
    while i < len(s):
        if s[i] == '\x1d':
            i += 1
            continue
        ai = None
        for L in (2, 3, 4):
            if s[i:i + L] in fixed_len or s[i:i + L] in var_max:
                ai = s[i:i + L]
                break
        if ai is None:
            return {'error': 'unknown-ai', 'at': i}
        i += len(ai)
        if ai in fixed_len:
            n = fixed_len[ai]
            val = s[i:i + n]
            if len(val) != n or '\x1d' in val:
                return {'error': 'short', 'ai': ai}
            i += n
        else:
            j = s.find('\x1d', i)
            if j == -1:
                j = len(s)
            val = s[i:j]
            if len(val) < 1:
                return {'error': 'length', 'ai': ai}
            i = j
        out.append([ai, val])
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[']C137244121375\x1d21\x1d400XAXCC9C/XXB/1\x1d10/CA', {'error': 'length', 'ai': '37'}], [']C121/9A9-BBAXB9/1CX11A\x1d370168\x1d400XXXXACBAC1A99XX\x1d37958407873', {'error': 'length', 'ai': '37'}], [']C011400783', {'error': 'not-gs1'}], [']C03019\x1d10B9', {'error': 'not-gs1'}], [']C117140648306\x1d0141294680397442\x1d', [['17', '140648'], ['30', '6'], ['01', '41294680397442']]], [']d221B-1BA9-B\x1d219X91//1X9-/1A-C\x1d10BBCB1-9/-/9//-/BC1-A-X\x1d21/ABXAX9C-CC/-\x1d', {'error': 'not-gs1'}], [']C0\x1d3028612956', {'error': 'not-gs1'}], [']C121AC1CXBXC//BB1BCB\x1d310327866137162541688\x1d371', {'error': 'length', 'ai': '37'}]], [[']C12191XXAXB/XX-B91A9-1X1A\x1d10CBAB1-B', {'error': 'length', 'ai': '21'}], [']C13103253004017432790047008137876520261\x1d', {'error': 'length', 'ai': '37'}], [']C13076330559\x1d017350710908563810CX/1/1X//XX//AXCBA-\x1d30467914952', {'error': 'length', 'ai': '30'}], [']C04009\x1d10X-CXA1/X\x1d310311958730', {'error': 'not-gs1'}], [']C10044603095506351280311060380310300579483495402726338', {'error': 'unknown-ai', 'at': 41}], [']d211029205\x1d01139908024073283027281846\x1d10-X9C\x1d', {'error': 'not-gs1'}], [']C1310361473240011XBBC-1-CX1B-\x1d371255\x1d219X9B-C/', [['3103', '614732'], ['400', '11XBBC-1-CX1B-'], ['37', '1255'], ['21', '9X9B-C/']]], [']C137791221293\x1d400A11/1/ACC///CXC1CA/X-\x1d400A-/\x1d37768579', {'error': 'length', 'ai': '37'}]], [[']C121CX1CBA11//99A\x1d018138092042504821XCAA9BX9C91BXBX--B1B-\x1d3103153253', {'error': 'length', 'ai': '21'}], [']C1370404\x1d0169587500743493400C-B1-BAAC9AXXCXAA/B1X\x1d', [['37', '0404'], ['01', '69587500743493'], ['400', 'C-B1-BAAC9AXXCXAA/B1X']]], [']C137364\x1d37951579975\x1d11440863\x1d37038364119\x1d', {'error': 'length', 'ai': '37'}], [']C111362276', [['11', '362276']]], [']C121C-\x1d3103238166', [['21', 'C-'], ['3103', '238166']]], [']C121-/1-X-9B\x1d17420369015026678280984317842704\x1d', [['21', '-/1-X-9B'], ['17', '420369'], ['01', '50266782809843'], ['17', '842704']]], [']C111990558117862\x1d10X-11\x1d0141668383672539', {'error': 'short', 'ai': '11'}], [']C10011511945802272876110ABXB-BA1-B/1X1-BBCXCX1\x1d0143358957494055', {'error': 'length', 'ai': '10'}]], [[']C10153009609031376219XBB-1C-1A9//\x1d1781184810CB9CX-AX--B9ABCCBB9X-C\x1d', {'error': 'length', 'ai': '10'}], [']C121AB/-C9A99/\x1d305405245\x1d00419461779691996360400-1XBCX9CCA9/A-9-1C-11C\x1d', [['21', 'AB/-C9A99/'], ['30', '5405245'], ['00', '419461779691996360'], ['400', '-1XBCX9CCA9/A-9-1C-11C']]], [']C111141665\x1d37247204674\x1d37790824985\x1d00445616335895473473', {'error': 'length', 'ai': '37'}], [']C1211\x1d400/B-\x1d3067920\x1d', [['21', '1'], ['400', '/B-'], ['30', '67920']]], [']C1211CXX-B1B9XXX-/', [['21', '1CXX-B1B9XXX-/']]], [']C1308705431', [['30', '8705431']]], [']C010/ACC1C1C/9\x1d109\x1d00997634519263772689', {'error': 'not-gs1'}], [']C1211\x1d37789365790\x1d30311652\x1d', {'error': 'length', 'ai': '37'}]], [[']C13066\x1d37793432856\x1d3097076472', {'error': 'length', 'ai': '37'}], [']C137505172476\x1d3103210156', {'error': 'length', 'ai': '37'}], [']C137335719723\x1d', {'error': 'length', 'ai': '37'}], [']C037218164131\x1d017878870121363103882288', {'error': 'not-gs1'}], [']C10109147699409412219X9/BACAA-C1/9X19-B\x1d21/\x1d17759960', [['01', '09147699409412'], ['21', '9X9/BACAA-C1/9X19-B'], ['21', '/'], ['17', '759960']]], [']C01109918000653062932206451941', {'error': 'not-gs1'}], [']C017335622\x1d10/A/1X9\x1d1019911-1X/1B1/C-B\x1d400AX/C', {'error': 'not-gs1'}], [']C121-X-BCCC/AB/11/XX-C-B1A\x1d310310809321XX9-CB/X/XAB1XXC', {'error': 'length', 'ai': '21'}]]]
labels = ["regression: variable field maximum", "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: variable field maximum 0{'ai': '21', 'error': 'length'}{'ai': '37', 'error': 'length'}Failed
repair trap 1[['21', '/9A9-BBAXB9/1CX11A'], ['37', '0168'], ['400', 'XXXXACBAC1A99XX'], ['37', '958407873']]{'ai': '37', 'error': 'length'}Failed
combined fault 2{'error': 'not-gs1'}{'error': 'not-gs1'}Passed
control 3{'error': 'not-gs1'}{'error': 'not-gs1'}Passed
control 4[['17', '140648'], ['30', '6'], ['01', '41294680397442']][['17', '140648'], ['30', '6'], ['01', '41294680397442']]Passed
boundary 5{'error': 'not-gs1'}{'error': 'not-gs1'}Passed
boundary 6{'error': 'not-gs1'}{'error': 'not-gs1'}Passed
control 7[['21', 'AC1CXBXC//BB1BCB'], ['3103', '278661'], ['37', '162541688'], ['37', '1']]{'ai': '37', 'error': 'length'}Failed

SHA-256 / 360dc706483187442bcdc529484e1051ade994937af2dd6b15af950d8adc9618

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(s):
    fixed_len = {'00': 18, '01': 14, '02': 14, '11': 6, '13': 6, '15': 6, '17': 6, '3103': 6}
    var_max = {'10': 20, '21': 20, '30': 8, '37': 8, '400': 30}
    if not s.startswith(']C1'):
        return {'error': 'not-gs1'}
    i = 3
    out = []
    while i < len(s):
        if s[i] == '\x1d':
            i += 1
            continue
        ai = None
        for L in (2, 3, 4):
            if s[i:i + L] in fixed_len or s[i:i + L] in var_max:
                ai = s[i:i + L]
                break
        if ai is None:
            return {'error': 'unknown-ai', 'at': i}
        i += len(ai)
        if ai in fixed_len:
            n = fixed_len[ai]
            val = s[i:i + n]
            if len(val) != n or '\x1d' in val:
                return {'error': 'short', 'ai': ai}
            i += n
        else:
            j = s.find('\x1d', i)
            if j == -1:
                j = len(s)
            val = s[i:j]
            if not 1 <= len(val) <= 20:
                return {'error': 'length', 'ai': ai}
            i = j
        out.append([ai, val])
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[']C137244121375\x1d21\x1d400XAXCC9C/XXB/1\x1d10/CA', {'error': 'length', 'ai': '37'}], [']C121/9A9-BBAXB9/1CX11A\x1d370168\x1d400XXXXACBAC1A99XX\x1d37958407873', {'error': 'length', 'ai': '37'}], [']C011400783', {'error': 'not-gs1'}], [']C03019\x1d10B9', {'error': 'not-gs1'}], [']C117140648306\x1d0141294680397442\x1d', [['17', '140648'], ['30', '6'], ['01', '41294680397442']]], [']d221B-1BA9-B\x1d219X91//1X9-/1A-C\x1d10BBCB1-9/-/9//-/BC1-A-X\x1d21/ABXAX9C-CC/-\x1d', {'error': 'not-gs1'}], [']C0\x1d3028612956', {'error': 'not-gs1'}], [']C121AC1CXBXC//BB1BCB\x1d310327866137162541688\x1d371', {'error': 'length', 'ai': '37'}]], [[']C12191XXAXB/XX-B91A9-1X1A\x1d10CBAB1-B', {'error': 'length', 'ai': '21'}], [']C13103253004017432790047008137876520261\x1d', {'error': 'length', 'ai': '37'}], [']C13076330559\x1d017350710908563810CX/1/1X//XX//AXCBA-\x1d30467914952', {'error': 'length', 'ai': '30'}], [']C04009\x1d10X-CXA1/X\x1d310311958730', {'error': 'not-gs1'}], [']C10044603095506351280311060380310300579483495402726338', {'error': 'unknown-ai', 'at': 41}], [']d211029205\x1d01139908024073283027281846\x1d10-X9C\x1d', {'error': 'not-gs1'}], [']C1310361473240011XBBC-1-CX1B-\x1d371255\x1d219X9B-C/', [['3103', '614732'], ['400', '11XBBC-1-CX1B-'], ['37', '1255'], ['21', '9X9B-C/']]], [']C137791221293\x1d400A11/1/ACC///CXC1CA/X-\x1d400A-/\x1d37768579', {'error': 'length', 'ai': '37'}]], [[']C121CX1CBA11//99A\x1d018138092042504821XCAA9BX9C91BXBX--B1B-\x1d3103153253', {'error': 'length', 'ai': '21'}], [']C1370404\x1d0169587500743493400C-B1-BAAC9AXXCXAA/B1X\x1d', [['37', '0404'], ['01', '69587500743493'], ['400', 'C-B1-BAAC9AXXCXAA/B1X']]], [']C137364\x1d37951579975\x1d11440863\x1d37038364119\x1d', {'error': 'length', 'ai': '37'}], [']C111362276', [['11', '362276']]], [']C121C-\x1d3103238166', [['21', 'C-'], ['3103', '238166']]], [']C121-/1-X-9B\x1d17420369015026678280984317842704\x1d', [['21', '-/1-X-9B'], ['17', '420369'], ['01', '50266782809843'], ['17', '842704']]], [']C111990558117862\x1d10X-11\x1d0141668383672539', {'error': 'short', 'ai': '11'}], [']C10011511945802272876110ABXB-BA1-B/1X1-BBCXCX1\x1d0143358957494055', {'error': 'length', 'ai': '10'}]], [[']C10153009609031376219XBB-1C-1A9//\x1d1781184810CB9CX-AX--B9ABCCBB9X-C\x1d', {'error': 'length', 'ai': '10'}], [']C121AB/-C9A99/\x1d305405245\x1d00419461779691996360400-1XBCX9CCA9/A-9-1C-11C\x1d', [['21', 'AB/-C9A99/'], ['30', '5405245'], ['00', '419461779691996360'], ['400', '-1XBCX9CCA9/A-9-1C-11C']]], [']C111141665\x1d37247204674\x1d37790824985\x1d00445616335895473473', {'error': 'length', 'ai': '37'}], [']C1211\x1d400/B-\x1d3067920\x1d', [['21', '1'], ['400', '/B-'], ['30', '67920']]], [']C1211CXX-B1B9XXX-/', [['21', '1CXX-B1B9XXX-/']]], [']C1308705431', [['30', '8705431']]], [']C010/ACC1C1C/9\x1d109\x1d00997634519263772689', {'error': 'not-gs1'}], [']C1211\x1d37789365790\x1d30311652\x1d', {'error': 'length', 'ai': '37'}]], [[']C13066\x1d37793432856\x1d3097076472', {'error': 'length', 'ai': '37'}], [']C137505172476\x1d3103210156', {'error': 'length', 'ai': '37'}], [']C137335719723\x1d', {'error': 'length', 'ai': '37'}], [']C037218164131\x1d017878870121363103882288', {'error': 'not-gs1'}], [']C10109147699409412219X9/BACAA-C1/9X19-B\x1d21/\x1d17759960', [['01', '09147699409412'], ['21', '9X9/BACAA-C1/9X19-B'], ['21', '/'], ['17', '759960']]], [']C01109918000653062932206451941', {'error': 'not-gs1'}], [']C017335622\x1d10/A/1X9\x1d1019911-1X/1B1/C-B\x1d400AX/C', {'error': 'not-gs1'}], [']C121-X-BCCC/AB/11/XX-C-B1A\x1d310310809321XX9-CB/X/XAB1XXC', {'error': 'length', 'ai': '21'}]]]
labels = ["regression: variable field maximum", "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: variable field maximum 0{'ai': '21', 'error': 'length'}{'ai': '37', 'error': 'length'}Failed
repair trap 1[['21', '/9A9-BBAXB9/1CX11A'], ['37', '0168'], ['400', 'XXXXACBAC1A99XX'], ['37', '958407873']]{'ai': '37', 'error': 'length'}Failed
combined fault 2{'error': 'not-gs1'}{'error': 'not-gs1'}Passed
control 3{'error': 'not-gs1'}{'error': 'not-gs1'}Passed
control 4[['17', '140648'], ['30', '6'], ['01', '41294680397442']][['17', '140648'], ['30', '6'], ['01', '41294680397442']]Passed
boundary 5{'error': 'not-gs1'}{'error': 'not-gs1'}Passed
boundary 6{'error': 'not-gs1'}{'error': 'not-gs1'}Passed
control 7[['21', 'AC1CXBXC//BB1BCB'], ['3103', '278661'], ['37', '162541688'], ['37', '1']]{'ai': '37', 'error': 'length'}Failed

SHA-256 / 7c54bdc18e9031a5115b35b3250b706a19a7d5b4bce335d8872e420c365de52d

3 / The verified repair

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

N = 1
observations = []
def solve(s):
    fixed_len = {'00': 18, '01': 14, '02': 14, '11': 6, '13': 6, '15': 6, '17': 6, '3103': 6}
    var_max = {'10': 20, '21': 20, '30': 8, '37': 8, '400': 30}
    if not s.startswith(']C1'):
        return {'error': 'not-gs1'}
    i = 3
    out = []
    while i < len(s):
        if s[i] == '\x1d':
            i += 1
            continue
        ai = None
        for L in (2, 3, 4):
            if s[i:i + L] in fixed_len or s[i:i + L] in var_max:
                ai = s[i:i + L]
                break
        if ai is None:
            return {'error': 'unknown-ai', 'at': i}
        i += len(ai)
        if ai in fixed_len:
            n = fixed_len[ai]
            val = s[i:i + n]
            if len(val) != n or '\x1d' in val:
                return {'error': 'short', 'ai': ai}
            i += n
        else:
            j = s.find('\x1d', i)
            if j == -1:
                j = len(s)
            val = s[i:j]
            if not 1 <= len(val) <= var_max[ai]:
                return {'error': 'length', 'ai': ai}
            i = j
        out.append([ai, val])
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[']C137244121375\x1d21\x1d400XAXCC9C/XXB/1\x1d10/CA', {'error': 'length', 'ai': '37'}], [']C121/9A9-BBAXB9/1CX11A\x1d370168\x1d400XXXXACBAC1A99XX\x1d37958407873', {'error': 'length', 'ai': '37'}], [']C011400783', {'error': 'not-gs1'}], [']C03019\x1d10B9', {'error': 'not-gs1'}], [']C117140648306\x1d0141294680397442\x1d', [['17', '140648'], ['30', '6'], ['01', '41294680397442']]], [']d221B-1BA9-B\x1d219X91//1X9-/1A-C\x1d10BBCB1-9/-/9//-/BC1-A-X\x1d21/ABXAX9C-CC/-\x1d', {'error': 'not-gs1'}], [']C0\x1d3028612956', {'error': 'not-gs1'}], [']C121AC1CXBXC//BB1BCB\x1d310327866137162541688\x1d371', {'error': 'length', 'ai': '37'}]], [[']C12191XXAXB/XX-B91A9-1X1A\x1d10CBAB1-B', {'error': 'length', 'ai': '21'}], [']C13103253004017432790047008137876520261\x1d', {'error': 'length', 'ai': '37'}], [']C13076330559\x1d017350710908563810CX/1/1X//XX//AXCBA-\x1d30467914952', {'error': 'length', 'ai': '30'}], [']C04009\x1d10X-CXA1/X\x1d310311958730', {'error': 'not-gs1'}], [']C10044603095506351280311060380310300579483495402726338', {'error': 'unknown-ai', 'at': 41}], [']d211029205\x1d01139908024073283027281846\x1d10-X9C\x1d', {'error': 'not-gs1'}], [']C1310361473240011XBBC-1-CX1B-\x1d371255\x1d219X9B-C/', [['3103', '614732'], ['400', '11XBBC-1-CX1B-'], ['37', '1255'], ['21', '9X9B-C/']]], [']C137791221293\x1d400A11/1/ACC///CXC1CA/X-\x1d400A-/\x1d37768579', {'error': 'length', 'ai': '37'}]], [[']C121CX1CBA11//99A\x1d018138092042504821XCAA9BX9C91BXBX--B1B-\x1d3103153253', {'error': 'length', 'ai': '21'}], [']C1370404\x1d0169587500743493400C-B1-BAAC9AXXCXAA/B1X\x1d', [['37', '0404'], ['01', '69587500743493'], ['400', 'C-B1-BAAC9AXXCXAA/B1X']]], [']C137364\x1d37951579975\x1d11440863\x1d37038364119\x1d', {'error': 'length', 'ai': '37'}], [']C111362276', [['11', '362276']]], [']C121C-\x1d3103238166', [['21', 'C-'], ['3103', '238166']]], [']C121-/1-X-9B\x1d17420369015026678280984317842704\x1d', [['21', '-/1-X-9B'], ['17', '420369'], ['01', '50266782809843'], ['17', '842704']]], [']C111990558117862\x1d10X-11\x1d0141668383672539', {'error': 'short', 'ai': '11'}], [']C10011511945802272876110ABXB-BA1-B/1X1-BBCXCX1\x1d0143358957494055', {'error': 'length', 'ai': '10'}]], [[']C10153009609031376219XBB-1C-1A9//\x1d1781184810CB9CX-AX--B9ABCCBB9X-C\x1d', {'error': 'length', 'ai': '10'}], [']C121AB/-C9A99/\x1d305405245\x1d00419461779691996360400-1XBCX9CCA9/A-9-1C-11C\x1d', [['21', 'AB/-C9A99/'], ['30', '5405245'], ['00', '419461779691996360'], ['400', '-1XBCX9CCA9/A-9-1C-11C']]], [']C111141665\x1d37247204674\x1d37790824985\x1d00445616335895473473', {'error': 'length', 'ai': '37'}], [']C1211\x1d400/B-\x1d3067920\x1d', [['21', '1'], ['400', '/B-'], ['30', '67920']]], [']C1211CXX-B1B9XXX-/', [['21', '1CXX-B1B9XXX-/']]], [']C1308705431', [['30', '8705431']]], [']C010/ACC1C1C/9\x1d109\x1d00997634519263772689', {'error': 'not-gs1'}], [']C1211\x1d37789365790\x1d30311652\x1d', {'error': 'length', 'ai': '37'}]], [[']C13066\x1d37793432856\x1d3097076472', {'error': 'length', 'ai': '37'}], [']C137505172476\x1d3103210156', {'error': 'length', 'ai': '37'}], [']C137335719723\x1d', {'error': 'length', 'ai': '37'}], [']C037218164131\x1d017878870121363103882288', {'error': 'not-gs1'}], [']C10109147699409412219X9/BACAA-C1/9X19-B\x1d21/\x1d17759960', [['01', '09147699409412'], ['21', '9X9/BACAA-C1/9X19-B'], ['21', '/'], ['17', '759960']]], [']C01109918000653062932206451941', {'error': 'not-gs1'}], [']C017335622\x1d10/A/1X9\x1d1019911-1X/1B1/C-B\x1d400AX/C', {'error': 'not-gs1'}], [']C121-X-BCCC/AB/11/XX-C-B1A\x1d310310809321XX9-CB/X/XAB1XXC', {'error': 'length', 'ai': '21'}]]]
labels = ["regression: variable field maximum", "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: variable field maximum 0{'ai': '37', 'error': 'length'}{'ai': '37', 'error': 'length'}Passed
repair trap 1{'ai': '37', 'error': 'length'}{'ai': '37', 'error': 'length'}Passed
combined fault 2{'error': 'not-gs1'}{'error': 'not-gs1'}Passed
control 3{'error': 'not-gs1'}{'error': 'not-gs1'}Passed
control 4[['17', '140648'], ['30', '6'], ['01', '41294680397442']][['17', '140648'], ['30', '6'], ['01', '41294680397442']]Passed
boundary 5{'error': 'not-gs1'}{'error': 'not-gs1'}Passed
boundary 6{'error': 'not-gs1'}{'error': 'not-gs1'}Passed
control 7{'ai': '37', 'error': 'length'}{'ai': '37', 'error': 'length'}Passed

SHA-256 / 38ab56dfe9afffdf9ae1a3f407e464cee20c570ee5dec05fdabad5f192a8357d

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

Case digest / 6b3123fb3bd83c60e7299dad89092dcc3144fdd55060273c300104b7e3b38d7e