{"abstract":"Payloads ending in states 1-4 get a check digit that does not validate.","category":"Check-digit algorithms","checks":8,"contract":"Verhoeff dihedral-group scheme. mode \"generate\" returns the check digit for a nonempty ASCII digit payload; mode \"validate\" returns whether a nonempty digit string ending in its check digit is correct. Digits are processed from the right with permutation P[(i + offset) % 8], offset 1 when generating and 0 when validating; the check digit is the dihedral inverse of the final state. Empty or non-digit input returns None.","evaluation_group":"w2-check_digit_algorithms-verhoeff","failed_approach":"Using the cyclic inverse (10 - c) % 10 treats the dihedral group as if it were Z10.","family":"w2-check_digit_algorithms-verhoeff-dihedral-inverse","id":"FA-72396","implementations":{"attempt":{"sha256":"2862e66ff0ba5fc144974d53e5218fc9503c5874382e04c90f58119f8ebe8f53","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(s, mode):\n    D = [[0,1,2,3,4,5,6,7,8,9],[1,2,3,4,0,6,7,8,9,5],[2,3,4,0,1,7,8,9,5,6],[3,4,0,1,2,8,9,5,6,7],[4,0,1,2,3,9,5,6,7,8],[5,9,8,7,6,0,4,3,2,1],[6,5,9,8,7,1,0,4,3,2],[7,6,5,9,8,2,1,0,4,3],[8,7,6,5,9,3,2,1,0,4],[9,8,7,6,5,4,3,2,1,0]]\n    P = [[0,1,2,3,4,5,6,7,8,9],[1,5,7,6,2,8,3,0,9,4],[5,8,0,3,7,9,6,1,4,2],[8,9,1,6,0,4,3,5,2,7],[9,4,5,3,1,2,8,7,6,0],[4,2,8,6,5,7,3,9,0,1],[2,7,9,3,8,0,6,4,1,5],[7,0,4,6,9,1,3,2,5,8]]\n    INV = [0,4,3,2,1,5,6,7,8,9]\n    if not s or not s.isascii() or not s.isdigit():\n        return None\n    offset = 1 if mode == 'generate' else 0\n    c = 0\n    for i, ch in enumerate(reversed(s)):\n        c = D[c][P[(i + offset) % 8][int(ch)]]\n    if mode == 'generate':\n        return (10 - c) % 10\n    return c == 0\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression [\"12\", \"generate\"]', ['12', 'generate'], 1], ['regression [\"07668886\", \"generate\"]', ['07668886', 'generate'], 2], ['partial-repair [\"600\", \"generate\"]', ['600', 'generate'], 8], ['control [\"7\", \"generate\"]', ['7', 'generate'], 0], ['control [\"73\", \"validate\"]', ['73', 'validate'], False], ['control [\"123\", \"validate\"]', ['123', 'validate'], False], ['control [\"6001\", \"validate\"]', ['6001', 'validate'], False], ['control [\"317230\", \"validate\"]', ['317230', 'validate'], False]], [['regression [\"236\", \"generate\"]', ['236', 'generate'], 3], ['regression [\"12345\", \"generate\"]', ['12345', 'generate'], 1], ['partial-repair [\"07668886\", \"generate\"]', ['07668886', 'generate'], 2], ['partial-repair [\"286425756\", \"generate\"]', ['286425756', 'generate'], 2], ['control [\"076688867\", \"validate\"]', ['076688867', 'validate'], False], ['control [\"2864257569\", \"validate\"]', ['2864257569', 'validate'], False], ['control [\"426688793324\", \"validate\"]', ['426688793324', 'validate'], False], ['control [\"8115669551647\", \"validate\"]', ['8115669551647', 'validate'], False]], [['regression [\"84736430954837284567892\", \"generate\"]', ['84736430954837284567892', 'generate'], 2], ['regression [\"12\", \"generate\"]', ['12', 'generate'], 1], ['partial-repair [\"811566955164\", \"generate\"]', ['811566955164', 'generate'], 9], ['partial-repair [\"651645631340669\", \"generate\"]', ['651645631340669', 'generate'], 8], ['control [\"2363\", \"validate\"]', ['2363', 'validate'], True], ['control [\"2364\", \"validate\"]', ['2364', 'validate'], False], ['control [\"123451\", \"validate\"]', ['123451', 'validate'], True], ['control [\"\", \"generate\"]', ['', 'generate'], None]], [['regression [\"286425756\", \"generate\"]', ['286425756', 'generate'], 2], ['regression [\"236\", \"generate\"]', ['236', 'generate'], 3], ['partial-repair [\"12345\", \"generate\"]', ['12345', 'generate'], 1], ['partial-repair [\"0\", \"generate\"]', ['0', 'generate'], 4], ['control [\"12a\", \"generate\"]', ['12a', 'generate'], None], ['control [\"0\", \"validate\"]', ['0', 'validate'], True], ['control [\"142857\", \"generate\"]', ['142857', 'generate'], 0], ['control [\"1428570\", \"validate\"]', ['1428570', 'validate'], True]], [['regression [\"0\", \"generate\"]', ['0', 'generate'], 4], ['regression [\"84736430954837284567892\", \"generate\"]', ['84736430954837284567892', 'generate'], 2], ['partial-repair [\"12\", \"generate\"]', ['12', 'generate'], 1], ['partial-repair [\"600\", \"generate\"]', ['600', 'generate'], 8], ['control [\"7\", \"generate\"]', ['7', 'generate'], 0], ['control [\"73\", \"validate\"]', ['73', 'validate'], False], ['control [\"123\", \"validate\"]', ['123', 'validate'], False], ['control [\"6001\", \"validate\"]', ['6001', 'validate'], 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":"43bf08b44923be30c767fe71f9b38c4c8d2266b5d3283791cf7d620edb40a80e","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(s, mode):\n    D = [[0,1,2,3,4,5,6,7,8,9],[1,2,3,4,0,6,7,8,9,5],[2,3,4,0,1,7,8,9,5,6],[3,4,0,1,2,8,9,5,6,7],[4,0,1,2,3,9,5,6,7,8],[5,9,8,7,6,0,4,3,2,1],[6,5,9,8,7,1,0,4,3,2],[7,6,5,9,8,2,1,0,4,3],[8,7,6,5,9,3,2,1,0,4],[9,8,7,6,5,4,3,2,1,0]]\n    P = [[0,1,2,3,4,5,6,7,8,9],[1,5,7,6,2,8,3,0,9,4],[5,8,0,3,7,9,6,1,4,2],[8,9,1,6,0,4,3,5,2,7],[9,4,5,3,1,2,8,7,6,0],[4,2,8,6,5,7,3,9,0,1],[2,7,9,3,8,0,6,4,1,5],[7,0,4,6,9,1,3,2,5,8]]\n    INV = [0,4,3,2,1,5,6,7,8,9]\n    if not s or not s.isascii() or not s.isdigit():\n        return None\n    offset = 1 if mode == 'generate' else 0\n    c = 0\n    for i, ch in enumerate(reversed(s)):\n        c = D[c][P[(i + offset) % 8][int(ch)]]\n    if mode == 'generate':\n        return c\n    return c == 0\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression [\"12\", \"generate\"]', ['12', 'generate'], 1], ['regression [\"07668886\", \"generate\"]', ['07668886', 'generate'], 2], ['partial-repair [\"600\", \"generate\"]', ['600', 'generate'], 8], ['control [\"7\", \"generate\"]', ['7', 'generate'], 0], ['control [\"73\", \"validate\"]', ['73', 'validate'], False], ['control [\"123\", \"validate\"]', ['123', 'validate'], False], ['control [\"6001\", \"validate\"]', ['6001', 'validate'], False], ['control [\"317230\", \"validate\"]', ['317230', 'validate'], False]], [['regression [\"236\", \"generate\"]', ['236', 'generate'], 3], ['regression [\"12345\", \"generate\"]', ['12345', 'generate'], 1], ['partial-repair [\"07668886\", \"generate\"]', ['07668886', 'generate'], 2], ['partial-repair [\"286425756\", \"generate\"]', ['286425756', 'generate'], 2], ['control [\"076688867\", \"validate\"]', ['076688867', 'validate'], False], ['control [\"2864257569\", \"validate\"]', ['2864257569', 'validate'], False], ['control [\"426688793324\", \"validate\"]', ['426688793324', 'validate'], False], ['control [\"8115669551647\", \"validate\"]', ['8115669551647', 'validate'], False]], [['regression [\"84736430954837284567892\", \"generate\"]', ['84736430954837284567892', 'generate'], 2], ['regression [\"12\", \"generate\"]', ['12', 'generate'], 1], ['partial-repair [\"811566955164\", \"generate\"]', ['811566955164', 'generate'], 9], ['partial-repair [\"651645631340669\", \"generate\"]', ['651645631340669', 'generate'], 8], ['control [\"2363\", \"validate\"]', ['2363', 'validate'], True], ['control [\"2364\", \"validate\"]', ['2364', 'validate'], False], ['control [\"123451\", \"validate\"]', ['123451', 'validate'], True], ['control [\"\", \"generate\"]', ['', 'generate'], None]], [['regression [\"286425756\", \"generate\"]', ['286425756', 'generate'], 2], ['regression [\"236\", \"generate\"]', ['236', 'generate'], 3], ['partial-repair [\"12345\", \"generate\"]', ['12345', 'generate'], 1], ['partial-repair [\"0\", \"generate\"]', ['0', 'generate'], 4], ['control [\"12a\", \"generate\"]', ['12a', 'generate'], None], ['control [\"0\", \"validate\"]', ['0', 'validate'], True], ['control [\"142857\", \"generate\"]', ['142857', 'generate'], 0], ['control [\"1428570\", \"validate\"]', ['1428570', 'validate'], True]], [['regression [\"0\", \"generate\"]', ['0', 'generate'], 4], ['regression [\"84736430954837284567892\", \"generate\"]', ['84736430954837284567892', 'generate'], 2], ['partial-repair [\"12\", \"generate\"]', ['12', 'generate'], 1], ['partial-repair [\"600\", \"generate\"]', ['600', 'generate'], 8], ['control [\"7\", \"generate\"]', ['7', 'generate'], 0], ['control [\"73\", \"validate\"]', ['73', 'validate'], False], ['control [\"123\", \"validate\"]', ['123', 'validate'], False], ['control [\"6001\", \"validate\"]', ['6001', 'validate'], 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":"2aaf87edb057e1ca5161402c41dd50a820be676a6d2f5776254f96cffa69ba2a","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(s, mode):\n    D = [[0,1,2,3,4,5,6,7,8,9],[1,2,3,4,0,6,7,8,9,5],[2,3,4,0,1,7,8,9,5,6],[3,4,0,1,2,8,9,5,6,7],[4,0,1,2,3,9,5,6,7,8],[5,9,8,7,6,0,4,3,2,1],[6,5,9,8,7,1,0,4,3,2],[7,6,5,9,8,2,1,0,4,3],[8,7,6,5,9,3,2,1,0,4],[9,8,7,6,5,4,3,2,1,0]]\n    P = [[0,1,2,3,4,5,6,7,8,9],[1,5,7,6,2,8,3,0,9,4],[5,8,0,3,7,9,6,1,4,2],[8,9,1,6,0,4,3,5,2,7],[9,4,5,3,1,2,8,7,6,0],[4,2,8,6,5,7,3,9,0,1],[2,7,9,3,8,0,6,4,1,5],[7,0,4,6,9,1,3,2,5,8]]\n    INV = [0,4,3,2,1,5,6,7,8,9]\n    if not s or not s.isascii() or not s.isdigit():\n        return None\n    offset = 1 if mode == 'generate' else 0\n    c = 0\n    for i, ch in enumerate(reversed(s)):\n        c = D[c][P[(i + offset) % 8][int(ch)]]\n    if mode == 'generate':\n        return INV[c]\n    return c == 0\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression [\"12\", \"generate\"]', ['12', 'generate'], 1], ['regression [\"07668886\", \"generate\"]', ['07668886', 'generate'], 2], ['partial-repair [\"600\", \"generate\"]', ['600', 'generate'], 8], ['control [\"7\", \"generate\"]', ['7', 'generate'], 0], ['control [\"73\", \"validate\"]', ['73', 'validate'], False], ['control [\"123\", \"validate\"]', ['123', 'validate'], False], ['control [\"6001\", \"validate\"]', ['6001', 'validate'], False], ['control [\"317230\", \"validate\"]', ['317230', 'validate'], False]], [['regression [\"236\", \"generate\"]', ['236', 'generate'], 3], ['regression [\"12345\", \"generate\"]', ['12345', 'generate'], 1], ['partial-repair [\"07668886\", \"generate\"]', ['07668886', 'generate'], 2], ['partial-repair [\"286425756\", \"generate\"]', ['286425756', 'generate'], 2], ['control [\"076688867\", \"validate\"]', ['076688867', 'validate'], False], ['control [\"2864257569\", \"validate\"]', ['2864257569', 'validate'], False], ['control [\"426688793324\", \"validate\"]', ['426688793324', 'validate'], False], ['control [\"8115669551647\", \"validate\"]', ['8115669551647', 'validate'], False]], [['regression [\"84736430954837284567892\", \"generate\"]', ['84736430954837284567892', 'generate'], 2], ['regression [\"12\", \"generate\"]', ['12', 'generate'], 1], ['partial-repair [\"811566955164\", \"generate\"]', ['811566955164', 'generate'], 9], ['partial-repair [\"651645631340669\", \"generate\"]', ['651645631340669', 'generate'], 8], ['control [\"2363\", \"validate\"]', ['2363', 'validate'], True], ['control [\"2364\", \"validate\"]', ['2364', 'validate'], False], ['control [\"123451\", \"validate\"]', ['123451', 'validate'], True], ['control [\"\", \"generate\"]', ['', 'generate'], None]], [['regression [\"286425756\", \"generate\"]', ['286425756', 'generate'], 2], ['regression [\"236\", \"generate\"]', ['236', 'generate'], 3], ['partial-repair [\"12345\", \"generate\"]', ['12345', 'generate'], 1], ['partial-repair [\"0\", \"generate\"]', ['0', 'generate'], 4], ['control [\"12a\", \"generate\"]', ['12a', 'generate'], None], ['control [\"0\", \"validate\"]', ['0', 'validate'], True], ['control [\"142857\", \"generate\"]', ['142857', 'generate'], 0], ['control [\"1428570\", \"validate\"]', ['1428570', 'validate'], True]], [['regression [\"0\", \"generate\"]', ['0', 'generate'], 4], ['regression [\"84736430954837284567892\", \"generate\"]', ['84736430954837284567892', 'generate'], 2], ['partial-repair [\"12\", \"generate\"]', ['12', 'generate'], 1], ['partial-repair [\"600\", \"generate\"]', ['600', 'generate'], 8], ['control [\"7\", \"generate\"]', ['7', 'generate'], 0], ['control [\"73\", \"validate\"]', ['73', 'validate'], False], ['control [\"123\", \"validate\"]', ['123', 'validate'], False], ['control [\"6001\", \"validate\"]', ['6001', 'validate'], 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-verhoeff-dihedral-inverse","generated_at":"2026-09-29T14:48:38.100565+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"National identity and ticketing numbers use Verhoeff to catch all single-digit and adjacent transposition errors.","repair":"Return INV[c], the dihedral inverse, so the completed number reduces to 0.","root_cause":"The generator returns c directly; in D5 the elements 1..4 are not self-inverse.","sha256":"37e5a34f9dffd0b706bd6637bd10e038527e35514acb4fa611a43e0e3e8ccf08","title":"Verhoeff returns the final state instead of its inverse · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":38.852,"exit_code":1,"observations":[{"actual":6,"check":"regression [\"12\", \"generate\"]","expected":1,"passed":false},{"actual":7,"check":"regression [\"07668886\", \"generate\"]","expected":2,"passed":false},{"actual":2,"check":"partial-repair [\"600\", \"generate\"]","expected":8,"passed":false},{"actual":0,"check":"control [\"7\", \"generate\"]","expected":0,"passed":true},{"actual":false,"check":"control [\"73\", \"validate\"]","expected":false,"passed":true},{"actual":false,"check":"control [\"123\", \"validate\"]","expected":false,"passed":true},{"actual":false,"check":"control [\"6001\", \"validate\"]","expected":false,"passed":true},{"actual":false,"check":"control [\"317230\", \"validate\"]","expected":false,"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression [\\\"12\\\", \\\"generate\\\"]\", \"actual\": 6, \"expected\": 1, \"passed\": false}, {\"check\": \"regression [\\\"07668886\\\", \\\"generate\\\"]\", \"actual\": 7, \"expected\": 2, \"passed\": false}, {\"check\": \"partial-repair [\\\"600\\\", \\\"generate\\\"]\", \"actual\": 2, \"expected\": 8, \"passed\": false}, {\"check\": \"control [\\\"7\\\", \\\"generate\\\"]\", \"actual\": 0, \"expected\": 0, \"passed\": true}, {\"check\": \"control [\\\"73\\\", \\\"validate\\\"]\", \"actual\": false, \"expected\": false, \"passed\": true}, {\"check\": \"control [\\\"123\\\", \\\"validate\\\"]\", \"actual\": false, \"expected\": false, \"passed\": true}, {\"check\": \"control [\\\"6001\\\", \\\"validate\\\"]\", \"actual\": false, \"expected\": false, \"passed\": true}, {\"check\": \"control [\\\"317230\\\", \\\"validate\\\"]\", \"actual\": false, \"expected\": false, \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":37.454,"exit_code":1,"observations":[{"actual":4,"check":"regression [\"12\", \"generate\"]","expected":1,"passed":false},{"actual":3,"check":"regression [\"07668886\", \"generate\"]","expected":2,"passed":false},{"actual":8,"check":"partial-repair [\"600\", \"generate\"]","expected":8,"passed":true},{"actual":0,"check":"control [\"7\", \"generate\"]","expected":0,"passed":true},{"actual":false,"check":"control [\"73\", \"validate\"]","expected":false,"passed":true},{"actual":false,"check":"control [\"123\", \"validate\"]","expected":false,"passed":true},{"actual":false,"check":"control [\"6001\", \"validate\"]","expected":false,"passed":true},{"actual":false,"check":"control [\"317230\", \"validate\"]","expected":false,"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression [\\\"12\\\", \\\"generate\\\"]\", \"actual\": 4, \"expected\": 1, \"passed\": false}, {\"check\": \"regression [\\\"07668886\\\", \\\"generate\\\"]\", \"actual\": 3, \"expected\": 2, \"passed\": false}, {\"check\": \"partial-repair [\\\"600\\\", \\\"generate\\\"]\", \"actual\": 8, \"expected\": 8, \"passed\": true}, {\"check\": \"control [\\\"7\\\", \\\"generate\\\"]\", \"actual\": 0, \"expected\": 0, \"passed\": true}, {\"check\": \"control [\\\"73\\\", \\\"validate\\\"]\", \"actual\": false, \"expected\": false, \"passed\": true}, {\"check\": \"control [\\\"123\\\", \\\"validate\\\"]\", \"actual\": false, \"expected\": false, \"passed\": true}, {\"check\": \"control [\\\"6001\\\", \\\"validate\\\"]\", \"actual\": false, \"expected\": false, \"passed\": true}, {\"check\": \"control [\\\"317230\\\", \\\"validate\\\"]\", \"actual\": false, \"expected\": false, \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":37.634,"exit_code":0,"observations":[{"actual":1,"check":"regression [\"12\", \"generate\"]","expected":1,"passed":true},{"actual":2,"check":"regression [\"07668886\", \"generate\"]","expected":2,"passed":true},{"actual":8,"check":"partial-repair [\"600\", \"generate\"]","expected":8,"passed":true},{"actual":0,"check":"control [\"7\", \"generate\"]","expected":0,"passed":true},{"actual":false,"check":"control [\"73\", \"validate\"]","expected":false,"passed":true},{"actual":false,"check":"control [\"123\", \"validate\"]","expected":false,"passed":true},{"actual":false,"check":"control [\"6001\", \"validate\"]","expected":false,"passed":true},{"actual":false,"check":"control [\"317230\", \"validate\"]","expected":false,"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression [\\\"12\\\", \\\"generate\\\"]\", \"actual\": 1, \"expected\": 1, \"passed\": true}, {\"check\": \"regression [\\\"07668886\\\", \\\"generate\\\"]\", \"actual\": 2, \"expected\": 2, \"passed\": true}, {\"check\": \"partial-repair [\\\"600\\\", \\\"generate\\\"]\", \"actual\": 8, \"expected\": 8, \"passed\": true}, {\"check\": \"control [\\\"7\\\", \\\"generate\\\"]\", \"actual\": 0, \"expected\": 0, \"passed\": true}, {\"check\": \"control [\\\"73\\\", \\\"validate\\\"]\", \"actual\": false, \"expected\": false, \"passed\": true}, {\"check\": \"control [\\\"123\\\", \\\"validate\\\"]\", \"actual\": false, \"expected\": false, \"passed\": true}, {\"check\": \"control [\\\"6001\\\", \\\"validate\\\"]\", \"actual\": false, \"expected\": false, \"passed\": true}, {\"check\": \"control [\\\"317230\\\", \\\"validate\\\"]\", \"actual\": false, \"expected\": false, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}