FAILURE MAP
← Case archive

FA-82161 / Poker hand evaluation / Open access

Suited class enumerates offsuit combos · case 01

"AKs" counts 12 combos.

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

ROOT CAUSE

The suited filter is inverted and discards the same-suit combos.

VERIFIED REPAIR

For a suited class, skip every combo whose suits differ.

Unsuccessful approach: Skipping by suit index order keeps mixed-suit combos.

Case contract

Input: {"hand": class such as "AKs", "AKo", "AK" or "QQ", "dead": [known cards, rank upper-case or lower-case, suit lower-case or upper-case]}. Enumerate the concrete two-card combos of the class (suits c,d,h,s) and return how many contain no dead card.

Why this case matters

Blocker math decides how many value combos an opponent can still hold.

1 / The failure

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(x):
    S='cdhs'
    h=x['hand']; dead={c[0].upper()+c[1].lower() for c in x['dead']}
    r1,r2=h[0],h[1]; suf=h[2:]
    n=0
    for i,s1 in enumerate(S):
        for j,s2 in enumerate(S):
            if r1==r2 and j<=i: continue
            if suf=='s' and s1==s2: continue
            if suf=='o' and s1==s2: continue
            if r1+s1 in dead or r2+s2 in dead: continue
            n+=1
    return n
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('pair no blockers', {'dead': [], 'hand': 'QQ'}, 6),
  ('pair one blocker', {'dead': ['Qh'], 'hand': 'QQ'}, 3),
  ('suited no blockers', {'dead': [], 'hand': 'AKs'}, 4),
  ('suited blocked king', {'dead': ['Kd'], 'hand': 'AKs'}, 3),
  ('offsuit blocked king', {'dead': ['Kd'], 'hand': 'AKo'}, 9),
  ('any ace king two blockers', {'dead': ['As', 'Kc'], 'hand': 'AK'}, 9),
  ('lower-case dead', {'dead': ['ah', 'kS'], 'hand': 'AKo'}, 7),
  ('pair two blockers', {'dead': ['9c', '9s'], 'hand': '99'}, 1)],
 [('suited no blockers', {'dead': [], 'hand': 'AKs'}, 4),
  ('suited blocked king', {'dead': ['Kd'], 'hand': 'AKs'}, 3),
  ('any ace king two blockers', {'dead': ['As', 'Kc'], 'hand': 'AK'}, 9),
  ('lower-case dead', {'dead': ['ah', 'kS'], 'hand': 'AKo'}, 7),
  ('upper-case suit dead', {'dead': ['JH'], 'hand': 'JTs'}, 3),
  ('unrelated dead', {'dead': ['2c', '7d'], 'hand': 'AKs'}, 4),
  ('pair two blockers', {'dead': ['9c', '9s'], 'hand': '99'}, 1),
  ('offsuit no blockers', {'dead': [], 'hand': 'T9o'}, 12)],
 [('pair no blockers', {'dead': [], 'hand': 'QQ'}, 6),
  ('pair one blocker', {'dead': ['Qh'], 'hand': 'QQ'}, 3),
  ('suited no blockers', {'dead': [], 'hand': 'AKs'}, 4),
  ('suited blocked king', {'dead': ['Kd'], 'hand': 'AKs'}, 3),
  ('upper-case suit dead', {'dead': ['JH'], 'hand': 'JTs'}, 3),
  ('unrelated dead', {'dead': ['2c', '7d'], 'hand': 'AKs'}, 4),
  ('offsuit no blockers', {'dead': [], 'hand': 'T9o'}, 12),
  ('blocked first rank only', {'dead': ['Qs', 'Qh'], 'hand': 'KQs'}, 2)],
 [('pair no blockers', {'dead': [], 'hand': 'QQ'}, 6),
  ('pair one blocker', {'dead': ['Qh'], 'hand': 'QQ'}, 3),
  ('offsuit blocked king', {'dead': ['Kd'], 'hand': 'AKo'}, 9),
  ('any ace king two blockers', {'dead': ['As', 'Kc'], 'hand': 'AK'}, 9),
  ('lower-case dead', {'dead': ['ah', 'kS'], 'hand': 'AKo'}, 7),
  ('upper-case suit dead', {'dead': ['JH'], 'hand': 'JTs'}, 3),
  ('unrelated dead', {'dead': ['2c', '7d'], 'hand': 'AKs'}, 4),
  ('blocked first rank only', {'dead': ['Qs', 'Qh'], 'hand': 'KQs'}, 2)],
 [('pair no blockers', {'dead': [], 'hand': 'QQ'}, 6),
  ('pair one blocker', {'dead': ['Qh'], 'hand': 'QQ'}, 3),
  ('suited no blockers', {'dead': [], 'hand': 'AKs'}, 4),
  ('offsuit blocked king', {'dead': ['Kd'], 'hand': 'AKo'}, 9),
  ('any ace king two blockers', {'dead': ['As', 'Kc'], 'hand': 'AK'}, 9),
  ('lower-case dead', {'dead': ['ah', 'kS'], 'hand': 'AKo'}, 7),
  ('pair two blockers', {'dead': ['9c', '9s'], 'hand': '99'}, 1),
  ('blocked first rank only', {'dead': ['Qs', 'Qh'], 'hand': 'KQs'}, 2)]]
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
pair no blockers66Passed
pair one blocker33Passed
suited no blockers124Failed
suited blocked king93Failed
offsuit blocked king99Passed
any ace king two blockers99Passed
lower-case dead77Passed
pair two blockers11Passed

