FA-79411 / Barcode symbology encoding / Open access
Trailing four-digit runs stay in set B · case 01
Serial numbers ending in four or five digits produce longer symbols than necessary.
ROOT CAUSE
The end-of-data exception for 4 and 5 digit runs is missing.
VERIFIED REPAIR
Also switch to C for runs of four or more digits that reach the end of the data.
Unsuccessful approach: Allowing the run to stop one character early switches before a final letter.
Case contract
Plan Code 128 code sets for printable ASCII data (other characters -> None) as a list of [set, text] segments. Start in C when the data begins with at least 4 digits or is entirely digits of even length >= 2, else B. In C consume digit pairs and fall back to B when fewer than two digits remain in the run. In B switch to C before a run of at least 6 digits, or at least 4 digits that reach the end of the data; an odd run first encodes one digit in B. Empty data yields [["B", ""]].
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(data):
if any(not (32 <= ord(ch) <= 126) for ch in data):
return None
n = len(data)
def run(j):
k = j
while k < n and data[k] in '0123456789':
k += 1
return k - j
segs = []
r = run(0)
if r >= 4 or (r == n and n >= 2 and n % 2 == 0):
cur = 'C'
else:
cur = 'B'
buf = ''
i = 0
while i < n:
if cur == 'C':
if run(i) >= 2:
buf += data[i:i + 2]
i += 2
continue
segs.append(['C', buf])
buf = ''
cur = 'B'
continue
r = run(i)
if r >= 6:
if r % 2 == 1:
buf += data[i]
i += 1
if buf:
segs.append(['B', buf])
buf = ''
cur = 'C'
continue
buf += data[i]
i += 1
if buf or not segs:
segs.append([cur, buf])
return segs
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['ABlot61791', [['B', 'ABlot6'], ['C', '1791']]], [' lot1300 ', [['B', ' lot1300 ']]], ['3580131', [['C', '358013'], ['B', '1']]], ['lot17764124x', [['B', 'lot'], ['C', '17764124'], ['B', 'x']]], ['xAB', [['B', 'xAB']]], [' 193261lot', [['B', ' '], ['C', '193261'], ['B', 'lot']]], ['AB', [['B', 'AB']]], ['02 1847', [['B', '02 '], ['C', '1847']]]], [['lot0696', [['B', 'lot'], ['C', '0696']]], ['03 2849 ', [['B', '03 2849 ']]], ['Q7lotQ7lot', [['B', 'Q7lotQ7lot']]], ['101874486507729', [['C', '10187448650772'], ['B', '9']]], ['x22', [['B', 'x22']]], [' ', [['B', ' ']]], ['-006', [['B', '-006']]], ['338376558854179 84977', [['C', '33837655885417'], ['B', '9 8'], ['C', '4977']]]], [['x03107', [['B', 'x0'], ['C', '3107']]], ['AB1234x', [['B', 'AB1234x']]], ['0964853799773055547674lot', [['C', '0964853799773055547674'], ['B', 'lot']]], ['lot', [['B', 'lot']]], ['1', [['B', '1']]], ['Q7 lotAB', [['B', 'Q7 lotAB']]], ['-753024468324', [['B', '-'], ['C', '753024468324']]], ['827 AB51544', [['B', '827 AB5'], ['C', '1544']]]], [[' 1019', [['B', ' '], ['C', '1019']]], ['lot9876A', [['B', 'lot9876A']]], ['3807356726022 ', [['C', '380735672602'], ['B', '2 ']]], ['733-', [['B', '733-']]], ['46450162930', [['C', '4645016293'], ['B', '0']]], [' - ', [['B', ' - ']]], [' Q7', [['B', ' Q7']]], ['-Q7Q7805', [['B', '-Q7Q'], ['C', '7805']]]], [[' Q72484', [['B', ' Q7'], ['C', '2484']]], ['AB1234x', [['B', 'AB1234x']]], ['xlot045355094', [['B', 'xlot0'], ['C', '45355094']]], ['007775830', [['C', '00777583'], ['B', '0']]], ['AB8', [['B', 'AB8']]], ['014550632960 753', [['C', '014550632960'], ['B', ' 753']]], [' x', [['B', ' x']]], ['3283655059x2996', [['C', '3283655059'], ['B', 'x'], ['C', '2996']]]]]
labels = ["regression: trailing digit run switch", "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: trailing digit run switch 0 | [['B', 'ABlot61791']] | [['B', 'ABlot6'], ['C', '1791']] | Failed |
| repair trap 1 | [['B', ' lot1300 ']] | [['B', ' lot1300 ']] | Passed |
| combined fault 2 | [['C', '358013'], ['B', '1']] | [['C', '358013'], ['B', '1']] | Passed |
| control 3 | [['B', 'lot'], ['C', '17764124'], ['B', 'x']] | [['B', 'lot'], ['C', '17764124'], ['B', 'x']] | Passed |
| control 4 | [['B', 'xAB']] | [['B', 'xAB']] | Passed |
| boundary 5 | [['B', ' '], ['C', '193261'], ['B', 'lot']] | [['B', ' '], ['C', '193261'], ['B', 'lot']] | Passed |
| boundary 6 | [['B', 'AB']] | [['B', 'AB']] | Passed |
| control 7 | [['B', '02 1847']] | [['B', '02 '], ['C', '1847']] | Failed |
SHA-256 / 6228b30bb7557b8a9f038678dafe6a51df487c18a4b9c5b880e9a387ef9d8bb5
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(data):
if any(not (32 <= ord(ch) <= 126) for ch in data):
return None
n = len(data)
def run(j):
k = j
while k < n and data[k] in '0123456789':
k += 1
return k - j
segs = []
r = run(0)
if r >= 4 or (r == n and n >= 2 and n % 2 == 0):
cur = 'C'
else:
cur = 'B'
buf = ''
i = 0
while i < n:
if cur == 'C':
if run(i) >= 2:
buf += data[i:i + 2]
i += 2
continue
segs.append(['C', buf])
buf = ''
cur = 'B'
continue
r = run(i)
if r >= 6 or (r >= 4 and i + r >= n - 1):
if r % 2 == 1:
buf += data[i]
i += 1
if buf:
segs.append(['B', buf])
buf = ''
cur = 'C'
continue
buf += data[i]
i += 1
if buf or not segs:
segs.append([cur, buf])
return segs
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['ABlot61791', [['B', 'ABlot6'], ['C', '1791']]], [' lot1300 ', [['B', ' lot1300 ']]], ['3580131', [['C', '358013'], ['B', '1']]], ['lot17764124x', [['B', 'lot'], ['C', '17764124'], ['B', 'x']]], ['xAB', [['B', 'xAB']]], [' 193261lot', [['B', ' '], ['C', '193261'], ['B', 'lot']]], ['AB', [['B', 'AB']]], ['02 1847', [['B', '02 '], ['C', '1847']]]], [['lot0696', [['B', 'lot'], ['C', '0696']]], ['03 2849 ', [['B', '03 2849 ']]], ['Q7lotQ7lot', [['B', 'Q7lotQ7lot']]], ['101874486507729', [['C', '10187448650772'], ['B', '9']]], ['x22', [['B', 'x22']]], [' ', [['B', ' ']]], ['-006', [['B', '-006']]], ['338376558854179 84977', [['C', '33837655885417'], ['B', '9 8'], ['C', '4977']]]], [['x03107', [['B', 'x0'], ['C', '3107']]], ['AB1234x', [['B', 'AB1234x']]], ['0964853799773055547674lot', [['C', '0964853799773055547674'], ['B', 'lot']]], ['lot', [['B', 'lot']]], ['1', [['B', '1']]], ['Q7 lotAB', [['B', 'Q7 lotAB']]], ['-753024468324', [['B', '-'], ['C', '753024468324']]], ['827 AB51544', [['B', '827 AB5'], ['C', '1544']]]], [[' 1019', [['B', ' '], ['C', '1019']]], ['lot9876A', [['B', 'lot9876A']]], ['3807356726022 ', [['C', '380735672602'], ['B', '2 ']]], ['733-', [['B', '733-']]], ['46450162930', [['C', '4645016293'], ['B', '0']]], [' - ', [['B', ' - ']]], [' Q7', [['B', ' Q7']]], ['-Q7Q7805', [['B', '-Q7Q'], ['C', '7805']]]], [[' Q72484', [['B', ' Q7'], ['C', '2484']]], ['AB1234x', [['B', 'AB1234x']]], ['xlot045355094', [['B', 'xlot0'], ['C', '45355094']]], ['007775830', [['C', '00777583'], ['B', '0']]], ['AB8', [['B', 'AB8']]], ['014550632960 753', [['C', '014550632960'], ['B', ' 753']]], [' x', [['B', ' x']]], ['3283655059x2996', [['C', '3283655059'], ['B', 'x'], ['C', '2996']]]]]
labels = ["regression: trailing digit run switch", "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: trailing digit run switch 0 | [['B', 'ABlot6'], ['C', '1791']] | [['B', 'ABlot6'], ['C', '1791']] | Passed |
| repair trap 1 | [['B', ' lot'], ['C', '1300'], ['B', ' ']] | [['B', ' lot1300 ']] | Failed |
| combined fault 2 | [['C', '358013'], ['B', '1']] | [['C', '358013'], ['B', '1']] | Passed |
| control 3 | [['B', 'lot'], ['C', '17764124'], ['B', 'x']] | [['B', 'lot'], ['C', '17764124'], ['B', 'x']] | Passed |
| control 4 | [['B', 'xAB']] | [['B', 'xAB']] | Passed |
| boundary 5 | [['B', ' '], ['C', '193261'], ['B', 'lot']] | [['B', ' '], ['C', '193261'], ['B', 'lot']] | Passed |
| boundary 6 | [['B', 'AB']] | [['B', 'AB']] | Passed |
| control 7 | [['B', '02 '], ['C', '1847']] | [['B', '02 '], ['C', '1847']] | Passed |
SHA-256 / 0679ee9437a24620e2c57e13046288381c9590d2cf432a1c1d6f7ce464806961
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(data):
if any(not (32 <= ord(ch) <= 126) for ch in data):
return None
n = len(data)
def run(j):
k = j
while k < n and data[k] in '0123456789':
k += 1
return k - j
segs = []
r = run(0)
if r >= 4 or (r == n and n >= 2 and n % 2 == 0):
cur = 'C'
else:
cur = 'B'
buf = ''
i = 0
while i < n:
if cur == 'C':
if run(i) >= 2:
buf += data[i:i + 2]
i += 2
continue
segs.append(['C', buf])
buf = ''
cur = 'B'
continue
r = run(i)
if r >= 6 or (r >= 4 and i + r == n):
if r % 2 == 1:
buf += data[i]
i += 1
if buf:
segs.append(['B', buf])
buf = ''
cur = 'C'
continue
buf += data[i]
i += 1
if buf or not segs:
segs.append([cur, buf])
return segs
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['ABlot61791', [['B', 'ABlot6'], ['C', '1791']]], [' lot1300 ', [['B', ' lot1300 ']]], ['3580131', [['C', '358013'], ['B', '1']]], ['lot17764124x', [['B', 'lot'], ['C', '17764124'], ['B', 'x']]], ['xAB', [['B', 'xAB']]], [' 193261lot', [['B', ' '], ['C', '193261'], ['B', 'lot']]], ['AB', [['B', 'AB']]], ['02 1847', [['B', '02 '], ['C', '1847']]]], [['lot0696', [['B', 'lot'], ['C', '0696']]], ['03 2849 ', [['B', '03 2849 ']]], ['Q7lotQ7lot', [['B', 'Q7lotQ7lot']]], ['101874486507729', [['C', '10187448650772'], ['B', '9']]], ['x22', [['B', 'x22']]], [' ', [['B', ' ']]], ['-006', [['B', '-006']]], ['338376558854179 84977', [['C', '33837655885417'], ['B', '9 8'], ['C', '4977']]]], [['x03107', [['B', 'x0'], ['C', '3107']]], ['AB1234x', [['B', 'AB1234x']]], ['0964853799773055547674lot', [['C', '0964853799773055547674'], ['B', 'lot']]], ['lot', [['B', 'lot']]], ['1', [['B', '1']]], ['Q7 lotAB', [['B', 'Q7 lotAB']]], ['-753024468324', [['B', '-'], ['C', '753024468324']]], ['827 AB51544', [['B', '827 AB5'], ['C', '1544']]]], [[' 1019', [['B', ' '], ['C', '1019']]], ['lot9876A', [['B', 'lot9876A']]], ['3807356726022 ', [['C', '380735672602'], ['B', '2 ']]], ['733-', [['B', '733-']]], ['46450162930', [['C', '4645016293'], ['B', '0']]], [' - ', [['B', ' - ']]], [' Q7', [['B', ' Q7']]], ['-Q7Q7805', [['B', '-Q7Q'], ['C', '7805']]]], [[' Q72484', [['B', ' Q7'], ['C', '2484']]], ['AB1234x', [['B', 'AB1234x']]], ['xlot045355094', [['B', 'xlot0'], ['C', '45355094']]], ['007775830', [['C', '00777583'], ['B', '0']]], ['AB8', [['B', 'AB8']]], ['014550632960 753', [['C', '014550632960'], ['B', ' 753']]], [' x', [['B', ' x']]], ['3283655059x2996', [['C', '3283655059'], ['B', 'x'], ['C', '2996']]]]]
labels = ["regression: trailing digit run switch", "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: trailing digit run switch 0 | [['B', 'ABlot6'], ['C', '1791']] | [['B', 'ABlot6'], ['C', '1791']] | Passed |
| repair trap 1 | [['B', ' lot1300 ']] | [['B', ' lot1300 ']] | Passed |
| combined fault 2 | [['C', '358013'], ['B', '1']] | [['C', '358013'], ['B', '1']] | Passed |
| control 3 | [['B', 'lot'], ['C', '17764124'], ['B', 'x']] | [['B', 'lot'], ['C', '17764124'], ['B', 'x']] | Passed |
| control 4 | [['B', 'xAB']] | [['B', 'xAB']] | Passed |
| boundary 5 | [['B', ' '], ['C', '193261'], ['B', 'lot']] | [['B', ' '], ['C', '193261'], ['B', 'lot']] | Passed |
| boundary 6 | [['B', 'AB']] | [['B', 'AB']] | Passed |
| control 7 | [['B', '02 '], ['C', '1847']] | [['B', '02 '], ['C', '1847']] | Passed |
SHA-256 / 6bb21ffaa0706c0f55122c0773c1f8f1ab90e2282ddd32ef6b37a48b26f9fb9b
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:44.392215+00:00.
Case digest / fe0904523d28f3a99288ba98cf189aab46fc996c4487395638ed5069bc3366b9