FA-81891 / Poker hand evaluation / Open access
Exact ties awarded to the first seat · case 01
Two identical straights in different suits are not split; hand_a is paid the whole pot.
ROOT CAUSE
The comparison collapses equality into a win for hand_a.
THE FAILURE
The comparison collapses equality into a win for hand_a.
Unsuccessful approach: Subtracting (a<=b) turns ties into a loss for hand_a instead of a split.
Case contract
Input: [hand_a, hand_b], each five distinct cards "Rs" (ranks 23456789TJQKA, suits cdhs). Return 1 if hand_a wins, -1 if hand_b wins, 0 for a split. Categories rank in the standard order; within a category compare rank groups by (group size, rank) descending; a wheel straight is five-high; suits never break ties.
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'
def key(h):
vals=[R.index(c[0])+2 for c in h]
cnt=collections.Counter(vals)
groups=sorted(cnt.items(), key=lambda kv:(kv[1],kv[0]), reverse=True)
ranks=[v for v,n in groups]
shape=[n for v,n in groups]
flush=len({c[1] for c in h})==1
straight=len(cnt)==5 and (max(vals)-min(vals)==4 or sorted(vals)==[2,3,4,5,14])
if straight:
ranks=[5] if sorted(vals)==[2,3,4,5,14] else [max(vals)]
if straight and flush: cat=8
elif shape==[4,1]: cat=7
elif shape==[3,2]: cat=6
elif flush: cat=5
elif straight: cat=4
elif shape==[3,1,1]: cat=3
elif shape==[2,2,1]: cat=2
elif shape==[2,1,1,1]: cat=1
else: cat=0
return (cat, ranks)
a,b=key(x[0]),key(x[1])
return 1 if a>=b else -1
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('wheel vs six-high straight', [['Ah', '2d', '3c', '4s', '5h'], ['2h', '3d', '4c', '5s', '6h']],
-1),
('six-high vs wheel', [['2c', '3h', '4d', '5c', '6s'], ['As', '2c', '3d', '4h', '5d']], 1),
('pair of twos vs ace high kickers',
[['2h', '2d', 'Kc', 'Qs', 'Jh'], ['3h', '3d', '4c', '5s', '7h']], -1),
('full house trips first', [['3h', '3d', '3c', 'As', 'Ah'], ['Kh', 'Kd', '2c', '2s', '2h']], 1),
('identical ranks different suits',
[['Ah', 'Kd', '9c', '7s', '4h'], ['As', 'Kc', '9d', '7h', '4d']], 0),
('split straights', [['9h', 'Td', 'Jc', 'Qs', 'Kh'], ['9s', 'Tc', 'Jd', 'Qh', 'Kd']], 0),
('flush beats straight', [['2h', '7h', '9h', 'Jh', 'Kh'], ['9s', 'Tc', 'Jd', 'Qh', 'Kd']], 1),
('straight loses to flush', [['9s', 'Tc', 'Jd', 'Qh', 'Kd'], ['2c', '5c', '8c', 'Tc', 'Qc']],
-1)],
[('full house trips first', [['3h', '3d', '3c', 'As', 'Ah'], ['Kh', 'Kd', '2c', '2s', '2h']], 1),
('identical ranks different suits',
[['Ah', 'Kd', '9c', '7s', '4h'], ['As', 'Kc', '9d', '7h', '4d']], 0),
('split straights', [['9h', 'Td', 'Jc', 'Qs', 'Kh'], ['9s', 'Tc', 'Jd', 'Qh', 'Kd']], 0),
('flush beats straight', [['2h', '7h', '9h', 'Jh', 'Kh'], ['9s', 'Tc', 'Jd', 'Qh', 'Kd']], 1),
('straight loses to flush', [['9s', 'Tc', 'Jd', 'Qh', 'Kd'], ['2c', '5c', '8c', 'Tc', 'Qc']], -1),
('paired five-card span', [['5h', '5d', '6c', '7s', '9h'], ['Ah', 'Kd', 'Qc', '8s', '4h']], 1),
('paired span vs two pair', [['5h', '5d', '6c', '7s', '9h'], ['3h', '3d', '2c', '2s', 'Kh']], -1),
('two pair vs paired span', [['Jh', 'Jd', '2c', '2s', 'Kh'], ['8h', '8d', '6c', '7s', '9h']], 1)],
[('identical ranks different suits',
[['Ah', 'Kd', '9c', '7s', '4h'], ['As', 'Kc', '9d', '7h', '4d']], 0),
('split straights', [['9h', 'Td', 'Jc', 'Qs', 'Kh'], ['9s', 'Tc', 'Jd', 'Qh', 'Kd']], 0),
('paired five-card span', [['5h', '5d', '6c', '7s', '9h'], ['Ah', 'Kd', 'Qc', '8s', '4h']], 1),
('paired span vs two pair', [['5h', '5d', '6c', '7s', '9h'], ['3h', '3d', '2c', '2s', 'Kh']], -1),
('two pair vs paired span', [['Jh', 'Jd', '2c', '2s', 'Kh'], ['8h', '8d', '6c', '7s', '9h']], 1),
('two pair high pair first', [['Kh', 'Kd', '3c', '3s', '9h'], ['Qh', 'Qd', 'Jc', 'Js', '2h']], 1),
('kicker decides pair', [['Qh', 'Qd', 'Ac', '4s', '2h'], ['Qs', 'Qc', 'Kc', '9s', '8h']], 1),
('trips vs two pair', [['7h', '7d', '7c', '2s', '3h'], ['Ah', 'Ad', 'Kc', 'Ks', '2h']], 1)],
[('identical ranks different suits',
[['Ah', 'Kd', '9c', '7s', '4h'], ['As', 'Kc', '9d', '7h', '4d']], 0),
('split straights', [['9h', 'Td', 'Jc', 'Qs', 'Kh'], ['9s', 'Tc', 'Jd', 'Qh', 'Kd']], 0),
('two pair high pair first', [['Kh', 'Kd', '3c', '3s', '9h'], ['Qh', 'Qd', 'Jc', 'Js', '2h']], 1),
('kicker decides pair', [['Qh', 'Qd', 'Ac', '4s', '2h'], ['Qs', 'Qc', 'Kc', '9s', '8h']], 1),
('trips vs two pair', [['7h', '7d', '7c', '2s', '3h'], ['Ah', 'Ad', 'Kc', 'Ks', '2h']], 1),
('quads vs full house', [['4h', '4d', '4c', '4s', '2h'], ['Ah', 'Ad', 'Ac', 'Ks', 'Kh']], 1),
('high card ace vs king', [['Ah', '9d', '7c', '4s', '2h'], ['Kh', 'Qd', 'Jc', '9s', '7h']], 1),
('broadway vs wheel', [['Th', 'Jd', 'Qc', 'Ks', 'Ah'], ['As', '2c', '3d', '4h', '5d']], 1)],
[('wheel vs six-high straight', [['Ah', '2d', '3c', '4s', '5h'], ['2h', '3d', '4c', '5s', '6h']],
-1),
('six-high vs wheel', [['2c', '3h', '4d', '5c', '6s'], ['As', '2c', '3d', '4h', '5d']], 1),
('pair of twos vs ace high kickers',
[['2h', '2d', 'Kc', 'Qs', 'Jh'], ['3h', '3d', '4c', '5s', '7h']], -1),
('identical ranks different suits',
[['Ah', 'Kd', '9c', '7s', '4h'], ['As', 'Kc', '9d', '7h', '4d']], 0),
('split straights', [['9h', 'Td', 'Jc', 'Qs', 'Kh'], ['9s', 'Tc', 'Jd', 'Qh', 'Kd']], 0),
('quads vs full house', [['4h', '4d', '4c', '4s', '2h'], ['Ah', 'Ad', 'Ac', 'Ks', 'Kh']], 1),
('high card ace vs king', [['Ah', '9d', '7c', '4s', '2h'], ['Kh', 'Qd', 'Jc', '9s', '7h']], 1),
('broadway vs wheel', [['Th', 'Jd', 'Qc', 'Ks', 'Ah'], ['As', '2c', '3d', '4h', '5d']], 1)]]
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 vs six-high straight | -1 | -1 | Passed |
| six-high vs wheel | 1 | 1 | Passed |
| pair of twos vs ace high kickers | -1 | -1 | Passed |
| full house trips first | 1 | 1 | Passed |
| identical ranks different suits | 1 | 0 | Failed |
| split straights | 1 | 0 | Failed |
| flush beats straight | 1 | 1 | Passed |
| straight loses to flush | -1 | -1 | Passed |
SHA-256 / b67a6646812a391d2ea1ae43029326fb83403b56a60192d86b946fd4ff8846cb
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'
def key(h):
vals=[R.index(c[0])+2 for c in h]
cnt=collections.Counter(vals)
groups=sorted(cnt.items(), key=lambda kv:(kv[1],kv[0]), reverse=True)
ranks=[v for v,n in groups]
shape=[n for v,n in groups]
flush=len({c[1] for c in h})==1
straight=len(cnt)==5 and (max(vals)-min(vals)==4 or sorted(vals)==[2,3,4,5,14])
if straight:
ranks=[5] if sorted(vals)==[2,3,4,5,14] else [max(vals)]
if straight and flush: cat=8
elif shape==[4,1]: cat=7
elif shape==[3,2]: cat=6
elif flush: cat=5
elif straight: cat=4
elif shape==[3,1,1]: cat=3
elif shape==[2,2,1]: cat=2
elif shape==[2,1,1,1]: cat=1
else: cat=0
return (cat, ranks)
a,b=key(x[0]),key(x[1])
return (a>b)-(a<=b)
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('wheel vs six-high straight', [['Ah', '2d', '3c', '4s', '5h'], ['2h', '3d', '4c', '5s', '6h']],
-1),
('six-high vs wheel', [['2c', '3h', '4d', '5c', '6s'], ['As', '2c', '3d', '4h', '5d']], 1),
('pair of twos vs ace high kickers',
[['2h', '2d', 'Kc', 'Qs', 'Jh'], ['3h', '3d', '4c', '5s', '7h']], -1),
('full house trips first', [['3h', '3d', '3c', 'As', 'Ah'], ['Kh', 'Kd', '2c', '2s', '2h']], 1),
('identical ranks different suits',
[['Ah', 'Kd', '9c', '7s', '4h'], ['As', 'Kc', '9d', '7h', '4d']], 0),
('split straights', [['9h', 'Td', 'Jc', 'Qs', 'Kh'], ['9s', 'Tc', 'Jd', 'Qh', 'Kd']], 0),
('flush beats straight', [['2h', '7h', '9h', 'Jh', 'Kh'], ['9s', 'Tc', 'Jd', 'Qh', 'Kd']], 1),
('straight loses to flush', [['9s', 'Tc', 'Jd', 'Qh', 'Kd'], ['2c', '5c', '8c', 'Tc', 'Qc']],
-1)],
[('full house trips first', [['3h', '3d', '3c', 'As', 'Ah'], ['Kh', 'Kd', '2c', '2s', '2h']], 1),
('identical ranks different suits',
[['Ah', 'Kd', '9c', '7s', '4h'], ['As', 'Kc', '9d', '7h', '4d']], 0),
('split straights', [['9h', 'Td', 'Jc', 'Qs', 'Kh'], ['9s', 'Tc', 'Jd', 'Qh', 'Kd']], 0),
('flush beats straight', [['2h', '7h', '9h', 'Jh', 'Kh'], ['9s', 'Tc', 'Jd', 'Qh', 'Kd']], 1),
('straight loses to flush', [['9s', 'Tc', 'Jd', 'Qh', 'Kd'], ['2c', '5c', '8c', 'Tc', 'Qc']], -1),
('paired five-card span', [['5h', '5d', '6c', '7s', '9h'], ['Ah', 'Kd', 'Qc', '8s', '4h']], 1),
('paired span vs two pair', [['5h', '5d', '6c', '7s', '9h'], ['3h', '3d', '2c', '2s', 'Kh']], -1),
('two pair vs paired span', [['Jh', 'Jd', '2c', '2s', 'Kh'], ['8h', '8d', '6c', '7s', '9h']], 1)],
[('identical ranks different suits',
[['Ah', 'Kd', '9c', '7s', '4h'], ['As', 'Kc', '9d', '7h', '4d']], 0),
('split straights', [['9h', 'Td', 'Jc', 'Qs', 'Kh'], ['9s', 'Tc', 'Jd', 'Qh', 'Kd']], 0),
('paired five-card span', [['5h', '5d', '6c', '7s', '9h'], ['Ah', 'Kd', 'Qc', '8s', '4h']], 1),
('paired span vs two pair', [['5h', '5d', '6c', '7s', '9h'], ['3h', '3d', '2c', '2s', 'Kh']], -1),
('two pair vs paired span', [['Jh', 'Jd', '2c', '2s', 'Kh'], ['8h', '8d', '6c', '7s', '9h']], 1),
('two pair high pair first', [['Kh', 'Kd', '3c', '3s', '9h'], ['Qh', 'Qd', 'Jc', 'Js', '2h']], 1),
('kicker decides pair', [['Qh', 'Qd', 'Ac', '4s', '2h'], ['Qs', 'Qc', 'Kc', '9s', '8h']], 1),
('trips vs two pair', [['7h', '7d', '7c', '2s', '3h'], ['Ah', 'Ad', 'Kc', 'Ks', '2h']], 1)],
[('identical ranks different suits',
[['Ah', 'Kd', '9c', '7s', '4h'], ['As', 'Kc', '9d', '7h', '4d']], 0),
('split straights', [['9h', 'Td', 'Jc', 'Qs', 'Kh'], ['9s', 'Tc', 'Jd', 'Qh', 'Kd']], 0),
('two pair high pair first', [['Kh', 'Kd', '3c', '3s', '9h'], ['Qh', 'Qd', 'Jc', 'Js', '2h']], 1),
('kicker decides pair', [['Qh', 'Qd', 'Ac', '4s', '2h'], ['Qs', 'Qc', 'Kc', '9s', '8h']], 1),
('trips vs two pair', [['7h', '7d', '7c', '2s', '3h'], ['Ah', 'Ad', 'Kc', 'Ks', '2h']], 1),
('quads vs full house', [['4h', '4d', '4c', '4s', '2h'], ['Ah', 'Ad', 'Ac', 'Ks', 'Kh']], 1),
('high card ace vs king', [['Ah', '9d', '7c', '4s', '2h'], ['Kh', 'Qd', 'Jc', '9s', '7h']], 1),
('broadway vs wheel', [['Th', 'Jd', 'Qc', 'Ks', 'Ah'], ['As', '2c', '3d', '4h', '5d']], 1)],
[('wheel vs six-high straight', [['Ah', '2d', '3c', '4s', '5h'], ['2h', '3d', '4c', '5s', '6h']],
-1),
('six-high vs wheel', [['2c', '3h', '4d', '5c', '6s'], ['As', '2c', '3d', '4h', '5d']], 1),
('pair of twos vs ace high kickers',
[['2h', '2d', 'Kc', 'Qs', 'Jh'], ['3h', '3d', '4c', '5s', '7h']], -1),
('identical ranks different suits',
[['Ah', 'Kd', '9c', '7s', '4h'], ['As', 'Kc', '9d', '7h', '4d']], 0),
('split straights', [['9h', 'Td', 'Jc', 'Qs', 'Kh'], ['9s', 'Tc', 'Jd', 'Qh', 'Kd']], 0),
('quads vs full house', [['4h', '4d', '4c', '4s', '2h'], ['Ah', 'Ad', 'Ac', 'Ks', 'Kh']], 1),
('high card ace vs king', [['Ah', '9d', '7c', '4s', '2h'], ['Kh', 'Qd', 'Jc', '9s', '7h']], 1),
('broadway vs wheel', [['Th', 'Jd', 'Qc', 'Ks', 'Ah'], ['As', '2c', '3d', '4h', '5d']], 1)]]
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 vs six-high straight | -1 | -1 | Passed |
| six-high vs wheel | 1 | 1 | Passed |
| pair of twos vs ace high kickers | -1 | -1 | Passed |
| full house trips first | 1 | 1 | Passed |
| identical ranks different suits | -1 | 0 | Failed |
| split straights | -1 | 0 | Failed |
| flush beats straight | 1 | 1 | Passed |
| straight loses to flush | -1 | -1 | Passed |
SHA-256 / eedb60056a4505658eb17ca430f659c4bf25657585c571f5d68ebae7743f3a36
HELD IN THE MEMBER ARCHIVE
The verified repair and its recorded checks are member-only.
This mechanism has 8 recorded checks per implementation. The open-access tier publishes the failure and the unsuccessful fix; the repaired source that passes every check, and the observations that prove it, are available to members.
Every case sharing this mechanism uses the same contract and the same repair, so this one record is held back for all of them.
Member access is invitation-based. Sign in with your invited account to inspect the repair.
Sign in to the archive ↗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.015315+00:00.
Case digest / 6cb332ac3af0a23abcdc11b0771b00ec443a8dbeae75512f924352dff234db2b