FAILURE MAP
← Case archive

FA-79811 / Barcode symbology encoding / Open access

Randomised pad wraps by 253 · case 01

Some pad codewords are one higher than the reference encoder produces.

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

ROOT CAUSE

Values above 254 are reduced by 253 instead of 254.

VERIFIED REPAIR

Subtract 254 when the value exceeds 254.

Unsuccessful approach: Wrapping above 255 lets 255 through, which is not a valid pad.

Case 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.

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(text, capacity):
    cw = []
    i = 0
    while i < len(text):
        c = text[i]
        if c in '0123456789' and i + 1 < len(text) and text[i + 1] in '0123456789':
            cw.append(130 + int(text[i:i + 2]))
            i += 2
            continue
        o = ord(c)
        if o > 255:
            return {'error': 'unencodable'}
        if o > 127:
            cw += [235, o - 127]
        else:
            cw.append(o + 1)
        i += 1
    if len(cw) > capacity:
        return {'error': 'overflow'}
    if len(cw) < capacity:
        cw.append(129)
    while len(cw) < capacity:
        p = len(cw) + 1
        v = 129 + ((149 * p) % 253) + 1
        if v > 254:
            v -= 253
        cw.append(v)
    return cw
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[('', 6), [129, 175, 70, 220, 115, 11]], [('é99AB0', 10), [235, 106, 229, 66, 67, 49, 129, 56, 206, 101]], [('\x80', 4), [235, 1, 129, 220]], [('0AB12', 3), {'error': 'overflow'}], [('ABé', 1), {'error': 'overflow'}], [('AB€€', 10), {'error': 'unencodable'}], [('ÿAB', 5), [235, 128, 66, 67, 129]], [('99x', 5), [229, 121, 129, 220, 115]]], [[('0', 9), [49, 129, 70, 220, 115, 11, 161, 56, 206]], [('0 5', 12), [49, 33, 54, 129, 115, 11, 161, 56, 206, 101, 251, 147]], [('ABxx', 2), {'error': 'overflow'}], [(' AB', 4), [33, 66, 67, 129]], [('', 2), [129, 175]], [('x€', 10), {'error': 'unencodable'}], [(' 125', 1), {'error': 'overflow'}], [('0', 4), [49, 129, 70, 220]]], [[('', 4), [129, 175, 70, 220]], [('x', 5), [121, 129, 70, 220, 115]], [('éé', 3), {'error': 'overflow'}], [('é\x80\x80', 3), {'error': 'overflow'}], [('99ÿé', 7), [229, 235, 128, 235, 106, 129, 161]], [('0', 2), [49, 129]], [('99é0', 5), [229, 235, 106, 49, 129]], [('x99AB', 11), [121, 229, 66, 67, 129, 11, 161, 56, 206, 101, 251]]], [[('0xÿ', 8), [49, 121, 235, 128, 129, 11, 161, 56]], [(' 12', 9), [33, 142, 129, 220, 115, 11, 161, 56, 206]], [('\x8012x5', 1), {'error': 'overflow'}], [(' €ÿ\x80', 5), {'error': 'unencodable'}], [('AB€x', 2), {'error': 'unencodable'}], [('€ ', 4), {'error': 'unencodable'}], [('\x80x0', 5), [235, 1, 121, 49, 129]], [('', 6), [129, 175, 70, 220, 115, 11]]], [[('xÿ ', 8), [121, 235, 128, 33, 129, 11, 161, 56]], [('x5AB', 12), [121, 54, 66, 67, 129, 11, 161, 56, 206, 101, 251, 147]], [('990', 1), {'error': 'overflow'}], [('599AB€', 8), {'error': 'unencodable'}], [('\x80€ 0', 8), {'error': 'unencodable'}], [('AB\x805AB', 8), [66, 67, 235, 1, 54, 66, 67, 129]], [('€99', 7), {'error': 'unencodable'}], [('\x80ÿ', 9), [235, 1, 235, 128, 129, 11, 161, 56, 206]]]]
labels = ["regression: randomised pad wraparound", "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: randomised pad wraparound 0[129, 175, 71, 220, 116, 12][129, 175, 70, 220, 115, 11]Failed
repair trap 1[235, 106, 229, 66, 67, 49, 129, 57, 206, 102][235, 106, 229, 66, 67, 49, 129, 56, 206, 101]Failed
combined fault 2[235, 1, 129, 220][235, 1, 129, 220]Passed
control 3{'error': 'overflow'}{'error': 'overflow'}Passed
control 4{'error': 'overflow'}{'error': 'overflow'}Passed
boundary 5{'error': 'unencodable'}{'error': 'unencodable'}Passed
boundary 6[235, 128, 66, 67, 129][235, 128, 66, 67, 129]Passed
control 7[229, 121, 129, 220, 116][229, 121, 129, 220, 115]Failed

SHA-256 / fd0738d7b8410603acbf79c0a02bd7d8cfb1f984d8315a7e34a76c689b6ea5df

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(text, capacity):
    cw = []
    i = 0
    while i < len(text):
        c = text[i]
        if c in '0123456789' and i + 1 < len(text) and text[i + 1] in '0123456789':
            cw.append(130 + int(text[i:i + 2]))
            i += 2
            continue
        o = ord(c)
        if o > 255:
            return {'error': 'unencodable'}
        if o > 127:
            cw += [235, o - 127]
        else:
            cw.append(o + 1)
        i += 1
    if len(cw) > capacity:
        return {'error': 'overflow'}
    if len(cw) < capacity:
        cw.append(129)
    while len(cw) < capacity:
        p = len(cw) + 1
        v = 129 + ((149 * p) % 253) + 1
        if v > 255:
            v -= 255
        cw.append(v)
    return cw
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[('', 6), [129, 175, 70, 220, 115, 11]], [('é99AB0', 10), [235, 106, 229, 66, 67, 49, 129, 56, 206, 101]], [('\x80', 4), [235, 1, 129, 220]], [('0AB12', 3), {'error': 'overflow'}], [('ABé', 1), {'error': 'overflow'}], [('AB€€', 10), {'error': 'unencodable'}], [('ÿAB', 5), [235, 128, 66, 67, 129]], [('99x', 5), [229, 121, 129, 220, 115]]], [[('0', 9), [49, 129, 70, 220, 115, 11, 161, 56, 206]], [('0 5', 12), [49, 33, 54, 129, 115, 11, 161, 56, 206, 101, 251, 147]], [('ABxx', 2), {'error': 'overflow'}], [(' AB', 4), [33, 66, 67, 129]], [('', 2), [129, 175]], [('x€', 10), {'error': 'unencodable'}], [(' 125', 1), {'error': 'overflow'}], [('0', 4), [49, 129, 70, 220]]], [[('', 4), [129, 175, 70, 220]], [('x', 5), [121, 129, 70, 220, 115]], [('éé', 3), {'error': 'overflow'}], [('é\x80\x80', 3), {'error': 'overflow'}], [('99ÿé', 7), [229, 235, 128, 235, 106, 129, 161]], [('0', 2), [49, 129]], [('99é0', 5), [229, 235, 106, 49, 129]], [('x99AB', 11), [121, 229, 66, 67, 129, 11, 161, 56, 206, 101, 251]]], [[('0xÿ', 8), [49, 121, 235, 128, 129, 11, 161, 56]], [(' 12', 9), [33, 142, 129, 220, 115, 11, 161, 56, 206]], [('\x8012x5', 1), {'error': 'overflow'}], [(' €ÿ\x80', 5), {'error': 'unencodable'}], [('AB€x', 2), {'error': 'unencodable'}], [('€ ', 4), {'error': 'unencodable'}], [('\x80x0', 5), [235, 1, 121, 49, 129]], [('', 6), [129, 175, 70, 220, 115, 11]]], [[('xÿ ', 8), [121, 235, 128, 33, 129, 11, 161, 56]], [('x5AB', 12), [121, 54, 66, 67, 129, 11, 161, 56, 206, 101, 251, 147]], [('990', 1), {'error': 'overflow'}], [('599AB€', 8), {'error': 'unencodable'}], [('\x80€ 0', 8), {'error': 'unencodable'}], [('AB\x805AB', 8), [66, 67, 235, 1, 54, 66, 67, 129]], [('€99', 7), {'error': 'unencodable'}], [('\x80ÿ', 9), [235, 1, 235, 128, 129, 11, 161, 56, 206]]]]
labels = ["regression: randomised pad wraparound", "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: randomised pad wraparound 0[129, 175, 69, 220, 114, 10][129, 175, 70, 220, 115, 11]Failed
repair trap 1[235, 106, 229, 66, 67, 49, 129, 55, 206, 100][235, 106, 229, 66, 67, 49, 129, 56, 206, 101]Failed
combined fault 2[235, 1, 129, 220][235, 1, 129, 220]Passed
control 3{'error': 'overflow'}{'error': 'overflow'}Passed
control 4{'error': 'overflow'}{'error': 'overflow'}Passed
boundary 5{'error': 'unencodable'}{'error': 'unencodable'}Passed
boundary 6[235, 128, 66, 67, 129][235, 128, 66, 67, 129]Passed
control 7[229, 121, 129, 220, 114][229, 121, 129, 220, 115]Failed

SHA-256 / 2e2994c88a5c54ebf33464d4b519fc0ac78d5984b3bf1b6f4a7c7e0aac1ffeeb

3 / The verified repair

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

N = 1
observations = []
def solve(text, capacity):
    cw = []
    i = 0
    while i < len(text):
        c = text[i]
        if c in '0123456789' and i + 1 < len(text) and text[i + 1] in '0123456789':
            cw.append(130 + int(text[i:i + 2]))
            i += 2
            continue
        o = ord(c)
        if o > 255:
            return {'error': 'unencodable'}
        if o > 127:
            cw += [235, o - 127]
        else:
            cw.append(o + 1)
        i += 1
    if len(cw) > capacity:
        return {'error': 'overflow'}
    if len(cw) < capacity:
        cw.append(129)
    while len(cw) < capacity:
        p = len(cw) + 1
        v = 129 + ((149 * p) % 253) + 1
        if v > 254:
            v -= 254
        cw.append(v)
    return cw
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[('', 6), [129, 175, 70, 220, 115, 11]], [('é99AB0', 10), [235, 106, 229, 66, 67, 49, 129, 56, 206, 101]], [('\x80', 4), [235, 1, 129, 220]], [('0AB12', 3), {'error': 'overflow'}], [('ABé', 1), {'error': 'overflow'}], [('AB€€', 10), {'error': 'unencodable'}], [('ÿAB', 5), [235, 128, 66, 67, 129]], [('99x', 5), [229, 121, 129, 220, 115]]], [[('0', 9), [49, 129, 70, 220, 115, 11, 161, 56, 206]], [('0 5', 12), [49, 33, 54, 129, 115, 11, 161, 56, 206, 101, 251, 147]], [('ABxx', 2), {'error': 'overflow'}], [(' AB', 4), [33, 66, 67, 129]], [('', 2), [129, 175]], [('x€', 10), {'error': 'unencodable'}], [(' 125', 1), {'error': 'overflow'}], [('0', 4), [49, 129, 70, 220]]], [[('', 4), [129, 175, 70, 220]], [('x', 5), [121, 129, 70, 220, 115]], [('éé', 3), {'error': 'overflow'}], [('é\x80\x80', 3), {'error': 'overflow'}], [('99ÿé', 7), [229, 235, 128, 235, 106, 129, 161]], [('0', 2), [49, 129]], [('99é0', 5), [229, 235, 106, 49, 129]], [('x99AB', 11), [121, 229, 66, 67, 129, 11, 161, 56, 206, 101, 251]]], [[('0xÿ', 8), [49, 121, 235, 128, 129, 11, 161, 56]], [(' 12', 9), [33, 142, 129, 220, 115, 11, 161, 56, 206]], [('\x8012x5', 1), {'error': 'overflow'}], [(' €ÿ\x80', 5), {'error': 'unencodable'}], [('AB€x', 2), {'error': 'unencodable'}], [('€ ', 4), {'error': 'unencodable'}], [('\x80x0', 5), [235, 1, 121, 49, 129]], [('', 6), [129, 175, 70, 220, 115, 11]]], [[('xÿ ', 8), [121, 235, 128, 33, 129, 11, 161, 56]], [('x5AB', 12), [121, 54, 66, 67, 129, 11, 161, 56, 206, 101, 251, 147]], [('990', 1), {'error': 'overflow'}], [('599AB€', 8), {'error': 'unencodable'}], [('\x80€ 0', 8), {'error': 'unencodable'}], [('AB\x805AB', 8), [66, 67, 235, 1, 54, 66, 67, 129]], [('€99', 7), {'error': 'unencodable'}], [('\x80ÿ', 9), [235, 1, 235, 128, 129, 11, 161, 56, 206]]]]
labels = ["regression: randomised pad wraparound", "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: randomised pad wraparound 0[129, 175, 70, 220, 115, 11][129, 175, 70, 220, 115, 11]Passed
repair trap 1[235, 106, 229, 66, 67, 49, 129, 56, 206, 101][235, 106, 229, 66, 67, 49, 129, 56, 206, 101]Passed
combined fault 2[235, 1, 129, 220][235, 1, 129, 220]Passed
control 3{'error': 'overflow'}{'error': 'overflow'}Passed
control 4{'error': 'overflow'}{'error': 'overflow'}Passed
boundary 5{'error': 'unencodable'}{'error': 'unencodable'}Passed
boundary 6[235, 128, 66, 67, 129][235, 128, 66, 67, 129]Passed
control 7[229, 121, 129, 220, 115][229, 121, 129, 220, 115]Passed

SHA-256 / 4615be2fbff40d2fb86ab901daf81242d56625c7ac4781d5c21daac93be53538

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

Case digest / 44fd0ef007f0e6fc09f3dc0d7288f03cc97ebd39591ab565212135ac184f4baa