FAILURE MAP
← Case archive

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.

Verified by executionVariant 1 · 8 checks per implementationDownload source bundle ↓JSON ↗

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 fixtureActualExpectedOutcome
regression ["24", "generate"]01Failed
regression ["7601", "generate"]83Failed
partial-repair ["9", "generate"]22Passed
control ["97", "validate"]FalseFalsePassed
control ["249", "validate"]FalseFalsePassed
control ["6370058", "validate"]FalseFalsePassed
control ["23794217", "validate"]FalseFalsePassed
control ["90341295635", "validate"]FalseFalsePassed

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 fixtureActualExpectedOutcome
regression ["24", "generate"]81Failed
regression ["7601", "generate"]13Failed
partial-repair ["9", "generate"]92Failed
control ["97", "validate"]FalseFalsePassed
control ["249", "validate"]FalseFalsePassed
control ["6370058", "validate"]FalseFalsePassed
control ["23794217", "validate"]FalseFalsePassed
control ["90341295635", "validate"]FalseFalsePassed

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 fixtureActualExpectedOutcome
regression ["24", "generate"]11Passed
regression ["7601", "generate"]33Passed
partial-repair ["9", "generate"]22Passed
control ["97", "validate"]FalseFalsePassed
control ["249", "validate"]FalseFalsePassed
control ["6370058", "validate"]FalseFalsePassed
control ["23794217", "validate"]FalseFalsePassed
control ["90341295635", "validate"]FalseFalsePassed

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