{"abstract":"Y- and Z-series foreigner numbers get the wrong control letter (X happens to work).","category":"Check-digit algorithms","checks":8,"contract":"Spanish DNI/NIE control letter: input upper-cased, hyphens removed, then nine characters: eight digits (or X/Y/Z followed by seven digits, the prefix standing for 0/1/2) and a letter (else \"malformed\"). The letter is \"TRWAGMYFPDXBNJZSQVHLCKE\"[number mod 23]. Return [expected letter, match].","evaluation_group":"w2-check_digit_algorithms-es-dni-nie","failed_approach":"Mapping X to 1, Y to 2 and Z to 3 shifts every NIE.","family":"w2-check_digit_algorithms-es-dni-nie-nie-prefix","id":"FA-72821","implementations":{"attempt":{"sha256":"023ff6fd2f04ecdb699739c56ca071e9a0a1fd3fcc7dc7e6d0bd82e8801c015b","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(s):\n    t = s.upper().replace('-', '')\n    if len(t) != 9 or not t.isascii():\n        return 'malformed'\n    body = t[:8]\n    if body[0] in 'XYZ':\n        body = str('XYZ'.index(body[0]) + 1) + body[1:]\n    if not body.isdigit() or not t[8].isalpha():\n        return 'malformed'\n    letter = 'TRWAGMYFPDXBNJZSQVHLCKE'[int(body) % 23]\n    return [letter, t[8] == letter]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression [\"Z8303596E\"]', ['Z8303596E'], ['A', False]], ['regression [\"Y9463691F\"]', ['Y9463691F'], ['X', False]], ['control [\"11888450T\"]', ['11888450T'], ['A', False]], ['control [\"15183137S\"]', ['15183137S'], ['D', False]], ['control [\"96436549C\"]', ['96436549C'], ['X', False]], ['control [\"32369867Q\"]', ['32369867Q'], ['N', False]], ['control [\"84574425H\"]', ['84574425H'], ['K', False]], ['control [\"09456394Q\"]', ['09456394Q'], ['J', False]]], [['regression [\"Y1496345D\"]', ['Y1496345D'], ['W', False]], ['regression [\"Y4913243Z\"]', ['Y4913243Z'], ['C', False]], ['control [\"09456394Q\"]', ['09456394Q'], ['J', False]], ['control [\"06580396K\"]', ['06580396K'], ['G', False]], ['control [\"74087956U\"]', ['74087956U'], ['B', False]], ['control [\"08401512F\"]', ['08401512F'], ['A', False]], ['control [\"73708311E\"]', ['73708311E'], ['G', False]], ['control [\"12345678Z\"]', ['12345678Z'], ['Z', True]]], [['regression [\"Y2667738D\"]', ['Y2667738D'], ['M', False]], ['regression [\"Z8719589B\"]', ['Z8719589B'], ['H', False]], ['partial-repair [\"X4304629M\"]', ['X4304629M'], ['H', False]], ['control [\"12345678Z\"]', ['12345678Z'], ['Z', True]], ['control [\"12345678-Z\"]', ['12345678-Z'], ['Z', True]], ['control [\"12345678z\"]', ['12345678z'], ['Z', True]], ['control [\"1234567Z\"]', ['1234567Z'], 'malformed'], ['control [\"A1234567L\"]', ['A1234567L'], 'malformed']], [['regression [\"Z1234567R\"]', ['Z1234567R'], ['R', True]], ['regression [\"y7654321g\"]', ['y7654321g'], ['G', True]], ['partial-repair [\"X5964504D\"]', ['X5964504D'], ['Y', False]], ['partial-repair [\"X1234567L\"]', ['X1234567L'], ['L', True]], ['control [\"123456789\"]', ['123456789'], 'malformed'], ['control [\"11888450T\"]', ['11888450T'], ['A', False]], ['control [\"15183137S\"]', ['15183137S'], ['D', False]], ['control [\"96436549C\"]', ['96436549C'], ['X', False]]], [['regression [\"Y9463691F\"]', ['Y9463691F'], ['X', False]], ['regression [\"Y6311829O\"]', ['Y6311829O'], ['E', False]], ['partial-repair [\"Z1234567R\"]', ['Z1234567R'], ['R', True]], ['partial-repair [\"x1234567l\"]', ['x1234567l'], ['L', True]], ['control [\"84574425H\"]', ['84574425H'], ['K', False]], ['control [\"09456394Q\"]', ['09456394Q'], ['J', False]], ['control [\"06580396K\"]', ['06580396K'], ['G', False]], ['control [\"74087956U\"]', ['74087956U'], ['B', 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":"30dfd06f4f2ac275a6db6a8214fdba8db22a769afd4b2485006b3472fb13c994","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(s):\n    t = s.upper().replace('-', '')\n    if len(t) != 9 or not t.isascii():\n        return 'malformed'\n    body = t[:8]\n    if body[0] in 'XYZ':\n        body = body[1:]\n    if not body.isdigit() or not t[8].isalpha():\n        return 'malformed'\n    letter = 'TRWAGMYFPDXBNJZSQVHLCKE'[int(body) % 23]\n    return [letter, t[8] == letter]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression [\"Z8303596E\"]', ['Z8303596E'], ['A', False]], ['regression [\"Y9463691F\"]', ['Y9463691F'], ['X', False]], ['control [\"11888450T\"]', ['11888450T'], ['A', False]], ['control [\"15183137S\"]', ['15183137S'], ['D', False]], ['control [\"96436549C\"]', ['96436549C'], ['X', False]], ['control [\"32369867Q\"]', ['32369867Q'], ['N', False]], ['control [\"84574425H\"]', ['84574425H'], ['K', False]], ['control [\"09456394Q\"]', ['09456394Q'], ['J', False]]], [['regression [\"Y1496345D\"]', ['Y1496345D'], ['W', False]], ['regression [\"Y4913243Z\"]', ['Y4913243Z'], ['C', False]], ['control [\"09456394Q\"]', ['09456394Q'], ['J', False]], ['control [\"06580396K\"]', ['06580396K'], ['G', False]], ['control [\"74087956U\"]', ['74087956U'], ['B', False]], ['control [\"08401512F\"]', ['08401512F'], ['A', False]], ['control [\"73708311E\"]', ['73708311E'], ['G', False]], ['control [\"12345678Z\"]', ['12345678Z'], ['Z', True]]], [['regression [\"Y2667738D\"]', ['Y2667738D'], ['M', False]], ['regression [\"Z8719589B\"]', ['Z8719589B'], ['H', False]], ['partial-repair [\"X4304629M\"]', ['X4304629M'], ['H', False]], ['control [\"12345678Z\"]', ['12345678Z'], ['Z', True]], ['control [\"12345678-Z\"]', ['12345678-Z'], ['Z', True]], ['control [\"12345678z\"]', ['12345678z'], ['Z', True]], ['control [\"1234567Z\"]', ['1234567Z'], 'malformed'], ['control [\"A1234567L\"]', ['A1234567L'], 'malformed']], [['regression [\"Z1234567R\"]', ['Z1234567R'], ['R', True]], ['regression [\"y7654321g\"]', ['y7654321g'], ['G', True]], ['partial-repair [\"X5964504D\"]', ['X5964504D'], ['Y', False]], ['partial-repair [\"X1234567L\"]', ['X1234567L'], ['L', True]], ['control [\"123456789\"]', ['123456789'], 'malformed'], ['control [\"11888450T\"]', ['11888450T'], ['A', False]], ['control [\"15183137S\"]', ['15183137S'], ['D', False]], ['control [\"96436549C\"]', ['96436549C'], ['X', False]]], [['regression [\"Y9463691F\"]', ['Y9463691F'], ['X', False]], ['regression [\"Y6311829O\"]', ['Y6311829O'], ['E', False]], ['partial-repair [\"Z1234567R\"]', ['Z1234567R'], ['R', True]], ['partial-repair [\"x1234567l\"]', ['x1234567l'], ['L', True]], ['control [\"84574425H\"]', ['84574425H'], ['K', False]], ['control [\"09456394Q\"]', ['09456394Q'], ['J', False]], ['control [\"06580396K\"]', ['06580396K'], ['G', False]], ['control [\"74087956U\"]', ['74087956U'], ['B', 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":"0b33449b7c307df3844cccf59baff00674cc81171cfc0fd26041d323bbe5e055","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(s):\n    t = s.upper().replace('-', '')\n    if len(t) != 9 or not t.isascii():\n        return 'malformed'\n    body = t[:8]\n    if body[0] in 'XYZ':\n        body = str('XYZ'.index(body[0])) + body[1:]\n    if not body.isdigit() or not t[8].isalpha():\n        return 'malformed'\n    letter = 'TRWAGMYFPDXBNJZSQVHLCKE'[int(body) % 23]\n    return [letter, t[8] == letter]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression [\"Z8303596E\"]', ['Z8303596E'], ['A', False]], ['regression [\"Y9463691F\"]', ['Y9463691F'], ['X', False]], ['control [\"11888450T\"]', ['11888450T'], ['A', False]], ['control [\"15183137S\"]', ['15183137S'], ['D', False]], ['control [\"96436549C\"]', ['96436549C'], ['X', False]], ['control [\"32369867Q\"]', ['32369867Q'], ['N', False]], ['control [\"84574425H\"]', ['84574425H'], ['K', False]], ['control [\"09456394Q\"]', ['09456394Q'], ['J', False]]], [['regression [\"Y1496345D\"]', ['Y1496345D'], ['W', False]], ['regression [\"Y4913243Z\"]', ['Y4913243Z'], ['C', False]], ['control [\"09456394Q\"]', ['09456394Q'], ['J', False]], ['control [\"06580396K\"]', ['06580396K'], ['G', False]], ['control [\"74087956U\"]', ['74087956U'], ['B', False]], ['control [\"08401512F\"]', ['08401512F'], ['A', False]], ['control [\"73708311E\"]', ['73708311E'], ['G', False]], ['control [\"12345678Z\"]', ['12345678Z'], ['Z', True]]], [['regression [\"Y2667738D\"]', ['Y2667738D'], ['M', False]], ['regression [\"Z8719589B\"]', ['Z8719589B'], ['H', False]], ['partial-repair [\"X4304629M\"]', ['X4304629M'], ['H', False]], ['control [\"12345678Z\"]', ['12345678Z'], ['Z', True]], ['control [\"12345678-Z\"]', ['12345678-Z'], ['Z', True]], ['control [\"12345678z\"]', ['12345678z'], ['Z', True]], ['control [\"1234567Z\"]', ['1234567Z'], 'malformed'], ['control [\"A1234567L\"]', ['A1234567L'], 'malformed']], [['regression [\"Z1234567R\"]', ['Z1234567R'], ['R', True]], ['regression [\"y7654321g\"]', ['y7654321g'], ['G', True]], ['partial-repair [\"X5964504D\"]', ['X5964504D'], ['Y', False]], ['partial-repair [\"X1234567L\"]', ['X1234567L'], ['L', True]], ['control [\"123456789\"]', ['123456789'], 'malformed'], ['control [\"11888450T\"]', ['11888450T'], ['A', False]], ['control [\"15183137S\"]', ['15183137S'], ['D', False]], ['control [\"96436549C\"]', ['96436549C'], ['X', False]]], [['regression [\"Y9463691F\"]', ['Y9463691F'], ['X', False]], ['regression [\"Y6311829O\"]', ['Y6311829O'], ['E', False]], ['partial-repair [\"Z1234567R\"]', ['Z1234567R'], ['R', True]], ['partial-repair [\"x1234567l\"]', ['x1234567l'], ['L', True]], ['control [\"84574425H\"]', ['84574425H'], ['K', False]], ['control [\"09456394Q\"]', ['09456394Q'], ['J', False]], ['control [\"06580396K\"]', ['06580396K'], ['G', False]], ['control [\"74087956U\"]', ['74087956U'], ['B', 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-es-dni-nie-nie-prefix","generated_at":"2026-09-29T14:48:41.877122+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Tax and KYC forms validate the control letter of Spanish national and foreigner identity numbers.","repair":"Replace X, Y, Z by the digits 0, 1, 2 before taking the number mod 23.","root_cause":"The X/Y/Z prefix is removed rather than replaced by 0/1/2.","sha256":"dc6aebd987b9f198b10bf8a079f6e3ac42a3ace982e9dbc5b1bcd1c6aa9556e0","title":"NIE prefix letter is dropped instead of mapped · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":39.034,"exit_code":1,"observations":[{"actual":["V",false],"check":"regression [\"Z8303596E\"]","expected":["A",false],"passed":false},{"actual":["R",false],"check":"regression [\"Y9463691F\"]","expected":["X",false],"passed":false},{"actual":["A",false],"check":"control [\"11888450T\"]","expected":["A",false],"passed":true},{"actual":["D",false],"check":"control [\"15183137S\"]","expected":["D",false],"passed":true},{"actual":["X",false],"check":"control [\"96436549C\"]","expected":["X",false],"passed":true},{"actual":["N",false],"check":"control [\"32369867Q\"]","expected":["N",false],"passed":true},{"actual":["K",false],"check":"control [\"84574425H\"]","expected":["K",false],"passed":true},{"actual":["J",false],"check":"control [\"09456394Q\"]","expected":["J",false],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression [\\\"Z8303596E\\\"]\", \"actual\": [\"V\", false], \"expected\": [\"A\", false], \"passed\": false}, {\"check\": \"regression [\\\"Y9463691F\\\"]\", \"actual\": [\"R\", false], \"expected\": [\"X\", false], \"passed\": false}, {\"check\": \"control [\\\"11888450T\\\"]\", \"actual\": [\"A\", false], \"expected\": [\"A\", false], \"passed\": true}, {\"check\": \"control [\\\"15183137S\\\"]\", \"actual\": [\"D\", false], \"expected\": [\"D\", false], \"passed\": true}, {\"check\": \"control [\\\"96436549C\\\"]\", \"actual\": [\"X\", false], \"expected\": [\"X\", false], \"passed\": true}, {\"check\": \"control [\\\"32369867Q\\\"]\", \"actual\": [\"N\", false], \"expected\": [\"N\", false], \"passed\": true}, {\"check\": \"control [\\\"84574425H\\\"]\", \"actual\": [\"K\", false], \"expected\": [\"K\", false], \"passed\": true}, {\"check\": \"control [\\\"09456394Q\\\"]\", \"actual\": [\"J\", false], \"expected\": [\"J\", false], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":37.356,"exit_code":1,"observations":[{"actual":["K",false],"check":"regression [\"Z8303596E\"]","expected":["A",false],"passed":false},{"actual":["L",false],"check":"regression [\"Y9463691F\"]","expected":["X",false],"passed":false},{"actual":["A",false],"check":"control [\"11888450T\"]","expected":["A",false],"passed":true},{"actual":["D",false],"check":"control [\"15183137S\"]","expected":["D",false],"passed":true},{"actual":["X",false],"check":"control [\"96436549C\"]","expected":["X",false],"passed":true},{"actual":["N",false],"check":"control [\"32369867Q\"]","expected":["N",false],"passed":true},{"actual":["K",false],"check":"control [\"84574425H\"]","expected":["K",false],"passed":true},{"actual":["J",false],"check":"control [\"09456394Q\"]","expected":["J",false],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression [\\\"Z8303596E\\\"]\", \"actual\": [\"K\", false], \"expected\": [\"A\", false], \"passed\": false}, {\"check\": \"regression [\\\"Y9463691F\\\"]\", \"actual\": [\"L\", false], \"expected\": [\"X\", false], \"passed\": false}, {\"check\": \"control [\\\"11888450T\\\"]\", \"actual\": [\"A\", false], \"expected\": [\"A\", false], \"passed\": true}, {\"check\": \"control [\\\"15183137S\\\"]\", \"actual\": [\"D\", false], \"expected\": [\"D\", false], \"passed\": true}, {\"check\": \"control [\\\"96436549C\\\"]\", \"actual\": [\"X\", false], \"expected\": [\"X\", false], \"passed\": true}, {\"check\": \"control [\\\"32369867Q\\\"]\", \"actual\": [\"N\", false], \"expected\": [\"N\", false], \"passed\": true}, {\"check\": \"control [\\\"84574425H\\\"]\", \"actual\": [\"K\", false], \"expected\": [\"K\", false], \"passed\": true}, {\"check\": \"control [\\\"09456394Q\\\"]\", \"actual\": [\"J\", false], \"expected\": [\"J\", false], \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":39.192,"exit_code":0,"observations":[{"actual":["A",false],"check":"regression [\"Z8303596E\"]","expected":["A",false],"passed":true},{"actual":["X",false],"check":"regression [\"Y9463691F\"]","expected":["X",false],"passed":true},{"actual":["A",false],"check":"control [\"11888450T\"]","expected":["A",false],"passed":true},{"actual":["D",false],"check":"control [\"15183137S\"]","expected":["D",false],"passed":true},{"actual":["X",false],"check":"control [\"96436549C\"]","expected":["X",false],"passed":true},{"actual":["N",false],"check":"control [\"32369867Q\"]","expected":["N",false],"passed":true},{"actual":["K",false],"check":"control [\"84574425H\"]","expected":["K",false],"passed":true},{"actual":["J",false],"check":"control [\"09456394Q\"]","expected":["J",false],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression [\\\"Z8303596E\\\"]\", \"actual\": [\"A\", false], \"expected\": [\"A\", false], \"passed\": true}, {\"check\": \"regression [\\\"Y9463691F\\\"]\", \"actual\": [\"X\", false], \"expected\": [\"X\", false], \"passed\": true}, {\"check\": \"control [\\\"11888450T\\\"]\", \"actual\": [\"A\", false], \"expected\": [\"A\", false], \"passed\": true}, {\"check\": \"control [\\\"15183137S\\\"]\", \"actual\": [\"D\", false], \"expected\": [\"D\", false], \"passed\": true}, {\"check\": \"control [\\\"96436549C\\\"]\", \"actual\": [\"X\", false], \"expected\": [\"X\", false], \"passed\": true}, {\"check\": \"control [\\\"32369867Q\\\"]\", \"actual\": [\"N\", false], \"expected\": [\"N\", false], \"passed\": true}, {\"check\": \"control [\\\"84574425H\\\"]\", \"actual\": [\"K\", false], \"expected\": [\"K\", false], \"passed\": true}, {\"check\": \"control [\\\"09456394Q\\\"]\", \"actual\": [\"J\", false], \"expected\": [\"J\", false], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}