FAILURE MAP
← Case archive

FA-72576 / Check-digit algorithms / Open access

MOD 11,10 emits ten as a check digit · case 01

Some payloads receive a two-digit check value.

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

ROOT CAUSE

The final step returns 11 - p without reducing mod 10.

VERIFIED REPAIR

Return (11 - p) % 10 so p = 1 yields 0.

Unsuccessful approach: Using (10 - p) % 10 shifts every check digit by one.

Case contract

ISO 7064 MOD 11,10 hybrid check digit generation for a nonempty ASCII digit payload (else None). Start with p = 10; for each digit p = ((p + d) mod 10, with 0 replaced by 10) * 2 mod 11; the check digit is (11 - p) mod 10.

Why this case matters

Tax and personal identification numbers (for example OIB-style identifiers) use the hybrid MOD 11,10 system.

1 / The failure

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(s):
    if not s or not s.isascii() or not s.isdigit():
        return None
    p = 10
    for ch in s:
        p = ((p + int(ch)) % 10 or 10) * 2 % 11
    return 11 - p
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression ["6943515153"]', ['6943515153'], 0], ['regression ["00000"]', ['00000'], 0], ['partial-repair ["9"]', ['9'], 4], ['partial-repair ["12"]', ['12'], 3], ['control [""]', [''], None], ['control ["12a"]', ['12a'], None], ['control ["072"]', ['072'], 5], ['control ["36073"]', ['36073'], 5]], [['regression ["00000"]', ['00000'], 0], ['regression ["6943515153"]', ['6943515153'], 0], ['partial-repair ["36073"]', ['36073'], 5], ['partial-repair ["98772300"]', ['98772300'], 4], ['control ["12a"]', ['12a'], None], ['control [""]', [''], None], ['control ["2638206592"]', ['2638206592'], 8], ['control ["412595035658"]', ['412595035658'], 9]], [['regression ["6943515153"]', ['6943515153'], 0], ['regression ["00000"]', ['00000'], 0], ['partial-repair ["6279939841"]', ['6279939841'], 2], ['partial-repair ["2638206592"]', ['2638206592'], 8], ['control [""]', [''], None], ['control ["12a"]', ['12a'], None], ['control ["9795751"]', ['9795751'], 6], ['control ["0"]', ['0'], 2]], [['regression ["00000"]', ['00000'], 0], ['regression ["6943515153"]', ['6943515153'], 0], ['partial-repair ["0227566323850846"]', ['0227566323850846'], 4], ['partial-repair ["9477"]', ['9477'], 3], ['control ["12a"]', ['12a'], None], ['control [""]', [''], None], ['control ["3"]', ['3'], 5], ['control ["95"]', ['95'], 7]], [['regression ["6943515153"]', ['6943515153'], 0], ['regression ["00000"]', ['00000'], 0], ['partial-repair ["9795751"]', ['9795751'], 6], ['control [""]', [''], None], ['control ["12a"]', ['12a'], None], ['control ["9"]', ['9'], 4], ['control ["12"]', ['12'], 3], ['control ["072"]', ['072'], 5]]]
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 ["6943515153"]100Failed
regression ["00000"]100Failed
partial-repair ["9"]44Passed
partial-repair ["12"]33Passed
control [""]NoneNonePassed
control ["12a"]NoneNonePassed
control ["072"]55Passed
control ["36073"]55Passed

