FA-83386 / Card game rule engines / Open access
Dealer draws from the back of the shoe · case 01
Hit cards come from the wrong end of the prepared shoe.
ROOT CAUSE
The draw index counts from the end.
VERIFIED REPAIR
Draw shoe[pos] and advance pos.
Unsuccessful approach: Burning a card before every hit skips the next card in the shoe.
Case contract
Input [dealer_cards, shoe, rule]. Dealer draws from the front of the shoe while total < 17, and under H17 also on soft 17; aces count 11 when that does not bust. Stop if the shoe runs out. Return [final_cards, total].
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):
cards, shoe, rule = x
hand = list(cards)
pos = 0
def value(h):
t = 0
a = 0
for c in h:
if c[0] == 'A':
a += 1
t += 1
elif c[0] in 'TJQK':
t += 10
else:
t += int(c[0])
soft = a > 0 and t + 10 <= 21
return (t + 10 if soft else t), soft
while True:
t, soft = value(hand)
if t < 17 or (t == 17 and soft and rule == 'H17'):
if pos >= len(shoe):
break
hand.append(shoe[-1 - pos])
pos += 1
else:
break
t, soft = value(hand)
return [hand, t]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[['5C', 'JH'], ['TC', '4S', '8S', 'QS', '9C', 'QD'], 'H17'], [['5C', 'JH', 'TC'], 25]], [[['KS', '7S'], ['TC', 'JH', 'AD', '3D', 'KC', 'QD'], 'H17'], [['KS', '7S'], 17]], [[['QS', 'JS'], ['6H', '6D', '3C', '3S', '9D', 'QD'], 'S17'], [['QS', 'JS'], 20]], [[['3H', '7D'], ['3S', '9S', '4D', '2H', '6C', '9H'], 'S17'], [['3H', '7D', '3S', '9S'], 22]], [[['3C', '2D'], ['QS', 'QH', '2C', '8D', 'KC', 'JC'], 'S17'], [['3C', '2D', 'QS', 'QH'], 25]], [[['TC', '6H'], ['TH', '5C', '2D', '7S', '2S', '3S'], 'H17'], [['TC', '6H', 'TH'], 26]], [[['JD', 'TD'], ['2D', '5S', '8D', '6D', 'QH', '6S'], 'H17'], [['JD', 'TD'], 20]], [[['KS', '2D'], ['7D', '7H', '8S', '4H', '8H', 'KC'], 'S17'], [['KS', '2D', '7D'], 19]]], [[[['JH', '5D'], ['7D', 'KH', '2H', '6D', 'QS', 'KS'], 'H17'], [['JH', '5D', '7D'], 22]], [[['TH', '8S'], ['QC', 'QS', 'KH', 'JH', '3D', 'QH'], 'S17'], [['TH', '8S'], 18]], [[['8C', 'QS'], ['AS', 'KC', '5C', '6C', '9S', '6S'], 'S17'], [['8C', 'QS'], 18]], [[['TC', '7H'], ['2S', '8C', 'JC', '7S', '2H', '8H'], 'H17'], [['TC', '7H'], 17]], [[['2C', 'QS'], ['QD', '7D', '9D', '7C', 'KH', 'AS'], 'S17'], [['2C', 'QS', 'QD'], 22]], [[['KC', '9C'], ['2H', 'JD', '2C', 'KS', 'AC', '7C'], 'S17'], [['KC', '9C'], 19]], [[['QS', '9H'], ['6C', 'JD', 'JC', '7S', '4C', '7C'], 'H17'], [['QS', '9H'], 19]], [[['9H', '7D'], ['QD', '8C', '6D', 'AD', 'JD', 'AS'], 'H17'], [['9H', '7D', 'QD'], 26]]], [[[['TC', '6H'], ['TH', '5C', '2D', '7S', '2S', '3S'], 'H17'], [['TC', '6H', 'TH'], 26]], [[['JS', 'QC'], ['AH', '4S', '6C', 'TS', '5D', 'QD'], 'S17'], [['JS', 'QC'], 20]], [[['5C', '7S'], ['4C', 'KH', '9H', 'QC', 'KD', '3D'], 'H17'], [['5C', '7S', '4C', 'KH'], 26]], [[['JD', '7S'], ['7D', 'KH', '5D', '9H', '4D', '3H'], 'S17'], [['JD', '7S'], 17]], [[['KC', 'QH'], ['5H', 'JS', '9S', '6H', '5D', '3C'], 'H17'], [['KC', 'QH'], 20]], [[['TH', '5S'], ['7H', 'JD', '4C', '6D', '7D', 'QC'], 'H17'], [['TH', '5S', '7H'], 22]], [[['AC', 'JC'], ['7D', 'JH', '4S', '8D', '6D', 'TH'], 'S17'], [['AC', 'JC'], 21]], [[['7H', '4S'], ['6H', 'JS', 'TS', '2C', '8S', '5C'], 'H17'], [['7H', '4S', '6H'], 17]]], [[[['5C', '7S'], ['4C', 'KH', '9H', 'QC', 'KD', '3D'], 'H17'], [['5C', '7S', '4C', 'KH'], 26]], [[['8D', '4H'], ['5H', '2S', 'TS', 'QH', 'TD', '9H'], 'H17'], [['8D', '4H', '5H'], 17]], [[['2D', 'KC'], ['9D', 'AD', 'QC', 'TD', '6C', 'TC'], 'S17'], [['2D', 'KC', '9D'], 21]], [[['5D', '3S'], ['JC', '7S', '4S', '6H', '2D', 'KC'], 'H17'], [['5D', '3S', 'JC'], 18]], [[['8C', 'JS'], ['2C', '2S', '9C', '3C', '4D', 'TH'], 'S17'], [['8C', 'JS'], 18]], [[['5C', 'QD'], ['2H', 'TD', 'TC', '8C', '2C', 'QS'], 'H17'], [['5C', 'QD', '2H'], 17]], [[['7H', '4S'], ['6H', 'JS', 'TS', '2C', '8S', '5C'], 'H17'], [['7H', '4S', '6H'], 17]], [[['7C', '6S'], ['5S', '7D', '9H', '3C', '4S', 'JH'], 'H17'], [['7C', '6S', '5S'], 18]]], [[[['8D', '4H'], ['5H', '2S', 'TS', 'QH', 'TD', '9H'], 'H17'], [['8D', '4H', '5H'], 17]], [[['QS', 'JS'], ['8H', '2C', '6H', '5C', 'AH', 'QH'], 'S17'], [['QS', 'JS'], 20]], [[['2C', '9D'], ['7H', '2S', '3S', '4H', '2D', '4S'], 'H17'], [['2C', '9D', '7H'], 18]], [[['3S', '9D'], ['2D', 'KC', '3D', 'TD', 'AS', 'TH'], 'S17'], [['3S', '9D', '2D', 'KC'], 24]], [[['4D', '7S'], ['3S', '8S', '8D', 'QC', 'AH', 'JC'], 'S17'], [['4D', '7S', '3S', '8S'], 22]], [[['7C', '6S'], ['5S', '7D', '9H', '3C', '4S', 'JH'], 'H17'], [['7C', '6S', '5S'], 18]], [[['KH', 'KD'], ['8S', '3H', 'JS', '4C', '2D', '7C'], 'S17'], [['KH', 'KD'], 20]], [[['3D', 'TC'], ['AH', '3C', 'JH', '2C', 'AC', '7H'], 'H17'], [['3D', 'TC', 'AH', '3C'], 17]]]]
for i, (args, expected) in enumerate(fixtures[N-1]):
check("dealer hand 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 |
|---|---|---|---|
| dealer hand case 0 | [['5C', 'JH', 'QD'], 25] | [['5C', 'JH', 'TC'], 25] | Failed |
| dealer hand case 1 | [['KS', '7S'], 17] | [['KS', '7S'], 17] | Passed |
| dealer hand case 2 | [['QS', 'JS'], 20] | [['QS', 'JS'], 20] | Passed |
| dealer hand case 3 | [['3H', '7D', '9H'], 19] | [['3H', '7D', '3S', '9S'], 22] | Failed |
| dealer hand case 4 | [['3C', '2D', 'JC', 'KC'], 25] | [['3C', '2D', 'QS', 'QH'], 25] | Failed |
| dealer hand case 5 | [['TC', '6H', '3S'], 19] | [['TC', '6H', 'TH'], 26] | Failed |
| dealer hand case 6 | [['JD', 'TD'], 20] | [['JD', 'TD'], 20] | Passed |
| dealer hand case 7 | [['KS', '2D', 'KC'], 22] | [['KS', '2D', '7D'], 19] | Failed |
SHA-256 / 1322740d72818f9b73a4985413736f6a2f408f25d334811e7a35bc3b3a38fe61
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
cards, shoe, rule = x
hand = list(cards)
pos = 0
def value(h):
t = 0
a = 0
for c in h:
if c[0] == 'A':
a += 1
t += 1
elif c[0] in 'TJQK':
t += 10
else:
t += int(c[0])
soft = a > 0 and t + 10 <= 21
return (t + 10 if soft else t), soft
while True:
t, soft = value(hand)
if t < 17 or (t == 17 and soft and rule == 'H17'):
if pos >= len(shoe):
break
hand.append(shoe[pos + 1])
pos += 1
else:
break
t, soft = value(hand)
return [hand, t]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[['5C', 'JH'], ['TC', '4S', '8S', 'QS', '9C', 'QD'], 'H17'], [['5C', 'JH', 'TC'], 25]], [[['KS', '7S'], ['TC', 'JH', 'AD', '3D', 'KC', 'QD'], 'H17'], [['KS', '7S'], 17]], [[['QS', 'JS'], ['6H', '6D', '3C', '3S', '9D', 'QD'], 'S17'], [['QS', 'JS'], 20]], [[['3H', '7D'], ['3S', '9S', '4D', '2H', '6C', '9H'], 'S17'], [['3H', '7D', '3S', '9S'], 22]], [[['3C', '2D'], ['QS', 'QH', '2C', '8D', 'KC', 'JC'], 'S17'], [['3C', '2D', 'QS', 'QH'], 25]], [[['TC', '6H'], ['TH', '5C', '2D', '7S', '2S', '3S'], 'H17'], [['TC', '6H', 'TH'], 26]], [[['JD', 'TD'], ['2D', '5S', '8D', '6D', 'QH', '6S'], 'H17'], [['JD', 'TD'], 20]], [[['KS', '2D'], ['7D', '7H', '8S', '4H', '8H', 'KC'], 'S17'], [['KS', '2D', '7D'], 19]]], [[[['JH', '5D'], ['7D', 'KH', '2H', '6D', 'QS', 'KS'], 'H17'], [['JH', '5D', '7D'], 22]], [[['TH', '8S'], ['QC', 'QS', 'KH', 'JH', '3D', 'QH'], 'S17'], [['TH', '8S'], 18]], [[['8C', 'QS'], ['AS', 'KC', '5C', '6C', '9S', '6S'], 'S17'], [['8C', 'QS'], 18]], [[['TC', '7H'], ['2S', '8C', 'JC', '7S', '2H', '8H'], 'H17'], [['TC', '7H'], 17]], [[['2C', 'QS'], ['QD', '7D', '9D', '7C', 'KH', 'AS'], 'S17'], [['2C', 'QS', 'QD'], 22]], [[['KC', '9C'], ['2H', 'JD', '2C', 'KS', 'AC', '7C'], 'S17'], [['KC', '9C'], 19]], [[['QS', '9H'], ['6C', 'JD', 'JC', '7S', '4C', '7C'], 'H17'], [['QS', '9H'], 19]], [[['9H', '7D'], ['QD', '8C', '6D', 'AD', 'JD', 'AS'], 'H17'], [['9H', '7D', 'QD'], 26]]], [[[['TC', '6H'], ['TH', '5C', '2D', '7S', '2S', '3S'], 'H17'], [['TC', '6H', 'TH'], 26]], [[['JS', 'QC'], ['AH', '4S', '6C', 'TS', '5D', 'QD'], 'S17'], [['JS', 'QC'], 20]], [[['5C', '7S'], ['4C', 'KH', '9H', 'QC', 'KD', '3D'], 'H17'], [['5C', '7S', '4C', 'KH'], 26]], [[['JD', '7S'], ['7D', 'KH', '5D', '9H', '4D', '3H'], 'S17'], [['JD', '7S'], 17]], [[['KC', 'QH'], ['5H', 'JS', '9S', '6H', '5D', '3C'], 'H17'], [['KC', 'QH'], 20]], [[['TH', '5S'], ['7H', 'JD', '4C', '6D', '7D', 'QC'], 'H17'], [['TH', '5S', '7H'], 22]], [[['AC', 'JC'], ['7D', 'JH', '4S', '8D', '6D', 'TH'], 'S17'], [['AC', 'JC'], 21]], [[['7H', '4S'], ['6H', 'JS', 'TS', '2C', '8S', '5C'], 'H17'], [['7H', '4S', '6H'], 17]]], [[[['5C', '7S'], ['4C', 'KH', '9H', 'QC', 'KD', '3D'], 'H17'], [['5C', '7S', '4C', 'KH'], 26]], [[['8D', '4H'], ['5H', '2S', 'TS', 'QH', 'TD', '9H'], 'H17'], [['8D', '4H', '5H'], 17]], [[['2D', 'KC'], ['9D', 'AD', 'QC', 'TD', '6C', 'TC'], 'S17'], [['2D', 'KC', '9D'], 21]], [[['5D', '3S'], ['JC', '7S', '4S', '6H', '2D', 'KC'], 'H17'], [['5D', '3S', 'JC'], 18]], [[['8C', 'JS'], ['2C', '2S', '9C', '3C', '4D', 'TH'], 'S17'], [['8C', 'JS'], 18]], [[['5C', 'QD'], ['2H', 'TD', 'TC', '8C', '2C', 'QS'], 'H17'], [['5C', 'QD', '2H'], 17]], [[['7H', '4S'], ['6H', 'JS', 'TS', '2C', '8S', '5C'], 'H17'], [['7H', '4S', '6H'], 17]], [[['7C', '6S'], ['5S', '7D', '9H', '3C', '4S', 'JH'], 'H17'], [['7C', '6S', '5S'], 18]]], [[[['8D', '4H'], ['5H', '2S', 'TS', 'QH', 'TD', '9H'], 'H17'], [['8D', '4H', '5H'], 17]], [[['QS', 'JS'], ['8H', '2C', '6H', '5C', 'AH', 'QH'], 'S17'], [['QS', 'JS'], 20]], [[['2C', '9D'], ['7H', '2S', '3S', '4H', '2D', '4S'], 'H17'], [['2C', '9D', '7H'], 18]], [[['3S', '9D'], ['2D', 'KC', '3D', 'TD', 'AS', 'TH'], 'S17'], [['3S', '9D', '2D', 'KC'], 24]], [[['4D', '7S'], ['3S', '8S', '8D', 'QC', 'AH', 'JC'], 'S17'], [['4D', '7S', '3S', '8S'], 22]], [[['7C', '6S'], ['5S', '7D', '9H', '3C', '4S', 'JH'], 'H17'], [['7C', '6S', '5S'], 18]], [[['KH', 'KD'], ['8S', '3H', 'JS', '4C', '2D', '7C'], 'S17'], [['KH', 'KD'], 20]], [[['3D', 'TC'], ['AH', '3C', 'JH', '2C', 'AC', '7H'], 'H17'], [['3D', 'TC', 'AH', '3C'], 17]]]]
for i, (args, expected) in enumerate(fixtures[N-1]):
check("dealer hand 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 |
|---|---|---|---|
| dealer hand case 0 | [['5C', 'JH', '4S'], 19] | [['5C', 'JH', 'TC'], 25] | Failed |
| dealer hand case 1 | [['KS', '7S'], 17] | [['KS', '7S'], 17] | Passed |
| dealer hand case 2 | [['QS', 'JS'], 20] | [['QS', 'JS'], 20] | Passed |
| dealer hand case 3 | [['3H', '7D', '9S'], 19] | [['3H', '7D', '3S', '9S'], 22] | Failed |
| dealer hand case 4 | [['3C', '2D', 'QH', '2C'], 17] | [['3C', '2D', 'QS', 'QH'], 25] | Failed |
| dealer hand case 5 | [['TC', '6H', '5C'], 21] | [['TC', '6H', 'TH'], 26] | Failed |
| dealer hand case 6 | [['JD', 'TD'], 20] | [['JD', 'TD'], 20] | Passed |
| dealer hand case 7 | [['KS', '2D', '7H'], 19] | [['KS', '2D', '7D'], 19] | Failed |
SHA-256 / 2cf6c13fbe4300b1601ff3a0fc8b451aa512ac50cf444922da76c9fb95709100
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
cards, shoe, rule = x
hand = list(cards)
pos = 0
def value(h):
t = 0
a = 0
for c in h:
if c[0] == 'A':
a += 1
t += 1
elif c[0] in 'TJQK':
t += 10
else:
t += int(c[0])
soft = a > 0 and t + 10 <= 21
return (t + 10 if soft else t), soft
while True:
t, soft = value(hand)
if t < 17 or (t == 17 and soft and rule == 'H17'):
if pos >= len(shoe):
break
hand.append(shoe[pos])
pos += 1
else:
break
t, soft = value(hand)
return [hand, t]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[['5C', 'JH'], ['TC', '4S', '8S', 'QS', '9C', 'QD'], 'H17'], [['5C', 'JH', 'TC'], 25]], [[['KS', '7S'], ['TC', 'JH', 'AD', '3D', 'KC', 'QD'], 'H17'], [['KS', '7S'], 17]], [[['QS', 'JS'], ['6H', '6D', '3C', '3S', '9D', 'QD'], 'S17'], [['QS', 'JS'], 20]], [[['3H', '7D'], ['3S', '9S', '4D', '2H', '6C', '9H'], 'S17'], [['3H', '7D', '3S', '9S'], 22]], [[['3C', '2D'], ['QS', 'QH', '2C', '8D', 'KC', 'JC'], 'S17'], [['3C', '2D', 'QS', 'QH'], 25]], [[['TC', '6H'], ['TH', '5C', '2D', '7S', '2S', '3S'], 'H17'], [['TC', '6H', 'TH'], 26]], [[['JD', 'TD'], ['2D', '5S', '8D', '6D', 'QH', '6S'], 'H17'], [['JD', 'TD'], 20]], [[['KS', '2D'], ['7D', '7H', '8S', '4H', '8H', 'KC'], 'S17'], [['KS', '2D', '7D'], 19]]], [[[['JH', '5D'], ['7D', 'KH', '2H', '6D', 'QS', 'KS'], 'H17'], [['JH', '5D', '7D'], 22]], [[['TH', '8S'], ['QC', 'QS', 'KH', 'JH', '3D', 'QH'], 'S17'], [['TH', '8S'], 18]], [[['8C', 'QS'], ['AS', 'KC', '5C', '6C', '9S', '6S'], 'S17'], [['8C', 'QS'], 18]], [[['TC', '7H'], ['2S', '8C', 'JC', '7S', '2H', '8H'], 'H17'], [['TC', '7H'], 17]], [[['2C', 'QS'], ['QD', '7D', '9D', '7C', 'KH', 'AS'], 'S17'], [['2C', 'QS', 'QD'], 22]], [[['KC', '9C'], ['2H', 'JD', '2C', 'KS', 'AC', '7C'], 'S17'], [['KC', '9C'], 19]], [[['QS', '9H'], ['6C', 'JD', 'JC', '7S', '4C', '7C'], 'H17'], [['QS', '9H'], 19]], [[['9H', '7D'], ['QD', '8C', '6D', 'AD', 'JD', 'AS'], 'H17'], [['9H', '7D', 'QD'], 26]]], [[[['TC', '6H'], ['TH', '5C', '2D', '7S', '2S', '3S'], 'H17'], [['TC', '6H', 'TH'], 26]], [[['JS', 'QC'], ['AH', '4S', '6C', 'TS', '5D', 'QD'], 'S17'], [['JS', 'QC'], 20]], [[['5C', '7S'], ['4C', 'KH', '9H', 'QC', 'KD', '3D'], 'H17'], [['5C', '7S', '4C', 'KH'], 26]], [[['JD', '7S'], ['7D', 'KH', '5D', '9H', '4D', '3H'], 'S17'], [['JD', '7S'], 17]], [[['KC', 'QH'], ['5H', 'JS', '9S', '6H', '5D', '3C'], 'H17'], [['KC', 'QH'], 20]], [[['TH', '5S'], ['7H', 'JD', '4C', '6D', '7D', 'QC'], 'H17'], [['TH', '5S', '7H'], 22]], [[['AC', 'JC'], ['7D', 'JH', '4S', '8D', '6D', 'TH'], 'S17'], [['AC', 'JC'], 21]], [[['7H', '4S'], ['6H', 'JS', 'TS', '2C', '8S', '5C'], 'H17'], [['7H', '4S', '6H'], 17]]], [[[['5C', '7S'], ['4C', 'KH', '9H', 'QC', 'KD', '3D'], 'H17'], [['5C', '7S', '4C', 'KH'], 26]], [[['8D', '4H'], ['5H', '2S', 'TS', 'QH', 'TD', '9H'], 'H17'], [['8D', '4H', '5H'], 17]], [[['2D', 'KC'], ['9D', 'AD', 'QC', 'TD', '6C', 'TC'], 'S17'], [['2D', 'KC', '9D'], 21]], [[['5D', '3S'], ['JC', '7S', '4S', '6H', '2D', 'KC'], 'H17'], [['5D', '3S', 'JC'], 18]], [[['8C', 'JS'], ['2C', '2S', '9C', '3C', '4D', 'TH'], 'S17'], [['8C', 'JS'], 18]], [[['5C', 'QD'], ['2H', 'TD', 'TC', '8C', '2C', 'QS'], 'H17'], [['5C', 'QD', '2H'], 17]], [[['7H', '4S'], ['6H', 'JS', 'TS', '2C', '8S', '5C'], 'H17'], [['7H', '4S', '6H'], 17]], [[['7C', '6S'], ['5S', '7D', '9H', '3C', '4S', 'JH'], 'H17'], [['7C', '6S', '5S'], 18]]], [[[['8D', '4H'], ['5H', '2S', 'TS', 'QH', 'TD', '9H'], 'H17'], [['8D', '4H', '5H'], 17]], [[['QS', 'JS'], ['8H', '2C', '6H', '5C', 'AH', 'QH'], 'S17'], [['QS', 'JS'], 20]], [[['2C', '9D'], ['7H', '2S', '3S', '4H', '2D', '4S'], 'H17'], [['2C', '9D', '7H'], 18]], [[['3S', '9D'], ['2D', 'KC', '3D', 'TD', 'AS', 'TH'], 'S17'], [['3S', '9D', '2D', 'KC'], 24]], [[['4D', '7S'], ['3S', '8S', '8D', 'QC', 'AH', 'JC'], 'S17'], [['4D', '7S', '3S', '8S'], 22]], [[['7C', '6S'], ['5S', '7D', '9H', '3C', '4S', 'JH'], 'H17'], [['7C', '6S', '5S'], 18]], [[['KH', 'KD'], ['8S', '3H', 'JS', '4C', '2D', '7C'], 'S17'], [['KH', 'KD'], 20]], [[['3D', 'TC'], ['AH', '3C', 'JH', '2C', 'AC', '7H'], 'H17'], [['3D', 'TC', 'AH', '3C'], 17]]]]
for i, (args, expected) in enumerate(fixtures[N-1]):
check("dealer hand 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 |
|---|---|---|---|
| dealer hand case 0 | [['5C', 'JH', 'TC'], 25] | [['5C', 'JH', 'TC'], 25] | Passed |
| dealer hand case 1 | [['KS', '7S'], 17] | [['KS', '7S'], 17] | Passed |
| dealer hand case 2 | [['QS', 'JS'], 20] | [['QS', 'JS'], 20] | Passed |
| dealer hand case 3 | [['3H', '7D', '3S', '9S'], 22] | [['3H', '7D', '3S', '9S'], 22] | Passed |
| dealer hand case 4 | [['3C', '2D', 'QS', 'QH'], 25] | [['3C', '2D', 'QS', 'QH'], 25] | Passed |
| dealer hand case 5 | [['TC', '6H', 'TH'], 26] | [['TC', '6H', 'TH'], 26] | Passed |
| dealer hand case 6 | [['JD', 'TD'], 20] | [['JD', 'TD'], 20] | Passed |
| dealer hand case 7 | [['KS', '2D', '7D'], 19] | [['KS', '2D', '7D'], 19] | Passed |
SHA-256 / 53272674e682016971d2cde3f17a8a92c129e83c1770a9f11fc0fb265a448e27
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:21.170399+00:00.
Case digest / 23a6cde885724976e8b67e50998cd5ef455eb3f29fb7b3271faa9e64fa9688d9