FAILURE MAP
← Case archive

FA-72411 / Check-digit algorithms / Open access

Damm processes digits right to left · case 01

Check digits only match for palindromic payloads.

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

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 fixtureActualExpectedOutcome
regression ["24", "generate"]71Failed
regression ["406", "generate"]43Failed
control ["9", "generate"]22Passed
control ["97", "validate"]FalseFalsePassed
control ["249", "validate"]FalseFalsePassed
control ["4060", "validate"]FalseFalsePassed
control ["6370058", "validate"]FalseFalsePassed
control ["23794217", "validate"]FalseFalsePassed

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 fixtureActualExpectedOutcome
regression ["24", "generate"]71Failed
regression ["406", "generate"]23Failed
control ["9", "generate"]22Passed
control ["97", "validate"]FalseFalsePassed
control ["249", "validate"]FalseFalsePassed
control ["4060", "validate"]FalseFalsePassed
control ["6370058", "validate"]FalseFalsePassed
control ["23794217", "validate"]FalseFalsePassed

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

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