FA-72416 / Check-digit algorithms / Open access
Damm rejects space-grouped references · case 01
References printed in groups of digits return None.
ROOT CAUSE
Only surrounding whitespace is trimmed, so interior group spaces fail the digit gate.
VERIFIED REPAIR
Remove every space before validating the digits.
Unsuccessful approach: Removing only the first space fixes two-group references but not longer groupings.
Case contract
Damm quasigroup scheme with the standard order-10 table. Spaces are ignored; the remaining text must be nonempty ASCII digits or the result is None. Digits are processed left to right with interim = T[interim][digit] from 0; "generate" returns the final interim value, "validate" returns whether it is 0.
Why this case matters
Damm checks are used on order and parcel references where transpositions must be detected.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(s, mode):
T = [[0,3,1,7,5,9,8,6,4,2],[7,0,9,2,1,5,4,8,6,3],[4,2,0,6,8,7,1,3,5,9],[1,7,5,0,9,8,3,4,2,6],[6,1,2,3,0,4,5,9,7,8],[3,6,7,4,2,0,9,5,8,1],[5,8,6,9,7,2,0,1,3,4],[8,9,4,5,3,6,2,0,1,7],[9,4,3,8,6,1,7,2,0,5],[2,5,8,1,4,3,6,7,9,0]]
t = s.strip()
if not t or not t.isascii() or not t.isdigit():
return None
interim = 0
for ch in t:
interim = T[interim][int(ch)]
if mode == 'generate':
return interim
return interim == 0
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression ["572 4", "validate"]', ['572 4', 'validate'], True], ['regression ["12 34 56", "generate"]', ['12 34 56', 'generate'], 6], ['partial-repair ["4012 8888 8888 1881", "generate"]', ['4012 8888 8888 1881', 'generate'], 6], ['control ["9", "generate"]', ['9', 'generate'], 2], ['control ["97", "validate"]', ['97', 'validate'], False], ['control ["24", "generate"]', ['24', 'generate'], 1], ['control ["249", "validate"]', ['249', 'validate'], False], ['control ["406", "generate"]', ['406', 'generate'], 3]], [['regression ["572 4", "validate"]', ['572 4', 'validate'], True], ['regression ["12 34 56", "generate"]', ['12 34 56', 'generate'], 6], ['partial-repair ["4012 8888 8888 1881", "generate"]', ['4012 8888 8888 1881', 'generate'], 6], ['control ["4060", "validate"]', ['4060', 'validate'], False], ['control ["7601", "generate"]', ['7601', 'generate'], 3], ['control ["76013", "validate"]', ['76013', 'validate'], True], ['control ["637005", "generate"]', ['637005', 'generate'], 2], ['control ["6370058", "validate"]', ['6370058', 'validate'], False]], [['regression ["572 4", "validate"]', ['572 4', 'validate'], True], ['regression ["12 34 56", "generate"]', ['12 34 56', 'generate'], 6], ['partial-repair ["4012 8888 8888 1881", "generate"]', ['4012 8888 8888 1881', 'generate'], 6], ['control ["2379421", "generate"]', ['2379421', 'generate'], 1], ['control ["23794217", "validate"]', ['23794217', 'validate'], False], ['control ["315720564", "generate"]', ['315720564', 'generate'], 2], ['control ["3157205642", "validate"]', ['3157205642', 'validate'], True], ['control ["9034129563", "generate"]', ['9034129563', 'generate'], 7]], [['regression ["572 4", "validate"]', ['572 4', 'validate'], True], ['regression ["12 34 56", "generate"]', ['12 34 56', 'generate'], 6], ['partial-repair ["4012 8888 8888 1881", "generate"]', ['4012 8888 8888 1881', 'generate'], 6], ['control ["90341295635", "validate"]', ['90341295635', 'validate'], False], ['control ["7689245619132", "generate"]', ['7689245619132', 'generate'], 9], ['control ["76892456191326", "validate"]', ['76892456191326', 'validate'], False], ['control ["572", "generate"]', ['572', 'generate'], 4], ['control ["5724", "validate"]', ['5724', 'validate'], True]], [['regression ["572 4", "validate"]', ['572 4', 'validate'], True], ['regression ["12 34 56", "generate"]', ['12 34 56', 'generate'], 6], ['partial-repair ["4012 8888 8888 1881", "generate"]', ['4012 8888 8888 1881', 'generate'], 6], ['control ["5727", "validate"]', ['5727', 'validate'], False], ['control [" ", "generate"]', [' ', 'generate'], None], ['control ["1-2", "generate"]', ['1-2', 'generate'], None], ['control ["98", "generate"]', ['98', 'generate'], 5], ['control ["0", "validate"]', ['0', 'validate'], True]]]
for label, args, expected in fixtures[N - 1]:
check(label, 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 ["572 4", "validate"] | None | True | Failed |
| regression ["12 34 56", "generate"] | None | 6 | Failed |
| partial-repair ["4012 8888 8888 1881", "generate"] | None | 6 | Failed |
| control ["9", "generate"] | 2 | 2 | Passed |
| control ["97", "validate"] | False | False | Passed |
| control ["24", "generate"] | 1 | 1 | Passed |
| control ["249", "validate"] | False | False | Passed |
| control ["406", "generate"] | 3 | 3 | Passed |
SHA-256 / 19a48c52e429fa4bf50be6da90ee45426c202cdc371b828c6806bfe3cbc927ac
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(s, mode):
T = [[0,3,1,7,5,9,8,6,4,2],[7,0,9,2,1,5,4,8,6,3],[4,2,0,6,8,7,1,3,5,9],[1,7,5,0,9,8,3,4,2,6],[6,1,2,3,0,4,5,9,7,8],[3,6,7,4,2,0,9,5,8,1],[5,8,6,9,7,2,0,1,3,4],[8,9,4,5,3,6,2,0,1,7],[9,4,3,8,6,1,7,2,0,5],[2,5,8,1,4,3,6,7,9,0]]
t = s.replace(' ', '', 1)
if not t or not t.isascii() or not t.isdigit():
return None
interim = 0
for ch in t:
interim = T[interim][int(ch)]
if mode == 'generate':
return interim
return interim == 0
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression ["572 4", "validate"]', ['572 4', 'validate'], True], ['regression ["12 34 56", "generate"]', ['12 34 56', 'generate'], 6], ['partial-repair ["4012 8888 8888 1881", "generate"]', ['4012 8888 8888 1881', 'generate'], 6], ['control ["9", "generate"]', ['9', 'generate'], 2], ['control ["97", "validate"]', ['97', 'validate'], False], ['control ["24", "generate"]', ['24', 'generate'], 1], ['control ["249", "validate"]', ['249', 'validate'], False], ['control ["406", "generate"]', ['406', 'generate'], 3]], [['regression ["572 4", "validate"]', ['572 4', 'validate'], True], ['regression ["12 34 56", "generate"]', ['12 34 56', 'generate'], 6], ['partial-repair ["4012 8888 8888 1881", "generate"]', ['4012 8888 8888 1881', 'generate'], 6], ['control ["4060", "validate"]', ['4060', 'validate'], False], ['control ["7601", "generate"]', ['7601', 'generate'], 3], ['control ["76013", "validate"]', ['76013', 'validate'], True], ['control ["637005", "generate"]', ['637005', 'generate'], 2], ['control ["6370058", "validate"]', ['6370058', 'validate'], False]], [['regression ["572 4", "validate"]', ['572 4', 'validate'], True], ['regression ["12 34 56", "generate"]', ['12 34 56', 'generate'], 6], ['partial-repair ["4012 8888 8888 1881", "generate"]', ['4012 8888 8888 1881', 'generate'], 6], ['control ["2379421", "generate"]', ['2379421', 'generate'], 1], ['control ["23794217", "validate"]', ['23794217', 'validate'], False], ['control ["315720564", "generate"]', ['315720564', 'generate'], 2], ['control ["3157205642", "validate"]', ['3157205642', 'validate'], True], ['control ["9034129563", "generate"]', ['9034129563', 'generate'], 7]], [['regression ["572 4", "validate"]', ['572 4', 'validate'], True], ['regression ["12 34 56", "generate"]', ['12 34 56', 'generate'], 6], ['partial-repair ["4012 8888 8888 1881", "generate"]', ['4012 8888 8888 1881', 'generate'], 6], ['control ["90341295635", "validate"]', ['90341295635', 'validate'], False], ['control ["7689245619132", "generate"]', ['7689245619132', 'generate'], 9], ['control ["76892456191326", "validate"]', ['76892456191326', 'validate'], False], ['control ["572", "generate"]', ['572', 'generate'], 4], ['control ["5724", "validate"]', ['5724', 'validate'], True]], [['regression ["572 4", "validate"]', ['572 4', 'validate'], True], ['regression ["12 34 56", "generate"]', ['12 34 56', 'generate'], 6], ['partial-repair ["4012 8888 8888 1881", "generate"]', ['4012 8888 8888 1881', 'generate'], 6], ['control ["5727", "validate"]', ['5727', 'validate'], False], ['control [" ", "generate"]', [' ', 'generate'], None], ['control ["1-2", "generate"]', ['1-2', 'generate'], None], ['control ["98", "generate"]', ['98', 'generate'], 5], ['control ["0", "validate"]', ['0', 'validate'], True]]]
for label, args, expected in fixtures[N - 1]:
check(label, 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 ["572 4", "validate"] | True | True | Passed |
| regression ["12 34 56", "generate"] | None | 6 | Failed |
| partial-repair ["4012 8888 8888 1881", "generate"] | None | 6 | Failed |
| control ["9", "generate"] | 2 | 2 | Passed |
| control ["97", "validate"] | False | False | Passed |
| control ["24", "generate"] | 1 | 1 | Passed |
| control ["249", "validate"] | False | False | Passed |
| control ["406", "generate"] | 3 | 3 | Passed |
SHA-256 / c39645e1ec5c4fe79ee2e84f8d8405857ebe9942ded3128a6daa2bb63a80ca9b
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(s, mode):
T = [[0,3,1,7,5,9,8,6,4,2],[7,0,9,2,1,5,4,8,6,3],[4,2,0,6,8,7,1,3,5,9],[1,7,5,0,9,8,3,4,2,6],[6,1,2,3,0,4,5,9,7,8],[3,6,7,4,2,0,9,5,8,1],[5,8,6,9,7,2,0,1,3,4],[8,9,4,5,3,6,2,0,1,7],[9,4,3,8,6,1,7,2,0,5],[2,5,8,1,4,3,6,7,9,0]]
t = s.replace(' ', '')
if not t or not t.isascii() or not t.isdigit():
return None
interim = 0
for ch in t:
interim = T[interim][int(ch)]
if mode == 'generate':
return interim
return interim == 0
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression ["572 4", "validate"]', ['572 4', 'validate'], True], ['regression ["12 34 56", "generate"]', ['12 34 56', 'generate'], 6], ['partial-repair ["4012 8888 8888 1881", "generate"]', ['4012 8888 8888 1881', 'generate'], 6], ['control ["9", "generate"]', ['9', 'generate'], 2], ['control ["97", "validate"]', ['97', 'validate'], False], ['control ["24", "generate"]', ['24', 'generate'], 1], ['control ["249", "validate"]', ['249', 'validate'], False], ['control ["406", "generate"]', ['406', 'generate'], 3]], [['regression ["572 4", "validate"]', ['572 4', 'validate'], True], ['regression ["12 34 56", "generate"]', ['12 34 56', 'generate'], 6], ['partial-repair ["4012 8888 8888 1881", "generate"]', ['4012 8888 8888 1881', 'generate'], 6], ['control ["4060", "validate"]', ['4060', 'validate'], False], ['control ["7601", "generate"]', ['7601', 'generate'], 3], ['control ["76013", "validate"]', ['76013', 'validate'], True], ['control ["637005", "generate"]', ['637005', 'generate'], 2], ['control ["6370058", "validate"]', ['6370058', 'validate'], False]], [['regression ["572 4", "validate"]', ['572 4', 'validate'], True], ['regression ["12 34 56", "generate"]', ['12 34 56', 'generate'], 6], ['partial-repair ["4012 8888 8888 1881", "generate"]', ['4012 8888 8888 1881', 'generate'], 6], ['control ["2379421", "generate"]', ['2379421', 'generate'], 1], ['control ["23794217", "validate"]', ['23794217', 'validate'], False], ['control ["315720564", "generate"]', ['315720564', 'generate'], 2], ['control ["3157205642", "validate"]', ['3157205642', 'validate'], True], ['control ["9034129563", "generate"]', ['9034129563', 'generate'], 7]], [['regression ["572 4", "validate"]', ['572 4', 'validate'], True], ['regression ["12 34 56", "generate"]', ['12 34 56', 'generate'], 6], ['partial-repair ["4012 8888 8888 1881", "generate"]', ['4012 8888 8888 1881', 'generate'], 6], ['control ["90341295635", "validate"]', ['90341295635', 'validate'], False], ['control ["7689245619132", "generate"]', ['7689245619132', 'generate'], 9], ['control ["76892456191326", "validate"]', ['76892456191326', 'validate'], False], ['control ["572", "generate"]', ['572', 'generate'], 4], ['control ["5724", "validate"]', ['5724', 'validate'], True]], [['regression ["572 4", "validate"]', ['572 4', 'validate'], True], ['regression ["12 34 56", "generate"]', ['12 34 56', 'generate'], 6], ['partial-repair ["4012 8888 8888 1881", "generate"]', ['4012 8888 8888 1881', 'generate'], 6], ['control ["5727", "validate"]', ['5727', 'validate'], False], ['control [" ", "generate"]', [' ', 'generate'], None], ['control ["1-2", "generate"]', ['1-2', 'generate'], None], ['control ["98", "generate"]', ['98', 'generate'], 5], ['control ["0", "validate"]', ['0', 'validate'], True]]]
for label, args, expected in fixtures[N - 1]:
check(label, 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 ["572 4", "validate"] | True | True | Passed |
| regression ["12 34 56", "generate"] | 6 | 6 | Passed |
| partial-repair ["4012 8888 8888 1881", "generate"] | 6 | 6 | Passed |
| control ["9", "generate"] | 2 | 2 | Passed |
| control ["97", "validate"] | False | False | Passed |
| control ["24", "generate"] | 1 | 1 | Passed |
| control ["249", "validate"] | False | False | Passed |
| control ["406", "generate"] | 3 | 3 | Passed |
SHA-256 / d5224ce481d9fa3c9b155d914389ca070abddc8a166286cc8898841e55bbad7c
Verification & scope
A deterministic, bounded teaching model of the named scheme under the stated contract; not a certified validator. 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:48:38.393361+00:00.
Case digest / 68a52e98217979ef251c78fed6d8797052c966421cf2a9133fc41c7affdbcf11