FAILURE MAP
← Case archive

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.

Verified by executionVariant 1 · 8 checks per implementationDownload source bundle ↓JSON ↗

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 fixtureActualExpectedOutcome
ace highhigh cardhigh cardPassed
pair of acesone pairone pairPassed
ace with threehigh cardhigh cardPassed
ace with kinghigh cardhigh cardPassed
ace with seven pairone pairone pairPassed
full housefull housefull housePassed
ten token with aceone pairhigh cardFailed
ten token pairhigh cardone pairFailed

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 fixtureActualExpectedOutcome
ace highhigh cardhigh cardPassed
pair of acesone pairone pairPassed
ace with threehigh cardhigh cardPassed
ace with kinghigh cardhigh cardPassed
ace with seven pairone pairone pairPassed
full housefull housefull housePassed
ten token with aceone pairhigh cardFailed
ten token pairhigh cardone pairFailed

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 fixtureActualExpectedOutcome
ace highhigh cardhigh cardPassed
pair of acesone pairone pairPassed
ace with threehigh cardhigh cardPassed
ace with kinghigh cardhigh cardPassed
ace with seven pairone pairone pairPassed
full housefull housefull housePassed
ten token with acehigh cardhigh cardPassed
ten token pairone pairone pairPassed

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