FA-81966 / Poker hand evaluation / Open access
Unknown ten token silently hashes as an ace · case 01
A hand holding "10h" and an ace is reported as a pair.
ROOT CAUSE
str.find returns -1 for the "1" of a "10" token and P[-1] is the ace prime, so the ten silently becomes an ace.
VERIFIED REPAIR
Normalize "10" to T and use a lookup that fails loudly instead of wrapping to the last table entry.
Unsuccessful approach: Looking up the whole "10" token with find still returns -1 and wraps to the ace prime.
Case contract
Input: five cards "Rs" (rank may be written "10" for ten; suits ignored, repeated ranks allowed up to four). Each rank maps to a distinct prime (2 for deuce ... 41 for ace); the product of the five primes is factored back into rank multiplicities, and the sorted multiplicity pattern names the rank shape: four of a kind, full house, three of a kind, two pair, one pair or high card.
Why this case matters
Prime-product hashing is how table-driven evaluators identify non-flush rank multisets.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
R='23456789TJQKA'
P=[2,3,5,7,11,13,17,19,23,29,31,37,41]
prod=1
for c in x:
prod*=P[R.find(c[0])]
exps=[]
for p in P:
e=0
while prod%p==0:
prod//=p
e+=1
if e: exps.append(e)
exps.sort(reverse=True)
names={(4,1):'four of a kind',(3,2):'full house',(3,1,1):'three of a kind',(2,2,1):'two pair',(2,1,1,1):'one pair',(1,1,1,1,1):'high card'}
return names[tuple(exps)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('ace high', ['Ah', 'Kd', '9c', '7s', '4h'], 'high card'),
('pair of aces', ['Ah', 'Ad', '9c', '7s', '4h'], 'one pair'),
('ace with three', ['Ah', '3d', '9c', '7s', '4h'], 'high card'),
('ace with king', ['Ah', 'Kd', 'Qc', '7s', '4h'], 'high card'),
('ace with seven pair', ['Ah', '7d', '7c', '2s', '4h'], 'one pair'),
('full house', ['Kh', 'Kd', '2c', '2s', '2h'], 'full house'),
('ten token with ace', ['10h', 'Ad', '8c', '6s', '4h'], 'high card'),
('ten token pair', ['10h', 'Td', '8c', '6s', '4h'], 'one pair')],
[('ace with king', ['Ah', 'Kd', 'Qc', '7s', '4h'], 'high card'),
('ace with seven pair', ['Ah', '7d', '7c', '2s', '4h'], 'one pair'),
('full house', ['Kh', 'Kd', '2c', '2s', '2h'], 'full house'),
('quads', ['9h', '9d', '9c', '9s', '2h'], 'four of a kind'),
('two pair', ['Jh', 'Jd', '4c', '4s', 'Ah'], 'two pair'),
('trips deuces', ['2h', '2d', '2c', 'Ks', 'Qh'], 'three of a kind'),
('ten token pair', ['10h', 'Td', '8c', '6s', '4h'], 'one pair'),
('ten token full house', ['10h', '10d', 'Tc', '6s', '6h'], 'full house')],
[('quads', ['9h', '9d', '9c', '9s', '2h'], 'four of a kind'),
('two pair', ['Jh', 'Jd', '4c', '4s', 'Ah'], 'two pair'),
('trips deuces', ['2h', '2d', '2c', 'Ks', 'Qh'], 'three of a kind'),
('deuce and ace', ['2h', 'Ad', '8c', '6s', '4h'], 'high card'),
('high card low', ['2h', '3d', '5c', '7s', '9h'], 'high card'),
('pair of deuces', ['2h', '2d', '5c', '7s', '9h'], 'one pair'),
('ten token with ace', ['10h', 'Ad', '8c', '6s', '4h'], 'high card'),
('ten token full house', ['10h', '10d', 'Tc', '6s', '6h'], 'full house')],
[('ace high', ['Ah', 'Kd', '9c', '7s', '4h'], 'high card'),
('pair of aces', ['Ah', 'Ad', '9c', '7s', '4h'], 'one pair'),
('deuce and ace', ['2h', 'Ad', '8c', '6s', '4h'], 'high card'),
('high card low', ['2h', '3d', '5c', '7s', '9h'], 'high card'),
('pair of deuces', ['2h', '2d', '5c', '7s', '9h'], 'one pair'),
('ten token with ace', ['10h', 'Ad', '8c', '6s', '4h'], 'high card'),
('ten token pair', ['10h', 'Td', '8c', '6s', '4h'], 'one pair'),
('ten token full house', ['10h', '10d', 'Tc', '6s', '6h'], 'full house')],
[('ace high', ['Ah', 'Kd', '9c', '7s', '4h'], 'high card'),
('pair of aces', ['Ah', 'Ad', '9c', '7s', '4h'], 'one pair'),
('ace with three', ['Ah', '3d', '9c', '7s', '4h'], 'high card'),
('ace with king', ['Ah', 'Kd', 'Qc', '7s', '4h'], 'high card'),
('ace with seven pair', ['Ah', '7d', '7c', '2s', '4h'], 'one pair'),
('ten token with ace', ['10h', 'Ad', '8c', '6s', '4h'], 'high card'),
('ten token pair', ['10h', 'Td', '8c', '6s', '4h'], 'one pair'),
('ten token full house', ['10h', '10d', 'Tc', '6s', '6h'], 'full house')]]
for label, args, expected in fixtures[N-1]:
try:
actual = solve(args)
except Exception as exc:
actual = 'error:' + type(exc).__name__
check(label, actual, 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 |
|---|---|---|---|
| ace high | high card | high card | Passed |
| pair of aces | one pair | one pair | Passed |
| ace with three | high card | high card | Passed |
| ace with king | high card | high card | Passed |
| ace with seven pair | one pair | one pair | Passed |
| full house | full house | full house | Passed |
| ten token with ace | one pair | high card | Failed |
| ten token pair | high card | one pair | Failed |
SHA-256 / 50c3994ce1093c5273cb49de700e59bf40f3dc0584104a2149fd2df15d67feb3
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
R='23456789TJQKA'
P=[2,3,5,7,11,13,17,19,23,29,31,37,41]
prod=1
for c in x:
prod*=P[R.find(c[:-1])]
exps=[]
for p in P:
e=0
while prod%p==0:
prod//=p
e+=1
if e: exps.append(e)
exps.sort(reverse=True)
names={(4,1):'four of a kind',(3,2):'full house',(3,1,1):'three of a kind',(2,2,1):'two pair',(2,1,1,1):'one pair',(1,1,1,1,1):'high card'}
return names[tuple(exps)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('ace high', ['Ah', 'Kd', '9c', '7s', '4h'], 'high card'),
('pair of aces', ['Ah', 'Ad', '9c', '7s', '4h'], 'one pair'),
('ace with three', ['Ah', '3d', '9c', '7s', '4h'], 'high card'),
('ace with king', ['Ah', 'Kd', 'Qc', '7s', '4h'], 'high card'),
('ace with seven pair', ['Ah', '7d', '7c', '2s', '4h'], 'one pair'),
('full house', ['Kh', 'Kd', '2c', '2s', '2h'], 'full house'),
('ten token with ace', ['10h', 'Ad', '8c', '6s', '4h'], 'high card'),
('ten token pair', ['10h', 'Td', '8c', '6s', '4h'], 'one pair')],
[('ace with king', ['Ah', 'Kd', 'Qc', '7s', '4h'], 'high card'),
('ace with seven pair', ['Ah', '7d', '7c', '2s', '4h'], 'one pair'),
('full house', ['Kh', 'Kd', '2c', '2s', '2h'], 'full house'),
('quads', ['9h', '9d', '9c', '9s', '2h'], 'four of a kind'),
('two pair', ['Jh', 'Jd', '4c', '4s', 'Ah'], 'two pair'),
('trips deuces', ['2h', '2d', '2c', 'Ks', 'Qh'], 'three of a kind'),
('ten token pair', ['10h', 'Td', '8c', '6s', '4h'], 'one pair'),
('ten token full house', ['10h', '10d', 'Tc', '6s', '6h'], 'full house')],
[('quads', ['9h', '9d', '9c', '9s', '2h'], 'four of a kind'),
('two pair', ['Jh', 'Jd', '4c', '4s', 'Ah'], 'two pair'),
('trips deuces', ['2h', '2d', '2c', 'Ks', 'Qh'], 'three of a kind'),
('deuce and ace', ['2h', 'Ad', '8c', '6s', '4h'], 'high card'),
('high card low', ['2h', '3d', '5c', '7s', '9h'], 'high card'),
('pair of deuces', ['2h', '2d', '5c', '7s', '9h'], 'one pair'),
('ten token with ace', ['10h', 'Ad', '8c', '6s', '4h'], 'high card'),
('ten token full house', ['10h', '10d', 'Tc', '6s', '6h'], 'full house')],
[('ace high', ['Ah', 'Kd', '9c', '7s', '4h'], 'high card'),
('pair of aces', ['Ah', 'Ad', '9c', '7s', '4h'], 'one pair'),
('deuce and ace', ['2h', 'Ad', '8c', '6s', '4h'], 'high card'),
('high card low', ['2h', '3d', '5c', '7s', '9h'], 'high card'),
('pair of deuces', ['2h', '2d', '5c', '7s', '9h'], 'one pair'),
('ten token with ace', ['10h', 'Ad', '8c', '6s', '4h'], 'high card'),
('ten token pair', ['10h', 'Td', '8c', '6s', '4h'], 'one pair'),
('ten token full house', ['10h', '10d', 'Tc', '6s', '6h'], 'full house')],
[('ace high', ['Ah', 'Kd', '9c', '7s', '4h'], 'high card'),
('pair of aces', ['Ah', 'Ad', '9c', '7s', '4h'], 'one pair'),
('ace with three', ['Ah', '3d', '9c', '7s', '4h'], 'high card'),
('ace with king', ['Ah', 'Kd', 'Qc', '7s', '4h'], 'high card'),
('ace with seven pair', ['Ah', '7d', '7c', '2s', '4h'], 'one pair'),
('ten token with ace', ['10h', 'Ad', '8c', '6s', '4h'], 'high card'),
('ten token pair', ['10h', 'Td', '8c', '6s', '4h'], 'one pair'),
('ten token full house', ['10h', '10d', 'Tc', '6s', '6h'], 'full house')]]
for label, args, expected in fixtures[N-1]:
try:
actual = solve(args)
except Exception as exc:
actual = 'error:' + type(exc).__name__
check(label, actual, 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 |
|---|---|---|---|
| ace high | high card | high card | Passed |
| pair of aces | one pair | one pair | Passed |
| ace with three | high card | high card | Passed |
| ace with king | high card | high card | Passed |
| ace with seven pair | one pair | one pair | Passed |
| full house | full house | full house | Passed |
| ten token with ace | one pair | high card | Failed |
| ten token pair | high card | one pair | Failed |
SHA-256 / e6ba092f233bf85fb7377c7369341ab6ce37dc439fa01692a934775e50506536
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
R='23456789TJQKA'
P=[2,3,5,7,11,13,17,19,23,29,31,37,41]
prod=1
for c in x:
prod*=P[R.index('T' if c[:-1]=='10' else c[:-1])]
exps=[]
for p in P:
e=0
while prod%p==0:
prod//=p
e+=1
if e: exps.append(e)
exps.sort(reverse=True)
names={(4,1):'four of a kind',(3,2):'full house',(3,1,1):'three of a kind',(2,2,1):'two pair',(2,1,1,1):'one pair',(1,1,1,1,1):'high card'}
return names[tuple(exps)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('ace high', ['Ah', 'Kd', '9c', '7s', '4h'], 'high card'),
('pair of aces', ['Ah', 'Ad', '9c', '7s', '4h'], 'one pair'),
('ace with three', ['Ah', '3d', '9c', '7s', '4h'], 'high card'),
('ace with king', ['Ah', 'Kd', 'Qc', '7s', '4h'], 'high card'),
('ace with seven pair', ['Ah', '7d', '7c', '2s', '4h'], 'one pair'),
('full house', ['Kh', 'Kd', '2c', '2s', '2h'], 'full house'),
('ten token with ace', ['10h', 'Ad', '8c', '6s', '4h'], 'high card'),
('ten token pair', ['10h', 'Td', '8c', '6s', '4h'], 'one pair')],
[('ace with king', ['Ah', 'Kd', 'Qc', '7s', '4h'], 'high card'),
('ace with seven pair', ['Ah', '7d', '7c', '2s', '4h'], 'one pair'),
('full house', ['Kh', 'Kd', '2c', '2s', '2h'], 'full house'),
('quads', ['9h', '9d', '9c', '9s', '2h'], 'four of a kind'),
('two pair', ['Jh', 'Jd', '4c', '4s', 'Ah'], 'two pair'),
('trips deuces', ['2h', '2d', '2c', 'Ks', 'Qh'], 'three of a kind'),
('ten token pair', ['10h', 'Td', '8c', '6s', '4h'], 'one pair'),
('ten token full house', ['10h', '10d', 'Tc', '6s', '6h'], 'full house')],
[('quads', ['9h', '9d', '9c', '9s', '2h'], 'four of a kind'),
('two pair', ['Jh', 'Jd', '4c', '4s', 'Ah'], 'two pair'),
('trips deuces', ['2h', '2d', '2c', 'Ks', 'Qh'], 'three of a kind'),
('deuce and ace', ['2h', 'Ad', '8c', '6s', '4h'], 'high card'),
('high card low', ['2h', '3d', '5c', '7s', '9h'], 'high card'),
('pair of deuces', ['2h', '2d', '5c', '7s', '9h'], 'one pair'),
('ten token with ace', ['10h', 'Ad', '8c', '6s', '4h'], 'high card'),
('ten token full house', ['10h', '10d', 'Tc', '6s', '6h'], 'full house')],
[('ace high', ['Ah', 'Kd', '9c', '7s', '4h'], 'high card'),
('pair of aces', ['Ah', 'Ad', '9c', '7s', '4h'], 'one pair'),
('deuce and ace', ['2h', 'Ad', '8c', '6s', '4h'], 'high card'),
('high card low', ['2h', '3d', '5c', '7s', '9h'], 'high card'),
('pair of deuces', ['2h', '2d', '5c', '7s', '9h'], 'one pair'),
('ten token with ace', ['10h', 'Ad', '8c', '6s', '4h'], 'high card'),
('ten token pair', ['10h', 'Td', '8c', '6s', '4h'], 'one pair'),
('ten token full house', ['10h', '10d', 'Tc', '6s', '6h'], 'full house')],
[('ace high', ['Ah', 'Kd', '9c', '7s', '4h'], 'high card'),
('pair of aces', ['Ah', 'Ad', '9c', '7s', '4h'], 'one pair'),
('ace with three', ['Ah', '3d', '9c', '7s', '4h'], 'high card'),
('ace with king', ['Ah', 'Kd', 'Qc', '7s', '4h'], 'high card'),
('ace with seven pair', ['Ah', '7d', '7c', '2s', '4h'], 'one pair'),
('ten token with ace', ['10h', 'Ad', '8c', '6s', '4h'], 'high card'),
('ten token pair', ['10h', 'Td', '8c', '6s', '4h'], 'one pair'),
('ten token full house', ['10h', '10d', 'Tc', '6s', '6h'], 'full house')]]
for label, args, expected in fixtures[N-1]:
try:
actual = solve(args)
except Exception as exc:
actual = 'error:' + type(exc).__name__
check(label, actual, 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 |
|---|---|---|---|
| ace high | high card | high card | Passed |
| pair of aces | one pair | one pair | Passed |
| ace with three | high card | high card | Passed |
| ace with king | high card | high card | Passed |
| ace with seven pair | one pair | one pair | Passed |
| full house | full house | full house | Passed |
| ten token with ace | high card | high card | Passed |
| ten token pair | one pair | one pair | Passed |
SHA-256 / 15df0ea62b272cfef095eecbd07d23d0aeb2d18daf7d22d26c7c13bfd59520a6
Verification & scope
A deterministic toy model with an explicitly stated contract; card strings are rank+suit (for example "As", "Td", "10h"); no claim of conformance to any casino or tournament rulebook. 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:50:07.674738+00:00.
Case digest / 454154c4db7dc4dc8eea2608e5dfbdc4f170fd3546d73f64d201a491f5eb0fb1