FA-81856 / Poker hand evaluation / Open access
One pair hands leak into the two pair branch · case 01
A single pair of nines with three unpaired cards is labelled two pair.
ROOT CAUSE
The two pair test allows four distinct ranks, which is the one pair shape.
VERIFIED REPAIR
Require the count shape [2,2,1], i.e. exactly three distinct ranks with two pairs.
Unsuccessful approach: Testing whether any rank appears twice is just the one pair predicate again.
Case contract
Input: five distinct cards as rank+suit strings; ranks 2-9, T or 10, J, Q, K, A (case-insensitive), suits c/d/h/s (case-insensitive). Return the standard five-card category name in lower case; A-2-3-4-5 is a straight; royal flush is reported as "straight flush".
Why this case matters
Poker engines settle real money pots from these comparisons; a single misranked hand pays the wrong seat.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
import collections
N = 1
observations = []
def solve(x):
R='23456789TJQKA'
vals=sorted((R.index('T' if c[:-1]=='10' else c[:-1].upper())+2 for c in x), reverse=True)
suits=[c[-1].lower() for c in x]
cnt=sorted(collections.Counter(vals).values(), reverse=True)
flush=len(set(suits))==1
uniq=sorted(set(vals))
straight=False
if len(uniq)==5:
if uniq[4]-uniq[0]==4: straight=True
elif uniq==[2,3,4,5,14]: straight=True
if straight and flush: return 'straight flush'
if cnt[0]==4: return 'four of a kind'
if cnt==[3,2]: return 'full house'
if flush: return 'flush'
if straight: return 'straight'
if cnt[0]==3: return 'three of a kind'
if cnt[0]==2 and len(cnt)<=4: return 'two pair'
if cnt[0]==2: return 'one pair'
return 'high card'
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('wheel straight', ['Ah', '2d', '3c', '4s', '5h'], 'straight'),
('wheel straight flush', ['As', '2s', '3s', '4s', '5s'], 'straight flush'),
('four to wheel plus nine', ['2h', '3d', '4c', '5s', '9h'], 'high card'),
('four to wheel plus king', ['2h', '3d', '4c', '5s', 'Kh'], 'high card'),
('plain flush', ['2h', '7h', '9h', 'Jh', 'Kh'], 'flush'),
('broadway', ['Th', 'Jd', 'Qc', 'Ks', 'Ah'], 'straight'),
('trips', ['7h', '7d', '7c', 'Ks', '2h'], 'three of a kind'),
('one pair', ['9h', '9d', '4c', 'Ks', '2h'], 'one pair')],
[('four to wheel plus king', ['2h', '3d', '4c', '5s', 'Kh'], 'high card'),
('plain flush', ['2h', '7h', '9h', 'Jh', 'Kh'], 'flush'),
('broadway', ['Th', 'Jd', 'Qc', 'Ks', 'Ah'], 'straight'),
('trips', ['7h', '7d', '7c', 'Ks', '2h'], 'three of a kind'),
('full house', ['7h', '7d', '7c', 'Ks', 'Kh'], 'full house'),
('one pair', ['9h', '9d', '4c', 'Ks', '2h'], 'one pair'),
('two pair', ['9h', '9d', '4c', '4s', '2h'], 'two pair'),
('ten written as 10', ['10h', 'Jd', 'Qc', 'Ks', '9h'], 'straight')],
[('trips', ['7h', '7d', '7c', 'Ks', '2h'], 'three of a kind'),
('full house', ['7h', '7d', '7c', 'Ks', 'Kh'], 'full house'),
('one pair', ['9h', '9d', '4c', 'Ks', '2h'], 'one pair'),
('two pair', ['9h', '9d', '4c', '4s', '2h'], 'two pair'),
('ten written as 10', ['10h', 'Jd', 'Qc', 'Ks', '9h'], 'straight'),
('lower-case ranks', ['kd', 'kh', '3c', '3s', '8h'], 'two pair'),
('mixed-case suits flush', ['2H', '7h', '9h', 'JH', 'Kh'], 'flush'),
('four-flush only', ['2h', '7h', '9h', 'Jh', 'Ks'], 'high card')],
[('one pair', ['9h', '9d', '4c', 'Ks', '2h'], 'one pair'),
('ten written as 10', ['10h', 'Jd', 'Qc', 'Ks', '9h'], 'straight'),
('lower-case ranks', ['kd', 'kh', '3c', '3s', '8h'], 'two pair'),
('mixed-case suits flush', ['2H', '7h', '9h', 'JH', 'Kh'], 'flush'),
('four-flush only', ['2h', '7h', '9h', 'Jh', 'Ks'], 'high card'),
('quads', ['6h', '6d', '6c', '6s', '2h'], 'four of a kind'),
('high card', ['2h', '7d', '9c', 'Js', 'Kh'], 'high card'),
('straight flush middle', ['5d', '6d', '7d', '8d', '9d'], 'straight flush')],
[('wheel straight', ['Ah', '2d', '3c', '4s', '5h'], 'straight'),
('one pair', ['9h', '9d', '4c', 'Ks', '2h'], 'one pair'),
('four-flush only', ['2h', '7h', '9h', 'Jh', 'Ks'], 'high card'),
('quads', ['6h', '6d', '6c', '6s', '2h'], 'four of a kind'),
('high card', ['2h', '7d', '9c', 'Js', 'Kh'], 'high card'),
('straight flush middle', ['5d', '6d', '7d', '8d', '9d'], 'straight flush'),
('ten flush with 10 token', ['10c', '2c', '5c', '8c', 'Qc'], 'flush'),
('flush ends match only', ['2h', '7d', '9h', 'Jc', 'Kh'], 'high card')]]
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 |
|---|---|---|---|
| wheel straight | straight | straight | Passed |
| wheel straight flush | straight flush | straight flush | Passed |
| four to wheel plus nine | high card | high card | Passed |
| four to wheel plus king | high card | high card | Passed |
| plain flush | flush | flush | Passed |
| broadway | straight | straight | Passed |
| trips | three of a kind | three of a kind | Passed |
| one pair | two pair | one pair | Failed |
SHA-256 / bde0ed45554547c6e9af02ec9a38c05b42803a1d8e418618782841d99c6fa76b
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
import collections
N = 1
observations = []
def solve(x):
R='23456789TJQKA'
vals=sorted((R.index('T' if c[:-1]=='10' else c[:-1].upper())+2 for c in x), reverse=True)
suits=[c[-1].lower() for c in x]
cnt=sorted(collections.Counter(vals).values(), reverse=True)
flush=len(set(suits))==1
uniq=sorted(set(vals))
straight=False
if len(uniq)==5:
if uniq[4]-uniq[0]==4: straight=True
elif uniq==[2,3,4,5,14]: straight=True
if straight and flush: return 'straight flush'
if cnt[0]==4: return 'four of a kind'
if cnt==[3,2]: return 'full house'
if flush: return 'flush'
if straight: return 'straight'
if cnt[0]==3: return 'three of a kind'
if 2 in cnt: return 'two pair'
if cnt[0]==2: return 'one pair'
return 'high card'
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('wheel straight', ['Ah', '2d', '3c', '4s', '5h'], 'straight'),
('wheel straight flush', ['As', '2s', '3s', '4s', '5s'], 'straight flush'),
('four to wheel plus nine', ['2h', '3d', '4c', '5s', '9h'], 'high card'),
('four to wheel plus king', ['2h', '3d', '4c', '5s', 'Kh'], 'high card'),
('plain flush', ['2h', '7h', '9h', 'Jh', 'Kh'], 'flush'),
('broadway', ['Th', 'Jd', 'Qc', 'Ks', 'Ah'], 'straight'),
('trips', ['7h', '7d', '7c', 'Ks', '2h'], 'three of a kind'),
('one pair', ['9h', '9d', '4c', 'Ks', '2h'], 'one pair')],
[('four to wheel plus king', ['2h', '3d', '4c', '5s', 'Kh'], 'high card'),
('plain flush', ['2h', '7h', '9h', 'Jh', 'Kh'], 'flush'),
('broadway', ['Th', 'Jd', 'Qc', 'Ks', 'Ah'], 'straight'),
('trips', ['7h', '7d', '7c', 'Ks', '2h'], 'three of a kind'),
('full house', ['7h', '7d', '7c', 'Ks', 'Kh'], 'full house'),
('one pair', ['9h', '9d', '4c', 'Ks', '2h'], 'one pair'),
('two pair', ['9h', '9d', '4c', '4s', '2h'], 'two pair'),
('ten written as 10', ['10h', 'Jd', 'Qc', 'Ks', '9h'], 'straight')],
[('trips', ['7h', '7d', '7c', 'Ks', '2h'], 'three of a kind'),
('full house', ['7h', '7d', '7c', 'Ks', 'Kh'], 'full house'),
('one pair', ['9h', '9d', '4c', 'Ks', '2h'], 'one pair'),
('two pair', ['9h', '9d', '4c', '4s', '2h'], 'two pair'),
('ten written as 10', ['10h', 'Jd', 'Qc', 'Ks', '9h'], 'straight'),
('lower-case ranks', ['kd', 'kh', '3c', '3s', '8h'], 'two pair'),
('mixed-case suits flush', ['2H', '7h', '9h', 'JH', 'Kh'], 'flush'),
('four-flush only', ['2h', '7h', '9h', 'Jh', 'Ks'], 'high card')],
[('one pair', ['9h', '9d', '4c', 'Ks', '2h'], 'one pair'),
('ten written as 10', ['10h', 'Jd', 'Qc', 'Ks', '9h'], 'straight'),
('lower-case ranks', ['kd', 'kh', '3c', '3s', '8h'], 'two pair'),
('mixed-case suits flush', ['2H', '7h', '9h', 'JH', 'Kh'], 'flush'),
('four-flush only', ['2h', '7h', '9h', 'Jh', 'Ks'], 'high card'),
('quads', ['6h', '6d', '6c', '6s', '2h'], 'four of a kind'),
('high card', ['2h', '7d', '9c', 'Js', 'Kh'], 'high card'),
('straight flush middle', ['5d', '6d', '7d', '8d', '9d'], 'straight flush')],
[('wheel straight', ['Ah', '2d', '3c', '4s', '5h'], 'straight'),
('one pair', ['9h', '9d', '4c', 'Ks', '2h'], 'one pair'),
('four-flush only', ['2h', '7h', '9h', 'Jh', 'Ks'], 'high card'),
('quads', ['6h', '6d', '6c', '6s', '2h'], 'four of a kind'),
('high card', ['2h', '7d', '9c', 'Js', 'Kh'], 'high card'),
('straight flush middle', ['5d', '6d', '7d', '8d', '9d'], 'straight flush'),
('ten flush with 10 token', ['10c', '2c', '5c', '8c', 'Qc'], 'flush'),
('flush ends match only', ['2h', '7d', '9h', 'Jc', 'Kh'], 'high card')]]
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 |
|---|---|---|---|
| wheel straight | straight | straight | Passed |
| wheel straight flush | straight flush | straight flush | Passed |
| four to wheel plus nine | high card | high card | Passed |
| four to wheel plus king | high card | high card | Passed |
| plain flush | flush | flush | Passed |
| broadway | straight | straight | Passed |
| trips | three of a kind | three of a kind | Passed |
| one pair | two pair | one pair | Failed |
SHA-256 / 3eeb2b013d4a2e4349494fab4d086f1997772ca7068680e29b2d1ab32e939777
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
import collections
N = 1
observations = []
def solve(x):
R='23456789TJQKA'
vals=sorted((R.index('T' if c[:-1]=='10' else c[:-1].upper())+2 for c in x), reverse=True)
suits=[c[-1].lower() for c in x]
cnt=sorted(collections.Counter(vals).values(), reverse=True)
flush=len(set(suits))==1
uniq=sorted(set(vals))
straight=False
if len(uniq)==5:
if uniq[4]-uniq[0]==4: straight=True
elif uniq==[2,3,4,5,14]: straight=True
if straight and flush: return 'straight flush'
if cnt[0]==4: return 'four of a kind'
if cnt==[3,2]: return 'full house'
if flush: return 'flush'
if straight: return 'straight'
if cnt[0]==3: return 'three of a kind'
if cnt==[2,2,1]: return 'two pair'
if cnt[0]==2: return 'one pair'
return 'high card'
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('wheel straight', ['Ah', '2d', '3c', '4s', '5h'], 'straight'),
('wheel straight flush', ['As', '2s', '3s', '4s', '5s'], 'straight flush'),
('four to wheel plus nine', ['2h', '3d', '4c', '5s', '9h'], 'high card'),
('four to wheel plus king', ['2h', '3d', '4c', '5s', 'Kh'], 'high card'),
('plain flush', ['2h', '7h', '9h', 'Jh', 'Kh'], 'flush'),
('broadway', ['Th', 'Jd', 'Qc', 'Ks', 'Ah'], 'straight'),
('trips', ['7h', '7d', '7c', 'Ks', '2h'], 'three of a kind'),
('one pair', ['9h', '9d', '4c', 'Ks', '2h'], 'one pair')],
[('four to wheel plus king', ['2h', '3d', '4c', '5s', 'Kh'], 'high card'),
('plain flush', ['2h', '7h', '9h', 'Jh', 'Kh'], 'flush'),
('broadway', ['Th', 'Jd', 'Qc', 'Ks', 'Ah'], 'straight'),
('trips', ['7h', '7d', '7c', 'Ks', '2h'], 'three of a kind'),
('full house', ['7h', '7d', '7c', 'Ks', 'Kh'], 'full house'),
('one pair', ['9h', '9d', '4c', 'Ks', '2h'], 'one pair'),
('two pair', ['9h', '9d', '4c', '4s', '2h'], 'two pair'),
('ten written as 10', ['10h', 'Jd', 'Qc', 'Ks', '9h'], 'straight')],
[('trips', ['7h', '7d', '7c', 'Ks', '2h'], 'three of a kind'),
('full house', ['7h', '7d', '7c', 'Ks', 'Kh'], 'full house'),
('one pair', ['9h', '9d', '4c', 'Ks', '2h'], 'one pair'),
('two pair', ['9h', '9d', '4c', '4s', '2h'], 'two pair'),
('ten written as 10', ['10h', 'Jd', 'Qc', 'Ks', '9h'], 'straight'),
('lower-case ranks', ['kd', 'kh', '3c', '3s', '8h'], 'two pair'),
('mixed-case suits flush', ['2H', '7h', '9h', 'JH', 'Kh'], 'flush'),
('four-flush only', ['2h', '7h', '9h', 'Jh', 'Ks'], 'high card')],
[('one pair', ['9h', '9d', '4c', 'Ks', '2h'], 'one pair'),
('ten written as 10', ['10h', 'Jd', 'Qc', 'Ks', '9h'], 'straight'),
('lower-case ranks', ['kd', 'kh', '3c', '3s', '8h'], 'two pair'),
('mixed-case suits flush', ['2H', '7h', '9h', 'JH', 'Kh'], 'flush'),
('four-flush only', ['2h', '7h', '9h', 'Jh', 'Ks'], 'high card'),
('quads', ['6h', '6d', '6c', '6s', '2h'], 'four of a kind'),
('high card', ['2h', '7d', '9c', 'Js', 'Kh'], 'high card'),
('straight flush middle', ['5d', '6d', '7d', '8d', '9d'], 'straight flush')],
[('wheel straight', ['Ah', '2d', '3c', '4s', '5h'], 'straight'),
('one pair', ['9h', '9d', '4c', 'Ks', '2h'], 'one pair'),
('four-flush only', ['2h', '7h', '9h', 'Jh', 'Ks'], 'high card'),
('quads', ['6h', '6d', '6c', '6s', '2h'], 'four of a kind'),
('high card', ['2h', '7d', '9c', 'Js', 'Kh'], 'high card'),
('straight flush middle', ['5d', '6d', '7d', '8d', '9d'], 'straight flush'),
('ten flush with 10 token', ['10c', '2c', '5c', '8c', 'Qc'], 'flush'),
('flush ends match only', ['2h', '7d', '9h', 'Jc', 'Kh'], 'high card')]]
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 |
|---|---|---|---|
| wheel straight | straight | straight | Passed |
| wheel straight flush | straight flush | straight flush | Passed |
| four to wheel plus nine | high card | high card | Passed |
| four to wheel plus king | high card | high card | Passed |
| plain flush | flush | flush | Passed |
| broadway | straight | straight | Passed |
| trips | three of a kind | three of a kind | Passed |
| one pair | one pair | one pair | Passed |
SHA-256 / 03bdfdccf5251bc7a8a3fa6b1c5635e70502759a8f012532fee4caf043625db7
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:06.927530+00:00.
Case digest / a6badecd2fcbb35aeded33b56ad0c93e6df9e7e75b035c98cbc8cf626783e5a3