{"abstract":"Numeric pairs 00 and 01 collide with the pad and upper-shift range and serial numbers decode wrongly.","category":"Barcode symbology encoding","checks":8,"contract":"Data Matrix ASCII encodation into `capacity` data codewords: two consecutive ASCII digits become 130 + their value; ASCII 0..127 becomes ord + 1; 128..255 becomes Upper Shift 235 then ord - 127; higher code points are unencodable. Too many codewords -> overflow. Padding: the first pad is 129; each later pad at 1-based position p is 129 + ((149 * p) mod 253) + 1, minus 254 if above 254.","evaluation_group":"w2-barcode-symbology-encoding-datamatrix-ascii","failed_approach":"value + 1 encodes the pair as a single ASCII character.","family":"w2-barcode-symbology-encoding-datamatrix-ascii-digit-pair","id":"FA-79786","implementations":{"attempt":{"sha256":"5024caaba8d55071cb192ffa85ef9dad4b0c5c93688d8336a33fe11191d52814","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(text, capacity):\n    cw = []\n    i = 0\n    while i < len(text):\n        c = text[i]\n        if c in '0123456789' and i + 1 < len(text) and text[i + 1] in '0123456789':\n            cw.append(int(text[i:i + 2]) + 1)\n            i += 2\n            continue\n        o = ord(c)\n        if o > 255:\n            return {'error': 'unencodable'}\n        if o > 127:\n            cw += [235, o - 127]\n        else:\n            cw.append(o + 1)\n        i += 1\n    if len(cw) > capacity:\n        return {'error': 'overflow'}\n    if len(cw) < capacity:\n        cw.append(129)\n    while len(cw) < capacity:\n        p = len(cw) + 1\n        v = 129 + ((149 * p) % 253) + 1\n        if v > 254:\n            v -= 254\n        cw.append(v)\n    return cw\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[[('99x', 5), [229, 121, 129, 220, 115]], [('ÿÿ\\x8012', 7), [235, 128, 235, 128, 235, 1, 142]], [('', 6), [129, 175, 70, 220, 115, 11]], [('', 11), [129, 175, 70, 220, 115, 11, 161, 56, 206, 101, 251]], [('\\x80', 4), [235, 1, 129, 220]], [('0AB12', 3), {'error': 'overflow'}], [('ABé', 1), {'error': 'overflow'}], [('é99AB0', 10), [235, 106, 229, 66, 67, 49, 129, 56, 206, 101]]], [[(' x99x', 10), [33, 121, 229, 121, 129, 11, 161, 56, 206, 101]], [('55xé', 9), [185, 121, 235, 106, 129, 11, 161, 56, 206]], [('ABxx', 2), {'error': 'overflow'}], [(' AB', 4), [33, 66, 67, 129]], [('0', 9), [49, 129, 70, 220, 115, 11, 161, 56, 206]], [('', 2), [129, 175]], [('0', 4), [49, 129, 70, 220]], [('AB\\x8012', 10), [66, 67, 235, 1, 142, 129, 161, 56, 206, 101]]], [[('99ÿé', 7), [229, 235, 128, 235, 106, 129, 161]], [('12', 3), [142, 129, 70]], [('é€5', 6), {'error': 'unencodable'}], [('éé', 3), {'error': 'overflow'}], [('é\\x80\\x80', 3), {'error': 'overflow'}], [('', 4), [129, 175, 70, 220]], [('', 5), [129, 175, 70, 220, 115]], [('ÿé12', 9), [235, 128, 235, 106, 142, 129, 161, 56, 206]]], [[('120ÿ', 6), [142, 49, 235, 128, 129, 11]], [('55', 8), [185, 129, 70, 220, 115, 11, 161, 56]], [('', 6), [129, 175, 70, 220, 115, 11]], [('\\x8012x5', 1), {'error': 'overflow'}], [(' €ÿ\\x80', 5), {'error': 'unencodable'}], [('', 11), [129, 175, 70, 220, 115, 11, 161, 56, 206, 101, 251]], [('0xÿ', 8), [49, 121, 235, 128, 129, 11, 161, 56]], [('99', 3), [229, 129, 70]]], [[('é99\\x805', 9), [235, 106, 229, 235, 1, 54, 129, 56, 206]], [('12\\x80', 6), [142, 235, 1, 129, 115, 11]], [('5', 2), [54, 129]], [('990', 1), {'error': 'overflow'}], [('599AB€', 8), {'error': 'unencodable'}], [('', 7), [129, 175, 70, 220, 115, 11, 161]], [('xÿ ', 8), [121, 235, 128, 33, 129, 11, 161, 56]], [('995', 11), [229, 54, 129, 220, 115, 11, 161, 56, 206, 101, 251]]]]\nlabels = [\"regression: digit pair codeword\", \"repair trap\", \"combined fault\", \"control\", \"control\", \"boundary\", \"boundary\", \"control\"]\nfor i, (args, expected) in enumerate(fixtures[N-1]):\n    check(\"%s %d\" % (labels[i % len(labels)], i), solve(*args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"broken":{"sha256":"f6d9a2b05f57677c0c5f778b38ea8be2ec576222630ac1a53092e709cc55e87a","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(text, capacity):\n    cw = []\n    i = 0\n    while i < len(text):\n        c = text[i]\n        if c in '0123456789' and i + 1 < len(text) and text[i + 1] in '0123456789':\n            cw.append(128 + int(text[i:i + 2]))\n            i += 2\n            continue\n        o = ord(c)\n        if o > 255:\n            return {'error': 'unencodable'}\n        if o > 127:\n            cw += [235, o - 127]\n        else:\n            cw.append(o + 1)\n        i += 1\n    if len(cw) > capacity:\n        return {'error': 'overflow'}\n    if len(cw) < capacity:\n        cw.append(129)\n    while len(cw) < capacity:\n        p = len(cw) + 1\n        v = 129 + ((149 * p) % 253) + 1\n        if v > 254:\n            v -= 254\n        cw.append(v)\n    return cw\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[[('99x', 5), [229, 121, 129, 220, 115]], [('ÿÿ\\x8012', 7), [235, 128, 235, 128, 235, 1, 142]], [('', 6), [129, 175, 70, 220, 115, 11]], [('', 11), [129, 175, 70, 220, 115, 11, 161, 56, 206, 101, 251]], [('\\x80', 4), [235, 1, 129, 220]], [('0AB12', 3), {'error': 'overflow'}], [('ABé', 1), {'error': 'overflow'}], [('é99AB0', 10), [235, 106, 229, 66, 67, 49, 129, 56, 206, 101]]], [[(' x99x', 10), [33, 121, 229, 121, 129, 11, 161, 56, 206, 101]], [('55xé', 9), [185, 121, 235, 106, 129, 11, 161, 56, 206]], [('ABxx', 2), {'error': 'overflow'}], [(' AB', 4), [33, 66, 67, 129]], [('0', 9), [49, 129, 70, 220, 115, 11, 161, 56, 206]], [('', 2), [129, 175]], [('0', 4), [49, 129, 70, 220]], [('AB\\x8012', 10), [66, 67, 235, 1, 142, 129, 161, 56, 206, 101]]], [[('99ÿé', 7), [229, 235, 128, 235, 106, 129, 161]], [('12', 3), [142, 129, 70]], [('é€5', 6), {'error': 'unencodable'}], [('éé', 3), {'error': 'overflow'}], [('é\\x80\\x80', 3), {'error': 'overflow'}], [('', 4), [129, 175, 70, 220]], [('', 5), [129, 175, 70, 220, 115]], [('ÿé12', 9), [235, 128, 235, 106, 142, 129, 161, 56, 206]]], [[('120ÿ', 6), [142, 49, 235, 128, 129, 11]], [('55', 8), [185, 129, 70, 220, 115, 11, 161, 56]], [('', 6), [129, 175, 70, 220, 115, 11]], [('\\x8012x5', 1), {'error': 'overflow'}], [(' €ÿ\\x80', 5), {'error': 'unencodable'}], [('', 11), [129, 175, 70, 220, 115, 11, 161, 56, 206, 101, 251]], [('0xÿ', 8), [49, 121, 235, 128, 129, 11, 161, 56]], [('99', 3), [229, 129, 70]]], [[('é99\\x805', 9), [235, 106, 229, 235, 1, 54, 129, 56, 206]], [('12\\x80', 6), [142, 235, 1, 129, 115, 11]], [('5', 2), [54, 129]], [('990', 1), {'error': 'overflow'}], [('599AB€', 8), {'error': 'unencodable'}], [('', 7), [129, 175, 70, 220, 115, 11, 161]], [('xÿ ', 8), [121, 235, 128, 33, 129, 11, 161, 56]], [('995', 11), [229, 54, 129, 220, 115, 11, 161, 56, 206, 101, 251]]]]\nlabels = [\"regression: digit pair codeword\", \"repair trap\", \"combined fault\", \"control\", \"control\", \"boundary\", \"boundary\", \"control\"]\nfor i, (args, expected) in enumerate(fixtures[N-1]):\n    check(\"%s %d\" % (labels[i % len(labels)], i), solve(*args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"fixed":{"sha256":"4fe8830102ab2af1c92d2dba1d2866e3e4332f1183dbfc5555ec23b4518a751e","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(text, capacity):\n    cw = []\n    i = 0\n    while i < len(text):\n        c = text[i]\n        if c in '0123456789' and i + 1 < len(text) and text[i + 1] in '0123456789':\n            cw.append(130 + int(text[i:i + 2]))\n            i += 2\n            continue\n        o = ord(c)\n        if o > 255:\n            return {'error': 'unencodable'}\n        if o > 127:\n            cw += [235, o - 127]\n        else:\n            cw.append(o + 1)\n        i += 1\n    if len(cw) > capacity:\n        return {'error': 'overflow'}\n    if len(cw) < capacity:\n        cw.append(129)\n    while len(cw) < capacity:\n        p = len(cw) + 1\n        v = 129 + ((149 * p) % 253) + 1\n        if v > 254:\n            v -= 254\n        cw.append(v)\n    return cw\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[[('99x', 5), [229, 121, 129, 220, 115]], [('ÿÿ\\x8012', 7), [235, 128, 235, 128, 235, 1, 142]], [('', 6), [129, 175, 70, 220, 115, 11]], [('', 11), [129, 175, 70, 220, 115, 11, 161, 56, 206, 101, 251]], [('\\x80', 4), [235, 1, 129, 220]], [('0AB12', 3), {'error': 'overflow'}], [('ABé', 1), {'error': 'overflow'}], [('é99AB0', 10), [235, 106, 229, 66, 67, 49, 129, 56, 206, 101]]], [[(' x99x', 10), [33, 121, 229, 121, 129, 11, 161, 56, 206, 101]], [('55xé', 9), [185, 121, 235, 106, 129, 11, 161, 56, 206]], [('ABxx', 2), {'error': 'overflow'}], [(' AB', 4), [33, 66, 67, 129]], [('0', 9), [49, 129, 70, 220, 115, 11, 161, 56, 206]], [('', 2), [129, 175]], [('0', 4), [49, 129, 70, 220]], [('AB\\x8012', 10), [66, 67, 235, 1, 142, 129, 161, 56, 206, 101]]], [[('99ÿé', 7), [229, 235, 128, 235, 106, 129, 161]], [('12', 3), [142, 129, 70]], [('é€5', 6), {'error': 'unencodable'}], [('éé', 3), {'error': 'overflow'}], [('é\\x80\\x80', 3), {'error': 'overflow'}], [('', 4), [129, 175, 70, 220]], [('', 5), [129, 175, 70, 220, 115]], [('ÿé12', 9), [235, 128, 235, 106, 142, 129, 161, 56, 206]]], [[('120ÿ', 6), [142, 49, 235, 128, 129, 11]], [('55', 8), [185, 129, 70, 220, 115, 11, 161, 56]], [('', 6), [129, 175, 70, 220, 115, 11]], [('\\x8012x5', 1), {'error': 'overflow'}], [(' €ÿ\\x80', 5), {'error': 'unencodable'}], [('', 11), [129, 175, 70, 220, 115, 11, 161, 56, 206, 101, 251]], [('0xÿ', 8), [49, 121, 235, 128, 129, 11, 161, 56]], [('99', 3), [229, 129, 70]]], [[('é99\\x805', 9), [235, 106, 229, 235, 1, 54, 129, 56, 206]], [('12\\x80', 6), [142, 235, 1, 129, 115, 11]], [('5', 2), [54, 129]], [('990', 1), {'error': 'overflow'}], [('599AB€', 8), {'error': 'unencodable'}], [('', 7), [129, 175, 70, 220, 115, 11, 161]], [('xÿ ', 8), [121, 235, 128, 33, 129, 11, 161, 56]], [('995', 11), [229, 54, 129, 220, 115, 11, 161, 56, 206, 101, 251]]]]\nlabels = [\"regression: digit pair codeword\", \"repair trap\", \"combined fault\", \"control\", \"control\", \"boundary\", \"boundary\", \"control\"]\nfor i, (args, expected) in enumerate(fixtures[N-1]):\n    check(\"%s %d\" % (labels[i % len(labels)], i), solve(*args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"}},"limitations":"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.","method":"Deterministic executable model with adversarial boundary fixtures.","provenance":{"created_by":"Failure Map","dependencies":"Python standard library","family":"w2-barcode-symbology-encoding-datamatrix-ascii-digit-pair","generated_at":"2026-09-29T14:49:47.649672+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"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.","repair":"Encode a digit pair as 130 + its two-digit value.","root_cause":"Digit pairs are encoded as 128 + value instead of 130 + value.","sha256":"5cc373b6979954bbd04e611cf080bcefffd0fbbca22399d4de3f55badded450d","title":"Data Matrix digit pairs are offset by 128 · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":38.642,"exit_code":1,"observations":[{"actual":[100,121,129,220,115],"check":"regression: digit pair codeword 0","expected":[229,121,129,220,115],"passed":false},{"actual":[235,128,235,128,235,1,13],"check":"repair trap 1","expected":[235,128,235,128,235,1,142],"passed":false},{"actual":[129,175,70,220,115,11],"check":"combined fault 2","expected":[129,175,70,220,115,11],"passed":true},{"actual":[129,175,70,220,115,11,161,56,206,101,251],"check":"control 3","expected":[129,175,70,220,115,11,161,56,206,101,251],"passed":true},{"actual":[235,1,129,220],"check":"control 4","expected":[235,1,129,220],"passed":true},{"actual":{"error":"overflow"},"check":"boundary 5","expected":{"error":"overflow"},"passed":true},{"actual":{"error":"overflow"},"check":"boundary 6","expected":{"error":"overflow"},"passed":true},{"actual":[235,106,100,66,67,49,129,56,206,101],"check":"control 7","expected":[235,106,229,66,67,49,129,56,206,101],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: digit pair codeword 0\", \"actual\": [100, 121, 129, 220, 115], \"expected\": [229, 121, 129, 220, 115], \"passed\": false}, {\"check\": \"repair trap 1\", \"actual\": [235, 128, 235, 128, 235, 1, 13], \"expected\": [235, 128, 235, 128, 235, 1, 142], \"passed\": false}, {\"check\": \"combined fault 2\", \"actual\": [129, 175, 70, 220, 115, 11], \"expected\": [129, 175, 70, 220, 115, 11], \"passed\": true}, {\"check\": \"control 3\", \"actual\": [129, 175, 70, 220, 115, 11, 161, 56, 206, 101, 251], \"expected\": [129, 175, 70, 220, 115, 11, 161, 56, 206, 101, 251], \"passed\": true}, {\"check\": \"control 4\", \"actual\": [235, 1, 129, 220], \"expected\": [235, 1, 129, 220], \"passed\": true}, {\"check\": \"boundary 5\", \"actual\": {\"error\": \"overflow\"}, \"expected\": {\"error\": \"overflow\"}, \"passed\": true}, {\"check\": \"boundary 6\", \"actual\": {\"error\": \"overflow\"}, \"expected\": {\"error\": \"overflow\"}, \"passed\": true}, {\"check\": \"control 7\", \"actual\": [235, 106, 100, 66, 67, 49, 129, 56, 206, 101], \"expected\": [235, 106, 229, 66, 67, 49, 129, 56, 206, 101], \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":38.076,"exit_code":1,"observations":[{"actual":[227,121,129,220,115],"check":"regression: digit pair codeword 0","expected":[229,121,129,220,115],"passed":false},{"actual":[235,128,235,128,235,1,140],"check":"repair trap 1","expected":[235,128,235,128,235,1,142],"passed":false},{"actual":[129,175,70,220,115,11],"check":"combined fault 2","expected":[129,175,70,220,115,11],"passed":true},{"actual":[129,175,70,220,115,11,161,56,206,101,251],"check":"control 3","expected":[129,175,70,220,115,11,161,56,206,101,251],"passed":true},{"actual":[235,1,129,220],"check":"control 4","expected":[235,1,129,220],"passed":true},{"actual":{"error":"overflow"},"check":"boundary 5","expected":{"error":"overflow"},"passed":true},{"actual":{"error":"overflow"},"check":"boundary 6","expected":{"error":"overflow"},"passed":true},{"actual":[235,106,227,66,67,49,129,56,206,101],"check":"control 7","expected":[235,106,229,66,67,49,129,56,206,101],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: digit pair codeword 0\", \"actual\": [227, 121, 129, 220, 115], \"expected\": [229, 121, 129, 220, 115], \"passed\": false}, {\"check\": \"repair trap 1\", \"actual\": [235, 128, 235, 128, 235, 1, 140], \"expected\": [235, 128, 235, 128, 235, 1, 142], \"passed\": false}, {\"check\": \"combined fault 2\", \"actual\": [129, 175, 70, 220, 115, 11], \"expected\": [129, 175, 70, 220, 115, 11], \"passed\": true}, {\"check\": \"control 3\", \"actual\": [129, 175, 70, 220, 115, 11, 161, 56, 206, 101, 251], \"expected\": [129, 175, 70, 220, 115, 11, 161, 56, 206, 101, 251], \"passed\": true}, {\"check\": \"control 4\", \"actual\": [235, 1, 129, 220], \"expected\": [235, 1, 129, 220], \"passed\": true}, {\"check\": \"boundary 5\", \"actual\": {\"error\": \"overflow\"}, \"expected\": {\"error\": \"overflow\"}, \"passed\": true}, {\"check\": \"boundary 6\", \"actual\": {\"error\": \"overflow\"}, \"expected\": {\"error\": \"overflow\"}, \"passed\": true}, {\"check\": \"control 7\", \"actual\": [235, 106, 227, 66, 67, 49, 129, 56, 206, 101], \"expected\": [235, 106, 229, 66, 67, 49, 129, 56, 206, 101], \"passed\": false}], \"passed\": false}\n"},"fixed":{"elapsed_ms":39.268,"exit_code":0,"observations":[{"actual":[229,121,129,220,115],"check":"regression: digit pair codeword 0","expected":[229,121,129,220,115],"passed":true},{"actual":[235,128,235,128,235,1,142],"check":"repair trap 1","expected":[235,128,235,128,235,1,142],"passed":true},{"actual":[129,175,70,220,115,11],"check":"combined fault 2","expected":[129,175,70,220,115,11],"passed":true},{"actual":[129,175,70,220,115,11,161,56,206,101,251],"check":"control 3","expected":[129,175,70,220,115,11,161,56,206,101,251],"passed":true},{"actual":[235,1,129,220],"check":"control 4","expected":[235,1,129,220],"passed":true},{"actual":{"error":"overflow"},"check":"boundary 5","expected":{"error":"overflow"},"passed":true},{"actual":{"error":"overflow"},"check":"boundary 6","expected":{"error":"overflow"},"passed":true},{"actual":[235,106,229,66,67,49,129,56,206,101],"check":"control 7","expected":[235,106,229,66,67,49,129,56,206,101],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: digit pair codeword 0\", \"actual\": [229, 121, 129, 220, 115], \"expected\": [229, 121, 129, 220, 115], \"passed\": true}, {\"check\": \"repair trap 1\", \"actual\": [235, 128, 235, 128, 235, 1, 142], \"expected\": [235, 128, 235, 128, 235, 1, 142], \"passed\": true}, {\"check\": \"combined fault 2\", \"actual\": [129, 175, 70, 220, 115, 11], \"expected\": [129, 175, 70, 220, 115, 11], \"passed\": true}, {\"check\": \"control 3\", \"actual\": [129, 175, 70, 220, 115, 11, 161, 56, 206, 101, 251], \"expected\": [129, 175, 70, 220, 115, 11, 161, 56, 206, 101, 251], \"passed\": true}, {\"check\": \"control 4\", \"actual\": [235, 1, 129, 220], \"expected\": [235, 1, 129, 220], \"passed\": true}, {\"check\": \"boundary 5\", \"actual\": {\"error\": \"overflow\"}, \"expected\": {\"error\": \"overflow\"}, \"passed\": true}, {\"check\": \"boundary 6\", \"actual\": {\"error\": \"overflow\"}, \"expected\": {\"error\": \"overflow\"}, \"passed\": true}, {\"check\": \"control 7\", \"actual\": [235, 106, 229, 66, 67, 49, 129, 56, 206, 101], \"expected\": [235, 106, 229, 66, 67, 49, 129, 56, 206, 101], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}