FA-79486 / Barcode symbology encoding / Open access
EAN-13 right quiet zone uses the left width · case 01
Retail labels reserve four extra modules on the right and overflow narrow shelf strips.
ROOT CAUSE
The EAN-13 quiet zones are recorded as 11 on both sides.
VERIFIED REPAIR
EAN-13 needs 11 modules left and 7 right.
Unsuccessful approach: Swapping the sides leaves the left quiet zone too small for scanners.
Case contract
Input {sym, modules, x_um, addon?}. Quiet zones in X: ean13 11 left / 7 right, upca 9/9, ean8 7/7, code128, code39 and itf14 10/10. Allowed X-dimensions in micrometres: EAN/UPC 264..660 inclusive, code128/code39 >= 190, itf14 >= 495. An EAN-2 (20 modules) or EAN-5 (47 modules) add-on is only allowed on EAN/UPC; it replaces the right quiet zone by a 7-module gap, the add-on and a 5-module trailing quiet zone. Return [total_um, left_quiet_um] or unknown/x-out-of-range/bad-addon.
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(spec):
qz = {'ean13': (11, 11), 'upca': (9, 9), 'ean8': (7, 7), 'code128': (10, 10), 'code39': (10, 10), 'itf14': (10, 10)}
xr = {'ean13': (264, 660), 'upca': (264, 660), 'ean8': (264, 660), 'code128': (190, None), 'code39': (190, None), 'itf14': (495, None)}
sym = spec['sym']
if sym not in qz:
return 'unknown'
lo, hi = xr[sym]
x = spec['x_um']
if x < lo or (hi is not None and x > hi):
return 'x-out-of-range'
left, right = qz[sym]
addon = spec.get('addon', 0)
if addon:
if sym not in ('ean13', 'upca', 'ean8') or addon not in (2, 5):
return 'bad-addon'
right = 7 + (20 if addon == 2 else 47) + 5
total = left + spec['modules'] + right
return [total * x, left * x]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[{'sym': 'ean13', 'modules': 67, 'x_um': 330}, [28050, 3630]], [{'sym': 'ean13', 'modules': 95, 'x_um': 300}, [33900, 3300]], [{'sym': 'code39', 'modules': 200, 'x_um': 661}, [145420, 6610]], [{'sym': 'qr', 'modules': 200, 'x_um': 250, 'addon': 2}, 'unknown'], [{'sym': 'ean8', 'modules': 101, 'x_um': 1100, 'addon': 5}, 'x-out-of-range'], [{'sym': 'code128', 'modules': 200, 'x_um': 1000, 'addon': 5}, 'bad-addon'], [{'sym': 'code128', 'modules': 67, 'x_um': 400, 'addon': 2}, 'bad-addon'], [{'sym': 'ean13', 'modules': 142, 'x_um': 330}, [52800, 3630]]], [[{'sym': 'ean13', 'modules': 95, 'x_um': 400}, [45200, 4400]], [{'sym': 'ean13', 'modules': 200, 'x_um': 660}, [143880, 7260]], [{'sym': 'itf14', 'modules': 67, 'x_um': 1000}, [87000, 10000]], [{'sym': 'itf14', 'modules': 67, 'x_um': 250}, 'x-out-of-range'], [{'sym': 'code128', 'modules': 200, 'x_um': 660}, [145200, 6600]], [{'sym': 'ean13', 'modules': 95, 'x_um': 661}, 'x-out-of-range'], [{'sym': 'ean13', 'modules': 95, 'x_um': 190}, 'x-out-of-range'], [{'sym': 'ean13', 'modules': 200, 'x_um': 330}, [71940, 3630]]], [[{'sym': 'ean13', 'modules': 67, 'x_um': 330}, [28050, 3630]], [{'sym': 'ean13', 'modules': 95, 'x_um': 330}, [37290, 3630]], [{'sym': 'ean13', 'modules': 101, 'x_um': 400}, [47600, 4400]], [{'sym': 'ean13', 'modules': 200, 'x_um': 190}, 'x-out-of-range'], [{'sym': 'code39', 'modules': 101, 'x_um': 400}, [48400, 4000]], [{'sym': 'itf14', 'modules': 95, 'x_um': 263, 'addon': 5}, 'x-out-of-range'], [{'sym': 'code39', 'modules': 101, 'x_um': 190, 'addon': 3}, 'bad-addon'], [{'sym': 'ean13', 'modules': 142, 'x_um': 660}, [105600, 7260]]], [[{'sym': 'ean13', 'modules': 95, 'x_um': 495}, [55935, 5445]], [{'sym': 'ean13', 'modules': 200, 'x_um': 495}, [107910, 5445]], [{'sym': 'ean13', 'modules': 200, 'x_um': 330}, [71940, 3630]], [{'sym': 'ean13', 'modules': 101, 'x_um': 1100}, 'x-out-of-range'], [{'sym': 'itf14', 'modules': 95, 'x_um': 264, 'addon': 2}, 'x-out-of-range'], [{'sym': 'ean13', 'modules': 67, 'x_um': 661}, 'x-out-of-range'], [{'sym': 'itf14', 'modules': 67, 'x_um': 1100, 'addon': 3}, 'bad-addon'], [{'sym': 'ean13', 'modules': 95, 'x_um': 264}, [29832, 2904]]], [[{'sym': 'ean13', 'modules': 200, 'x_um': 264}, [57552, 2904]], [{'sym': 'ean13', 'modules': 101, 'x_um': 660}, [78540, 7260]], [{'sym': 'ean13', 'modules': 67, 'x_um': 264}, [22440, 2904]], [{'sym': 'ean8', 'modules': 95, 'x_um': 330, 'addon': 2}, [44220, 2310]], [{'sym': 'upca', 'modules': 101, 'x_um': 1100}, 'x-out-of-range'], [{'sym': 'upca', 'modules': 95, 'x_um': 661, 'addon': 3}, 'x-out-of-range'], [{'sym': 'code39', 'modules': 67, 'x_um': 250, 'addon': 5}, 'bad-addon'], [{'sym': 'ean13', 'modules': 67, 'x_um': 330}, [28050, 3630]]]]
labels = ["regression: EAN-13 right quiet zone", "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: EAN-13 right quiet zone 0 | [29370, 3630] | [28050, 3630] | Failed |
| repair trap 1 | [35100, 3300] | [33900, 3300] | Failed |
| combined fault 2 | [145420, 6610] | [145420, 6610] | Passed |
| control 3 | unknown | unknown | Passed |
| control 4 | x-out-of-range | x-out-of-range | Passed |
| boundary 5 | bad-addon | bad-addon | Passed |
| boundary 6 | bad-addon | bad-addon | Passed |
| control 7 | [54120, 3630] | [52800, 3630] | Failed |
SHA-256 / 6846b4a950e1403726d1c49a081ec66096dc5132d116aab14460ed24c10618de
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(spec):
qz = {'ean13': (7, 11), 'upca': (9, 9), 'ean8': (7, 7), 'code128': (10, 10), 'code39': (10, 10), 'itf14': (10, 10)}
xr = {'ean13': (264, 660), 'upca': (264, 660), 'ean8': (264, 660), 'code128': (190, None), 'code39': (190, None), 'itf14': (495, None)}
sym = spec['sym']
if sym not in qz:
return 'unknown'
lo, hi = xr[sym]
x = spec['x_um']
if x < lo or (hi is not None and x > hi):
return 'x-out-of-range'
left, right = qz[sym]
addon = spec.get('addon', 0)
if addon:
if sym not in ('ean13', 'upca', 'ean8') or addon not in (2, 5):
return 'bad-addon'
right = 7 + (20 if addon == 2 else 47) + 5
total = left + spec['modules'] + right
return [total * x, left * x]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[{'sym': 'ean13', 'modules': 67, 'x_um': 330}, [28050, 3630]], [{'sym': 'ean13', 'modules': 95, 'x_um': 300}, [33900, 3300]], [{'sym': 'code39', 'modules': 200, 'x_um': 661}, [145420, 6610]], [{'sym': 'qr', 'modules': 200, 'x_um': 250, 'addon': 2}, 'unknown'], [{'sym': 'ean8', 'modules': 101, 'x_um': 1100, 'addon': 5}, 'x-out-of-range'], [{'sym': 'code128', 'modules': 200, 'x_um': 1000, 'addon': 5}, 'bad-addon'], [{'sym': 'code128', 'modules': 67, 'x_um': 400, 'addon': 2}, 'bad-addon'], [{'sym': 'ean13', 'modules': 142, 'x_um': 330}, [52800, 3630]]], [[{'sym': 'ean13', 'modules': 95, 'x_um': 400}, [45200, 4400]], [{'sym': 'ean13', 'modules': 200, 'x_um': 660}, [143880, 7260]], [{'sym': 'itf14', 'modules': 67, 'x_um': 1000}, [87000, 10000]], [{'sym': 'itf14', 'modules': 67, 'x_um': 250}, 'x-out-of-range'], [{'sym': 'code128', 'modules': 200, 'x_um': 660}, [145200, 6600]], [{'sym': 'ean13', 'modules': 95, 'x_um': 661}, 'x-out-of-range'], [{'sym': 'ean13', 'modules': 95, 'x_um': 190}, 'x-out-of-range'], [{'sym': 'ean13', 'modules': 200, 'x_um': 330}, [71940, 3630]]], [[{'sym': 'ean13', 'modules': 67, 'x_um': 330}, [28050, 3630]], [{'sym': 'ean13', 'modules': 95, 'x_um': 330}, [37290, 3630]], [{'sym': 'ean13', 'modules': 101, 'x_um': 400}, [47600, 4400]], [{'sym': 'ean13', 'modules': 200, 'x_um': 190}, 'x-out-of-range'], [{'sym': 'code39', 'modules': 101, 'x_um': 400}, [48400, 4000]], [{'sym': 'itf14', 'modules': 95, 'x_um': 263, 'addon': 5}, 'x-out-of-range'], [{'sym': 'code39', 'modules': 101, 'x_um': 190, 'addon': 3}, 'bad-addon'], [{'sym': 'ean13', 'modules': 142, 'x_um': 660}, [105600, 7260]]], [[{'sym': 'ean13', 'modules': 95, 'x_um': 495}, [55935, 5445]], [{'sym': 'ean13', 'modules': 200, 'x_um': 495}, [107910, 5445]], [{'sym': 'ean13', 'modules': 200, 'x_um': 330}, [71940, 3630]], [{'sym': 'ean13', 'modules': 101, 'x_um': 1100}, 'x-out-of-range'], [{'sym': 'itf14', 'modules': 95, 'x_um': 264, 'addon': 2}, 'x-out-of-range'], [{'sym': 'ean13', 'modules': 67, 'x_um': 661}, 'x-out-of-range'], [{'sym': 'itf14', 'modules': 67, 'x_um': 1100, 'addon': 3}, 'bad-addon'], [{'sym': 'ean13', 'modules': 95, 'x_um': 264}, [29832, 2904]]], [[{'sym': 'ean13', 'modules': 200, 'x_um': 264}, [57552, 2904]], [{'sym': 'ean13', 'modules': 101, 'x_um': 660}, [78540, 7260]], [{'sym': 'ean13', 'modules': 67, 'x_um': 264}, [22440, 2904]], [{'sym': 'ean8', 'modules': 95, 'x_um': 330, 'addon': 2}, [44220, 2310]], [{'sym': 'upca', 'modules': 101, 'x_um': 1100}, 'x-out-of-range'], [{'sym': 'upca', 'modules': 95, 'x_um': 661, 'addon': 3}, 'x-out-of-range'], [{'sym': 'code39', 'modules': 67, 'x_um': 250, 'addon': 5}, 'bad-addon'], [{'sym': 'ean13', 'modules': 67, 'x_um': 330}, [28050, 3630]]]]
labels = ["regression: EAN-13 right quiet zone", "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: EAN-13 right quiet zone 0 | [28050, 2310] | [28050, 3630] | Failed |
| repair trap 1 | [33900, 2100] | [33900, 3300] | Failed |
| combined fault 2 | [145420, 6610] | [145420, 6610] | Passed |
| control 3 | unknown | unknown | Passed |
| control 4 | x-out-of-range | x-out-of-range | Passed |
| boundary 5 | bad-addon | bad-addon | Passed |
| boundary 6 | bad-addon | bad-addon | Passed |
| control 7 | [52800, 2310] | [52800, 3630] | Failed |
SHA-256 / 1859ead38f5f9bc7ada4ac3671631746591b2810217331683c52ae08e57d95a7
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(spec):
qz = {'ean13': (11, 7), 'upca': (9, 9), 'ean8': (7, 7), 'code128': (10, 10), 'code39': (10, 10), 'itf14': (10, 10)}
xr = {'ean13': (264, 660), 'upca': (264, 660), 'ean8': (264, 660), 'code128': (190, None), 'code39': (190, None), 'itf14': (495, None)}
sym = spec['sym']
if sym not in qz:
return 'unknown'
lo, hi = xr[sym]
x = spec['x_um']
if x < lo or (hi is not None and x > hi):
return 'x-out-of-range'
left, right = qz[sym]
addon = spec.get('addon', 0)
if addon:
if sym not in ('ean13', 'upca', 'ean8') or addon not in (2, 5):
return 'bad-addon'
right = 7 + (20 if addon == 2 else 47) + 5
total = left + spec['modules'] + right
return [total * x, left * x]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[{'sym': 'ean13', 'modules': 67, 'x_um': 330}, [28050, 3630]], [{'sym': 'ean13', 'modules': 95, 'x_um': 300}, [33900, 3300]], [{'sym': 'code39', 'modules': 200, 'x_um': 661}, [145420, 6610]], [{'sym': 'qr', 'modules': 200, 'x_um': 250, 'addon': 2}, 'unknown'], [{'sym': 'ean8', 'modules': 101, 'x_um': 1100, 'addon': 5}, 'x-out-of-range'], [{'sym': 'code128', 'modules': 200, 'x_um': 1000, 'addon': 5}, 'bad-addon'], [{'sym': 'code128', 'modules': 67, 'x_um': 400, 'addon': 2}, 'bad-addon'], [{'sym': 'ean13', 'modules': 142, 'x_um': 330}, [52800, 3630]]], [[{'sym': 'ean13', 'modules': 95, 'x_um': 400}, [45200, 4400]], [{'sym': 'ean13', 'modules': 200, 'x_um': 660}, [143880, 7260]], [{'sym': 'itf14', 'modules': 67, 'x_um': 1000}, [87000, 10000]], [{'sym': 'itf14', 'modules': 67, 'x_um': 250}, 'x-out-of-range'], [{'sym': 'code128', 'modules': 200, 'x_um': 660}, [145200, 6600]], [{'sym': 'ean13', 'modules': 95, 'x_um': 661}, 'x-out-of-range'], [{'sym': 'ean13', 'modules': 95, 'x_um': 190}, 'x-out-of-range'], [{'sym': 'ean13', 'modules': 200, 'x_um': 330}, [71940, 3630]]], [[{'sym': 'ean13', 'modules': 67, 'x_um': 330}, [28050, 3630]], [{'sym': 'ean13', 'modules': 95, 'x_um': 330}, [37290, 3630]], [{'sym': 'ean13', 'modules': 101, 'x_um': 400}, [47600, 4400]], [{'sym': 'ean13', 'modules': 200, 'x_um': 190}, 'x-out-of-range'], [{'sym': 'code39', 'modules': 101, 'x_um': 400}, [48400, 4000]], [{'sym': 'itf14', 'modules': 95, 'x_um': 263, 'addon': 5}, 'x-out-of-range'], [{'sym': 'code39', 'modules': 101, 'x_um': 190, 'addon': 3}, 'bad-addon'], [{'sym': 'ean13', 'modules': 142, 'x_um': 660}, [105600, 7260]]], [[{'sym': 'ean13', 'modules': 95, 'x_um': 495}, [55935, 5445]], [{'sym': 'ean13', 'modules': 200, 'x_um': 495}, [107910, 5445]], [{'sym': 'ean13', 'modules': 200, 'x_um': 330}, [71940, 3630]], [{'sym': 'ean13', 'modules': 101, 'x_um': 1100}, 'x-out-of-range'], [{'sym': 'itf14', 'modules': 95, 'x_um': 264, 'addon': 2}, 'x-out-of-range'], [{'sym': 'ean13', 'modules': 67, 'x_um': 661}, 'x-out-of-range'], [{'sym': 'itf14', 'modules': 67, 'x_um': 1100, 'addon': 3}, 'bad-addon'], [{'sym': 'ean13', 'modules': 95, 'x_um': 264}, [29832, 2904]]], [[{'sym': 'ean13', 'modules': 200, 'x_um': 264}, [57552, 2904]], [{'sym': 'ean13', 'modules': 101, 'x_um': 660}, [78540, 7260]], [{'sym': 'ean13', 'modules': 67, 'x_um': 264}, [22440, 2904]], [{'sym': 'ean8', 'modules': 95, 'x_um': 330, 'addon': 2}, [44220, 2310]], [{'sym': 'upca', 'modules': 101, 'x_um': 1100}, 'x-out-of-range'], [{'sym': 'upca', 'modules': 95, 'x_um': 661, 'addon': 3}, 'x-out-of-range'], [{'sym': 'code39', 'modules': 67, 'x_um': 250, 'addon': 5}, 'bad-addon'], [{'sym': 'ean13', 'modules': 67, 'x_um': 330}, [28050, 3630]]]]
labels = ["regression: EAN-13 right quiet zone", "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: EAN-13 right quiet zone 0 | [28050, 3630] | [28050, 3630] | Passed |
| repair trap 1 | [33900, 3300] | [33900, 3300] | Passed |
| combined fault 2 | [145420, 6610] | [145420, 6610] | Passed |
| control 3 | unknown | unknown | Passed |
| control 4 | x-out-of-range | x-out-of-range | Passed |
| boundary 5 | bad-addon | bad-addon | Passed |
| boundary 6 | bad-addon | bad-addon | Passed |
| control 7 | [52800, 3630] | [52800, 3630] | Passed |
SHA-256 / 48fd2508e691732c9f9caf121f3a968306aa0288d80c5997a6a37419f7630f9c
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:45.029381+00:00.
Case digest / 7058c1a6c556849b7abca4071eb1f00dbd150e49b98b08f9254380a5bbcc926f