{"abstract":"Long-format Visa cards are reported as unknown.","category":"Check-digit algorithms","checks":8,"contract":"Card number screening: spaces removed, nonempty ASCII digits required (else \"malformed\"). Network by prefix and length: visa 4 with 13/16/19 digits; amex 34 or 37 with 15; mastercard 51-55 or 2221-2720 with 16; discover 6011, 644-649 or 65 with 16-19; otherwise \"unknown\". Return [network, Luhn validity].","evaluation_group":"w2-check_digit_algorithms-card-network","failed_approach":"Adding 13 but not 19 still misses long-format cards.","family":"w2-check_digit_algorithms-card-network-visa-lengths","id":"FA-72766","implementations":{"attempt":{"sha256":"43642a35784818fd5b1d0b6414f6284d50434632e676f68b977479df517ae1bb","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(s):\n    t = s.replace(' ', '')\n    if not t or not t.isascii() or not t.isdigit():\n        return 'malformed'\n    n = len(t)\n    if t[0] == '4' and n in (13, 16):\n        net = 'visa'\n    elif t[:2] in ('34', '37') and n == 15:\n        net = 'amex'\n    elif (51 <= int(t[:2]) <= 55 or 2221 <= int(t[:4]) <= 2720) and n == 16:\n        net = 'mastercard'\n    elif (t[:4] == '6011' or 644 <= int(t[:3]) <= 649 or t[:2] == '65') and 16 <= n <= 19:\n        net = 'discover'\n    else:\n        net = 'unknown'\n    total = 0\n    for i, ch in enumerate(reversed(t)):\n        d = int(ch) * (2 if i % 2 else 1)\n        total += d - 9 if d > 9 else d\n    return [net, total % 10 == 0]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression [\"4677178611987\"]', ['4677178611987'], ['visa', False]], ['regression [\"4654355756337734313\"]', ['4654355756337734313'], ['visa', False]], ['control [\"4846348185497646\"]', ['4846348185497646'], ['visa', False]], ['control [\"341466066267172\"]', ['341466066267172'], ['amex', False]], ['control [\"376431358491919\"]', ['376431358491919'], ['amex', False]], ['control [\"351552971521401\"]', ['351552971521401'], ['unknown', True]], ['control [\"367788575584486\"]', ['367788575584486'], ['unknown', False]], ['control [\"5168420993367718\"]', ['5168420993367718'], ['mastercard', False]]], [['regression [\"4654355756337734313\"]', ['4654355756337734313'], ['visa', False]], ['regression [\"4677178611987\"]', ['4677178611987'], ['visa', False]], ['control [\"5168420993367718\"]', ['5168420993367718'], ['mastercard', False]], ['control [\"5518245380112330\"]', ['5518245380112330'], ['mastercard', False]], ['control [\"5656984207856782\"]', ['5656984207856782'], ['unknown', False]], ['control [\"2221631854572594\"]', ['2221631854572594'], ['mastercard', False]], ['control [\"2720611269032342\"]', ['2720611269032342'], ['mastercard', False]], ['control [\"2721101650461399\"]', ['2721101650461399'], ['unknown', False]]], [['regression [\"4677178611987\"]', ['4677178611987'], ['visa', False]], ['regression [\"4654355756337734313\"]', ['4654355756337734313'], ['visa', False]], ['control [\"2721101650461399\"]', ['2721101650461399'], ['unknown', False]], ['control [\"2719349847162292\"]', ['2719349847162292'], ['mastercard', False]], ['control [\"6011388299412119\"]', ['6011388299412119'], ['discover', False]], ['control [\"6441839750335463\"]', ['6441839750335463'], ['discover', False]], ['control [\"6490399248434857177\"]', ['6490399248434857177'], ['discover', False]], ['control [\"6408243514832764\"]', ['6408243514832764'], ['unknown', False]]], [['regression [\"4654355756337734313\"]', ['4654355756337734313'], ['visa', False]], ['regression [\"4677178611987\"]', ['4677178611987'], ['visa', False]], ['control [\"6408243514832764\"]', ['6408243514832764'], ['unknown', False]], ['control [\"6438800916518222\"]', ['6438800916518222'], ['unknown', False]], ['control [\"65813918194527509\"]', ['65813918194527509'], ['discover', False]], ['control [\"6692677811687578\"]', ['6692677811687578'], ['unknown', True]], ['control [\"4111 1111 1111 1111\"]', ['4111 1111 1111 1111'], ['visa', True]], ['control [\"378282246310005\"]', ['378282246310005'], ['amex', True]]], [['regression [\"4677178611987\"]', ['4677178611987'], ['visa', False]], ['regression [\"4654355756337734313\"]', ['4654355756337734313'], ['visa', False]], ['control [\"378282246310005\"]', ['378282246310005'], ['amex', True]], ['control [\"5555555555554444\"]', ['5555555555554444'], ['mastercard', True]], ['control [\"2223003122003222\"]', ['2223003122003222'], ['mastercard', True]], ['control [\"6011111111111117\"]', ['6011111111111117'], ['discover', True]], ['control [\"4111-1111\"]', ['4111-1111'], 'malformed'], ['control [\"\"]', [''], '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":"3203b10ce5f904d59b32153eef4e3d62b54b85ad55e03e6ca5ca7396064c2a38","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(s):\n    t = s.replace(' ', '')\n    if not t or not t.isascii() or not t.isdigit():\n        return 'malformed'\n    n = len(t)\n    if t[0] == '4' and n == 16:\n        net = 'visa'\n    elif t[:2] in ('34', '37') and n == 15:\n        net = 'amex'\n    elif (51 <= int(t[:2]) <= 55 or 2221 <= int(t[:4]) <= 2720) and n == 16:\n        net = 'mastercard'\n    elif (t[:4] == '6011' or 644 <= int(t[:3]) <= 649 or t[:2] == '65') and 16 <= n <= 19:\n        net = 'discover'\n    else:\n        net = 'unknown'\n    total = 0\n    for i, ch in enumerate(reversed(t)):\n        d = int(ch) * (2 if i % 2 else 1)\n        total += d - 9 if d > 9 else d\n    return [net, total % 10 == 0]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression [\"4677178611987\"]', ['4677178611987'], ['visa', False]], ['regression [\"4654355756337734313\"]', ['4654355756337734313'], ['visa', False]], ['control [\"4846348185497646\"]', ['4846348185497646'], ['visa', False]], ['control [\"341466066267172\"]', ['341466066267172'], ['amex', False]], ['control [\"376431358491919\"]', ['376431358491919'], ['amex', False]], ['control [\"351552971521401\"]', ['351552971521401'], ['unknown', True]], ['control [\"367788575584486\"]', ['367788575584486'], ['unknown', False]], ['control [\"5168420993367718\"]', ['5168420993367718'], ['mastercard', False]]], [['regression [\"4654355756337734313\"]', ['4654355756337734313'], ['visa', False]], ['regression [\"4677178611987\"]', ['4677178611987'], ['visa', False]], ['control [\"5168420993367718\"]', ['5168420993367718'], ['mastercard', False]], ['control [\"5518245380112330\"]', ['5518245380112330'], ['mastercard', False]], ['control [\"5656984207856782\"]', ['5656984207856782'], ['unknown', False]], ['control [\"2221631854572594\"]', ['2221631854572594'], ['mastercard', False]], ['control [\"2720611269032342\"]', ['2720611269032342'], ['mastercard', False]], ['control [\"2721101650461399\"]', ['2721101650461399'], ['unknown', False]]], [['regression [\"4677178611987\"]', ['4677178611987'], ['visa', False]], ['regression [\"4654355756337734313\"]', ['4654355756337734313'], ['visa', False]], ['control [\"2721101650461399\"]', ['2721101650461399'], ['unknown', False]], ['control [\"2719349847162292\"]', ['2719349847162292'], ['mastercard', False]], ['control [\"6011388299412119\"]', ['6011388299412119'], ['discover', False]], ['control [\"6441839750335463\"]', ['6441839750335463'], ['discover', False]], ['control [\"6490399248434857177\"]', ['6490399248434857177'], ['discover', False]], ['control [\"6408243514832764\"]', ['6408243514832764'], ['unknown', False]]], [['regression [\"4654355756337734313\"]', ['4654355756337734313'], ['visa', False]], ['regression [\"4677178611987\"]', ['4677178611987'], ['visa', False]], ['control [\"6408243514832764\"]', ['6408243514832764'], ['unknown', False]], ['control [\"6438800916518222\"]', ['6438800916518222'], ['unknown', False]], ['control [\"65813918194527509\"]', ['65813918194527509'], ['discover', False]], ['control [\"6692677811687578\"]', ['6692677811687578'], ['unknown', True]], ['control [\"4111 1111 1111 1111\"]', ['4111 1111 1111 1111'], ['visa', True]], ['control [\"378282246310005\"]', ['378282246310005'], ['amex', True]]], [['regression [\"4677178611987\"]', ['4677178611987'], ['visa', False]], ['regression [\"4654355756337734313\"]', ['4654355756337734313'], ['visa', False]], ['control [\"378282246310005\"]', ['378282246310005'], ['amex', True]], ['control [\"5555555555554444\"]', ['5555555555554444'], ['mastercard', True]], ['control [\"2223003122003222\"]', ['2223003122003222'], ['mastercard', True]], ['control [\"6011111111111117\"]', ['6011111111111117'], ['discover', True]], ['control [\"4111-1111\"]', ['4111-1111'], 'malformed'], ['control [\"\"]', [''], '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":"a175ae65a628118a49b6b92af23b4b7420b787c656fdc72eb4cacbd7a6e00cc1","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(s):\n    t = s.replace(' ', '')\n    if not t or not t.isascii() or not t.isdigit():\n        return 'malformed'\n    n = len(t)\n    if t[0] == '4' and n in (13, 16, 19):\n        net = 'visa'\n    elif t[:2] in ('34', '37') and n == 15:\n        net = 'amex'\n    elif (51 <= int(t[:2]) <= 55 or 2221 <= int(t[:4]) <= 2720) and n == 16:\n        net = 'mastercard'\n    elif (t[:4] == '6011' or 644 <= int(t[:3]) <= 649 or t[:2] == '65') and 16 <= n <= 19:\n        net = 'discover'\n    else:\n        net = 'unknown'\n    total = 0\n    for i, ch in enumerate(reversed(t)):\n        d = int(ch) * (2 if i % 2 else 1)\n        total += d - 9 if d > 9 else d\n    return [net, total % 10 == 0]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression [\"4677178611987\"]', ['4677178611987'], ['visa', False]], ['regression [\"4654355756337734313\"]', ['4654355756337734313'], ['visa', False]], ['control [\"4846348185497646\"]', ['4846348185497646'], ['visa', False]], ['control [\"341466066267172\"]', ['341466066267172'], ['amex', False]], ['control [\"376431358491919\"]', ['376431358491919'], ['amex', False]], ['control [\"351552971521401\"]', ['351552971521401'], ['unknown', True]], ['control [\"367788575584486\"]', ['367788575584486'], ['unknown', False]], ['control [\"5168420993367718\"]', ['5168420993367718'], ['mastercard', False]]], [['regression [\"4654355756337734313\"]', ['4654355756337734313'], ['visa', False]], ['regression [\"4677178611987\"]', ['4677178611987'], ['visa', False]], ['control [\"5168420993367718\"]', ['5168420993367718'], ['mastercard', False]], ['control [\"5518245380112330\"]', ['5518245380112330'], ['mastercard', False]], ['control [\"5656984207856782\"]', ['5656984207856782'], ['unknown', False]], ['control [\"2221631854572594\"]', ['2221631854572594'], ['mastercard', False]], ['control [\"2720611269032342\"]', ['2720611269032342'], ['mastercard', False]], ['control [\"2721101650461399\"]', ['2721101650461399'], ['unknown', False]]], [['regression [\"4677178611987\"]', ['4677178611987'], ['visa', False]], ['regression [\"4654355756337734313\"]', ['4654355756337734313'], ['visa', False]], ['control [\"2721101650461399\"]', ['2721101650461399'], ['unknown', False]], ['control [\"2719349847162292\"]', ['2719349847162292'], ['mastercard', False]], ['control [\"6011388299412119\"]', ['6011388299412119'], ['discover', False]], ['control [\"6441839750335463\"]', ['6441839750335463'], ['discover', False]], ['control [\"6490399248434857177\"]', ['6490399248434857177'], ['discover', False]], ['control [\"6408243514832764\"]', ['6408243514832764'], ['unknown', False]]], [['regression [\"4654355756337734313\"]', ['4654355756337734313'], ['visa', False]], ['regression [\"4677178611987\"]', ['4677178611987'], ['visa', False]], ['control [\"6408243514832764\"]', ['6408243514832764'], ['unknown', False]], ['control [\"6438800916518222\"]', ['6438800916518222'], ['unknown', False]], ['control [\"65813918194527509\"]', ['65813918194527509'], ['discover', False]], ['control [\"6692677811687578\"]', ['6692677811687578'], ['unknown', True]], ['control [\"4111 1111 1111 1111\"]', ['4111 1111 1111 1111'], ['visa', True]], ['control [\"378282246310005\"]', ['378282246310005'], ['amex', True]]], [['regression [\"4677178611987\"]', ['4677178611987'], ['visa', False]], ['regression [\"4654355756337734313\"]', ['4654355756337734313'], ['visa', False]], ['control [\"378282246310005\"]', ['378282246310005'], ['amex', True]], ['control [\"5555555555554444\"]', ['5555555555554444'], ['mastercard', True]], ['control [\"2223003122003222\"]', ['2223003122003222'], ['mastercard', True]], ['control [\"6011111111111117\"]', ['6011111111111117'], ['discover', True]], ['control [\"4111-1111\"]', ['4111-1111'], 'malformed'], ['control [\"\"]', [''], '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-card-network-visa-lengths","generated_at":"2026-09-29T14:48:41.459461+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Checkout forms route card numbers to the right processor and reject Luhn failures before authorization.","repair":"Accept Visa numbers of 13, 16 or 19 digits.","root_cause":"The Visa length set only contains 16.","sha256":"6c40fb07a39931323a259ac4c645f57d4c38280db6e1793c682d310096f7a51c","title":"Visa routing rejects nineteen-digit cards · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":40.286,"exit_code":1,"observations":[{"actual":["visa",false],"check":"regression [\"4677178611987\"]","expected":["visa",false],"passed":true},{"actual":["unknown",false],"check":"regression [\"4654355756337734313\"]","expected":["visa",false],"passed":false},{"actual":["visa",false],"check":"control [\"4846348185497646\"]","expected":["visa",false],"passed":true},{"actual":["amex",false],"check":"control [\"341466066267172\"]","expected":["amex",false],"passed":true},{"actual":["amex",false],"check":"control [\"376431358491919\"]","expected":["amex",false],"passed":true},{"actual":["unknown",true],"check":"control [\"351552971521401\"]","expected":["unknown",true],"passed":true},{"actual":["unknown",false],"check":"control [\"367788575584486\"]","expected":["unknown",false],"passed":true},{"actual":["mastercard",false],"check":"control [\"5168420993367718\"]","expected":["mastercard",false],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression [\\\"4677178611987\\\"]\", \"actual\": [\"visa\", false], \"expected\": [\"visa\", false], \"passed\": true}, {\"check\": \"regression [\\\"4654355756337734313\\\"]\", \"actual\": [\"unknown\", false], \"expected\": [\"visa\", false], \"passed\": false}, {\"check\": \"control [\\\"4846348185497646\\\"]\", \"actual\": [\"visa\", false], \"expected\": [\"visa\", false], \"passed\": true}, {\"check\": \"control [\\\"341466066267172\\\"]\", \"actual\": [\"amex\", false], \"expected\": [\"amex\", false], \"passed\": true}, {\"check\": \"control [\\\"376431358491919\\\"]\", \"actual\": [\"amex\", false], \"expected\": [\"amex\", false], \"passed\": true}, {\"check\": \"control [\\\"351552971521401\\\"]\", \"actual\": [\"unknown\", true], \"expected\": [\"unknown\", true], \"passed\": true}, {\"check\": \"control [\\\"367788575584486\\\"]\", \"actual\": [\"unknown\", false], \"expected\": [\"unknown\", false], \"passed\": true}, {\"check\": \"control [\\\"5168420993367718\\\"]\", \"actual\": [\"mastercard\", false], \"expected\": [\"mastercard\", false], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":45.806,"exit_code":1,"observations":[{"actual":["unknown",false],"check":"regression [\"4677178611987\"]","expected":["visa",false],"passed":false},{"actual":["unknown",false],"check":"regression [\"4654355756337734313\"]","expected":["visa",false],"passed":false},{"actual":["visa",false],"check":"control [\"4846348185497646\"]","expected":["visa",false],"passed":true},{"actual":["amex",false],"check":"control [\"341466066267172\"]","expected":["amex",false],"passed":true},{"actual":["amex",false],"check":"control [\"376431358491919\"]","expected":["amex",false],"passed":true},{"actual":["unknown",true],"check":"control [\"351552971521401\"]","expected":["unknown",true],"passed":true},{"actual":["unknown",false],"check":"control [\"367788575584486\"]","expected":["unknown",false],"passed":true},{"actual":["mastercard",false],"check":"control [\"5168420993367718\"]","expected":["mastercard",false],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression [\\\"4677178611987\\\"]\", \"actual\": [\"unknown\", false], \"expected\": [\"visa\", false], \"passed\": false}, {\"check\": \"regression [\\\"4654355756337734313\\\"]\", \"actual\": [\"unknown\", false], \"expected\": [\"visa\", false], \"passed\": false}, {\"check\": \"control [\\\"4846348185497646\\\"]\", \"actual\": [\"visa\", false], \"expected\": [\"visa\", false], \"passed\": true}, {\"check\": \"control [\\\"341466066267172\\\"]\", \"actual\": [\"amex\", false], \"expected\": [\"amex\", false], \"passed\": true}, {\"check\": \"control [\\\"376431358491919\\\"]\", \"actual\": [\"amex\", false], \"expected\": [\"amex\", false], \"passed\": true}, {\"check\": \"control [\\\"351552971521401\\\"]\", \"actual\": [\"unknown\", true], \"expected\": [\"unknown\", true], \"passed\": true}, {\"check\": \"control [\\\"367788575584486\\\"]\", \"actual\": [\"unknown\", false], \"expected\": [\"unknown\", false], \"passed\": true}, {\"check\": \"control [\\\"5168420993367718\\\"]\", \"actual\": [\"mastercard\", false], \"expected\": [\"mastercard\", false], \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":39.74,"exit_code":0,"observations":[{"actual":["visa",false],"check":"regression [\"4677178611987\"]","expected":["visa",false],"passed":true},{"actual":["visa",false],"check":"regression [\"4654355756337734313\"]","expected":["visa",false],"passed":true},{"actual":["visa",false],"check":"control [\"4846348185497646\"]","expected":["visa",false],"passed":true},{"actual":["amex",false],"check":"control [\"341466066267172\"]","expected":["amex",false],"passed":true},{"actual":["amex",false],"check":"control [\"376431358491919\"]","expected":["amex",false],"passed":true},{"actual":["unknown",true],"check":"control [\"351552971521401\"]","expected":["unknown",true],"passed":true},{"actual":["unknown",false],"check":"control [\"367788575584486\"]","expected":["unknown",false],"passed":true},{"actual":["mastercard",false],"check":"control [\"5168420993367718\"]","expected":["mastercard",false],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression [\\\"4677178611987\\\"]\", \"actual\": [\"visa\", false], \"expected\": [\"visa\", false], \"passed\": true}, {\"check\": \"regression [\\\"4654355756337734313\\\"]\", \"actual\": [\"visa\", false], \"expected\": [\"visa\", false], \"passed\": true}, {\"check\": \"control [\\\"4846348185497646\\\"]\", \"actual\": [\"visa\", false], \"expected\": [\"visa\", false], \"passed\": true}, {\"check\": \"control [\\\"341466066267172\\\"]\", \"actual\": [\"amex\", false], \"expected\": [\"amex\", false], \"passed\": true}, {\"check\": \"control [\\\"376431358491919\\\"]\", \"actual\": [\"amex\", false], \"expected\": [\"amex\", false], \"passed\": true}, {\"check\": \"control [\\\"351552971521401\\\"]\", \"actual\": [\"unknown\", true], \"expected\": [\"unknown\", true], \"passed\": true}, {\"check\": \"control [\\\"367788575584486\\\"]\", \"actual\": [\"unknown\", false], \"expected\": [\"unknown\", false], \"passed\": true}, {\"check\": \"control [\\\"5168420993367718\\\"]\", \"actual\": [\"mastercard\", false], \"expected\": [\"mastercard\", false], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}