SHA-256 / 22009411302bbb97d20d2461900fac8013a8a18b0247310849151f503116bebe

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(x):
    S='cdhs'
    h=x['hand']; dead={c[0].upper()+c[1].lower() for c in x['dead']}
    r1,r2=h[0],h[1]; suf=h[2:]
    n=0
    for i,s1 in enumerate(S):
        for j,s2 in enumerate(S):
            if r1==r2 and j<=i: continue
            if suf=='s' and i>j: continue
            if suf=='o' and s1==s2: continue
            if r1+s1 in dead or r2+s2 in dead: continue
            n+=1
    return n
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('pair no blockers', {'dead': [], 'hand': 'QQ'}, 6),
  ('pair one blocker', {'dead': ['Qh'], 'hand': 'QQ'}, 3),
  ('suited no blockers', {'dead': [], 'hand': 'AKs'}, 4),
  ('suited blocked king', {'dead': ['Kd'], 'hand': 'AKs'}, 3),
  ('offsuit blocked king', {'dead': ['Kd'], 'hand': 'AKo'}, 9),
  ('any ace king two blockers', {'dead': ['As', 'Kc'], 'hand': 'AK'}, 9),
  ('lower-case dead', {'dead': ['ah', 'kS'], 'hand': 'AKo'}, 7),
  ('pair two blockers', {'dead': ['9c', '9s'], 'hand': '99'}, 1)],
 [('suited no blockers', {'dead': [], 'hand': 'AKs'}, 4),
  ('suited blocked king', {'dead': ['Kd'], 'hand': 'AKs'}, 3),
  ('any ace king two blockers', {'dead': ['As', 'Kc'], 'hand': 'AK'}, 9),
  ('lower-case dead', {'dead': ['ah', 'kS'], 'hand': 'AKo'}, 7),
  ('upper-case suit dead', {'dead': ['JH'], 'hand': 'JTs'}, 3),
  ('unrelated dead', {'dead': ['2c', '7d'], 'hand': 'AKs'}, 4),
  ('pair two blockers', {'dead': ['9c', '9s'], 'hand': '99'}, 1),
  ('offsuit no blockers', {'dead': [], 'hand': 'T9o'}, 12)],
 [('pair no blockers', {'dead': [], 'hand': 'QQ'}, 6),
  ('pair one blocker', {'dead': ['Qh'], 'hand': 'QQ'}, 3),
  ('suited no blockers', {'dead': [], 'hand': 'AKs'}, 4),
  ('suited blocked king', {'dead': ['Kd'], 'hand': 'AKs'}, 3),
  ('upper-case suit dead', {'dead': ['JH'], 'hand': 'JTs'}, 3),
  ('unrelated dead', {'dead': ['2c', '7d'], 'hand': 'AKs'}, 4),
  ('offsuit no blockers', {'dead': [], 'hand': 'T9o'}, 12),
  ('blocked first rank only', {'dead': ['Qs', 'Qh'], 'hand': 'KQs'}, 2)],
 [('pair no blockers', {'dead': [], 'hand': 'QQ'}, 6),
  ('pair one blocker', {'dead': ['Qh'], 'hand': 'QQ'}, 3),
  ('offsuit blocked king', {'dead': ['Kd'], 'hand': 'AKo'}, 9),
  ('any ace king two blockers', {'dead': ['As', 'Kc'], 'hand': 'AK'}, 9),
  ('lower-case dead', {'dead': ['ah', 'kS'], 'hand': 'AKo'}, 7),
  ('upper-case suit dead', {'dead': ['JH'], 'hand': 'JTs'}, 3),
  ('unrelated dead', {'dead': ['2c', '7d'], 'hand': 'AKs'}, 4),
  ('blocked first rank only', {'dead': ['Qs', 'Qh'], 'hand': 'KQs'}, 2)],
 [('pair no blockers', {'dead': [], 'hand': 'QQ'}, 6),
  ('pair one blocker', {'dead': ['Qh'], 'hand': 'QQ'}, 3),
  ('suited no blockers', {'dead': [], 'hand': 'AKs'}, 4),
  ('offsuit blocked king', {'dead': ['Kd'], 'hand': 'AKo'}, 9),
  ('any ace king two blockers', {'dead': ['As', 'Kc'], 'hand': 'AK'}, 9),
  ('lower-case dead', {'dead': ['ah', 'kS'], 'hand': 'AKo'}, 7),
  ('pair two blockers', {'dead': ['9c', '9s'], 'hand': '99'}, 1),
  ('blocked first rank only', {'dead': ['Qs', 'Qh'], 'hand': 'KQs'}, 2)]]
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
pair no blockers66Passed
pair one blocker33Passed
suited no blockers104Failed
suited blocked king83Failed
offsuit blocked king99Passed
any ace king two blockers99Passed
lower-case dead77Passed
pair two blockers11Passed

