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.
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| playable case 0 | False | True | Failed |
| playable case 1 | False | False | Passed |
| playable case 2 | False | True | Failed |
| playable case 3 | False | False | Passed |
| playable case 4 | True | True | Passed |
| playable case 5 | False | False | Passed |
| playable case 6 | False | True | Failed |
| playable case 7 | True | True | Passed |
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| playable case 0 | False | True | Failed |
| playable case 1 | False | False | Passed |
| playable case 2 | False | True | Failed |
| playable case 3 | False | False | Passed |
| playable case 4 | True | True | Passed |
| playable case 5 | False | False | Passed |
| playable case 6 | False | True | Failed |
| playable case 7 | False | True | Failed |
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| playable case 0 | True | True | Passed |
| playable case 1 | False | False | Passed |
| playable case 2 | True | True | Passed |
| playable case 3 | False | False | Passed |
| playable case 4 | True | True | Passed |
| playable case 5 | False | False | Passed |
| playable case 6 | True | True | Passed |
| playable case 7 | True | True | Passed |
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