FA-72776 / Check-digit algorithms / Open access
LEI check is computed without the 00 placeholder · case 01
Nearly every generated LEI fails validation.
ROOT CAUSE
The number is formed from the prefix alone, so it is not shifted by two decimal places.
VERIFIED REPAIR
Append "00" to the prefix before converting and reducing mod 97.
Unsuccessful approach: Appending a single 0 shifts by only one decimal place.
Case contract
Generate ISO 17442 LEI check digits (ISO 7064 MOD 97-10): the 18-character alphanumeric prefix is upper-cased (other input returns None), "00" is appended, letters become 10..35, and the check is 98 - (number mod 97) written as exactly two digits. Return the 20-character LEI.
Why this case matters
Regulatory reporting tools assign and verify legal entity identifiers.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(prefix):
t = prefix.upper()
if len(t) != 18 or not t.isascii() or not t.isalnum():
return None
n = int(''.join(str(int(ch, 36)) for ch in t))
return t + '%02d' % (98 - n % 97)
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression ["NH4O4Q9HMI8RUJ0D6Y"]', ['NH4O4Q9HMI8RUJ0D6Y'], 'NH4O4Q9HMI8RUJ0D6Y73'], ['regression ["9K6IWOG7TS4VC3SHAM"]', ['9K6IWOG7TS4VC3SHAM'], '9K6IWOG7TS4VC3SHAM78'], ['control ["5493001KJTIIGC8Y1"]', ['5493001KJTIIGC8Y1'], None], ['control ["5493001KJTIIGC8Y1R-"]', ['5493001KJTIIGC8Y1R-'], None], ['control ["000000000000000000"]', ['000000000000000000'], '00000000000000000098'], ['control ["TD7FDXWKLVRV07ALBK"]', ['TD7FDXWKLVRV07ALBK'], 'TD7FDXWKLVRV07ALBK05'], ['control ["ACLPCCV3EGBW4QG3I6"]', ['ACLPCCV3EGBW4QG3I6'], 'ACLPCCV3EGBW4QG3I685'], ['control ["64WI551TBNLAZEBU15"]', ['64WI551TBNLAZEBU15'], '64WI551TBNLAZEBU1502']], [['regression ["TD7FDXWKLVRV07ALBK"]', ['TD7FDXWKLVRV07ALBK'], 'TD7FDXWKLVRV07ALBK05'], ['regression ["ACLPCCV3EGBW4QG3I6"]', ['ACLPCCV3EGBW4QG3I6'], 'ACLPCCV3EGBW4QG3I685'], ['control ["000000000000000000"]', ['000000000000000000'], '00000000000000000098'], ['control ["5493001KJTIIGC8Y1"]', ['5493001KJTIIGC8Y1'], None], ['control ["5493001KJTIIGC8Y1R-"]', ['5493001KJTIIGC8Y1R-'], None], ['control ["2G388X3WHEMWPIB3DO"]', ['2G388X3WHEMWPIB3DO'], '2G388X3WHEMWPIB3DO38'], ['control ["WYITG3CIA2EMN51FG8"]', ['WYITG3CIA2EMN51FG8'], 'WYITG3CIA2EMN51FG854'], ['control ["X22YG0E1MY8V7QUQUU"]', ['X22YG0E1MY8V7QUQUU'], 'X22YG0E1MY8V7QUQUU47']], [['regression ["II5XCIYZ03SDPPSQ7Z"]', ['II5XCIYZ03SDPPSQ7Z'], 'II5XCIYZ03SDPPSQ7Z30'], ['regression ["H6UNZ3Z93AZ7BYYPJC"]', ['H6UNZ3Z93AZ7BYYPJC'], 'H6UNZ3Z93AZ7BYYPJC84'], ['control ["5493001KJTIIGC8Y1R-"]', ['5493001KJTIIGC8Y1R-'], None], ['control ["000000000000000000"]', ['000000000000000000'], '00000000000000000098'], ['control ["5493001KJTIIGC8Y1"]', ['5493001KJTIIGC8Y1'], None], ['control ["2Y76WQMSKZ26SJ35YB"]', ['2Y76WQMSKZ26SJ35YB'], '2Y76WQMSKZ26SJ35YB12'], ['control ["CU3JXPUYQHVR22PKEM"]', ['CU3JXPUYQHVR22PKEM'], 'CU3JXPUYQHVR22PKEM49'], ['control ["EPXGBGA2NLNHRPYT3N"]', ['EPXGBGA2NLNHRPYT3N'], 'EPXGBGA2NLNHRPYT3N83']], [['regression ["WYITG3CIA2EMN51FG8"]', ['WYITG3CIA2EMN51FG8'], 'WYITG3CIA2EMN51FG854'], ['regression ["X22YG0E1MY8V7QUQUU"]', ['X22YG0E1MY8V7QUQUU'], 'X22YG0E1MY8V7QUQUU47'], ['control ["5493001KJTIIGC8Y1"]', ['5493001KJTIIGC8Y1'], None], ['control ["5493001KJTIIGC8Y1R-"]', ['5493001KJTIIGC8Y1R-'], None], ['control ["000000000000000000"]', ['000000000000000000'], '00000000000000000098'], ['control ["11H96GYM52SNV78B6G"]', ['11H96GYM52SNV78B6G'], '11H96GYM52SNV78B6G12'], ['control ["8WZS9XRTCO6DTNCKMU"]', ['8WZS9XRTCO6DTNCKMU'], '8WZS9XRTCO6DTNCKMU93'], ['control ["QBZJYTHC8GNQSKDJSD"]', ['QBZJYTHC8GNQSKDJSD'], 'QBZJYTHC8GNQSKDJSD15']], [['regression ["U6G55SH046WQ164I4P"]', ['U6G55SH046WQ164I4P'], 'U6G55SH046WQ164I4P20'], ['regression ["2Y76WQMSKZ26SJ35YB"]', ['2Y76WQMSKZ26SJ35YB'], '2Y76WQMSKZ26SJ35YB12'], ['control ["000000000000000000"]', ['000000000000000000'], '00000000000000000098'], ['control ["5493001KJTIIGC8Y1"]', ['5493001KJTIIGC8Y1'], None], ['control ["5493001KJTIIGC8Y1R-"]', ['5493001KJTIIGC8Y1R-'], None], ['control ["JA1SCUCU57DVVWD2MF"]', ['JA1SCUCU57DVVWD2MF'], 'JA1SCUCU57DVVWD2MF33'], ['control ["FUNIAT1L7171F0KBF9"]', ['FUNIAT1L7171F0KBF9'], 'FUNIAT1L7171F0KBF963'], ['control ["Z62YQ0YUTHLSESKG4A"]', ['Z62YQ0YUTHLSESKG4A'], 'Z62YQ0YUTHLSESKG4A79']]]
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 ["NH4O4Q9HMI8RUJ0D6Y"] | NH4O4Q9HMI8RUJ0D6Y25 | NH4O4Q9HMI8RUJ0D6Y73 | Failed |
| regression ["9K6IWOG7TS4VC3SHAM"] | 9K6IWOG7TS4VC3SHAM59 | 9K6IWOG7TS4VC3SHAM78 | Failed |
| control ["5493001KJTIIGC8Y1"] | None | None | Passed |
| control ["5493001KJTIIGC8Y1R-"] | None | None | Passed |
| control ["000000000000000000"] | 00000000000000000098 | 00000000000000000098 | Passed |
| control ["TD7FDXWKLVRV07ALBK"] | TD7FDXWKLVRV07ALBK67 | TD7FDXWKLVRV07ALBK05 | Failed |
| control ["ACLPCCV3EGBW4QG3I6"] | ACLPCCV3EGBW4QG3I629 | ACLPCCV3EGBW4QG3I685 | Failed |
| control ["64WI551TBNLAZEBU15"] | 64WI551TBNLAZEBU1566 | 64WI551TBNLAZEBU1502 | Failed |
SHA-256 / 4f81477bf6d6e1f4ce9d20dcb0eb0f2d735153787ae142f57fa9d3067b61511a
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(prefix):
t = prefix.upper()
if len(t) != 18 or not t.isascii() or not t.isalnum():
return None
n = int(''.join(str(int(ch, 36)) for ch in t + '0'))
return t + '%02d' % (98 - n % 97)
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression ["NH4O4Q9HMI8RUJ0D6Y"]', ['NH4O4Q9HMI8RUJ0D6Y'], 'NH4O4Q9HMI8RUJ0D6Y73'], ['regression ["9K6IWOG7TS4VC3SHAM"]', ['9K6IWOG7TS4VC3SHAM'], '9K6IWOG7TS4VC3SHAM78'], ['control ["5493001KJTIIGC8Y1"]', ['5493001KJTIIGC8Y1'], None], ['control ["5493001KJTIIGC8Y1R-"]', ['5493001KJTIIGC8Y1R-'], None], ['control ["000000000000000000"]', ['000000000000000000'], '00000000000000000098'], ['control ["TD7FDXWKLVRV07ALBK"]', ['TD7FDXWKLVRV07ALBK'], 'TD7FDXWKLVRV07ALBK05'], ['control ["ACLPCCV3EGBW4QG3I6"]', ['ACLPCCV3EGBW4QG3I6'], 'ACLPCCV3EGBW4QG3I685'], ['control ["64WI551TBNLAZEBU15"]', ['64WI551TBNLAZEBU15'], '64WI551TBNLAZEBU1502']], [['regression ["TD7FDXWKLVRV07ALBK"]', ['TD7FDXWKLVRV07ALBK'], 'TD7FDXWKLVRV07ALBK05'], ['regression ["ACLPCCV3EGBW4QG3I6"]', ['ACLPCCV3EGBW4QG3I6'], 'ACLPCCV3EGBW4QG3I685'], ['control ["000000000000000000"]', ['000000000000000000'], '00000000000000000098'], ['control ["5493001KJTIIGC8Y1"]', ['5493001KJTIIGC8Y1'], None], ['control ["5493001KJTIIGC8Y1R-"]', ['5493001KJTIIGC8Y1R-'], None], ['control ["2G388X3WHEMWPIB3DO"]', ['2G388X3WHEMWPIB3DO'], '2G388X3WHEMWPIB3DO38'], ['control ["WYITG3CIA2EMN51FG8"]', ['WYITG3CIA2EMN51FG8'], 'WYITG3CIA2EMN51FG854'], ['control ["X22YG0E1MY8V7QUQUU"]', ['X22YG0E1MY8V7QUQUU'], 'X22YG0E1MY8V7QUQUU47']], [['regression ["II5XCIYZ03SDPPSQ7Z"]', ['II5XCIYZ03SDPPSQ7Z'], 'II5XCIYZ03SDPPSQ7Z30'], ['regression ["H6UNZ3Z93AZ7BYYPJC"]', ['H6UNZ3Z93AZ7BYYPJC'], 'H6UNZ3Z93AZ7BYYPJC84'], ['control ["5493001KJTIIGC8Y1R-"]', ['5493001KJTIIGC8Y1R-'], None], ['control ["000000000000000000"]', ['000000000000000000'], '00000000000000000098'], ['control ["5493001KJTIIGC8Y1"]', ['5493001KJTIIGC8Y1'], None], ['control ["2Y76WQMSKZ26SJ35YB"]', ['2Y76WQMSKZ26SJ35YB'], '2Y76WQMSKZ26SJ35YB12'], ['control ["CU3JXPUYQHVR22PKEM"]', ['CU3JXPUYQHVR22PKEM'], 'CU3JXPUYQHVR22PKEM49'], ['control ["EPXGBGA2NLNHRPYT3N"]', ['EPXGBGA2NLNHRPYT3N'], 'EPXGBGA2NLNHRPYT3N83']], [['regression ["WYITG3CIA2EMN51FG8"]', ['WYITG3CIA2EMN51FG8'], 'WYITG3CIA2EMN51FG854'], ['regression ["X22YG0E1MY8V7QUQUU"]', ['X22YG0E1MY8V7QUQUU'], 'X22YG0E1MY8V7QUQUU47'], ['control ["5493001KJTIIGC8Y1"]', ['5493001KJTIIGC8Y1'], None], ['control ["5493001KJTIIGC8Y1R-"]', ['5493001KJTIIGC8Y1R-'], None], ['control ["000000000000000000"]', ['000000000000000000'], '00000000000000000098'], ['control ["11H96GYM52SNV78B6G"]', ['11H96GYM52SNV78B6G'], '11H96GYM52SNV78B6G12'], ['control ["8WZS9XRTCO6DTNCKMU"]', ['8WZS9XRTCO6DTNCKMU'], '8WZS9XRTCO6DTNCKMU93'], ['control ["QBZJYTHC8GNQSKDJSD"]', ['QBZJYTHC8GNQSKDJSD'], 'QBZJYTHC8GNQSKDJSD15']], [['regression ["U6G55SH046WQ164I4P"]', ['U6G55SH046WQ164I4P'], 'U6G55SH046WQ164I4P20'], ['regression ["2Y76WQMSKZ26SJ35YB"]', ['2Y76WQMSKZ26SJ35YB'], '2Y76WQMSKZ26SJ35YB12'], ['control ["000000000000000000"]', ['000000000000000000'], '00000000000000000098'], ['control ["5493001KJTIIGC8Y1"]', ['5493001KJTIIGC8Y1'], None], ['control ["5493001KJTIIGC8Y1R-"]', ['5493001KJTIIGC8Y1R-'], None], ['control ["JA1SCUCU57DVVWD2MF"]', ['JA1SCUCU57DVVWD2MF'], 'JA1SCUCU57DVVWD2MF33'], ['control ["FUNIAT1L7171F0KBF9"]', ['FUNIAT1L7171F0KBF9'], 'FUNIAT1L7171F0KBF963'], ['control ["Z62YQ0YUTHLSESKG4A"]', ['Z62YQ0YUTHLSESKG4A'], 'Z62YQ0YUTHLSESKG4A79']]]
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 ["NH4O4Q9HMI8RUJ0D6Y"] | NH4O4Q9HMI8RUJ0D6Y47 | NH4O4Q9HMI8RUJ0D6Y73 | Failed |
| regression ["9K6IWOG7TS4VC3SHAM"] | 9K6IWOG7TS4VC3SHAM96 | 9K6IWOG7TS4VC3SHAM78 | Failed |
| control ["5493001KJTIIGC8Y1"] | None | None | Passed |
| control ["5493001KJTIIGC8Y1R-"] | None | None | Passed |
| control ["000000000000000000"] | 00000000000000000098 | 00000000000000000098 | Passed |
| control ["TD7FDXWKLVRV07ALBK"] | TD7FDXWKLVRV07ALBK79 | TD7FDXWKLVRV07ALBK05 | Failed |
| control ["ACLPCCV3EGBW4QG3I6"] | ACLPCCV3EGBW4QG3I687 | ACLPCCV3EGBW4QG3I685 | Failed |
| control ["64WI551TBNLAZEBU15"] | 64WI551TBNLAZEBU1569 | 64WI551TBNLAZEBU1502 | Failed |
SHA-256 / 86d872bc2bf9834246c74fd572cec82e156037ed628f3cae20c8cc567d74c6af
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(prefix):
t = prefix.upper()
if len(t) != 18 or not t.isascii() or not t.isalnum():
return None
n = int(''.join(str(int(ch, 36)) for ch in t + '00'))
return t + '%02d' % (98 - n % 97)
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression ["NH4O4Q9HMI8RUJ0D6Y"]', ['NH4O4Q9HMI8RUJ0D6Y'], 'NH4O4Q9HMI8RUJ0D6Y73'], ['regression ["9K6IWOG7TS4VC3SHAM"]', ['9K6IWOG7TS4VC3SHAM'], '9K6IWOG7TS4VC3SHAM78'], ['control ["5493001KJTIIGC8Y1"]', ['5493001KJTIIGC8Y1'], None], ['control ["5493001KJTIIGC8Y1R-"]', ['5493001KJTIIGC8Y1R-'], None], ['control ["000000000000000000"]', ['000000000000000000'], '00000000000000000098'], ['control ["TD7FDXWKLVRV07ALBK"]', ['TD7FDXWKLVRV07ALBK'], 'TD7FDXWKLVRV07ALBK05'], ['control ["ACLPCCV3EGBW4QG3I6"]', ['ACLPCCV3EGBW4QG3I6'], 'ACLPCCV3EGBW4QG3I685'], ['control ["64WI551TBNLAZEBU15"]', ['64WI551TBNLAZEBU15'], '64WI551TBNLAZEBU1502']], [['regression ["TD7FDXWKLVRV07ALBK"]', ['TD7FDXWKLVRV07ALBK'], 'TD7FDXWKLVRV07ALBK05'], ['regression ["ACLPCCV3EGBW4QG3I6"]', ['ACLPCCV3EGBW4QG3I6'], 'ACLPCCV3EGBW4QG3I685'], ['control ["000000000000000000"]', ['000000000000000000'], '00000000000000000098'], ['control ["5493001KJTIIGC8Y1"]', ['5493001KJTIIGC8Y1'], None], ['control ["5493001KJTIIGC8Y1R-"]', ['5493001KJTIIGC8Y1R-'], None], ['control ["2G388X3WHEMWPIB3DO"]', ['2G388X3WHEMWPIB3DO'], '2G388X3WHEMWPIB3DO38'], ['control ["WYITG3CIA2EMN51FG8"]', ['WYITG3CIA2EMN51FG8'], 'WYITG3CIA2EMN51FG854'], ['control ["X22YG0E1MY8V7QUQUU"]', ['X22YG0E1MY8V7QUQUU'], 'X22YG0E1MY8V7QUQUU47']], [['regression ["II5XCIYZ03SDPPSQ7Z"]', ['II5XCIYZ03SDPPSQ7Z'], 'II5XCIYZ03SDPPSQ7Z30'], ['regression ["H6UNZ3Z93AZ7BYYPJC"]', ['H6UNZ3Z93AZ7BYYPJC'], 'H6UNZ3Z93AZ7BYYPJC84'], ['control ["5493001KJTIIGC8Y1R-"]', ['5493001KJTIIGC8Y1R-'], None], ['control ["000000000000000000"]', ['000000000000000000'], '00000000000000000098'], ['control ["5493001KJTIIGC8Y1"]', ['5493001KJTIIGC8Y1'], None], ['control ["2Y76WQMSKZ26SJ35YB"]', ['2Y76WQMSKZ26SJ35YB'], '2Y76WQMSKZ26SJ35YB12'], ['control ["CU3JXPUYQHVR22PKEM"]', ['CU3JXPUYQHVR22PKEM'], 'CU3JXPUYQHVR22PKEM49'], ['control ["EPXGBGA2NLNHRPYT3N"]', ['EPXGBGA2NLNHRPYT3N'], 'EPXGBGA2NLNHRPYT3N83']], [['regression ["WYITG3CIA2EMN51FG8"]', ['WYITG3CIA2EMN51FG8'], 'WYITG3CIA2EMN51FG854'], ['regression ["X22YG0E1MY8V7QUQUU"]', ['X22YG0E1MY8V7QUQUU'], 'X22YG0E1MY8V7QUQUU47'], ['control ["5493001KJTIIGC8Y1"]', ['5493001KJTIIGC8Y1'], None], ['control ["5493001KJTIIGC8Y1R-"]', ['5493001KJTIIGC8Y1R-'], None], ['control ["000000000000000000"]', ['000000000000000000'], '00000000000000000098'], ['control ["11H96GYM52SNV78B6G"]', ['11H96GYM52SNV78B6G'], '11H96GYM52SNV78B6G12'], ['control ["8WZS9XRTCO6DTNCKMU"]', ['8WZS9XRTCO6DTNCKMU'], '8WZS9XRTCO6DTNCKMU93'], ['control ["QBZJYTHC8GNQSKDJSD"]', ['QBZJYTHC8GNQSKDJSD'], 'QBZJYTHC8GNQSKDJSD15']], [['regression ["U6G55SH046WQ164I4P"]', ['U6G55SH046WQ164I4P'], 'U6G55SH046WQ164I4P20'], ['regression ["2Y76WQMSKZ26SJ35YB"]', ['2Y76WQMSKZ26SJ35YB'], '2Y76WQMSKZ26SJ35YB12'], ['control ["000000000000000000"]', ['000000000000000000'], '00000000000000000098'], ['control ["5493001KJTIIGC8Y1"]', ['5493001KJTIIGC8Y1'], None], ['control ["5493001KJTIIGC8Y1R-"]', ['5493001KJTIIGC8Y1R-'], None], ['control ["JA1SCUCU57DVVWD2MF"]', ['JA1SCUCU57DVVWD2MF'], 'JA1SCUCU57DVVWD2MF33'], ['control ["FUNIAT1L7171F0KBF9"]', ['FUNIAT1L7171F0KBF9'], 'FUNIAT1L7171F0KBF963'], ['control ["Z62YQ0YUTHLSESKG4A"]', ['Z62YQ0YUTHLSESKG4A'], 'Z62YQ0YUTHLSESKG4A79']]]
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 ["NH4O4Q9HMI8RUJ0D6Y"] | NH4O4Q9HMI8RUJ0D6Y73 | NH4O4Q9HMI8RUJ0D6Y73 | Passed |
| regression ["9K6IWOG7TS4VC3SHAM"] | 9K6IWOG7TS4VC3SHAM78 | 9K6IWOG7TS4VC3SHAM78 | Passed |
| control ["5493001KJTIIGC8Y1"] | None | None | Passed |
| control ["5493001KJTIIGC8Y1R-"] | None | None | Passed |
| control ["000000000000000000"] | 00000000000000000098 | 00000000000000000098 | Passed |
| control ["TD7FDXWKLVRV07ALBK"] | TD7FDXWKLVRV07ALBK05 | TD7FDXWKLVRV07ALBK05 | Passed |
| control ["ACLPCCV3EGBW4QG3I6"] | ACLPCCV3EGBW4QG3I685 | ACLPCCV3EGBW4QG3I685 | Passed |
| control ["64WI551TBNLAZEBU15"] | 64WI551TBNLAZEBU1502 | 64WI551TBNLAZEBU1502 | Passed |
SHA-256 / e2fdaf2a565cdb31e6ef650e71fbf7a5601a08f5df08bd7286a941cebc064690
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:41.506380+00:00.
Case digest / a0a9c2f7883a8df8f88ae4cb3296353bf68c24c137d50a554b1bea6d0beb0b4b