SHA-256 / 13ff8ec0bb7c284b06e8919e2a5795c16c08d9f9fbae20440178c98413d50d2f

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(s):
    if not s or not s.isascii() or not s.isdigit():
        return None
    p = 10
    for ch in s:
        p = ((p + int(ch)) % 10 or 10) * 2 % 11
    return (10 - p) % 10
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression ["6943515153"]', ['6943515153'], 0], ['regression ["00000"]', ['00000'], 0], ['partial-repair ["9"]', ['9'], 4], ['partial-repair ["12"]', ['12'], 3], ['control [""]', [''], None], ['control ["12a"]', ['12a'], None], ['control ["072"]', ['072'], 5], ['control ["36073"]', ['36073'], 5]], [['regression ["00000"]', ['00000'], 0], ['regression ["6943515153"]', ['6943515153'], 0], ['partial-repair ["36073"]', ['36073'], 5], ['partial-repair ["98772300"]', ['98772300'], 4], ['control ["12a"]', ['12a'], None], ['control [""]', [''], None], ['control ["2638206592"]', ['2638206592'], 8], ['control ["412595035658"]', ['412595035658'], 9]], [['regression ["6943515153"]', ['6943515153'], 0], ['regression ["00000"]', ['00000'], 0], ['partial-repair ["6279939841"]', ['6279939841'], 2], ['partial-repair ["2638206592"]', ['2638206592'], 8], ['control [""]', [''], None], ['control ["12a"]', ['12a'], None], ['control ["9795751"]', ['9795751'], 6], ['control ["0"]', ['0'], 2]], [['regression ["00000"]', ['00000'], 0], ['regression ["6943515153"]', ['6943515153'], 0], ['partial-repair ["0227566323850846"]', ['0227566323850846'], 4], ['partial-repair ["9477"]', ['9477'], 3], ['control ["12a"]', ['12a'], None], ['control [""]', [''], None], ['control ["3"]', ['3'], 5], ['control ["95"]', ['95'], 7]], [['regression ["6943515153"]', ['6943515153'], 0], ['regression ["00000"]', ['00000'], 0], ['partial-repair ["9795751"]', ['9795751'], 6], ['control [""]', [''], None], ['control ["12a"]', ['12a'], None], ['control ["9"]', ['9'], 4], ['control ["12"]', ['12'], 3], ['control ["072"]', ['072'], 5]]]
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 ["6943515153"]90Failed
regression ["00000"]90Failed
partial-repair ["9"]34Failed
partial-repair ["12"]23Failed
control [""]NoneNonePassed
control ["12a"]NoneNonePassed
control ["072"]45Failed
control ["36073"]45Failed

SHA-256 / 76dcd817145f888854c9b29e8d2c3b30fdd8230b09b661f7ee5a6e8bfee508b3

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(s):
    if not s or not s.isascii() or not s.isdigit():
        return None
    p = 10
    for ch in s:
        p = ((p + int(ch)) % 10 or 10) * 2 % 11
    return (11 - p) % 10
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression ["6943515153"]', ['6943515153'], 0], ['regression ["00000"]', ['00000'], 0], ['partial-repair ["9"]', ['9'], 4], ['partial-repair ["12"]', ['12'], 3], ['control [""]', [''], None], ['control ["12a"]', ['12a'], None], ['control ["072"]', ['072'], 5], ['control ["36073"]', ['36073'], 5]], [['regression ["00000"]', ['00000'], 0], ['regression ["6943515153"]', ['6943515153'], 0], ['partial-repair ["36073"]', ['36073'], 5], ['partial-repair ["98772300"]', ['98772300'], 4], ['control ["12a"]', ['12a'], None], ['control [""]', [''], None], ['control ["2638206592"]', ['2638206592'], 8], ['control ["412595035658"]', ['412595035658'], 9]], [['regression ["6943515153"]', ['6943515153'], 0], ['regression ["00000"]', ['00000'], 0], ['partial-repair ["6279939841"]', ['6279939841'], 2], ['partial-repair ["2638206592"]', ['2638206592'], 8], ['control [""]', [''], None], ['control ["12a"]', ['12a'], None], ['control ["9795751"]', ['9795751'], 6], ['control ["0"]', ['0'], 2]], [['regression ["00000"]', ['00000'], 0], ['regression ["6943515153"]', ['6943515153'], 0], ['partial-repair ["0227566323850846"]', ['0227566323850846'], 4], ['partial-repair ["9477"]', ['9477'], 3], ['control ["12a"]', ['12a'], None], ['control [""]', [''], None], ['control ["3"]', ['3'], 5], ['control ["95"]', ['95'], 7]], [['regression ["6943515153"]', ['6943515153'], 0], ['regression ["00000"]', ['00000'], 0], ['partial-repair ["9795751"]', ['9795751'], 6], ['control [""]', [''], None], ['control ["12a"]', ['12a'], None], ['control ["9"]', ['9'], 4], ['control ["12"]', ['12'], 3], ['control ["072"]', ['072'], 5]]]
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 ["6943515153"]00Passed
regression ["00000"]00Passed
partial-repair ["9"]44Passed
partial-repair ["12"]33Passed
control [""]NoneNonePassed
control ["12a"]NoneNonePassed
control ["072"]55Passed
control ["36073"]55Passed

SHA-256 / 9f44de55e6ad826383dcd63b1c43dd16d92b9dbbce015db6ba010ba5ba649aea

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:39.730969+00:00.

Case digest / 0ab5aa38d9515c66f2d74dc501daa8d1447f00223cf3549572e3955b37a5aef0