{"abstract":"Identity numbers typed with a lowercase x are rejected.","category":"Check-digit algorithms","checks":8,"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].","evaluation_group":"w2-check_digit_algorithms-cn-resident-id","failed_approach":"Accepting \"x\" unconditionally lets a lowercase x pass even when the check should be a digit.","family":"w2-check_digit_algorithms-cn-resident-id-lowercase-check","id":"FA-72591","implementations":{"attempt":{"sha256":"07fe8ee079a0fe0c875c4891076ad261005498a7e9fbbd4746d5218e07d61737","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(s):\n    if len(s) != 18 or not s.isascii() or not s[:17].isdigit():\n        return 'malformed'\n    total = sum(int(ch) * pow(2, 17 - i, 11) for i, ch in enumerate(s[:17]))\n    check = '10X98765432'[total % 11]\n    return [check, s[17] in (check, 'x')]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression [\"11010519491231002x\"]', ['11010519491231002x'], ['X', True]], ['partial-repair [\"50937819800315206x\"]', ['50937819800315206x'], ['9', False]], ['control [\"268310199103143528\"]', ['268310199103143528'], ['9', False]], ['control [\"297547197007199229\"]', ['297547197007199229'], ['2', False]], ['control [\"518849198106269933\"]', ['518849198106269933'], ['6', False]], ['control [\"405799197903155930\"]', ['405799197903155930'], ['7', False]], ['control [\"445793197510028320\"]', ['445793197510028320'], ['X', False]], ['control [\"309071197409120443\"]', ['309071197409120443'], ['3', True]]], [['regression [\"11010519491231002x\"]', ['11010519491231002x'], ['X', True]], ['partial-repair [\"50937819800315206x\"]', ['50937819800315206x'], ['9', False]], ['control [\"309071197409120443\"]', ['309071197409120443'], ['3', True]], ['control [\"594570196107138355\"]', ['594570196107138355'], ['2', False]], ['control [\"458825200412201114\"]', ['458825200412201114'], ['5', False]], ['control [\"373498196811139070\"]', ['373498196811139070'], ['5', False]], ['control [\"18951819720314318X\"]', ['18951819720314318X'], ['3', False]], ['control [\"600025197711283200\"]', ['600025197711283200'], ['5', False]]], [['regression [\"11010519491231002x\"]', ['11010519491231002x'], ['X', True]], ['partial-repair [\"50937819800315206x\"]', ['50937819800315206x'], ['9', False]], ['control [\"600025197711283200\"]', ['600025197711283200'], ['5', False]], ['control [\"197110195609245785\"]', ['197110195609245785'], ['6', False]], ['control [\"37858219960314414X\"]', ['37858219960314414X'], ['7', False]], ['control [\"22100419730209591X\"]', ['22100419730209591X'], ['4', False]], ['control [\"653847197508233493\"]', ['653847197508233493'], ['2', False]], ['control [\"438548195709105267\"]', ['438548195709105267'], ['4', False]]], [['regression [\"11010519491231002x\"]', ['11010519491231002x'], ['X', True]], ['partial-repair [\"50937819800315206x\"]', ['50937819800315206x'], ['9', False]], ['control [\"438548195709105267\"]', ['438548195709105267'], ['4', False]], ['control [\"261917197009053555\"]', ['261917197009053555'], ['3', False]], ['control [\"607248198301138071\"]', ['607248198301138071'], ['9', False]], ['control [\"148107199504128670\"]', ['148107199504128670'], ['3', False]], ['control [\"116248195409054166\"]', ['116248195409054166'], ['7', False]], ['control [\"306465200011013206\"]', ['306465200011013206'], ['6', True]]], [['regression [\"11010519491231002x\"]', ['11010519491231002x'], ['X', True]], ['partial-repair [\"50937819800315206x\"]', ['50937819800315206x'], ['9', False]], ['control [\"306465200011013206\"]', ['306465200011013206'], ['6', True]], ['control [\"11010519491231002X\"]', ['11010519491231002X'], ['X', True]], ['control [\"110105194912310021\"]', ['110105194912310021'], ['X', False]], ['control [\"440524188001010014\"]', ['440524188001010014'], ['4', True]], ['control [\"11010519491231002\"]', ['11010519491231002'], 'malformed'], ['control [\"1101051949123100XX\"]', ['1101051949123100XX'], 'malformed']]]\nfor label, args, expected in fixtures[N - 1]:\n    check(label, solve(*args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"broken":{"sha256":"42da86fc1a529e79a0ebd5a5070470e40b5f0ccad8a6540ba0553518b419c140","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(s):\n    if len(s) != 18 or not s.isascii() or not s[:17].isdigit():\n        return 'malformed'\n    total = sum(int(ch) * pow(2, 17 - i, 11) for i, ch in enumerate(s[:17]))\n    check = '10X98765432'[total % 11]\n    return [check, check == s[17]]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression [\"11010519491231002x\"]', ['11010519491231002x'], ['X', True]], ['partial-repair [\"50937819800315206x\"]', ['50937819800315206x'], ['9', False]], ['control [\"268310199103143528\"]', ['268310199103143528'], ['9', False]], ['control [\"297547197007199229\"]', ['297547197007199229'], ['2', False]], ['control [\"518849198106269933\"]', ['518849198106269933'], ['6', False]], ['control [\"405799197903155930\"]', ['405799197903155930'], ['7', False]], ['control [\"445793197510028320\"]', ['445793197510028320'], ['X', False]], ['control [\"309071197409120443\"]', ['309071197409120443'], ['3', True]]], [['regression [\"11010519491231002x\"]', ['11010519491231002x'], ['X', True]], ['partial-repair [\"50937819800315206x\"]', ['50937819800315206x'], ['9', False]], ['control [\"309071197409120443\"]', ['309071197409120443'], ['3', True]], ['control [\"594570196107138355\"]', ['594570196107138355'], ['2', False]], ['control [\"458825200412201114\"]', ['458825200412201114'], ['5', False]], ['control [\"373498196811139070\"]', ['373498196811139070'], ['5', False]], ['control [\"18951819720314318X\"]', ['18951819720314318X'], ['3', False]], ['control [\"600025197711283200\"]', ['600025197711283200'], ['5', False]]], [['regression [\"11010519491231002x\"]', ['11010519491231002x'], ['X', True]], ['partial-repair [\"50937819800315206x\"]', ['50937819800315206x'], ['9', False]], ['control [\"600025197711283200\"]', ['600025197711283200'], ['5', False]], ['control [\"197110195609245785\"]', ['197110195609245785'], ['6', False]], ['control [\"37858219960314414X\"]', ['37858219960314414X'], ['7', False]], ['control [\"22100419730209591X\"]', ['22100419730209591X'], ['4', False]], ['control [\"653847197508233493\"]', ['653847197508233493'], ['2', False]], ['control [\"438548195709105267\"]', ['438548195709105267'], ['4', False]]], [['regression [\"11010519491231002x\"]', ['11010519491231002x'], ['X', True]], ['partial-repair [\"50937819800315206x\"]', ['50937819800315206x'], ['9', False]], ['control [\"438548195709105267\"]', ['438548195709105267'], ['4', False]], ['control [\"261917197009053555\"]', ['261917197009053555'], ['3', False]], ['control [\"607248198301138071\"]', ['607248198301138071'], ['9', False]], ['control [\"148107199504128670\"]', ['148107199504128670'], ['3', False]], ['control [\"116248195409054166\"]', ['116248195409054166'], ['7', False]], ['control [\"306465200011013206\"]', ['306465200011013206'], ['6', True]]], [['regression [\"11010519491231002x\"]', ['11010519491231002x'], ['X', True]], ['partial-repair [\"50937819800315206x\"]', ['50937819800315206x'], ['9', False]], ['control [\"306465200011013206\"]', ['306465200011013206'], ['6', True]], ['control [\"11010519491231002X\"]', ['11010519491231002X'], ['X', True]], ['control [\"110105194912310021\"]', ['110105194912310021'], ['X', False]], ['control [\"440524188001010014\"]', ['440524188001010014'], ['4', True]], ['control [\"11010519491231002\"]', ['11010519491231002'], 'malformed'], ['control [\"1101051949123100XX\"]', ['1101051949123100XX'], 'malformed']]]\nfor label, args, expected in fixtures[N - 1]:\n    check(label, solve(*args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"fixed":{"sha256":"466c6ece2c37aa1fec6b2875f02b79c1d03ed4834191f734ff8f560435702444","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(s):\n    if len(s) != 18 or not s.isascii() or not s[:17].isdigit():\n        return 'malformed'\n    total = sum(int(ch) * pow(2, 17 - i, 11) for i, ch in enumerate(s[:17]))\n    check = '10X98765432'[total % 11]\n    return [check, check == s[17].upper()]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression [\"11010519491231002x\"]', ['11010519491231002x'], ['X', True]], ['partial-repair [\"50937819800315206x\"]', ['50937819800315206x'], ['9', False]], ['control [\"268310199103143528\"]', ['268310199103143528'], ['9', False]], ['control [\"297547197007199229\"]', ['297547197007199229'], ['2', False]], ['control [\"518849198106269933\"]', ['518849198106269933'], ['6', False]], ['control [\"405799197903155930\"]', ['405799197903155930'], ['7', False]], ['control [\"445793197510028320\"]', ['445793197510028320'], ['X', False]], ['control [\"309071197409120443\"]', ['309071197409120443'], ['3', True]]], [['regression [\"11010519491231002x\"]', ['11010519491231002x'], ['X', True]], ['partial-repair [\"50937819800315206x\"]', ['50937819800315206x'], ['9', False]], ['control [\"309071197409120443\"]', ['309071197409120443'], ['3', True]], ['control [\"594570196107138355\"]', ['594570196107138355'], ['2', False]], ['control [\"458825200412201114\"]', ['458825200412201114'], ['5', False]], ['control [\"373498196811139070\"]', ['373498196811139070'], ['5', False]], ['control [\"18951819720314318X\"]', ['18951819720314318X'], ['3', False]], ['control [\"600025197711283200\"]', ['600025197711283200'], ['5', False]]], [['regression [\"11010519491231002x\"]', ['11010519491231002x'], ['X', True]], ['partial-repair [\"50937819800315206x\"]', ['50937819800315206x'], ['9', False]], ['control [\"600025197711283200\"]', ['600025197711283200'], ['5', False]], ['control [\"197110195609245785\"]', ['197110195609245785'], ['6', False]], ['control [\"37858219960314414X\"]', ['37858219960314414X'], ['7', False]], ['control [\"22100419730209591X\"]', ['22100419730209591X'], ['4', False]], ['control [\"653847197508233493\"]', ['653847197508233493'], ['2', False]], ['control [\"438548195709105267\"]', ['438548195709105267'], ['4', False]]], [['regression [\"11010519491231002x\"]', ['11010519491231002x'], ['X', True]], ['partial-repair [\"50937819800315206x\"]', ['50937819800315206x'], ['9', False]], ['control [\"438548195709105267\"]', ['438548195709105267'], ['4', False]], ['control [\"261917197009053555\"]', ['261917197009053555'], ['3', False]], ['control [\"607248198301138071\"]', ['607248198301138071'], ['9', False]], ['control [\"148107199504128670\"]', ['148107199504128670'], ['3', False]], ['control [\"116248195409054166\"]', ['116248195409054166'], ['7', False]], ['control [\"306465200011013206\"]', ['306465200011013206'], ['6', True]]], [['regression [\"11010519491231002x\"]', ['11010519491231002x'], ['X', True]], ['partial-repair [\"50937819800315206x\"]', ['50937819800315206x'], ['9', False]], ['control [\"306465200011013206\"]', ['306465200011013206'], ['6', True]], ['control [\"11010519491231002X\"]', ['11010519491231002X'], ['X', True]], ['control [\"110105194912310021\"]', ['110105194912310021'], ['X', False]], ['control [\"440524188001010014\"]', ['440524188001010014'], ['4', True]], ['control [\"11010519491231002\"]', ['11010519491231002'], 'malformed'], ['control [\"1101051949123100XX\"]', ['1101051949123100XX'], 'malformed']]]\nfor label, args, expected in fixtures[N - 1]:\n    check(label, solve(*args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"}},"limitations":"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.","method":"Deterministic executable model with adversarial boundary fixtures.","provenance":{"created_by":"Failure Map","dependencies":"Python standard library","family":"w2-check_digit_algorithms-cn-resident-id-lowercase-check","generated_at":"2026-09-29T14:48:39.773142+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Account opening flows validate national identity numbers before identity verification.","repair":"Compare against s[17].upper().","root_cause":"The final character is compared case-sensitively.","sha256":"2979b0995fc5aeb0c205fc177969e8d1851ec6909021f1a867059876d8a16043","title":"Resident ID rejects a lowercase x check character · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":37.081,"exit_code":1,"observations":[{"actual":["X",true],"check":"regression [\"11010519491231002x\"]","expected":["X",true],"passed":true},{"actual":["9",true],"check":"partial-repair [\"50937819800315206x\"]","expected":["9",false],"passed":false},{"actual":["9",false],"check":"control [\"268310199103143528\"]","expected":["9",false],"passed":true},{"actual":["2",false],"check":"control [\"297547197007199229\"]","expected":["2",false],"passed":true},{"actual":["6",false],"check":"control [\"518849198106269933\"]","expected":["6",false],"passed":true},{"actual":["7",false],"check":"control [\"405799197903155930\"]","expected":["7",false],"passed":true},{"actual":["X",false],"check":"control [\"445793197510028320\"]","expected":["X",false],"passed":true},{"actual":["3",true],"check":"control [\"309071197409120443\"]","expected":["3",true],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression [\\\"11010519491231002x\\\"]\", \"actual\": [\"X\", true], \"expected\": [\"X\", true], \"passed\": true}, {\"check\": \"partial-repair [\\\"50937819800315206x\\\"]\", \"actual\": [\"9\", true], \"expected\": [\"9\", false], \"passed\": false}, {\"check\": \"control [\\\"268310199103143528\\\"]\", \"actual\": [\"9\", false], \"expected\": [\"9\", false], \"passed\": true}, {\"check\": \"control [\\\"297547197007199229\\\"]\", \"actual\": [\"2\", false], \"expected\": [\"2\", false], \"passed\": true}, {\"check\": \"control [\\\"518849198106269933\\\"]\", \"actual\": [\"6\", false], \"expected\": [\"6\", false], \"passed\": true}, {\"check\": \"control [\\\"405799197903155930\\\"]\", \"actual\": [\"7\", false], \"expected\": [\"7\", false], \"passed\": true}, {\"check\": \"control [\\\"445793197510028320\\\"]\", \"actual\": [\"X\", false], \"expected\": [\"X\", false], \"passed\": true}, {\"check\": \"control [\\\"309071197409120443\\\"]\", \"actual\": [\"3\", true], \"expected\": [\"3\", true], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":37.651,"exit_code":1,"observations":[{"actual":["X",false],"check":"regression [\"11010519491231002x\"]","expected":["X",true],"passed":false},{"actual":["9",false],"check":"partial-repair [\"50937819800315206x\"]","expected":["9",false],"passed":true},{"actual":["9",false],"check":"control [\"268310199103143528\"]","expected":["9",false],"passed":true},{"actual":["2",false],"check":"control [\"297547197007199229\"]","expected":["2",false],"passed":true},{"actual":["6",false],"check":"control [\"518849198106269933\"]","expected":["6",false],"passed":true},{"actual":["7",false],"check":"control [\"405799197903155930\"]","expected":["7",false],"passed":true},{"actual":["X",false],"check":"control [\"445793197510028320\"]","expected":["X",false],"passed":true},{"actual":["3",true],"check":"control [\"309071197409120443\"]","expected":["3",true],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression [\\\"11010519491231002x\\\"]\", \"actual\": [\"X\", false], \"expected\": [\"X\", true], \"passed\": false}, {\"check\": \"partial-repair [\\\"50937819800315206x\\\"]\", \"actual\": [\"9\", false], \"expected\": [\"9\", false], \"passed\": true}, {\"check\": \"control [\\\"268310199103143528\\\"]\", \"actual\": [\"9\", false], \"expected\": [\"9\", false], \"passed\": true}, {\"check\": \"control [\\\"297547197007199229\\\"]\", \"actual\": [\"2\", false], \"expected\": [\"2\", false], \"passed\": true}, {\"check\": \"control [\\\"518849198106269933\\\"]\", \"actual\": [\"6\", false], \"expected\": [\"6\", false], \"passed\": true}, {\"check\": \"control [\\\"405799197903155930\\\"]\", \"actual\": [\"7\", false], \"expected\": [\"7\", false], \"passed\": true}, {\"check\": \"control [\\\"445793197510028320\\\"]\", \"actual\": [\"X\", false], \"expected\": [\"X\", false], \"passed\": true}, {\"check\": \"control [\\\"309071197409120443\\\"]\", \"actual\": [\"3\", true], \"expected\": [\"3\", true], \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":36.687,"exit_code":0,"observations":[{"actual":["X",true],"check":"regression [\"11010519491231002x\"]","expected":["X",true],"passed":true},{"actual":["9",false],"check":"partial-repair [\"50937819800315206x\"]","expected":["9",false],"passed":true},{"actual":["9",false],"check":"control [\"268310199103143528\"]","expected":["9",false],"passed":true},{"actual":["2",false],"check":"control [\"297547197007199229\"]","expected":["2",false],"passed":true},{"actual":["6",false],"check":"control [\"518849198106269933\"]","expected":["6",false],"passed":true},{"actual":["7",false],"check":"control [\"405799197903155930\"]","expected":["7",false],"passed":true},{"actual":["X",false],"check":"control [\"445793197510028320\"]","expected":["X",false],"passed":true},{"actual":["3",true],"check":"control [\"309071197409120443\"]","expected":["3",true],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression [\\\"11010519491231002x\\\"]\", \"actual\": [\"X\", true], \"expected\": [\"X\", true], \"passed\": true}, {\"check\": \"partial-repair [\\\"50937819800315206x\\\"]\", \"actual\": [\"9\", false], \"expected\": [\"9\", false], \"passed\": true}, {\"check\": \"control [\\\"268310199103143528\\\"]\", \"actual\": [\"9\", false], \"expected\": [\"9\", false], \"passed\": true}, {\"check\": \"control [\\\"297547197007199229\\\"]\", \"actual\": [\"2\", false], \"expected\": [\"2\", false], \"passed\": true}, {\"check\": \"control [\\\"518849198106269933\\\"]\", \"actual\": [\"6\", false], \"expected\": [\"6\", false], \"passed\": true}, {\"check\": \"control [\\\"405799197903155930\\\"]\", \"actual\": [\"7\", false], \"expected\": [\"7\", false], \"passed\": true}, {\"check\": \"control [\\\"445793197510028320\\\"]\", \"actual\": [\"X\", false], \"expected\": [\"X\", false], \"passed\": true}, {\"check\": \"control [\\\"309071197409120443\\\"]\", \"actual\": [\"3\", true], \"expected\": [\"3\", true], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}