FAILURE MAP
← Case archive

FA-83506 / Card game rule engines / Open access

An eight cannot be played on a declared suit · case 01

After a declared suit, eights of other suits are refused.

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

ROOT CAUSE

The declared-suit test runs before the wild-eight rule.

VERIFIED REPAIR

Eights are playable before any other test.

Unsuccessful approach: Removing the wild rule refuses eights whenever suit and rank differ.

Case contract

Input [card, top_card, declared_suit_or_None]. Eights are always playable. When the top card is an 8 with a declared suit, only that suit (or an 8) may follow. Otherwise match suit or rank. Return a bool.

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):
    card, top, declared = x
    if top[0] == '8' and declared:
        return card[1] == declared
    if card[0] == '8':
        return True
    return card[1] == top[1] or card[0] == top[0]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[['8C', '8D', 'S'], True], [['7H', '8C', 'C'], False], [['8C', '8S', 'S'], True], [['JD', '8S', None], False], [['8S', '8H', 'S'], True], [['TS', '3H', None], False], [['8S', '8D', 'H'], True], [['8S', '3H', None], True]], [[['8C', 'JD', None], True], [['6H', 'TC', None], False], [['KC', '6H', None], False], [['2D', '3C', None], False], [['8C', '4D', None], True], [['7C', 'QC', None], True], [['8C', '8C', 'H'], True], [['8D', '8H', 'H'], True]], [[['JH', '7C', None], False], [['JS', '8C', 'C'], False], [['3C', '8H', None], False], [['6C', '8S', 'C'], True], [['AH', 'TC', None], False], [['KH', '8H', 'H'], True], [['8H', '8C', 'C'], True], [['8S', '8H', 'H'], True]], [[['TC', '8C', 'D'], False], [['2H', '2C', None], True], [['6S', '4D', None], False], [['2S', '8C', 'S'], True], [['AC', '8D', 'S'], False], [['8C', '8C', 'H'], True], [['8S', '8H', 'H'], True], [['8H', '6C', None], True]], [[['AC', '4D', None], False], [['JD', '8C', 'H'], False], [['8C', 'AC', None], True], [['8H', '8D', 'C'], True], [['8H', 'TC', None], True], [['TC', '9D', None], False], [['8S', '4C', None], True], [['8S', '8S', 'D'], True]]]
for i, (args, expected) in enumerate(fixtures[N-1]):
    check("playable 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
playable case 0FalseTrueFailed
playable case 1FalseFalsePassed
playable case 2FalseTrueFailed
playable case 3FalseFalsePassed
playable case 4TrueTruePassed
playable case 5FalseFalsePassed
playable case 6FalseTrueFailed
playable case 7TrueTruePassed

SHA-256 / 154465d09f35bb803f275593e231c5bdc0b3add17ab3a6febed10baee1509780

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(x):
    card, top, declared = x
    if top[0] == '8' and declared:
        return card[1] == declared
    return card[1] == top[1] or card[0] == top[0]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[['8C', '8D', 'S'], True], [['7H', '8C', 'C'], False], [['8C', '8S', 'S'], True], [['JD', '8S', None], False], [['8S', '8H', 'S'], True], [['TS', '3H', None], False], [['8S', '8D', 'H'], True], [['8S', '3H', None], True]], [[['8C', 'JD', None], True], [['6H', 'TC', None], False], [['KC', '6H', None], False], [['2D', '3C', None], False], [['8C', '4D', None], True], [['7C', 'QC', None], True], [['8C', '8C', 'H'], True], [['8D', '8H', 'H'], True]], [[['JH', '7C', None], False], [['JS', '8C', 'C'], False], [['3C', '8H', None], False], [['6C', '8S', 'C'], True], [['AH', 'TC', None], False], [['KH', '8H', 'H'], True], [['8H', '8C', 'C'], True], [['8S', '8H', 'H'], True]], [[['TC', '8C', 'D'], False], [['2H', '2C', None], True], [['6S', '4D', None], False], [['2S', '8C', 'S'], True], [['AC', '8D', 'S'], False], [['8C', '8C', 'H'], True], [['8S', '8H', 'H'], True], [['8H', '6C', None], True]], [[['AC', '4D', None], False], [['JD', '8C', 'H'], False], [['8C', 'AC', None], True], [['8H', '8D', 'C'], True], [['8H', 'TC', None], True], [['TC', '9D', None], False], [['8S', '4C', None], True], [['8S', '8S', 'D'], True]]]
for i, (args, expected) in enumerate(fixtures[N-1]):
    check("playable 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
playable case 0FalseTrueFailed
playable case 1FalseFalsePassed
playable case 2FalseTrueFailed
playable case 3FalseFalsePassed
playable case 4TrueTruePassed
playable case 5FalseFalsePassed
playable case 6FalseTrueFailed
playable case 7FalseTrueFailed

SHA-256 / a072657877b51d2984645f42a1be921acde14a504020b99722c44b4de49c2612

3 / The verified repair

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

N = 1
observations = []
def solve(x):
    card, top, declared = x
    if card[0] == '8':
        return True
    if top[0] == '8' and declared:
        return card[1] == declared
    return card[1] == top[1] or card[0] == top[0]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[['8C', '8D', 'S'], True], [['7H', '8C', 'C'], False], [['8C', '8S', 'S'], True], [['JD', '8S', None], False], [['8S', '8H', 'S'], True], [['TS', '3H', None], False], [['8S', '8D', 'H'], True], [['8S', '3H', None], True]], [[['8C', 'JD', None], True], [['6H', 'TC', None], False], [['KC', '6H', None], False], [['2D', '3C', None], False], [['8C', '4D', None], True], [['7C', 'QC', None], True], [['8C', '8C', 'H'], True], [['8D', '8H', 'H'], True]], [[['JH', '7C', None], False], [['JS', '8C', 'C'], False], [['3C', '8H', None], False], [['6C', '8S', 'C'], True], [['AH', 'TC', None], False], [['KH', '8H', 'H'], True], [['8H', '8C', 'C'], True], [['8S', '8H', 'H'], True]], [[['TC', '8C', 'D'], False], [['2H', '2C', None], True], [['6S', '4D', None], False], [['2S', '8C', 'S'], True], [['AC', '8D', 'S'], False], [['8C', '8C', 'H'], True], [['8S', '8H', 'H'], True], [['8H', '6C', None], True]], [[['AC', '4D', None], False], [['JD', '8C', 'H'], False], [['8C', 'AC', None], True], [['8H', '8D', 'C'], True], [['8H', 'TC', None], True], [['TC', '9D', None], False], [['8S', '4C', None], True], [['8S', '8S', 'D'], True]]]
for i, (args, expected) in enumerate(fixtures[N-1]):
    check("playable 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
playable case 0TrueTruePassed
playable case 1FalseFalsePassed
playable case 2TrueTruePassed
playable case 3FalseFalsePassed
playable case 4TrueTruePassed
playable case 5FalseFalsePassed
playable case 6TrueTruePassed
playable case 7TrueTruePassed

SHA-256 / a62db6f0b8c19e04797e5a8d271434edb9a36a46042738a937e6e6bed408fd67

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:22.142059+00:00.

Case digest / 7808b1f196a9aef30291ab3f1f9eec1646030297fd612d02ab87cd877d14a9da