FAILURE MAP
← Case archive

FA-83736 / Card game rule engines / Open access

Aces beat twos · case 01

A single 2 can be topped by an ace.

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

ROOT CAUSE

The rank order places the 2 at the bottom.

VERIFIED REPAIR

Order ranks 3 through A, then 2.

Unsuccessful approach: Placing the ace above the 2 still inverts the top two ranks.

Case contract

Input [current_combination, play]. Ranks 3 low to 2 high; suits D<C<H<S. A play is 1-3 cards of one rank. On an empty table any valid play is "ok"; otherwise it must have the same size and its highest card must outrank the current highest card (rank, then suit). Empty play is "pass". Return "ok", "invalid" or "pass".

Why this case matters

Card-game engines, scoring apps and online tables apply this rule automatically on every hand.

1 / The failure

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

N = 1
observations = []
def solve(x):
    cur, play = x
    order = '23456789TJQKA'
    suits = 'DCHS'
    def key(c):
        return (order.index(c[0]), suits.index(c[1]))
    if not play:
        return 'pass'
    if len(set(c[0] for c in play)) != 1 or len(play) > 3:
        return 'invalid'
    if not cur:
        return 'ok'
    if len(play) != len(cur):
        return 'invalid'
    if max(key(c) for c in play) > max(key(c) for c in cur):
        return 'ok'
    return 'invalid'
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[['2C', '2S', '2D'], ['4S', '4C', '4H']], 'invalid'], [[['KC', 'KD'], ['KH', 'KS']], 'ok'], [[['8S', '8C', '8H'], ['KD', 'KC', 'KS']], 'ok'], [[['6S'], ['6H']], 'invalid'], [[['9C'], ['6S']], 'invalid'], [[[], ['3H', '3S', '3C']], 'ok'], [[['7D'], ['7S']], 'ok'], [[['AH'], ['2D']], 'ok']], [[[['8D', '8H'], ['8S', '8D', '8H', '8C']], 'invalid'], [[['AS'], ['AH', 'AC', 'AD']], 'invalid'], [[[], ['3C']], 'ok'], [[['QD'], ['QH']], 'ok'], [[['JD', 'JS'], ['TD', 'TS', 'TC', 'TH']], 'invalid'], [[['9S', '9H'], ['8S', '8C']], 'invalid'], [[['QC', 'QH'], ['2C', '2S']], 'ok'], [[['AS'], ['2D']], 'ok']], [[[['9D', '9C'], ['9D', '9C']], 'invalid'], [[['KD'], ['AH']], 'ok'], [[[], ['KS', 'KD']], 'ok'], [[['JC'], ['7C']], 'invalid'], [[['5S'], ['5H']], 'invalid'], [[['2S'], ['5D']], 'invalid'], [[['2D', '2C'], ['6S', '6D']], 'invalid'], [[['2S'], ['AS']], 'invalid']], [[[['JH', 'JC'], ['JC', 'JS']], 'ok'], [[['7C'], ['2D']], 'ok'], [[['2H'], ['2H']], 'invalid'], [[['TH', 'TD'], ['8D', '2S']], 'invalid'], [[['5H', '5D'], ['JS', 'JC']], 'ok'], [[[], ['QC', 'QH']], 'ok'], [[['2S', '2C'], ['7S', '7D']], 'invalid'], [[['AH'], ['2D']], 'ok']], [[[['6C', '6H'], ['AH', '4D']], 'invalid'], [[['3D', '3H', '3C'], ['3S', '3D', '3H', 'AC']], 'invalid'], [[['5S'], ['3S']], 'invalid'], [[['9C'], ['9C']], 'invalid'], [[['7C', '7S', '7D'], ['3D', '3S', '3C']], 'invalid'], [[['3H', '3C'], ['3D', '3C', '3S', '3H']], 'invalid'], [[['6S', '6H'], ['2S', '2D']], 'ok'], [[['AS'], ['2D']], 'ok']]]
for i, (args, expected) in enumerate(fixtures[N-1]):
    check("play case %d" % i, solve(args), 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
play case 0okinvalidFailed
play case 1okokPassed
play case 2okokPassed
play case 3invalidinvalidPassed
play case 4invalidinvalidPassed
play case 5okokPassed
play case 6okokPassed
play case 7invalidokFailed

SHA-256 / 60afbfd60b39c1816df1d53a7eba95b6063e21dbe86b517d40ad34effda13eed

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(x):
    cur, play = x
    order = '3456789TJQK2A'
    suits = 'DCHS'
    def key(c):
        return (order.index(c[0]), suits.index(c[1]))
    if not play:
        return 'pass'
    if len(set(c[0] for c in play)) != 1 or len(play) > 3:
        return 'invalid'
    if not cur:
        return 'ok'
    if len(play) != len(cur):
        return 'invalid'
    if max(key(c) for c in play) > max(key(c) for c in cur):
        return 'ok'
    return 'invalid'
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[['2C', '2S', '2D'], ['4S', '4C', '4H']], 'invalid'], [[['KC', 'KD'], ['KH', 'KS']], 'ok'], [[['8S', '8C', '8H'], ['KD', 'KC', 'KS']], 'ok'], [[['6S'], ['6H']], 'invalid'], [[['9C'], ['6S']], 'invalid'], [[[], ['3H', '3S', '3C']], 'ok'], [[['7D'], ['7S']], 'ok'], [[['AH'], ['2D']], 'ok']], [[[['8D', '8H'], ['8S', '8D', '8H', '8C']], 'invalid'], [[['AS'], ['AH', 'AC', 'AD']], 'invalid'], [[[], ['3C']], 'ok'], [[['QD'], ['QH']], 'ok'], [[['JD', 'JS'], ['TD', 'TS', 'TC', 'TH']], 'invalid'], [[['9S', '9H'], ['8S', '8C']], 'invalid'], [[['QC', 'QH'], ['2C', '2S']], 'ok'], [[['AS'], ['2D']], 'ok']], [[[['9D', '9C'], ['9D', '9C']], 'invalid'], [[['KD'], ['AH']], 'ok'], [[[], ['KS', 'KD']], 'ok'], [[['JC'], ['7C']], 'invalid'], [[['5S'], ['5H']], 'invalid'], [[['2S'], ['5D']], 'invalid'], [[['2D', '2C'], ['6S', '6D']], 'invalid'], [[['2S'], ['AS']], 'invalid']], [[[['JH', 'JC'], ['JC', 'JS']], 'ok'], [[['7C'], ['2D']], 'ok'], [[['2H'], ['2H']], 'invalid'], [[['TH', 'TD'], ['8D', '2S']], 'invalid'], [[['5H', '5D'], ['JS', 'JC']], 'ok'], [[[], ['QC', 'QH']], 'ok'], [[['2S', '2C'], ['7S', '7D']], 'invalid'], [[['AH'], ['2D']], 'ok']], [[[['6C', '6H'], ['AH', '4D']], 'invalid'], [[['3D', '3H', '3C'], ['3S', '3D', '3H', 'AC']], 'invalid'], [[['5S'], ['3S']], 'invalid'], [[['9C'], ['9C']], 'invalid'], [[['7C', '7S', '7D'], ['3D', '3S', '3C']], 'invalid'], [[['3H', '3C'], ['3D', '3C', '3S', '3H']], 'invalid'], [[['6S', '6H'], ['2S', '2D']], 'ok'], [[['AS'], ['2D']], 'ok']]]
for i, (args, expected) in enumerate(fixtures[N-1]):
    check("play case %d" % i, solve(args), 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
play case 0invalidinvalidPassed
play case 1okokPassed
play case 2okokPassed
play case 3invalidinvalidPassed
play case 4invalidinvalidPassed
play case 5okokPassed
play case 6okokPassed
play case 7invalidokFailed

SHA-256 / 344894d22520203f1c9a200da9a1d93e80e343de123b35082516d6aef16b6c8e

3 / The verified repair

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

N = 1
observations = []
def solve(x):
    cur, play = x
    order = '3456789TJQKA2'
    suits = 'DCHS'
    def key(c):
        return (order.index(c[0]), suits.index(c[1]))
    if not play:
        return 'pass'
    if len(set(c[0] for c in play)) != 1 or len(play) > 3:
        return 'invalid'
    if not cur:
        return 'ok'
    if len(play) != len(cur):
        return 'invalid'
    if max(key(c) for c in play) > max(key(c) for c in cur):
        return 'ok'
    return 'invalid'
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[['2C', '2S', '2D'], ['4S', '4C', '4H']], 'invalid'], [[['KC', 'KD'], ['KH', 'KS']], 'ok'], [[['8S', '8C', '8H'], ['KD', 'KC', 'KS']], 'ok'], [[['6S'], ['6H']], 'invalid'], [[['9C'], ['6S']], 'invalid'], [[[], ['3H', '3S', '3C']], 'ok'], [[['7D'], ['7S']], 'ok'], [[['AH'], ['2D']], 'ok']], [[[['8D', '8H'], ['8S', '8D', '8H', '8C']], 'invalid'], [[['AS'], ['AH', 'AC', 'AD']], 'invalid'], [[[], ['3C']], 'ok'], [[['QD'], ['QH']], 'ok'], [[['JD', 'JS'], ['TD', 'TS', 'TC', 'TH']], 'invalid'], [[['9S', '9H'], ['8S', '8C']], 'invalid'], [[['QC', 'QH'], ['2C', '2S']], 'ok'], [[['AS'], ['2D']], 'ok']], [[[['9D', '9C'], ['9D', '9C']], 'invalid'], [[['KD'], ['AH']], 'ok'], [[[], ['KS', 'KD']], 'ok'], [[['JC'], ['7C']], 'invalid'], [[['5S'], ['5H']], 'invalid'], [[['2S'], ['5D']], 'invalid'], [[['2D', '2C'], ['6S', '6D']], 'invalid'], [[['2S'], ['AS']], 'invalid']], [[[['JH', 'JC'], ['JC', 'JS']], 'ok'], [[['7C'], ['2D']], 'ok'], [[['2H'], ['2H']], 'invalid'], [[['TH', 'TD'], ['8D', '2S']], 'invalid'], [[['5H', '5D'], ['JS', 'JC']], 'ok'], [[[], ['QC', 'QH']], 'ok'], [[['2S', '2C'], ['7S', '7D']], 'invalid'], [[['AH'], ['2D']], 'ok']], [[[['6C', '6H'], ['AH', '4D']], 'invalid'], [[['3D', '3H', '3C'], ['3S', '3D', '3H', 'AC']], 'invalid'], [[['5S'], ['3S']], 'invalid'], [[['9C'], ['9C']], 'invalid'], [[['7C', '7S', '7D'], ['3D', '3S', '3C']], 'invalid'], [[['3H', '3C'], ['3D', '3C', '3S', '3H']], 'invalid'], [[['6S', '6H'], ['2S', '2D']], 'ok'], [[['AS'], ['2D']], 'ok']]]
for i, (args, expected) in enumerate(fixtures[N-1]):
    check("play case %d" % i, solve(args), 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
play case 0invalidinvalidPassed
play case 1okokPassed
play case 2okokPassed
play case 3invalidinvalidPassed
play case 4invalidinvalidPassed
play case 5okokPassed
play case 6okokPassed
play case 7okokPassed

SHA-256 / 57e0acfba63da9b1afcf69693f601aaa62e947502f386524161dc6591b7e2da6

Verification & scope

A bounded toy rule contract stated explicitly in the contract field; cards are two-character codes (rank, suit). Not a complete implementation of any published rulebook or casino table rules. 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:24.439478+00:00.

Case digest / 6a4752db5f306ad9a83f053881da070b90ba6db7d7130cf3932a216c2c5bb70f