FAILURE MAP
← Case archive

FA-72416 / Check-digit algorithms / Open access

Damm rejects space-grouped references · case 01

References printed in groups of digits return None.

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

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 fixtureActualExpectedOutcome
regression ["572 4", "validate"]NoneTrueFailed
regression ["12 34 56", "generate"]None6Failed
partial-repair ["4012 8888 8888 1881", "generate"]None6Failed
control ["9", "generate"]22Passed
control ["97", "validate"]FalseFalsePassed
control ["24", "generate"]11Passed
control ["249", "validate"]FalseFalsePassed
control ["406", "generate"]33Passed

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 fixtureActualExpectedOutcome
regression ["572 4", "validate"]TrueTruePassed
regression ["12 34 56", "generate"]None6Failed
partial-repair ["4012 8888 8888 1881", "generate"]None6Failed
control ["9", "generate"]22Passed
control ["97", "validate"]FalseFalsePassed
control ["24", "generate"]11Passed
control ["249", "validate"]FalseFalsePassed
control ["406", "generate"]33Passed

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 fixtureActualExpectedOutcome
regression ["572 4", "validate"]TrueTruePassed
regression ["12 34 56", "generate"]66Passed
partial-repair ["4012 8888 8888 1881", "generate"]66Passed
control ["9", "generate"]22Passed
control ["97", "validate"]FalseFalsePassed
control ["24", "generate"]11Passed
control ["249", "validate"]FalseFalsePassed
control ["406", "generate"]33Passed

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