{"abstract":"Almost every check letter is wrong.","category":"Check-digit algorithms","checks":8,"contract":"Singapore-style NRIC/FIN check letter for the S, T, F and G series: nine characters, series letter, seven digits, check letter (else \"malformed\"). Weights 2,7,6,5,4,3,2; add 4 for T and G; r = sum mod 11; the letter is \"JZIHGFEDCBA\"[r] for S/T and \"XWUTRQPNMLK\"[r] for F/G. Return [expected letter, match].","evaluation_group":"w2-check_digit_algorithms-sg-nric","failed_approach":"An off-by-one index table[r - 1] still shifts every letter.","family":"w2-check_digit_algorithms-sg-nric-table-orientation","id":"FA-72791","implementations":{"attempt":{"sha256":"b6baeb41e1bb0bbdf7f377fbf1024fb276256363122728982ed6193d4e501c18","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(s):\n    if len(s) != 9 or not s.isascii() or s[0] not in 'STFG' or not s[1:8].isdigit():\n        return 'malformed'\n    total = sum(int(ch) * w for ch, w in zip(s[1:8], [2, 7, 6, 5, 4, 3, 2]))\n    if s[0] in 'TG':\n        total += 4\n    r = total % 11\n    table = 'JZIHGFEDCBA' if s[0] in 'ST' else 'XWUTRQPNMLK'\n    c = table[r - 1]\n    return [c, s[8] == c]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression [\"S6621805O\"]', ['S6621805O'], ['H', False]], ['regression [\"G1651468G\"]', ['G1651468G'], ['W', False]], ['control [\"S123456D\"]', ['S123456D'], 'malformed'], ['control [\"M1234567K\"]', ['M1234567K'], 'malformed'], ['control [\"SA234567D\"]', ['SA234567D'], 'malformed'], ['control [\"G0138893V\"]', ['G0138893V'], ['U', False]], ['control [\"S3757569X\"]', ['S3757569X'], ['J', False]], ['control [\"F4116515A\"]', ['F4116515A'], ['N', False]]], [['regression [\"G0138893V\"]', ['G0138893V'], ['U', False]], ['regression [\"S3757569X\"]', ['S3757569X'], ['J', False]], ['control [\"SA234567D\"]', ['SA234567D'], 'malformed'], ['control [\"S123456D\"]', ['S123456D'], 'malformed'], ['control [\"M1234567K\"]', ['M1234567K'], 'malformed'], ['control [\"T4006687X\"]', ['T4006687X'], ['F', False]], ['control [\"S5101399J\"]', ['S5101399J'], ['I', False]], ['control [\"S0965290F\"]', ['S0965290F'], ['F', True]]], [['regression [\"G1812101N\"]', ['G1812101N'], ['N', True]], ['regression [\"G9259714Y\"]', ['G9259714Y'], ['N', False]], ['control [\"M1234567K\"]', ['M1234567K'], 'malformed'], ['control [\"SA234567D\"]', ['SA234567D'], 'malformed'], ['control [\"S123456D\"]', ['S123456D'], 'malformed'], ['control [\"G4191951W\"]', ['G4191951W'], ['K', False]], ['control [\"F9230492U\"]', ['F9230492U'], ['L', False]], ['control [\"F4160346W\"]', ['F4160346W'], ['K', False]]], [['regression [\"F3876611S\"]', ['F3876611S'], ['L', False]], ['regression [\"T7996809P\"]', ['T7996809P'], ['E', False]], ['partial-repair [\"S5101399J\"]', ['S5101399J'], ['I', False]], ['partial-repair [\"S0965290F\"]', ['S0965290F'], ['F', True]], ['control [\"S123456D\"]', ['S123456D'], 'malformed'], ['control [\"M1234567K\"]', ['M1234567K'], 'malformed'], ['control [\"SA234567D\"]', ['SA234567D'], 'malformed'], ['control [\"T2474569W\"]', ['T2474569W'], ['J', False]]], [['regression [\"F9230492U\"]', ['F9230492U'], ['L', False]], ['regression [\"F4160346W\"]', ['F4160346W'], ['K', False]], ['partial-repair [\"T7996809P\"]', ['T7996809P'], ['E', False]], ['partial-repair [\"G4191951W\"]', ['G4191951W'], ['K', False]], ['control [\"SA234567D\"]', ['SA234567D'], 'malformed'], ['control [\"S123456D\"]', ['S123456D'], 'malformed'], ['control [\"M1234567K\"]', ['M1234567K'], 'malformed'], ['control [\"F5183813A\"]', ['F5183813A'], ['X', False]]]]\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":"d42cbc750d23cd59408e9dd69675372bc0757ef40f62afc9ce9b6b066da94ec9","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(s):\n    if len(s) != 9 or not s.isascii() or s[0] not in 'STFG' or not s[1:8].isdigit():\n        return 'malformed'\n    total = sum(int(ch) * w for ch, w in zip(s[1:8], [2, 7, 6, 5, 4, 3, 2]))\n    if s[0] in 'TG':\n        total += 4\n    r = total % 11\n    table = 'JZIHGFEDCBA' if s[0] in 'ST' else 'XWUTRQPNMLK'\n    c = table[10 - r]\n    return [c, s[8] == c]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression [\"S6621805O\"]', ['S6621805O'], ['H', False]], ['regression [\"G1651468G\"]', ['G1651468G'], ['W', False]], ['control [\"S123456D\"]', ['S123456D'], 'malformed'], ['control [\"M1234567K\"]', ['M1234567K'], 'malformed'], ['control [\"SA234567D\"]', ['SA234567D'], 'malformed'], ['control [\"G0138893V\"]', ['G0138893V'], ['U', False]], ['control [\"S3757569X\"]', ['S3757569X'], ['J', False]], ['control [\"F4116515A\"]', ['F4116515A'], ['N', False]]], [['regression [\"G0138893V\"]', ['G0138893V'], ['U', False]], ['regression [\"S3757569X\"]', ['S3757569X'], ['J', False]], ['control [\"SA234567D\"]', ['SA234567D'], 'malformed'], ['control [\"S123456D\"]', ['S123456D'], 'malformed'], ['control [\"M1234567K\"]', ['M1234567K'], 'malformed'], ['control [\"T4006687X\"]', ['T4006687X'], ['F', False]], ['control [\"S5101399J\"]', ['S5101399J'], ['I', False]], ['control [\"S0965290F\"]', ['S0965290F'], ['F', True]]], [['regression [\"G1812101N\"]', ['G1812101N'], ['N', True]], ['regression [\"G9259714Y\"]', ['G9259714Y'], ['N', False]], ['control [\"M1234567K\"]', ['M1234567K'], 'malformed'], ['control [\"SA234567D\"]', ['SA234567D'], 'malformed'], ['control [\"S123456D\"]', ['S123456D'], 'malformed'], ['control [\"G4191951W\"]', ['G4191951W'], ['K', False]], ['control [\"F9230492U\"]', ['F9230492U'], ['L', False]], ['control [\"F4160346W\"]', ['F4160346W'], ['K', False]]], [['regression [\"F3876611S\"]', ['F3876611S'], ['L', False]], ['regression [\"T7996809P\"]', ['T7996809P'], ['E', False]], ['partial-repair [\"S5101399J\"]', ['S5101399J'], ['I', False]], ['partial-repair [\"S0965290F\"]', ['S0965290F'], ['F', True]], ['control [\"S123456D\"]', ['S123456D'], 'malformed'], ['control [\"M1234567K\"]', ['M1234567K'], 'malformed'], ['control [\"SA234567D\"]', ['SA234567D'], 'malformed'], ['control [\"T2474569W\"]', ['T2474569W'], ['J', False]]], [['regression [\"F9230492U\"]', ['F9230492U'], ['L', False]], ['regression [\"F4160346W\"]', ['F4160346W'], ['K', False]], ['partial-repair [\"T7996809P\"]', ['T7996809P'], ['E', False]], ['partial-repair [\"G4191951W\"]', ['G4191951W'], ['K', False]], ['control [\"SA234567D\"]', ['SA234567D'], 'malformed'], ['control [\"S123456D\"]', ['S123456D'], 'malformed'], ['control [\"M1234567K\"]', ['M1234567K'], 'malformed'], ['control [\"F5183813A\"]', ['F5183813A'], ['X', False]]]]\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":"bb2a0cc453315c60431d6101326f038b9c4cc83d7d50b71673635aaf4ca814ea","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(s):\n    if len(s) != 9 or not s.isascii() or s[0] not in 'STFG' or not s[1:8].isdigit():\n        return 'malformed'\n    total = sum(int(ch) * w for ch, w in zip(s[1:8], [2, 7, 6, 5, 4, 3, 2]))\n    if s[0] in 'TG':\n        total += 4\n    r = total % 11\n    table = 'JZIHGFEDCBA' if s[0] in 'ST' else 'XWUTRQPNMLK'\n    c = table[r]\n    return [c, s[8] == c]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression [\"S6621805O\"]', ['S6621805O'], ['H', False]], ['regression [\"G1651468G\"]', ['G1651468G'], ['W', False]], ['control [\"S123456D\"]', ['S123456D'], 'malformed'], ['control [\"M1234567K\"]', ['M1234567K'], 'malformed'], ['control [\"SA234567D\"]', ['SA234567D'], 'malformed'], ['control [\"G0138893V\"]', ['G0138893V'], ['U', False]], ['control [\"S3757569X\"]', ['S3757569X'], ['J', False]], ['control [\"F4116515A\"]', ['F4116515A'], ['N', False]]], [['regression [\"G0138893V\"]', ['G0138893V'], ['U', False]], ['regression [\"S3757569X\"]', ['S3757569X'], ['J', False]], ['control [\"SA234567D\"]', ['SA234567D'], 'malformed'], ['control [\"S123456D\"]', ['S123456D'], 'malformed'], ['control [\"M1234567K\"]', ['M1234567K'], 'malformed'], ['control [\"T4006687X\"]', ['T4006687X'], ['F', False]], ['control [\"S5101399J\"]', ['S5101399J'], ['I', False]], ['control [\"S0965290F\"]', ['S0965290F'], ['F', True]]], [['regression [\"G1812101N\"]', ['G1812101N'], ['N', True]], ['regression [\"G9259714Y\"]', ['G9259714Y'], ['N', False]], ['control [\"M1234567K\"]', ['M1234567K'], 'malformed'], ['control [\"SA234567D\"]', ['SA234567D'], 'malformed'], ['control [\"S123456D\"]', ['S123456D'], 'malformed'], ['control [\"G4191951W\"]', ['G4191951W'], ['K', False]], ['control [\"F9230492U\"]', ['F9230492U'], ['L', False]], ['control [\"F4160346W\"]', ['F4160346W'], ['K', False]]], [['regression [\"F3876611S\"]', ['F3876611S'], ['L', False]], ['regression [\"T7996809P\"]', ['T7996809P'], ['E', False]], ['partial-repair [\"S5101399J\"]', ['S5101399J'], ['I', False]], ['partial-repair [\"S0965290F\"]', ['S0965290F'], ['F', True]], ['control [\"S123456D\"]', ['S123456D'], 'malformed'], ['control [\"M1234567K\"]', ['M1234567K'], 'malformed'], ['control [\"SA234567D\"]', ['SA234567D'], 'malformed'], ['control [\"T2474569W\"]', ['T2474569W'], ['J', False]]], [['regression [\"F9230492U\"]', ['F9230492U'], ['L', False]], ['regression [\"F4160346W\"]', ['F4160346W'], ['K', False]], ['partial-repair [\"T7996809P\"]', ['T7996809P'], ['E', False]], ['partial-repair [\"G4191951W\"]', ['G4191951W'], ['K', False]], ['control [\"SA234567D\"]', ['SA234567D'], 'malformed'], ['control [\"S123456D\"]', ['S123456D'], 'malformed'], ['control [\"M1234567K\"]', ['M1234567K'], 'malformed'], ['control [\"F5183813A\"]', ['F5183813A'], ['X', False]]]]\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-sg-nric-table-orientation","generated_at":"2026-09-29T14:48:41.628494+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Identity verification forms validate NRIC/FIN numbers before submission.","repair":"Index the table directly with r.","root_cause":"The remainder indexes the table as table[10 - r].","sha256":"a098911284c9dc34d653d3af453f03eec97bfd2b26f996228b006280623adebe","title":"NRIC reads the check table from the other end · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":39.687,"exit_code":1,"observations":[{"actual":["I",false],"check":"regression [\"S6621805O\"]","expected":["H",false],"passed":false},{"actual":["X",false],"check":"regression [\"G1651468G\"]","expected":["W",false],"passed":false},{"actual":"malformed","check":"control [\"S123456D\"]","expected":"malformed","passed":true},{"actual":"malformed","check":"control [\"M1234567K\"]","expected":"malformed","passed":true},{"actual":"malformed","check":"control [\"SA234567D\"]","expected":"malformed","passed":true},{"actual":["W",false],"check":"control [\"G0138893V\"]","expected":["U",false],"passed":false},{"actual":["A",false],"check":"control [\"S3757569X\"]","expected":["J",false],"passed":false},{"actual":["P",false],"check":"control [\"F4116515A\"]","expected":["N",false],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression [\\\"S6621805O\\\"]\", \"actual\": [\"I\", false], \"expected\": [\"H\", false], \"passed\": false}, {\"check\": \"regression [\\\"G1651468G\\\"]\", \"actual\": [\"X\", false], \"expected\": [\"W\", false], \"passed\": false}, {\"check\": \"control [\\\"S123456D\\\"]\", \"actual\": \"malformed\", \"expected\": \"malformed\", \"passed\": true}, {\"check\": \"control [\\\"M1234567K\\\"]\", \"actual\": \"malformed\", \"expected\": \"malformed\", \"passed\": true}, {\"check\": \"control [\\\"SA234567D\\\"]\", \"actual\": \"malformed\", \"expected\": \"malformed\", \"passed\": true}, {\"check\": \"control [\\\"G0138893V\\\"]\", \"actual\": [\"W\", false], \"expected\": [\"U\", false], \"passed\": false}, {\"check\": \"control [\\\"S3757569X\\\"]\", \"actual\": [\"A\", false], \"expected\": [\"J\", false], \"passed\": false}, {\"check\": \"control [\\\"F4116515A\\\"]\", \"actual\": [\"P\", false], \"expected\": [\"N\", false], \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":39.447,"exit_code":1,"observations":[{"actual":["D",false],"check":"regression [\"S6621805O\"]","expected":["H",false],"passed":false},{"actual":["L",false],"check":"regression [\"G1651468G\"]","expected":["W",false],"passed":false},{"actual":"malformed","check":"control [\"S123456D\"]","expected":"malformed","passed":true},{"actual":"malformed","check":"control [\"M1234567K\"]","expected":"malformed","passed":true},{"actual":"malformed","check":"control [\"SA234567D\"]","expected":"malformed","passed":true},{"actual":["M",false],"check":"control [\"G0138893V\"]","expected":["U",false],"passed":false},{"actual":["A",false],"check":"control [\"S3757569X\"]","expected":["J",false],"passed":false},{"actual":["T",false],"check":"control [\"F4116515A\"]","expected":["N",false],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression [\\\"S6621805O\\\"]\", \"actual\": [\"D\", false], \"expected\": [\"H\", false], \"passed\": false}, {\"check\": \"regression [\\\"G1651468G\\\"]\", \"actual\": [\"L\", false], \"expected\": [\"W\", false], \"passed\": false}, {\"check\": \"control [\\\"S123456D\\\"]\", \"actual\": \"malformed\", \"expected\": \"malformed\", \"passed\": true}, {\"check\": \"control [\\\"M1234567K\\\"]\", \"actual\": \"malformed\", \"expected\": \"malformed\", \"passed\": true}, {\"check\": \"control [\\\"SA234567D\\\"]\", \"actual\": \"malformed\", \"expected\": \"malformed\", \"passed\": true}, {\"check\": \"control [\\\"G0138893V\\\"]\", \"actual\": [\"M\", false], \"expected\": [\"U\", false], \"passed\": false}, {\"check\": \"control [\\\"S3757569X\\\"]\", \"actual\": [\"A\", false], \"expected\": [\"J\", false], \"passed\": false}, {\"check\": \"control [\\\"F4116515A\\\"]\", \"actual\": [\"T\", false], \"expected\": [\"N\", false], \"passed\": false}], \"passed\": false}\n"},"fixed":{"elapsed_ms":40.074,"exit_code":0,"observations":[{"actual":["H",false],"check":"regression [\"S6621805O\"]","expected":["H",false],"passed":true},{"actual":["W",false],"check":"regression [\"G1651468G\"]","expected":["W",false],"passed":true},{"actual":"malformed","check":"control [\"S123456D\"]","expected":"malformed","passed":true},{"actual":"malformed","check":"control [\"M1234567K\"]","expected":"malformed","passed":true},{"actual":"malformed","check":"control [\"SA234567D\"]","expected":"malformed","passed":true},{"actual":["U",false],"check":"control [\"G0138893V\"]","expected":["U",false],"passed":true},{"actual":["J",false],"check":"control [\"S3757569X\"]","expected":["J",false],"passed":true},{"actual":["N",false],"check":"control [\"F4116515A\"]","expected":["N",false],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression [\\\"S6621805O\\\"]\", \"actual\": [\"H\", false], \"expected\": [\"H\", false], \"passed\": true}, {\"check\": \"regression [\\\"G1651468G\\\"]\", \"actual\": [\"W\", false], \"expected\": [\"W\", false], \"passed\": true}, {\"check\": \"control [\\\"S123456D\\\"]\", \"actual\": \"malformed\", \"expected\": \"malformed\", \"passed\": true}, {\"check\": \"control [\\\"M1234567K\\\"]\", \"actual\": \"malformed\", \"expected\": \"malformed\", \"passed\": true}, {\"check\": \"control [\\\"SA234567D\\\"]\", \"actual\": \"malformed\", \"expected\": \"malformed\", \"passed\": true}, {\"check\": \"control [\\\"G0138893V\\\"]\", \"actual\": [\"U\", false], \"expected\": [\"U\", false], \"passed\": true}, {\"check\": \"control [\\\"S3757569X\\\"]\", \"actual\": [\"J\", false], \"expected\": [\"J\", false], \"passed\": true}, {\"check\": \"control [\\\"F4116515A\\\"]\", \"actual\": [\"N\", false], \"expected\": [\"N\", false], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}