FA-83571 / Card game rule engines / Open access
Reaching exactly 31 is illegal · case 01
Cards that make exactly 31 are refused.
ROOT CAUSE
The limit uses >= 31.
THE FAILURE
The limit uses >= 31.
Unsuccessful approach: Testing the count before the new card lets plays exceed 31.
Case contract
Input [cards_in_current_count, new_card]. Values A=1, T/J/Q/K=10; a count above 31 is "illegal". Points: count 15 -> 2, count 31 -> 2; the new card with the immediately preceding same-rank run scores 2/6/12; the longest trailing sequence of 3+ cards whose ranks are consecutive in any order scores its length. Return [points, count].
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):
pile, card = x
order = 'A23456789TJQK'
def val(c):
return min(order.index(c[0]) + 1, 10)
count = sum(val(c) for c in pile) + val(card)
if count >= 31:
return 'illegal'
seq = pile + [card]
pts = 0
if count == 15:
pts += 2
if count == 31:
pts += 2
same = 1
for c in reversed(seq[:-1]):
if c[0] == card[0]:
same += 1
else:
break
pts += {1: 0, 2: 2, 3: 6, 4: 12}[same]
best = 0
for L in range(3, len(seq) + 1):
tail = sorted(order.index(c[0]) for c in seq[-L:])
if all(tail[i + 1] == tail[i] + 1 for i in range(L - 1)):
best = L
pts += best
return [pts, count]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[['TD'], 'JC'], [0, 20]], [[['4D', 'KS', '2C', 'TC'], 'TS'], 'illegal'], [[['JD', '8D', 'QD'], '9D'], 'illegal'], [[['8S', 'TD', '2H', 'QH'], '5S'], 'illegal'], [[['6S', '7D', '7C', 'KS'], '3C'], 'illegal'], [[['5C', '7H'], 'TS'], [0, 22]], [[['AC', 'AS', 'TS', '4C'], '4C'], [2, 20]], [[['9D', '2C', 'TC'], 'KD'], [2, 31]]], [[[[], '5D'], [0, 5]], [[['8C', '2D', '8S', '5H', 'AH'], 'AS'], [2, 25]], [[['5D', '4C', '3S', 'KS'], 'KC'], 'illegal'], [[['9C', '7D'], 'KD'], [0, 26]], [[[], '7C'], [0, 7]], [[['7H'], '7C'], [2, 14]], [[['2H', '4S', 'TC', '6H', '8D'], '8H'], 'illegal'], [[['4C', '7C', 'TC'], 'TD'], [4, 31]]], [[[['5D', 'JD', '2S', '6H', 'AH'], '4C'], [0, 28]], [[['AD'], 'AS'], [2, 2]], [[['JC'], 'JD'], [2, 20]], [[['TS', '4H', '2H', '7S'], 'QD'], 'illegal'], [[['QS', '3C'], '3C'], [2, 16]], [[['QS', '7D', '6S'], '9S'], 'illegal'], [[['8D', '8C', 'JC'], '7H'], 'illegal'], [[['QC', '7H', '6H'], '8C'], [5, 31]]], [[[['AD', '5H', 'KD', '6D'], '6S'], [2, 28]], [[['2H', '4S', 'TC', '6H', '8D'], '8H'], 'illegal'], [[['9D', '2C', 'TC'], 'KD'], [2, 31]], [[['AS', '2D'], 'JH'], [0, 13]], [[[], 'AD'], [0, 1]], [[['JH'], '7C'], [0, 17]], [[['7C', '4H', '6C', '3C', '9C'], 'QD'], 'illegal'], [[['8C', '5D', 'JD'], '8C'], [2, 31]]], [[[[], '3S'], [0, 3]], [[['TD', '5S', 'AD'], 'AD'], [2, 17]], [[[], '5S'], [0, 5]], [[['6H', 'AD'], 'TD'], [0, 17]], [[['JC', 'JC', '3C'], '3C'], [2, 26]], [[['5C', '3S', '8D', '7D'], 'QC'], 'illegal'], [[['TS', 'QD', 'QD'], 'KH'], 'illegal'], [[['KH', 'QD', 'TC'], 'AS'], [2, 31]]]]
for i, (args, expected) in enumerate(fixtures[N-1]):
check("pegging 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 |
|---|---|---|---|
| pegging case 0 | [0, 20] | [0, 20] | Passed |
| pegging case 1 | illegal | illegal | Passed |
| pegging case 2 | illegal | illegal | Passed |
| pegging case 3 | illegal | illegal | Passed |
| pegging case 4 | illegal | illegal | Passed |
| pegging case 5 | [0, 22] | [0, 22] | Passed |
| pegging case 6 | [2, 20] | [2, 20] | Passed |
| pegging case 7 | illegal | [2, 31] | Failed |
SHA-256 / cccbc3ea97817d1611dfcdf2a904c87571a1ae44df80e8d2153daff4aead2bd3
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
pile, card = x
order = 'A23456789TJQK'
def val(c):
return min(order.index(c[0]) + 1, 10)
count = sum(val(c) for c in pile) + val(card)
if count - val(card) >= 31:
return 'illegal'
seq = pile + [card]
pts = 0
if count == 15:
pts += 2
if count == 31:
pts += 2
same = 1
for c in reversed(seq[:-1]):
if c[0] == card[0]:
same += 1
else:
break
pts += {1: 0, 2: 2, 3: 6, 4: 12}[same]
best = 0
for L in range(3, len(seq) + 1):
tail = sorted(order.index(c[0]) for c in seq[-L:])
if all(tail[i + 1] == tail[i] + 1 for i in range(L - 1)):
best = L
pts += best
return [pts, count]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[['TD'], 'JC'], [0, 20]], [[['4D', 'KS', '2C', 'TC'], 'TS'], 'illegal'], [[['JD', '8D', 'QD'], '9D'], 'illegal'], [[['8S', 'TD', '2H', 'QH'], '5S'], 'illegal'], [[['6S', '7D', '7C', 'KS'], '3C'], 'illegal'], [[['5C', '7H'], 'TS'], [0, 22]], [[['AC', 'AS', 'TS', '4C'], '4C'], [2, 20]], [[['9D', '2C', 'TC'], 'KD'], [2, 31]]], [[[[], '5D'], [0, 5]], [[['8C', '2D', '8S', '5H', 'AH'], 'AS'], [2, 25]], [[['5D', '4C', '3S', 'KS'], 'KC'], 'illegal'], [[['9C', '7D'], 'KD'], [0, 26]], [[[], '7C'], [0, 7]], [[['7H'], '7C'], [2, 14]], [[['2H', '4S', 'TC', '6H', '8D'], '8H'], 'illegal'], [[['4C', '7C', 'TC'], 'TD'], [4, 31]]], [[[['5D', 'JD', '2S', '6H', 'AH'], '4C'], [0, 28]], [[['AD'], 'AS'], [2, 2]], [[['JC'], 'JD'], [2, 20]], [[['TS', '4H', '2H', '7S'], 'QD'], 'illegal'], [[['QS', '3C'], '3C'], [2, 16]], [[['QS', '7D', '6S'], '9S'], 'illegal'], [[['8D', '8C', 'JC'], '7H'], 'illegal'], [[['QC', '7H', '6H'], '8C'], [5, 31]]], [[[['AD', '5H', 'KD', '6D'], '6S'], [2, 28]], [[['2H', '4S', 'TC', '6H', '8D'], '8H'], 'illegal'], [[['9D', '2C', 'TC'], 'KD'], [2, 31]], [[['AS', '2D'], 'JH'], [0, 13]], [[[], 'AD'], [0, 1]], [[['JH'], '7C'], [0, 17]], [[['7C', '4H', '6C', '3C', '9C'], 'QD'], 'illegal'], [[['8C', '5D', 'JD'], '8C'], [2, 31]]], [[[[], '3S'], [0, 3]], [[['TD', '5S', 'AD'], 'AD'], [2, 17]], [[[], '5S'], [0, 5]], [[['6H', 'AD'], 'TD'], [0, 17]], [[['JC', 'JC', '3C'], '3C'], [2, 26]], [[['5C', '3S', '8D', '7D'], 'QC'], 'illegal'], [[['TS', 'QD', 'QD'], 'KH'], 'illegal'], [[['KH', 'QD', 'TC'], 'AS'], [2, 31]]]]
for i, (args, expected) in enumerate(fixtures[N-1]):
check("pegging 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 |
|---|---|---|---|
| pegging case 0 | [0, 20] | [0, 20] | Passed |
| pegging case 1 | [2, 36] | illegal | Failed |
| pegging case 2 | [0, 37] | illegal | Failed |
| pegging case 3 | [0, 35] | illegal | Failed |
| pegging case 4 | [0, 33] | illegal | Failed |
| pegging case 5 | [0, 22] | [0, 22] | Passed |
| pegging case 6 | [2, 20] | [2, 20] | Passed |
| pegging case 7 | [2, 31] | [2, 31] | Passed |
SHA-256 / d5847ff4c0ae5ac302cf31062bb05bb6af57f8ba63f844a6904a6142590c1134
HELD IN THE MEMBER ARCHIVE
The verified repair and its recorded checks are member-only.
This mechanism has 8 recorded checks per implementation. The open-access tier publishes the failure and the unsuccessful fix; the repaired source that passes every check, and the observations that prove it, are available to members.
Every case sharing this mechanism uses the same contract and the same repair, so this one record is held back for all of them.
Member access is invitation-based. Sign in with your invited account to inspect the repair.
Sign in to the archive ↗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.675522+00:00.
Case digest / d3be699f24271ff19d9d42d93f675c889765757710b9e43b7a30a3adcbc7ea82