FA-72411 / Check-digit algorithms / Open access
Damm processes digits right to left · case 01
Check digits only match for palindromic payloads.
ROOT CAUSE
The loop walks reversed(t), but Damm folds digits from the most significant end.
VERIFIED REPAIR
Iterate over the digits in their written order.
Unsuccessful approach: Reversing only the last two digits still reorders the fold.
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 reversed(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 ["406", "generate"]', ['406', 'generate'], 3], ['control ["9", "generate"]', ['9', 'generate'], 2], ['control ["97", "validate"]', ['97', 'validate'], False], ['control ["249", "validate"]', ['249', 'validate'], False], ['control ["4060", "validate"]', ['4060', 'validate'], False], ['control ["6370058", "validate"]', ['6370058', 'validate'], False], ['control ["23794217", "validate"]', ['23794217', 'validate'], False]], [['regression ["76013", "validate"]', ['76013', 'validate'], True], ['regression ["637005", "generate"]', ['637005', 'generate'], 2], ['control ["23794217", "validate"]', ['23794217', 'validate'], False], ['control ["90341295635", "validate"]', ['90341295635', 'validate'], False], ['control ["76892456191326", "validate"]', ['76892456191326', 'validate'], False], ['control ["5727", "validate"]', ['5727', 'validate'], False], ['control [" ", "generate"]', [' ', 'generate'], None], ['control ["1-2", "generate"]', ['1-2', 'generate'], None]], [['regression ["315720564", "generate"]', ['315720564', 'generate'], 2], ['regression ["3157205642", "validate"]', ['3157205642', 'validate'], True], ['control ["1-2", "generate"]', ['1-2', 'generate'], None], ['control ["0", "validate"]', ['0', 'validate'], True], ['control ["9", "generate"]', ['9', 'generate'], 2], ['control ["97", "validate"]', ['97', 'validate'], False], ['control ["249", "validate"]', ['249', 'validate'], False], ['control ["4060", "validate"]', ['4060', 'validate'], False]], [['regression ["7689245619132", "generate"]', ['7689245619132', 'generate'], 9], ['regression ["572", "generate"]', ['572', 'generate'], 4], ['control ["4060", "validate"]', ['4060', 'validate'], False], ['control ["6370058", "validate"]', ['6370058', 'validate'], False], ['control ["23794217", "validate"]', ['23794217', 'validate'], False], ['control ["90341295635", "validate"]', ['90341295635', 'validate'], False], ['control ["76892456191326", "validate"]', ['76892456191326', 'validate'], False], ['control ["5727", "validate"]', ['5727', 'validate'], False]], [['regression ["572 4", "validate"]', ['572 4', 'validate'], True], ['regression ["12 34 56", "generate"]', ['12 34 56', 'generate'], 6], ['control ["5727", "validate"]', ['5727', 'validate'], False], ['control [" ", "generate"]', [' ', 'generate'], None], ['control ["1-2", "generate"]', ['1-2', 'generate'], None], ['control ["0", "validate"]', ['0', 'validate'], True], ['control ["9", "generate"]', ['9', 'generate'], 2], ['control ["97", "validate"]', ['97', 'validate'], False]]]
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"] | 7 | 1 | Failed |
| regression ["406", "generate"] | 4 | 3 | Failed |
| control ["9", "generate"] | 2 | 2 | Passed |
| control ["97", "validate"] | False | False | Passed |
| control ["249", "validate"] | False | False | Passed |
| control ["4060", "validate"] | False | False | Passed |
| control ["6370058", "validate"] | False | False | Passed |
| control ["23794217", "validate"] | False | False | Passed |
SHA-256 / ccfe07099a1e12fe621ee8a93f00b884a9a434516dbfad5de5d889ce05f8b5c8
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 = 0
for ch in t[:-2] + t[-2:][::-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 ["406", "generate"]', ['406', 'generate'], 3], ['control ["9", "generate"]', ['9', 'generate'], 2], ['control ["97", "validate"]', ['97', 'validate'], False], ['control ["249", "validate"]', ['249', 'validate'], False], ['control ["4060", "validate"]', ['4060', 'validate'], False], ['control ["6370058", "validate"]', ['6370058', 'validate'], False], ['control ["23794217", "validate"]', ['23794217', 'validate'], False]], [['regression ["76013", "validate"]', ['76013', 'validate'], True], ['regression ["637005", "generate"]', ['637005', 'generate'], 2], ['control ["23794217", "validate"]', ['23794217', 'validate'], False], ['control ["90341295635", "validate"]', ['90341295635', 'validate'], False], ['control ["76892456191326", "validate"]', ['76892456191326', 'validate'], False], ['control ["5727", "validate"]', ['5727', 'validate'], False], ['control [" ", "generate"]', [' ', 'generate'], None], ['control ["1-2", "generate"]', ['1-2', 'generate'], None]], [['regression ["315720564", "generate"]', ['315720564', 'generate'], 2], ['regression ["3157205642", "validate"]', ['3157205642', 'validate'], True], ['control ["1-2", "generate"]', ['1-2', 'generate'], None], ['control ["0", "validate"]', ['0', 'validate'], True], ['control ["9", "generate"]', ['9', 'generate'], 2], ['control ["97", "validate"]', ['97', 'validate'], False], ['control ["249", "validate"]', ['249', 'validate'], False], ['control ["4060", "validate"]', ['4060', 'validate'], False]], [['regression ["7689245619132", "generate"]', ['7689245619132', 'generate'], 9], ['regression ["572", "generate"]', ['572', 'generate'], 4], ['control ["4060", "validate"]', ['4060', 'validate'], False], ['control ["6370058", "validate"]', ['6370058', 'validate'], False], ['control ["23794217", "validate"]', ['23794217', 'validate'], False], ['control ["90341295635", "validate"]', ['90341295635', 'validate'], False], ['control ["76892456191326", "validate"]', ['76892456191326', 'validate'], False], ['control ["5727", "validate"]', ['5727', 'validate'], False]], [['regression ["572 4", "validate"]', ['572 4', 'validate'], True], ['regression ["12 34 56", "generate"]', ['12 34 56', 'generate'], 6], ['control ["5727", "validate"]', ['5727', 'validate'], False], ['control [" ", "generate"]', [' ', 'generate'], None], ['control ["1-2", "generate"]', ['1-2', 'generate'], None], ['control ["0", "validate"]', ['0', 'validate'], True], ['control ["9", "generate"]', ['9', 'generate'], 2], ['control ["97", "validate"]', ['97', 'validate'], False]]]
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"] | 7 | 1 | Failed |
| regression ["406", "generate"] | 2 | 3 | Failed |
| control ["9", "generate"] | 2 | 2 | Passed |
| control ["97", "validate"] | False | False | Passed |
| control ["249", "validate"] | False | False | Passed |
| control ["4060", "validate"] | False | False | Passed |
| control ["6370058", "validate"] | False | False | Passed |
| control ["23794217", "validate"] | False | False | Passed |
SHA-256 / 88cac4161019b5dc4c7eb2f33b5af64aaaab85ade196a7816aa3bef73da639f6
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 ["406", "generate"]', ['406', 'generate'], 3], ['control ["9", "generate"]', ['9', 'generate'], 2], ['control ["97", "validate"]', ['97', 'validate'], False], ['control ["249", "validate"]', ['249', 'validate'], False], ['control ["4060", "validate"]', ['4060', 'validate'], False], ['control ["6370058", "validate"]', ['6370058', 'validate'], False], ['control ["23794217", "validate"]', ['23794217', 'validate'], False]], [['regression ["76013", "validate"]', ['76013', 'validate'], True], ['regression ["637005", "generate"]', ['637005', 'generate'], 2], ['control ["23794217", "validate"]', ['23794217', 'validate'], False], ['control ["90341295635", "validate"]', ['90341295635', 'validate'], False], ['control ["76892456191326", "validate"]', ['76892456191326', 'validate'], False], ['control ["5727", "validate"]', ['5727', 'validate'], False], ['control [" ", "generate"]', [' ', 'generate'], None], ['control ["1-2", "generate"]', ['1-2', 'generate'], None]], [['regression ["315720564", "generate"]', ['315720564', 'generate'], 2], ['regression ["3157205642", "validate"]', ['3157205642', 'validate'], True], ['control ["1-2", "generate"]', ['1-2', 'generate'], None], ['control ["0", "validate"]', ['0', 'validate'], True], ['control ["9", "generate"]', ['9', 'generate'], 2], ['control ["97", "validate"]', ['97', 'validate'], False], ['control ["249", "validate"]', ['249', 'validate'], False], ['control ["4060", "validate"]', ['4060', 'validate'], False]], [['regression ["7689245619132", "generate"]', ['7689245619132', 'generate'], 9], ['regression ["572", "generate"]', ['572', 'generate'], 4], ['control ["4060", "validate"]', ['4060', 'validate'], False], ['control ["6370058", "validate"]', ['6370058', 'validate'], False], ['control ["23794217", "validate"]', ['23794217', 'validate'], False], ['control ["90341295635", "validate"]', ['90341295635', 'validate'], False], ['control ["76892456191326", "validate"]', ['76892456191326', 'validate'], False], ['control ["5727", "validate"]', ['5727', 'validate'], False]], [['regression ["572 4", "validate"]', ['572 4', 'validate'], True], ['regression ["12 34 56", "generate"]', ['12 34 56', 'generate'], 6], ['control ["5727", "validate"]', ['5727', 'validate'], False], ['control [" ", "generate"]', [' ', 'generate'], None], ['control ["1-2", "generate"]', ['1-2', 'generate'], None], ['control ["0", "validate"]', ['0', 'validate'], True], ['control ["9", "generate"]', ['9', 'generate'], 2], ['control ["97", "validate"]', ['97', 'validate'], False]]]
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 ["406", "generate"] | 3 | 3 | Passed |
| control ["9", "generate"] | 2 | 2 | Passed |
| control ["97", "validate"] | False | False | Passed |
| control ["249", "validate"] | False | False | Passed |
| control ["4060", "validate"] | False | False | Passed |
| control ["6370058", "validate"] | False | False | Passed |
| control ["23794217", "validate"] | False | False | Passed |
SHA-256 / a3073219522e43892858eafdbb897f99e11c0d4d66843cf1056f15be5afa6f02
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.353272+00:00.
Case digest / e8abdbb4eccd36733370ac41d550b7b42b71953e389d4ae2011a1864bc29b886