FA-79801 / Barcode symbology encoding / Open access
Pad randomisation uses a zero-based position · case 01
Symbols with padding fail strict verification because every randomised pad is off by one position.
ROOT CAUSE
The 253-state randomiser is fed the zero-based index of the pad codeword.
VERIFIED REPAIR
Use the 1-based codeword position.
Unsuccessful approach: Adding two overshoots the position.
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)
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]], [('\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]], [(' ÿ5', 2), {'error': 'overflow'}], [('99x', 5), [229, 121, 129, 220, 115]]], [[('0', 9), [49, 129, 70, 220, 115, 11, 161, 56, 206]], [(' x99x', 10), [33, 121, 229, 121, 129, 11, 161, 56, 206, 101]], [('ABxx', 2), {'error': 'overflow'}], [(' AB', 4), [33, 66, 67, 129]], [('x€', 10), {'error': 'unencodable'}], [(' 125', 1), {'error': 'overflow'}], [('99€x', 6), {'error': 'unencodable'}], [('', 2), [129, 175]]], [[('', 4), [129, 175, 70, 220]], [('99ÿx\x80', 11), [229, 235, 128, 121, 235, 1, 129, 56, 206, 101, 251]], [('éé', 3), {'error': 'overflow'}], [('é\x80\x80', 3), {'error': 'overflow'}], [('0', 2), [49, 129]], [('99é0', 5), [229, 235, 106, 49, 129]], [('€', 6), {'error': 'unencodable'}], [('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]]], [[('995', 11), [229, 54, 129, 220, 115, 11, 161, 56, 206, 101, 251]], [('', 11), [129, 175, 70, 220, 115, 11, 161, 56, 206, 101, 251]], [('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), {'error': 'unencodable'}], [(' 12\x80x', 7), [33, 142, 235, 1, 121, 129, 161]]]]
labels = ["regression: pad randomisation position", "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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression: pad randomisation position 0 | [129, 25, 175, 70, 220, 115] | [129, 175, 70, 220, 115, 11] | Failed |
| repair trap 1 | [235, 1, 129, 70] | [235, 1, 129, 220] | Failed |
| combined fault 2 | {'error': 'overflow'} | {'error': 'overflow'} | Passed |
| control 3 | {'error': 'overflow'} | {'error': 'overflow'} | Passed |
| control 4 | {'error': 'unencodable'} | {'error': 'unencodable'} | Passed |
| boundary 5 | [235, 128, 66, 67, 129] | [235, 128, 66, 67, 129] | Passed |
| boundary 6 | {'error': 'overflow'} | {'error': 'overflow'} | Passed |
| control 7 | [229, 121, 129, 70, 220] | [229, 121, 129, 220, 115] | Failed |
SHA-256 / 015f757d907584cbe6092c6a71e0b06a2d861d434babc8f26b0ea48ed51049ea
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) + 2
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]], [('\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]], [(' ÿ5', 2), {'error': 'overflow'}], [('99x', 5), [229, 121, 129, 220, 115]]], [[('0', 9), [49, 129, 70, 220, 115, 11, 161, 56, 206]], [(' x99x', 10), [33, 121, 229, 121, 129, 11, 161, 56, 206, 101]], [('ABxx', 2), {'error': 'overflow'}], [(' AB', 4), [33, 66, 67, 129]], [('x€', 10), {'error': 'unencodable'}], [(' 125', 1), {'error': 'overflow'}], [('99€x', 6), {'error': 'unencodable'}], [('', 2), [129, 175]]], [[('', 4), [129, 175, 70, 220]], [('99ÿx\x80', 11), [229, 235, 128, 121, 235, 1, 129, 56, 206, 101, 251]], [('éé', 3), {'error': 'overflow'}], [('é\x80\x80', 3), {'error': 'overflow'}], [('0', 2), [49, 129]], [('99é0', 5), [229, 235, 106, 49, 129]], [('€', 6), {'error': 'unencodable'}], [('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]]], [[('995', 11), [229, 54, 129, 220, 115, 11, 161, 56, 206, 101, 251]], [('', 11), [129, 175, 70, 220, 115, 11, 161, 56, 206, 101, 251]], [('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), {'error': 'unencodable'}], [(' 12\x80x', 7), [33, 142, 235, 1, 121, 129, 161]]]]
labels = ["regression: pad randomisation position", "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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression: pad randomisation position 0 | [129, 70, 220, 115, 11, 161] | [129, 175, 70, 220, 115, 11] | Failed |
| repair trap 1 | [235, 1, 129, 115] | [235, 1, 129, 220] | Failed |
| combined fault 2 | {'error': 'overflow'} | {'error': 'overflow'} | Passed |
| control 3 | {'error': 'overflow'} | {'error': 'overflow'} | Passed |
| control 4 | {'error': 'unencodable'} | {'error': 'unencodable'} | Passed |
| boundary 5 | [235, 128, 66, 67, 129] | [235, 128, 66, 67, 129] | Passed |
| boundary 6 | {'error': 'overflow'} | {'error': 'overflow'} | Passed |
| control 7 | [229, 121, 129, 115, 11] | [229, 121, 129, 220, 115] | Failed |
SHA-256 / 4a35bf72fb4a16c57b30b4c88b1b9c716191631005353787c345712da53f2064
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]], [('\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]], [(' ÿ5', 2), {'error': 'overflow'}], [('99x', 5), [229, 121, 129, 220, 115]]], [[('0', 9), [49, 129, 70, 220, 115, 11, 161, 56, 206]], [(' x99x', 10), [33, 121, 229, 121, 129, 11, 161, 56, 206, 101]], [('ABxx', 2), {'error': 'overflow'}], [(' AB', 4), [33, 66, 67, 129]], [('x€', 10), {'error': 'unencodable'}], [(' 125', 1), {'error': 'overflow'}], [('99€x', 6), {'error': 'unencodable'}], [('', 2), [129, 175]]], [[('', 4), [129, 175, 70, 220]], [('99ÿx\x80', 11), [229, 235, 128, 121, 235, 1, 129, 56, 206, 101, 251]], [('éé', 3), {'error': 'overflow'}], [('é\x80\x80', 3), {'error': 'overflow'}], [('0', 2), [49, 129]], [('99é0', 5), [229, 235, 106, 49, 129]], [('€', 6), {'error': 'unencodable'}], [('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]]], [[('995', 11), [229, 54, 129, 220, 115, 11, 161, 56, 206, 101, 251]], [('', 11), [129, 175, 70, 220, 115, 11, 161, 56, 206, 101, 251]], [('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), {'error': 'unencodable'}], [(' 12\x80x', 7), [33, 142, 235, 1, 121, 129, 161]]]]
labels = ["regression: pad randomisation position", "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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression: pad randomisation position 0 | [129, 175, 70, 220, 115, 11] | [129, 175, 70, 220, 115, 11] | Passed |
| repair trap 1 | [235, 1, 129, 220] | [235, 1, 129, 220] | Passed |
| combined fault 2 | {'error': 'overflow'} | {'error': 'overflow'} | Passed |
| control 3 | {'error': 'overflow'} | {'error': 'overflow'} | Passed |
| control 4 | {'error': 'unencodable'} | {'error': 'unencodable'} | Passed |
| boundary 5 | [235, 128, 66, 67, 129] | [235, 128, 66, 67, 129] | Passed |
| boundary 6 | {'error': 'overflow'} | {'error': 'overflow'} | Passed |
| control 7 | [229, 121, 129, 220, 115] | [229, 121, 129, 220, 115] | Passed |
SHA-256 / 860e632bd13fce562794a8ef4e7120eb408685ec3665d7b9c57b77dcaee1dc3a
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.814865+00:00.
Case digest / bf43effe4f6ca16b8c9f27856b75dbd3d703a0dd7d6d573a06d5dafc587a0341