FA-72406 / Check-digit algorithms / Open access
Damm looks up the digit row instead of the interim row · case 01
Most generated check digits disagree with the Damm reference.
ROOT CAUSE
The step uses T[digit][interim]; the quasigroup is not commutative, so the operands are swapped.
VERIFIED REPAIR
Index the table as T[interim][digit].
Unsuccessful approach: Starting from the first digit instead of 0 keeps the swapped lookup semantics hidden only for some inputs.
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.replace(' ', '')
if not t or not t.isascii() or not t.isdigit():
return None
interim = 0
for ch in t:
interim = T[int(ch)][interim]
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 ["24", "generate"]', ['24', 'generate'], 1], ['regression ["7601", "generate"]', ['7601', 'generate'], 3], ['partial-repair ["9", "generate"]', ['9', 'generate'], 2], ['control ["97", "validate"]', ['97', 'validate'], False], ['control ["249", "validate"]', ['249', 'validate'], False], ['control ["6370058", "validate"]', ['6370058', 'validate'], False], ['control ["23794217", "validate"]', ['23794217', 'validate'], False], ['control ["90341295635", "validate"]', ['90341295635', 'validate'], False]], [['regression ["637005", "generate"]', ['637005', 'generate'], 2], ['regression ["2379421", "generate"]', ['2379421', 'generate'], 1], ['partial-repair ["4060", "validate"]', ['4060', 'validate'], False], ['partial-repair ["7601", "generate"]', ['7601', 'generate'], 3], ['control [" ", "generate"]', [' ', 'generate'], None], ['control ["1-2", "generate"]', ['1-2', 'generate'], None], ['control ["0", "validate"]', ['0', 'validate'], True], ['control ["97", "validate"]', ['97', 'validate'], False]], [['regression ["3157205642", "validate"]', ['3157205642', 'validate'], True], ['regression ["9034129563", "generate"]', ['9034129563', 'generate'], 7], ['partial-repair ["637005", "generate"]', ['637005', 'generate'], 2], ['partial-repair ["2379421", "generate"]', ['2379421', 'generate'], 1], ['control ["6370058", "validate"]', ['6370058', 'validate'], False], ['control ["23794217", "validate"]', ['23794217', 'validate'], False], ['control ["90341295635", "validate"]', ['90341295635', 'validate'], False], ['control [" ", "generate"]', [' ', 'generate'], None]], [['regression ["76892456191326", "validate"]', ['76892456191326', 'validate'], False], ['regression ["572", "generate"]', ['572', 'generate'], 4], ['partial-repair ["3157205642", "validate"]', ['3157205642', 'validate'], True], ['partial-repair ["9034129563", "generate"]', ['9034129563', 'generate'], 7], ['control ["0", "validate"]', ['0', 'validate'], True], ['control ["97", "validate"]', ['97', 'validate'], False], ['control ["249", "validate"]', ['249', 'validate'], False], ['control ["6370058", "validate"]', ['6370058', 'validate'], False]], [['regression ["5727", "validate"]', ['5727', 'validate'], False], ['regression ["572 4", "validate"]', ['572 4', 'validate'], True], ['partial-repair ["572", "generate"]', ['572', 'generate'], 4], ['partial-repair ["5724", "validate"]', ['5724', 'validate'], True], ['control ["90341295635", "validate"]', ['90341295635', 'validate'], False], ['control [" ", "generate"]', [' ', 'generate'], None], ['control ["1-2", "generate"]', ['1-2', 'generate'], None], ['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 ["24", "generate"] | 0 | 1 | Failed |
| regression ["7601", "generate"] | 8 | 3 | Failed |
| partial-repair ["9", "generate"] | 2 | 2 | Passed |
| control ["97", "validate"] | False | False | Passed |
| control ["249", "validate"] | False | False | Passed |
| control ["6370058", "validate"] | False | False | Passed |
| control ["23794217", "validate"] | False | False | Passed |
| control ["90341295635", "validate"] | False | False | Passed |
SHA-256 / 241121c11e8e151bf9a936a03b4e527cea5d39e6bd65911c214748bd98ba70a0
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(' ', '')
if not t or not t.isascii() or not t.isdigit():
return None
interim = int(t[0])
for ch in t[1:]:
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 ["24", "generate"]', ['24', 'generate'], 1], ['regression ["7601", "generate"]', ['7601', 'generate'], 3], ['partial-repair ["9", "generate"]', ['9', 'generate'], 2], ['control ["97", "validate"]', ['97', 'validate'], False], ['control ["249", "validate"]', ['249', 'validate'], False], ['control ["6370058", "validate"]', ['6370058', 'validate'], False], ['control ["23794217", "validate"]', ['23794217', 'validate'], False], ['control ["90341295635", "validate"]', ['90341295635', 'validate'], False]], [['regression ["637005", "generate"]', ['637005', 'generate'], 2], ['regression ["2379421", "generate"]', ['2379421', 'generate'], 1], ['partial-repair ["4060", "validate"]', ['4060', 'validate'], False], ['partial-repair ["7601", "generate"]', ['7601', 'generate'], 3], ['control [" ", "generate"]', [' ', 'generate'], None], ['control ["1-2", "generate"]', ['1-2', 'generate'], None], ['control ["0", "validate"]', ['0', 'validate'], True], ['control ["97", "validate"]', ['97', 'validate'], False]], [['regression ["3157205642", "validate"]', ['3157205642', 'validate'], True], ['regression ["9034129563", "generate"]', ['9034129563', 'generate'], 7], ['partial-repair ["637005", "generate"]', ['637005', 'generate'], 2], ['partial-repair ["2379421", "generate"]', ['2379421', 'generate'], 1], ['control ["6370058", "validate"]', ['6370058', 'validate'], False], ['control ["23794217", "validate"]', ['23794217', 'validate'], False], ['control ["90341295635", "validate"]', ['90341295635', 'validate'], False], ['control [" ", "generate"]', [' ', 'generate'], None]], [['regression ["76892456191326", "validate"]', ['76892456191326', 'validate'], False], ['regression ["572", "generate"]', ['572', 'generate'], 4], ['partial-repair ["3157205642", "validate"]', ['3157205642', 'validate'], True], ['partial-repair ["9034129563", "generate"]', ['9034129563', 'generate'], 7], ['control ["0", "validate"]', ['0', 'validate'], True], ['control ["97", "validate"]', ['97', 'validate'], False], ['control ["249", "validate"]', ['249', 'validate'], False], ['control ["6370058", "validate"]', ['6370058', 'validate'], False]], [['regression ["5727", "validate"]', ['5727', 'validate'], False], ['regression ["572 4", "validate"]', ['572 4', 'validate'], True], ['partial-repair ["572", "generate"]', ['572', 'generate'], 4], ['partial-repair ["5724", "validate"]', ['5724', 'validate'], True], ['control ["90341295635", "validate"]', ['90341295635', 'validate'], False], ['control [" ", "generate"]', [' ', 'generate'], None], ['control ["1-2", "generate"]', ['1-2', 'generate'], None], ['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 ["24", "generate"] | 8 | 1 | Failed |
| regression ["7601", "generate"] | 1 | 3 | Failed |
| partial-repair ["9", "generate"] | 9 | 2 | Failed |
| control ["97", "validate"] | False | False | Passed |
| control ["249", "validate"] | False | False | Passed |
| control ["6370058", "validate"] | False | False | Passed |
| control ["23794217", "validate"] | False | False | Passed |
| control ["90341295635", "validate"] | False | False | Passed |
SHA-256 / 4776dda2d196fe38fbc3377c33d9d57e2982bd48f0e819b164b935cae718e8ee
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 ["24", "generate"]', ['24', 'generate'], 1], ['regression ["7601", "generate"]', ['7601', 'generate'], 3], ['partial-repair ["9", "generate"]', ['9', 'generate'], 2], ['control ["97", "validate"]', ['97', 'validate'], False], ['control ["249", "validate"]', ['249', 'validate'], False], ['control ["6370058", "validate"]', ['6370058', 'validate'], False], ['control ["23794217", "validate"]', ['23794217', 'validate'], False], ['control ["90341295635", "validate"]', ['90341295635', 'validate'], False]], [['regression ["637005", "generate"]', ['637005', 'generate'], 2], ['regression ["2379421", "generate"]', ['2379421', 'generate'], 1], ['partial-repair ["4060", "validate"]', ['4060', 'validate'], False], ['partial-repair ["7601", "generate"]', ['7601', 'generate'], 3], ['control [" ", "generate"]', [' ', 'generate'], None], ['control ["1-2", "generate"]', ['1-2', 'generate'], None], ['control ["0", "validate"]', ['0', 'validate'], True], ['control ["97", "validate"]', ['97', 'validate'], False]], [['regression ["3157205642", "validate"]', ['3157205642', 'validate'], True], ['regression ["9034129563", "generate"]', ['9034129563', 'generate'], 7], ['partial-repair ["637005", "generate"]', ['637005', 'generate'], 2], ['partial-repair ["2379421", "generate"]', ['2379421', 'generate'], 1], ['control ["6370058", "validate"]', ['6370058', 'validate'], False], ['control ["23794217", "validate"]', ['23794217', 'validate'], False], ['control ["90341295635", "validate"]', ['90341295635', 'validate'], False], ['control [" ", "generate"]', [' ', 'generate'], None]], [['regression ["76892456191326", "validate"]', ['76892456191326', 'validate'], False], ['regression ["572", "generate"]', ['572', 'generate'], 4], ['partial-repair ["3157205642", "validate"]', ['3157205642', 'validate'], True], ['partial-repair ["9034129563", "generate"]', ['9034129563', 'generate'], 7], ['control ["0", "validate"]', ['0', 'validate'], True], ['control ["97", "validate"]', ['97', 'validate'], False], ['control ["249", "validate"]', ['249', 'validate'], False], ['control ["6370058", "validate"]', ['6370058', 'validate'], False]], [['regression ["5727", "validate"]', ['5727', 'validate'], False], ['regression ["572 4", "validate"]', ['572 4', 'validate'], True], ['partial-repair ["572", "generate"]', ['572', 'generate'], 4], ['partial-repair ["5724", "validate"]', ['5724', 'validate'], True], ['control ["90341295635", "validate"]', ['90341295635', 'validate'], False], ['control [" ", "generate"]', [' ', 'generate'], None], ['control ["1-2", "generate"]', ['1-2', 'generate'], None], ['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 ["24", "generate"] | 1 | 1 | Passed |
| regression ["7601", "generate"] | 3 | 3 | Passed |
| partial-repair ["9", "generate"] | 2 | 2 | Passed |
| control ["97", "validate"] | False | False | Passed |
| control ["249", "validate"] | False | False | Passed |
| control ["6370058", "validate"] | False | False | Passed |
| control ["23794217", "validate"] | False | False | Passed |
| control ["90341295635", "validate"] | False | False | Passed |
SHA-256 / 89ccf3823d56f3a5464d3b9ba9e4147b5887d06f52729440395109520c974dd5
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.270660+00:00.
Case digest / 945d6fd96ff7cf2d234dfb61426ae0b6fd59461f169c44756f0fd955e4922a81