FA-72761 / Check-digit algorithms / Open access
Discover range claims all of 64 · case 01
Cards with prefixes 640-643 are routed to discover.
ROOT CAUSE
The 644-649 range is written as the two-digit prefix 64.
VERIFIED REPAIR
Match three-digit prefixes 644 through 649 only.
Unsuccessful approach: Starting the range at 640 still includes 640-643.
Case 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].
Why this case matters
Checkout forms route card numbers to the right processor and reject Luhn failures before authorization.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(s):
t = s.replace(' ', '')
if not t or not t.isascii() or not t.isdigit():
return 'malformed'
n = len(t)
if t[0] == '4' and n in (13, 16, 19):
net = 'visa'
elif t[:2] in ('34', '37') and n == 15:
net = 'amex'
elif (51 <= int(t[:2]) <= 55 or 2221 <= int(t[:4]) <= 2720) and n == 16:
net = 'mastercard'
elif (t[:4] == '6011' or t[:2] == '64' or t[:2] == '65') and 16 <= n <= 19:
net = 'discover'
else:
net = 'unknown'
total = 0
for i, ch in enumerate(reversed(t)):
d = int(ch) * (2 if i % 2 else 1)
total += d - 9 if d > 9 else d
return [net, total % 10 == 0]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression ["6408243514832764"]', ['6408243514832764'], ['unknown', False]], ['regression ["6438800916518222"]', ['6438800916518222'], ['unknown', False]], ['control ["4846348185497646"]', ['4846348185497646'], ['visa', False]], ['control ["4677178611987"]', ['4677178611987'], ['visa', False]], ['control ["4654355756337734313"]', ['4654355756337734313'], ['visa', False]], ['control ["341466066267172"]', ['341466066267172'], ['amex', False]], ['control ["376431358491919"]', ['376431358491919'], ['amex', False]], ['control ["351552971521401"]', ['351552971521401'], ['unknown', True]]], [['regression ["6438800916518222"]', ['6438800916518222'], ['unknown', False]], ['regression ["6408243514832764"]', ['6408243514832764'], ['unknown', False]], ['control ["351552971521401"]', ['351552971521401'], ['unknown', True]], ['control ["367788575584486"]', ['367788575584486'], ['unknown', False]], ['control ["5168420993367718"]', ['5168420993367718'], ['mastercard', False]], ['control ["5518245380112330"]', ['5518245380112330'], ['mastercard', False]], ['control ["5656984207856782"]', ['5656984207856782'], ['unknown', False]], ['control ["2221631854572594"]', ['2221631854572594'], ['mastercard', False]]], [['regression ["6408243514832764"]', ['6408243514832764'], ['unknown', False]], ['regression ["6438800916518222"]', ['6438800916518222'], ['unknown', False]], ['control ["2221631854572594"]', ['2221631854572594'], ['mastercard', False]], ['control ["2720611269032342"]', ['2720611269032342'], ['mastercard', False]], ['control ["2721101650461399"]', ['2721101650461399'], ['unknown', False]], ['control ["2719349847162292"]', ['2719349847162292'], ['mastercard', False]], ['control ["6011388299412119"]', ['6011388299412119'], ['discover', False]], ['control ["6441839750335463"]', ['6441839750335463'], ['discover', False]]], [['regression ["6438800916518222"]', ['6438800916518222'], ['unknown', False]], ['regression ["6408243514832764"]', ['6408243514832764'], ['unknown', False]], ['control ["6441839750335463"]', ['6441839750335463'], ['discover', False]], ['control ["6490399248434857177"]', ['6490399248434857177'], ['discover', 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 ["6408243514832764"]', ['6408243514832764'], ['unknown', False]], ['regression ["6438800916518222"]', ['6438800916518222'], ['unknown', 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']]]
for label, args, expected in fixtures[N - 1]:
check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression ["6408243514832764"] | ['discover', False] | ['unknown', False] | Failed |
| regression ["6438800916518222"] | ['discover', False] | ['unknown', False] | Failed |
| control ["4846348185497646"] | ['visa', False] | ['visa', False] | Passed |
| control ["4677178611987"] | ['visa', False] | ['visa', False] | Passed |
| control ["4654355756337734313"] | ['visa', False] | ['visa', False] | Passed |
| control ["341466066267172"] | ['amex', False] | ['amex', False] | Passed |
| control ["376431358491919"] | ['amex', False] | ['amex', False] | Passed |
| control ["351552971521401"] | ['unknown', True] | ['unknown', True] | Passed |
SHA-256 / aa8b850b0c2d6e40f4e3caadfeaa98bfcd4a51a00a53d7a65ea011738c081ffc
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(s):
t = s.replace(' ', '')
if not t or not t.isascii() or not t.isdigit():
return 'malformed'
n = len(t)
if t[0] == '4' and n in (13, 16, 19):
net = 'visa'
elif t[:2] in ('34', '37') and n == 15:
net = 'amex'
elif (51 <= int(t[:2]) <= 55 or 2221 <= int(t[:4]) <= 2720) and n == 16:
net = 'mastercard'
elif (t[:4] == '6011' or 640 <= int(t[:3]) <= 649 or t[:2] == '65') and 16 <= n <= 19:
net = 'discover'
else:
net = 'unknown'
total = 0
for i, ch in enumerate(reversed(t)):
d = int(ch) * (2 if i % 2 else 1)
total += d - 9 if d > 9 else d
return [net, total % 10 == 0]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression ["6408243514832764"]', ['6408243514832764'], ['unknown', False]], ['regression ["6438800916518222"]', ['6438800916518222'], ['unknown', False]], ['control ["4846348185497646"]', ['4846348185497646'], ['visa', False]], ['control ["4677178611987"]', ['4677178611987'], ['visa', False]], ['control ["4654355756337734313"]', ['4654355756337734313'], ['visa', False]], ['control ["341466066267172"]', ['341466066267172'], ['amex', False]], ['control ["376431358491919"]', ['376431358491919'], ['amex', False]], ['control ["351552971521401"]', ['351552971521401'], ['unknown', True]]], [['regression ["6438800916518222"]', ['6438800916518222'], ['unknown', False]], ['regression ["6408243514832764"]', ['6408243514832764'], ['unknown', False]], ['control ["351552971521401"]', ['351552971521401'], ['unknown', True]], ['control ["367788575584486"]', ['367788575584486'], ['unknown', False]], ['control ["5168420993367718"]', ['5168420993367718'], ['mastercard', False]], ['control ["5518245380112330"]', ['5518245380112330'], ['mastercard', False]], ['control ["5656984207856782"]', ['5656984207856782'], ['unknown', False]], ['control ["2221631854572594"]', ['2221631854572594'], ['mastercard', False]]], [['regression ["6408243514832764"]', ['6408243514832764'], ['unknown', False]], ['regression ["6438800916518222"]', ['6438800916518222'], ['unknown', False]], ['control ["2221631854572594"]', ['2221631854572594'], ['mastercard', False]], ['control ["2720611269032342"]', ['2720611269032342'], ['mastercard', False]], ['control ["2721101650461399"]', ['2721101650461399'], ['unknown', False]], ['control ["2719349847162292"]', ['2719349847162292'], ['mastercard', False]], ['control ["6011388299412119"]', ['6011388299412119'], ['discover', False]], ['control ["6441839750335463"]', ['6441839750335463'], ['discover', False]]], [['regression ["6438800916518222"]', ['6438800916518222'], ['unknown', False]], ['regression ["6408243514832764"]', ['6408243514832764'], ['unknown', False]], ['control ["6441839750335463"]', ['6441839750335463'], ['discover', False]], ['control ["6490399248434857177"]', ['6490399248434857177'], ['discover', 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 ["6408243514832764"]', ['6408243514832764'], ['unknown', False]], ['regression ["6438800916518222"]', ['6438800916518222'], ['unknown', 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']]]
for label, args, expected in fixtures[N - 1]:
check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression ["6408243514832764"] | ['discover', False] | ['unknown', False] | Failed |
| regression ["6438800916518222"] | ['discover', False] | ['unknown', False] | Failed |
| control ["4846348185497646"] | ['visa', False] | ['visa', False] | Passed |
| control ["4677178611987"] | ['visa', False] | ['visa', False] | Passed |
| control ["4654355756337734313"] | ['visa', False] | ['visa', False] | Passed |
| control ["341466066267172"] | ['amex', False] | ['amex', False] | Passed |
| control ["376431358491919"] | ['amex', False] | ['amex', False] | Passed |
| control ["351552971521401"] | ['unknown', True] | ['unknown', True] | Passed |
SHA-256 / 044f2b9cdde8b0b3f08d224044c3c73c82eeaa88c8f79cee7c7e47c0c85f10cb
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(s):
t = s.replace(' ', '')
if not t or not t.isascii() or not t.isdigit():
return 'malformed'
n = len(t)
if t[0] == '4' and n in (13, 16, 19):
net = 'visa'
elif t[:2] in ('34', '37') and n == 15:
net = 'amex'
elif (51 <= int(t[:2]) <= 55 or 2221 <= int(t[:4]) <= 2720) and n == 16:
net = 'mastercard'
elif (t[:4] == '6011' or 644 <= int(t[:3]) <= 649 or t[:2] == '65') and 16 <= n <= 19:
net = 'discover'
else:
net = 'unknown'
total = 0
for i, ch in enumerate(reversed(t)):
d = int(ch) * (2 if i % 2 else 1)
total += d - 9 if d > 9 else d
return [net, total % 10 == 0]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression ["6408243514832764"]', ['6408243514832764'], ['unknown', False]], ['regression ["6438800916518222"]', ['6438800916518222'], ['unknown', False]], ['control ["4846348185497646"]', ['4846348185497646'], ['visa', False]], ['control ["4677178611987"]', ['4677178611987'], ['visa', False]], ['control ["4654355756337734313"]', ['4654355756337734313'], ['visa', False]], ['control ["341466066267172"]', ['341466066267172'], ['amex', False]], ['control ["376431358491919"]', ['376431358491919'], ['amex', False]], ['control ["351552971521401"]', ['351552971521401'], ['unknown', True]]], [['regression ["6438800916518222"]', ['6438800916518222'], ['unknown', False]], ['regression ["6408243514832764"]', ['6408243514832764'], ['unknown', False]], ['control ["351552971521401"]', ['351552971521401'], ['unknown', True]], ['control ["367788575584486"]', ['367788575584486'], ['unknown', False]], ['control ["5168420993367718"]', ['5168420993367718'], ['mastercard', False]], ['control ["5518245380112330"]', ['5518245380112330'], ['mastercard', False]], ['control ["5656984207856782"]', ['5656984207856782'], ['unknown', False]], ['control ["2221631854572594"]', ['2221631854572594'], ['mastercard', False]]], [['regression ["6408243514832764"]', ['6408243514832764'], ['unknown', False]], ['regression ["6438800916518222"]', ['6438800916518222'], ['unknown', False]], ['control ["2221631854572594"]', ['2221631854572594'], ['mastercard', False]], ['control ["2720611269032342"]', ['2720611269032342'], ['mastercard', False]], ['control ["2721101650461399"]', ['2721101650461399'], ['unknown', False]], ['control ["2719349847162292"]', ['2719349847162292'], ['mastercard', False]], ['control ["6011388299412119"]', ['6011388299412119'], ['discover', False]], ['control ["6441839750335463"]', ['6441839750335463'], ['discover', False]]], [['regression ["6438800916518222"]', ['6438800916518222'], ['unknown', False]], ['regression ["6408243514832764"]', ['6408243514832764'], ['unknown', False]], ['control ["6441839750335463"]', ['6441839750335463'], ['discover', False]], ['control ["6490399248434857177"]', ['6490399248434857177'], ['discover', 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 ["6408243514832764"]', ['6408243514832764'], ['unknown', False]], ['regression ["6438800916518222"]', ['6438800916518222'], ['unknown', 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']]]
for label, args, expected in fixtures[N - 1]:
check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression ["6408243514832764"] | ['unknown', False] | ['unknown', False] | Passed |
| regression ["6438800916518222"] | ['unknown', False] | ['unknown', False] | Passed |
| control ["4846348185497646"] | ['visa', False] | ['visa', False] | Passed |
| control ["4677178611987"] | ['visa', False] | ['visa', False] | Passed |
| control ["4654355756337734313"] | ['visa', False] | ['visa', False] | Passed |
| control ["341466066267172"] | ['amex', False] | ['amex', False] | Passed |
| control ["376431358491919"] | ['amex', False] | ['amex', False] | Passed |
| control ["351552971521401"] | ['unknown', True] | ['unknown', True] | Passed |
SHA-256 / 69ee65c12a8a7b01382744340a04e1009234246f6ca8ae39ca675e4d404983a2
Verification & scope
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.
Observations recorded using Python 3.12.14 at 2026-09-29T14:48:41.427269+00:00.
Case digest / 4e6b669973ccdeb812bedc9f3cb306b5e684a5033fd1d3cbc4bd1c1878a8b83c