FA-72586 / Check-digit algorithms / Open access
Resident ID maps the remainder straight to a digit · case 01
Check characters are wrong for all remainders except 10-to-X style coincidences.
ROOT CAUSE
The remainder indexes "0123456789X" instead of the scheme map "10X98765432".
VERIFIED REPAIR
Map remainder r to "10X98765432"[r].
Unsuccessful approach: Moving X to the end of the reversed map ("1098765432X") still misplaces three values.
Case contract
Check character of an 18-character resident identity number: seventeen ASCII digits followed by a digit or X (lowercase x accepted). Weights are 2^(17-i) mod 11 for 0-based i; the check character is "10X98765432"[sum % 11]. Return [check character, whether the 18th character matches case-insensitively].
Why this case matters
Account opening flows validate national identity numbers before identity verification.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(s):
if len(s) != 18 or not s.isascii() or not s[:17].isdigit():
return 'malformed'
total = sum(int(ch) * pow(2, 17 - i, 11) for i, ch in enumerate(s[:17]))
check = '0123456789X'[total % 11]
return [check, check == s[17].upper()]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression ["268310199103143528"]', ['268310199103143528'], ['9', False]], ['regression ["297547197007199229"]', ['297547197007199229'], ['2', False]], ['control ["11010519491231002"]', ['11010519491231002'], 'malformed'], ['control ["1101051949123100XX"]', ['1101051949123100XX'], 'malformed'], ['control ["518849198106269933"]', ['518849198106269933'], ['6', False]], ['control ["405799197903155930"]', ['405799197903155930'], ['7', False]], ['control ["445793197510028320"]', ['445793197510028320'], ['X', False]], ['control ["309071197409120443"]', ['309071197409120443'], ['3', True]]], [['regression ["445793197510028320"]', ['445793197510028320'], ['X', False]], ['regression ["309071197409120443"]', ['309071197409120443'], ['3', True]], ['partial-repair ["405799197903155930"]', ['405799197903155930'], ['7', False]], ['control ["1101051949123100XX"]', ['1101051949123100XX'], 'malformed'], ['control ["11010519491231002"]', ['11010519491231002'], 'malformed'], ['control ["458825200412201114"]', ['458825200412201114'], ['5', False]], ['control ["373498196811139070"]', ['373498196811139070'], ['5', False]], ['control ["18951819720314318X"]', ['18951819720314318X'], ['3', False]]], [['regression ["458825200412201114"]', ['458825200412201114'], ['5', False]], ['regression ["373498196811139070"]', ['373498196811139070'], ['5', False]], ['partial-repair ["594570196107138355"]', ['594570196107138355'], ['2', False]], ['control ["11010519491231002"]', ['11010519491231002'], 'malformed'], ['control ["1101051949123100XX"]', ['1101051949123100XX'], 'malformed'], ['control ["197110195609245785"]', ['197110195609245785'], ['6', False]], ['control ["37858219960314414X"]', ['37858219960314414X'], ['7', False]], ['control ["22100419730209591X"]', ['22100419730209591X'], ['4', False]]], [['regression ["50937819800315206x"]', ['50937819800315206x'], ['9', False]], ['regression ["600025197711283200"]', ['600025197711283200'], ['5', False]], ['partial-repair ["18951819720314318X"]', ['18951819720314318X'], ['3', False]], ['control ["1101051949123100XX"]', ['1101051949123100XX'], 'malformed'], ['control ["11010519491231002"]', ['11010519491231002'], 'malformed'], ['control ["261917197009053555"]', ['261917197009053555'], ['3', False]], ['control ["607248198301138071"]', ['607248198301138071'], ['9', False]], ['control ["148107199504128670"]', ['148107199504128670'], ['3', False]]], [['regression ["22100419730209591X"]', ['22100419730209591X'], ['4', False]], ['regression ["653847197508233493"]', ['653847197508233493'], ['2', False]], ['partial-repair ["197110195609245785"]', ['197110195609245785'], ['6', False]], ['partial-repair ["37858219960314414X"]', ['37858219960314414X'], ['7', False]], ['control ["11010519491231002"]', ['11010519491231002'], 'malformed'], ['control ["1101051949123100XX"]', ['1101051949123100XX'], 'malformed'], ['control ["11010519491231002X"]', ['11010519491231002X'], ['X', True]], ['control ["11010519491231002x"]', ['11010519491231002x'], ['X', 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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression ["268310199103143528"] | ['3', False] | ['9', False] | Failed |
| regression ["297547197007199229"] | ['X', False] | ['2', False] | Failed |
| control ["11010519491231002"] | malformed | malformed | Passed |
| control ["1101051949123100XX"] | malformed | malformed | Passed |
| control ["518849198106269933"] | ['6', False] | ['6', False] | Passed |
| control ["405799197903155930"] | ['5', False] | ['7', False] | Failed |
| control ["445793197510028320"] | ['2', False] | ['X', False] | Failed |
| control ["309071197409120443"] | ['9', False] | ['3', True] | Failed |
SHA-256 / ea2b914c77473276fae7ce280577dd81ffa6fa8633471bfe0c0acf8361f8420d
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(s):
if len(s) != 18 or not s.isascii() or not s[:17].isdigit():
return 'malformed'
total = sum(int(ch) * pow(2, 17 - i, 11) for i, ch in enumerate(s[:17]))
check = '1098765432X'[total % 11]
return [check, check == s[17].upper()]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression ["268310199103143528"]', ['268310199103143528'], ['9', False]], ['regression ["297547197007199229"]', ['297547197007199229'], ['2', False]], ['control ["11010519491231002"]', ['11010519491231002'], 'malformed'], ['control ["1101051949123100XX"]', ['1101051949123100XX'], 'malformed'], ['control ["518849198106269933"]', ['518849198106269933'], ['6', False]], ['control ["405799197903155930"]', ['405799197903155930'], ['7', False]], ['control ["445793197510028320"]', ['445793197510028320'], ['X', False]], ['control ["309071197409120443"]', ['309071197409120443'], ['3', True]]], [['regression ["445793197510028320"]', ['445793197510028320'], ['X', False]], ['regression ["309071197409120443"]', ['309071197409120443'], ['3', True]], ['partial-repair ["405799197903155930"]', ['405799197903155930'], ['7', False]], ['control ["1101051949123100XX"]', ['1101051949123100XX'], 'malformed'], ['control ["11010519491231002"]', ['11010519491231002'], 'malformed'], ['control ["458825200412201114"]', ['458825200412201114'], ['5', False]], ['control ["373498196811139070"]', ['373498196811139070'], ['5', False]], ['control ["18951819720314318X"]', ['18951819720314318X'], ['3', False]]], [['regression ["458825200412201114"]', ['458825200412201114'], ['5', False]], ['regression ["373498196811139070"]', ['373498196811139070'], ['5', False]], ['partial-repair ["594570196107138355"]', ['594570196107138355'], ['2', False]], ['control ["11010519491231002"]', ['11010519491231002'], 'malformed'], ['control ["1101051949123100XX"]', ['1101051949123100XX'], 'malformed'], ['control ["197110195609245785"]', ['197110195609245785'], ['6', False]], ['control ["37858219960314414X"]', ['37858219960314414X'], ['7', False]], ['control ["22100419730209591X"]', ['22100419730209591X'], ['4', False]]], [['regression ["50937819800315206x"]', ['50937819800315206x'], ['9', False]], ['regression ["600025197711283200"]', ['600025197711283200'], ['5', False]], ['partial-repair ["18951819720314318X"]', ['18951819720314318X'], ['3', False]], ['control ["1101051949123100XX"]', ['1101051949123100XX'], 'malformed'], ['control ["11010519491231002"]', ['11010519491231002'], 'malformed'], ['control ["261917197009053555"]', ['261917197009053555'], ['3', False]], ['control ["607248198301138071"]', ['607248198301138071'], ['9', False]], ['control ["148107199504128670"]', ['148107199504128670'], ['3', False]]], [['regression ["22100419730209591X"]', ['22100419730209591X'], ['4', False]], ['regression ["653847197508233493"]', ['653847197508233493'], ['2', False]], ['partial-repair ["197110195609245785"]', ['197110195609245785'], ['6', False]], ['partial-repair ["37858219960314414X"]', ['37858219960314414X'], ['7', False]], ['control ["11010519491231002"]', ['11010519491231002'], 'malformed'], ['control ["1101051949123100XX"]', ['1101051949123100XX'], 'malformed'], ['control ["11010519491231002X"]', ['11010519491231002X'], ['X', True]], ['control ["11010519491231002x"]', ['11010519491231002x'], ['X', 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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression ["268310199103143528"] | ['8', True] | ['9', False] | Failed |
| regression ["297547197007199229"] | ['X', False] | ['2', False] | Failed |
| control ["11010519491231002"] | malformed | malformed | Passed |
| control ["1101051949123100XX"] | malformed | malformed | Passed |
| control ["518849198106269933"] | ['5', False] | ['6', False] | Failed |
| control ["405799197903155930"] | ['6', False] | ['7', False] | Failed |
| control ["445793197510028320"] | ['9', False] | ['X', False] | Failed |
| control ["309071197409120443"] | ['2', False] | ['3', True] | Failed |
SHA-256 / 698b38e6c8226cc443e2e80e333a01ebfaf249376b7f079c3466b797e8b55020
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(s):
if len(s) != 18 or not s.isascii() or not s[:17].isdigit():
return 'malformed'
total = sum(int(ch) * pow(2, 17 - i, 11) for i, ch in enumerate(s[:17]))
check = '10X98765432'[total % 11]
return [check, check == s[17].upper()]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression ["268310199103143528"]', ['268310199103143528'], ['9', False]], ['regression ["297547197007199229"]', ['297547197007199229'], ['2', False]], ['control ["11010519491231002"]', ['11010519491231002'], 'malformed'], ['control ["1101051949123100XX"]', ['1101051949123100XX'], 'malformed'], ['control ["518849198106269933"]', ['518849198106269933'], ['6', False]], ['control ["405799197903155930"]', ['405799197903155930'], ['7', False]], ['control ["445793197510028320"]', ['445793197510028320'], ['X', False]], ['control ["309071197409120443"]', ['309071197409120443'], ['3', True]]], [['regression ["445793197510028320"]', ['445793197510028320'], ['X', False]], ['regression ["309071197409120443"]', ['309071197409120443'], ['3', True]], ['partial-repair ["405799197903155930"]', ['405799197903155930'], ['7', False]], ['control ["1101051949123100XX"]', ['1101051949123100XX'], 'malformed'], ['control ["11010519491231002"]', ['11010519491231002'], 'malformed'], ['control ["458825200412201114"]', ['458825200412201114'], ['5', False]], ['control ["373498196811139070"]', ['373498196811139070'], ['5', False]], ['control ["18951819720314318X"]', ['18951819720314318X'], ['3', False]]], [['regression ["458825200412201114"]', ['458825200412201114'], ['5', False]], ['regression ["373498196811139070"]', ['373498196811139070'], ['5', False]], ['partial-repair ["594570196107138355"]', ['594570196107138355'], ['2', False]], ['control ["11010519491231002"]', ['11010519491231002'], 'malformed'], ['control ["1101051949123100XX"]', ['1101051949123100XX'], 'malformed'], ['control ["197110195609245785"]', ['197110195609245785'], ['6', False]], ['control ["37858219960314414X"]', ['37858219960314414X'], ['7', False]], ['control ["22100419730209591X"]', ['22100419730209591X'], ['4', False]]], [['regression ["50937819800315206x"]', ['50937819800315206x'], ['9', False]], ['regression ["600025197711283200"]', ['600025197711283200'], ['5', False]], ['partial-repair ["18951819720314318X"]', ['18951819720314318X'], ['3', False]], ['control ["1101051949123100XX"]', ['1101051949123100XX'], 'malformed'], ['control ["11010519491231002"]', ['11010519491231002'], 'malformed'], ['control ["261917197009053555"]', ['261917197009053555'], ['3', False]], ['control ["607248198301138071"]', ['607248198301138071'], ['9', False]], ['control ["148107199504128670"]', ['148107199504128670'], ['3', False]]], [['regression ["22100419730209591X"]', ['22100419730209591X'], ['4', False]], ['regression ["653847197508233493"]', ['653847197508233493'], ['2', False]], ['partial-repair ["197110195609245785"]', ['197110195609245785'], ['6', False]], ['partial-repair ["37858219960314414X"]', ['37858219960314414X'], ['7', False]], ['control ["11010519491231002"]', ['11010519491231002'], 'malformed'], ['control ["1101051949123100XX"]', ['1101051949123100XX'], 'malformed'], ['control ["11010519491231002X"]', ['11010519491231002X'], ['X', True]], ['control ["11010519491231002x"]', ['11010519491231002x'], ['X', 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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression ["268310199103143528"] | ['9', False] | ['9', False] | Passed |
| regression ["297547197007199229"] | ['2', False] | ['2', False] | Passed |
| control ["11010519491231002"] | malformed | malformed | Passed |
| control ["1101051949123100XX"] | malformed | malformed | Passed |
| control ["518849198106269933"] | ['6', False] | ['6', False] | Passed |
| control ["405799197903155930"] | ['7', False] | ['7', False] | Passed |
| control ["445793197510028320"] | ['X', False] | ['X', False] | Passed |
| control ["309071197409120443"] | ['3', True] | ['3', True] | Passed |
SHA-256 / c00715277c14f5509e2843f67d21fdbcdef35dec71c152f10bbcf00db72635e8
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.772177+00:00.
Case digest / 14b70d63c9350f4ed6437207cf5d82cd57e8edba540f7eedd5fa68b377792d16