SHA-256 / 9eddd8730b8953dcb10bb4a2844f05dcc414ff7331197e51db1de52856a28b7e

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(x):
    S='cdhs'
    h=x['hand']; dead={c[0].upper()+c[1].lower() for c in x['dead']}
    r1,r2=h[0],h[1]; suf=h[2:]
    n=0
    for i,s1 in enumerate(S):
        for j,s2 in enumerate(S):
            if r1==r2 and j<=i: continue
            if suf=='s' and s1!=s2: continue
            if suf=='o' and s1==s2: continue
            if r1+s1 in dead or r2+s2 in dead: continue
            n+=1
    return n
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('pair no blockers', {'dead': [], 'hand': 'QQ'}, 6),
  ('pair one blocker', {'dead': ['Qh'], 'hand': 'QQ'}, 3),
  ('suited no blockers', {'dead': [], 'hand': 'AKs'}, 4),
  ('suited blocked king', {'dead': ['Kd'], 'hand': 'AKs'}, 3),
  ('offsuit blocked king', {'dead': ['Kd'], 'hand': 'AKo'}, 9),
  ('any ace king two blockers', {'dead': ['As', 'Kc'], 'hand': 'AK'}, 9),
  ('lower-case dead', {'dead': ['ah', 'kS'], 'hand': 'AKo'}, 7),
  ('pair two blockers', {'dead': ['9c', '9s'], 'hand': '99'}, 1)],
 [('suited no blockers', {'dead': [], 'hand': 'AKs'}, 4),
  ('suited blocked king', {'dead': ['Kd'], 'hand': 'AKs'}, 3),
  ('any ace king two blockers', {'dead': ['As', 'Kc'], 'hand': 'AK'}, 9),
  ('lower-case dead', {'dead': ['ah', 'kS'], 'hand': 'AKo'}, 7),
  ('upper-case suit dead', {'dead': ['JH'], 'hand': 'JTs'}, 3),
  ('unrelated dead', {'dead': ['2c', '7d'], 'hand': 'AKs'}, 4),
  ('pair two blockers', {'dead': ['9c', '9s'], 'hand': '99'}, 1),
  ('offsuit no blockers', {'dead': [], 'hand': 'T9o'}, 12)],
 [('pair no blockers', {'dead': [], 'hand': 'QQ'}, 6),
  ('pair one blocker', {'dead': ['Qh'], 'hand': 'QQ'}, 3),
  ('suited no blockers', {'dead': [], 'hand': 'AKs'}, 4),
  ('suited blocked king', {'dead': ['Kd'], 'hand': 'AKs'}, 3),
  ('upper-case suit dead', {'dead': ['JH'], 'hand': 'JTs'}, 3),
  ('unrelated dead', {'dead': ['2c', '7d'], 'hand': 'AKs'}, 4),
  ('offsuit no blockers', {'dead': [], 'hand': 'T9o'}, 12),
  ('blocked first rank only', {'dead': ['Qs', 'Qh'], 'hand': 'KQs'}, 2)],
 [('pair no blockers', {'dead': [], 'hand': 'QQ'}, 6),
  ('pair one blocker', {'dead': ['Qh'], 'hand': 'QQ'}, 3),
  ('offsuit blocked king', {'dead': ['Kd'], 'hand': 'AKo'}, 9),
  ('any ace king two blockers', {'dead': ['As', 'Kc'], 'hand': 'AK'}, 9),
  ('lower-case dead', {'dead': ['ah', 'kS'], 'hand': 'AKo'}, 7),
  ('upper-case suit dead', {'dead': ['JH'], 'hand': 'JTs'}, 3),
  ('unrelated dead', {'dead': ['2c', '7d'], 'hand': 'AKs'}, 4),
  ('blocked first rank only', {'dead': ['Qs', 'Qh'], 'hand': 'KQs'}, 2)],
 [('pair no blockers', {'dead': [], 'hand': 'QQ'}, 6),
  ('pair one blocker', {'dead': ['Qh'], 'hand': 'QQ'}, 3),
  ('suited no blockers', {'dead': [], 'hand': 'AKs'}, 4),
  ('offsuit blocked king', {'dead': ['Kd'], 'hand': 'AKo'}, 9),
  ('any ace king two blockers', {'dead': ['As', 'Kc'], 'hand': 'AK'}, 9),
  ('lower-case dead', {'dead': ['ah', 'kS'], 'hand': 'AKo'}, 7),
  ('pair two blockers', {'dead': ['9c', '9s'], 'hand': '99'}, 1),
  ('blocked first rank only', {'dead': ['Qs', 'Qh'], 'hand': 'KQs'}, 2)]]
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
pair no blockers66Passed
pair one blocker33Passed
suited no blockers44Passed
suited blocked king33Passed
offsuit blocked king99Passed
any ace king two blockers99Passed
lower-case dead77Passed
pair two blockers11Passed

SHA-256 / d6ef26f01d266fcde7f50ab385775df96f1b3b0fd96c2f3e63cf5ecb5c5bc0ff

Verification & scope

A deterministic toy model with an explicitly stated contract; card strings are rank+suit (for example "As", "Td"); 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:09.513191+00:00.

Case digest / 9a02866ea3c722c09459d6b55292431728d40c5b0e98bf39c6ecff0b83b5b041