FA-83831 / Card game rule engines / Open access
Deuces count five points · case 01
Wild twos are undervalued in meld points.
ROOT CAUSE
Only aces are valued at 20.
VERIFIED REPAIR
Aces and deuces are 20 each.
Unsuccessful approach: Valuing deuces like jokers overcounts them.
Case contract
Input a meld (cards; "JK" joker and deuces are wild). Valid: >= 3 cards, >= 2 naturals of one rank (not threes), at most 3 wild cards. Card points: joker 50, A and 2 20, 8-K 10, 4-7 and black 3 5. A canasta (7+ cards) earns 500 if natural, 300 if mixed. Return [valid|invalid, bonus, card_points].
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):
meld = x
wild = [c for c in meld if c == 'JK' or c[0] == '2']
nat = [c for c in meld if c not in wild]
if len(meld) < 3 or len(nat) < 2 or len(wild) > 3:
return ['invalid', 0, 0]
if len(set(c[0] for c in nat)) != 1 or nat[0][0] == '3':
return ['invalid', 0, 0]
def pts(c):
if c == 'JK':
return 50
if c[0] == 'A':
return 20
if c[0] in '89TJQK':
return 10
return 5
bonus = 0
if len(meld) >= 7:
bonus = 500 if not wild else 300
return ['valid', bonus, sum(pts(c) for c in meld)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[['AH', 'AS', 'AH', 'AH', 'AH', 'AH', '2H'], ['valid', 300, 140]], [['JH', 'JH', 'JC'], ['valid', 0, 30]], [['JK', '2S', '2H', '2D'], ['invalid', 0, 0]], [['2H', '5C', '2D', '2H', '2D'], ['invalid', 0, 0]], [['2H', '2H', '6H', '2S', '6H'], ['valid', 0, 70]], [['AD', 'AC', 'AS', '2S'], ['valid', 0, 80]], [['TH', '2S', 'TS'], ['valid', 0, 40]], [['2H', '6C', '6D', '6D', '6H', '2S'], ['valid', 0, 60]]], [[['JH', 'JH', '2C', 'JS', '2H'], ['valid', 0, 70]], [['KH', 'JK', 'KD', 'JK', 'KH', 'KC'], ['valid', 0, 140]], [[], ['invalid', 0, 0]], [['3S', 'JK', '3H', '3H', '3D', '2S'], ['invalid', 0, 0]], [['2S', '2D', '5H', '2C', '5C', '5D', 'JK', '5D'], ['invalid', 0, 0]], [['TD', 'TH'], ['invalid', 0, 0]], [['8H', '2C', '8H', '2S'], ['valid', 0, 60]], [['2S', 'AH', 'AS', 'AC', 'AD', 'AH', 'AS', 'AD'], ['valid', 300, 160]]], [[['2H', '2H', '6H', '2S', '6H'], ['valid', 0, 70]], [['KD', 'JS', '2C'], ['invalid', 0, 0]], [['2S', 'AH', 'AS', 'AC', 'AD', 'AH', 'AS', 'AD'], ['valid', 300, 160]], [['2D', 'AC', 'AH', 'AH', '2S'], ['valid', 0, 100]], [['7S', '2H'], ['invalid', 0, 0]], [['2S', '2D'], ['invalid', 0, 0]], [['JK', 'KD', 'KS'], ['valid', 0, 70]], [['2C', '6H', '6C', '2S', '6C', '6H', '6C'], ['valid', 300, 65]]], [[['2H', '6C', '6D', '6D', '6H', '2S'], ['valid', 0, 60]], [['AH', 'AS', 'AD', 'JK', 'AC', 'JK', 'AH', 'AC', '2S'], ['valid', 300, 240]], [['8D'], ['invalid', 0, 0]], [['AD', 'AD', 'AD', 'AH', '2S', 'AH'], ['valid', 0, 120]], [['2D', '9C', '9C', '9S', '9D'], ['valid', 0, 60]], [['KH', 'KD', 'KH', 'KS', 'KH'], ['valid', 0, 50]], [['2C', '6H', '6C', '2S', '6C', '6H', '6C'], ['valid', 300, 65]], [['QS', 'QS', '2S', 'QD', 'QS', '2S', 'QS', 'JK', 'QC', 'QD'], ['valid', 300, 160]]], [[['2D', 'AC', 'AH', 'AH', '2S'], ['valid', 0, 100]], [['TD', 'TH', 'TS', 'TD'], ['valid', 0, 40]], [['2D', '5D', 'JK', '2D', '5S'], ['valid', 0, 100]], [['7S', '2H', '7H', '7S', '6S'], ['invalid', 0, 0]], [['2H', 'JK', 'KC', '2H', 'KD', 'KH'], ['valid', 0, 120]], [['2H', 'TS', 'TD', 'JK'], ['valid', 0, 90]], [['QS', 'QS', '2S', 'QD', 'QS', '2S', 'QS', 'JK', 'QC', 'QD'], ['valid', 300, 160]], [['2C', '2D', 'JH', 'JS', '2H'], ['valid', 0, 80]]]]
for i, (args, expected) in enumerate(fixtures[N-1]):
check("meld 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 |
|---|---|---|---|
| meld case 0 | ['valid', 300, 125] | ['valid', 300, 140] | Failed |
| meld case 1 | ['valid', 0, 30] | ['valid', 0, 30] | Passed |
| meld case 2 | ['invalid', 0, 0] | ['invalid', 0, 0] | Passed |
| meld case 3 | ['invalid', 0, 0] | ['invalid', 0, 0] | Passed |
| meld case 4 | ['valid', 0, 25] | ['valid', 0, 70] | Failed |
| meld case 5 | ['valid', 0, 65] | ['valid', 0, 80] | Failed |
| meld case 6 | ['valid', 0, 25] | ['valid', 0, 40] | Failed |
| meld case 7 | ['valid', 0, 30] | ['valid', 0, 60] | Failed |
SHA-256 / 01c53b51b25bbb2a5bd56cf96d8c5d2c16e1ec5667562ba1eaea25627e37385f
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
meld = x
wild = [c for c in meld if c == 'JK' or c[0] == '2']
nat = [c for c in meld if c not in wild]
if len(meld) < 3 or len(nat) < 2 or len(wild) > 3:
return ['invalid', 0, 0]
if len(set(c[0] for c in nat)) != 1 or nat[0][0] == '3':
return ['invalid', 0, 0]
def pts(c):
if c == 'JK':
return 50
if c[0] == 'A':
return 20
if c[0] == '2':
return 50
if c[0] in '89TJQK':
return 10
return 5
bonus = 0
if len(meld) >= 7:
bonus = 500 if not wild else 300
return ['valid', bonus, sum(pts(c) for c in meld)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[['AH', 'AS', 'AH', 'AH', 'AH', 'AH', '2H'], ['valid', 300, 140]], [['JH', 'JH', 'JC'], ['valid', 0, 30]], [['JK', '2S', '2H', '2D'], ['invalid', 0, 0]], [['2H', '5C', '2D', '2H', '2D'], ['invalid', 0, 0]], [['2H', '2H', '6H', '2S', '6H'], ['valid', 0, 70]], [['AD', 'AC', 'AS', '2S'], ['valid', 0, 80]], [['TH', '2S', 'TS'], ['valid', 0, 40]], [['2H', '6C', '6D', '6D', '6H', '2S'], ['valid', 0, 60]]], [[['JH', 'JH', '2C', 'JS', '2H'], ['valid', 0, 70]], [['KH', 'JK', 'KD', 'JK', 'KH', 'KC'], ['valid', 0, 140]], [[], ['invalid', 0, 0]], [['3S', 'JK', '3H', '3H', '3D', '2S'], ['invalid', 0, 0]], [['2S', '2D', '5H', '2C', '5C', '5D', 'JK', '5D'], ['invalid', 0, 0]], [['TD', 'TH'], ['invalid', 0, 0]], [['8H', '2C', '8H', '2S'], ['valid', 0, 60]], [['2S', 'AH', 'AS', 'AC', 'AD', 'AH', 'AS', 'AD'], ['valid', 300, 160]]], [[['2H', '2H', '6H', '2S', '6H'], ['valid', 0, 70]], [['KD', 'JS', '2C'], ['invalid', 0, 0]], [['2S', 'AH', 'AS', 'AC', 'AD', 'AH', 'AS', 'AD'], ['valid', 300, 160]], [['2D', 'AC', 'AH', 'AH', '2S'], ['valid', 0, 100]], [['7S', '2H'], ['invalid', 0, 0]], [['2S', '2D'], ['invalid', 0, 0]], [['JK', 'KD', 'KS'], ['valid', 0, 70]], [['2C', '6H', '6C', '2S', '6C', '6H', '6C'], ['valid', 300, 65]]], [[['2H', '6C', '6D', '6D', '6H', '2S'], ['valid', 0, 60]], [['AH', 'AS', 'AD', 'JK', 'AC', 'JK', 'AH', 'AC', '2S'], ['valid', 300, 240]], [['8D'], ['invalid', 0, 0]], [['AD', 'AD', 'AD', 'AH', '2S', 'AH'], ['valid', 0, 120]], [['2D', '9C', '9C', '9S', '9D'], ['valid', 0, 60]], [['KH', 'KD', 'KH', 'KS', 'KH'], ['valid', 0, 50]], [['2C', '6H', '6C', '2S', '6C', '6H', '6C'], ['valid', 300, 65]], [['QS', 'QS', '2S', 'QD', 'QS', '2S', 'QS', 'JK', 'QC', 'QD'], ['valid', 300, 160]]], [[['2D', 'AC', 'AH', 'AH', '2S'], ['valid', 0, 100]], [['TD', 'TH', 'TS', 'TD'], ['valid', 0, 40]], [['2D', '5D', 'JK', '2D', '5S'], ['valid', 0, 100]], [['7S', '2H', '7H', '7S', '6S'], ['invalid', 0, 0]], [['2H', 'JK', 'KC', '2H', 'KD', 'KH'], ['valid', 0, 120]], [['2H', 'TS', 'TD', 'JK'], ['valid', 0, 90]], [['QS', 'QS', '2S', 'QD', 'QS', '2S', 'QS', 'JK', 'QC', 'QD'], ['valid', 300, 160]], [['2C', '2D', 'JH', 'JS', '2H'], ['valid', 0, 80]]]]
for i, (args, expected) in enumerate(fixtures[N-1]):
check("meld 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 |
|---|---|---|---|
| meld case 0 | ['valid', 300, 170] | ['valid', 300, 140] | Failed |
| meld case 1 | ['valid', 0, 30] | ['valid', 0, 30] | Passed |
| meld case 2 | ['invalid', 0, 0] | ['invalid', 0, 0] | Passed |
| meld case 3 | ['invalid', 0, 0] | ['invalid', 0, 0] | Passed |
| meld case 4 | ['valid', 0, 160] | ['valid', 0, 70] | Failed |
| meld case 5 | ['valid', 0, 110] | ['valid', 0, 80] | Failed |
| meld case 6 | ['valid', 0, 70] | ['valid', 0, 40] | Failed |
| meld case 7 | ['valid', 0, 120] | ['valid', 0, 60] | Failed |
SHA-256 / 082a8603e52a1dbded20e92a1f1d6c281e6c1c26c53116977b1281f2abea021d
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
meld = x
wild = [c for c in meld if c == 'JK' or c[0] == '2']
nat = [c for c in meld if c not in wild]
if len(meld) < 3 or len(nat) < 2 or len(wild) > 3:
return ['invalid', 0, 0]
if len(set(c[0] for c in nat)) != 1 or nat[0][0] == '3':
return ['invalid', 0, 0]
def pts(c):
if c == 'JK':
return 50
if c[0] in '2A':
return 20
if c[0] in '89TJQK':
return 10
return 5
bonus = 0
if len(meld) >= 7:
bonus = 500 if not wild else 300
return ['valid', bonus, sum(pts(c) for c in meld)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[['AH', 'AS', 'AH', 'AH', 'AH', 'AH', '2H'], ['valid', 300, 140]], [['JH', 'JH', 'JC'], ['valid', 0, 30]], [['JK', '2S', '2H', '2D'], ['invalid', 0, 0]], [['2H', '5C', '2D', '2H', '2D'], ['invalid', 0, 0]], [['2H', '2H', '6H', '2S', '6H'], ['valid', 0, 70]], [['AD', 'AC', 'AS', '2S'], ['valid', 0, 80]], [['TH', '2S', 'TS'], ['valid', 0, 40]], [['2H', '6C', '6D', '6D', '6H', '2S'], ['valid', 0, 60]]], [[['JH', 'JH', '2C', 'JS', '2H'], ['valid', 0, 70]], [['KH', 'JK', 'KD', 'JK', 'KH', 'KC'], ['valid', 0, 140]], [[], ['invalid', 0, 0]], [['3S', 'JK', '3H', '3H', '3D', '2S'], ['invalid', 0, 0]], [['2S', '2D', '5H', '2C', '5C', '5D', 'JK', '5D'], ['invalid', 0, 0]], [['TD', 'TH'], ['invalid', 0, 0]], [['8H', '2C', '8H', '2S'], ['valid', 0, 60]], [['2S', 'AH', 'AS', 'AC', 'AD', 'AH', 'AS', 'AD'], ['valid', 300, 160]]], [[['2H', '2H', '6H', '2S', '6H'], ['valid', 0, 70]], [['KD', 'JS', '2C'], ['invalid', 0, 0]], [['2S', 'AH', 'AS', 'AC', 'AD', 'AH', 'AS', 'AD'], ['valid', 300, 160]], [['2D', 'AC', 'AH', 'AH', '2S'], ['valid', 0, 100]], [['7S', '2H'], ['invalid', 0, 0]], [['2S', '2D'], ['invalid', 0, 0]], [['JK', 'KD', 'KS'], ['valid', 0, 70]], [['2C', '6H', '6C', '2S', '6C', '6H', '6C'], ['valid', 300, 65]]], [[['2H', '6C', '6D', '6D', '6H', '2S'], ['valid', 0, 60]], [['AH', 'AS', 'AD', 'JK', 'AC', 'JK', 'AH', 'AC', '2S'], ['valid', 300, 240]], [['8D'], ['invalid', 0, 0]], [['AD', 'AD', 'AD', 'AH', '2S', 'AH'], ['valid', 0, 120]], [['2D', '9C', '9C', '9S', '9D'], ['valid', 0, 60]], [['KH', 'KD', 'KH', 'KS', 'KH'], ['valid', 0, 50]], [['2C', '6H', '6C', '2S', '6C', '6H', '6C'], ['valid', 300, 65]], [['QS', 'QS', '2S', 'QD', 'QS', '2S', 'QS', 'JK', 'QC', 'QD'], ['valid', 300, 160]]], [[['2D', 'AC', 'AH', 'AH', '2S'], ['valid', 0, 100]], [['TD', 'TH', 'TS', 'TD'], ['valid', 0, 40]], [['2D', '5D', 'JK', '2D', '5S'], ['valid', 0, 100]], [['7S', '2H', '7H', '7S', '6S'], ['invalid', 0, 0]], [['2H', 'JK', 'KC', '2H', 'KD', 'KH'], ['valid', 0, 120]], [['2H', 'TS', 'TD', 'JK'], ['valid', 0, 90]], [['QS', 'QS', '2S', 'QD', 'QS', '2S', 'QS', 'JK', 'QC', 'QD'], ['valid', 300, 160]], [['2C', '2D', 'JH', 'JS', '2H'], ['valid', 0, 80]]]]
for i, (args, expected) in enumerate(fixtures[N-1]):
check("meld 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 |
|---|---|---|---|
| meld case 0 | ['valid', 300, 140] | ['valid', 300, 140] | Passed |
| meld case 1 | ['valid', 0, 30] | ['valid', 0, 30] | Passed |
| meld case 2 | ['invalid', 0, 0] | ['invalid', 0, 0] | Passed |
| meld case 3 | ['invalid', 0, 0] | ['invalid', 0, 0] | Passed |
| meld case 4 | ['valid', 0, 70] | ['valid', 0, 70] | Passed |
| meld case 5 | ['valid', 0, 80] | ['valid', 0, 80] | Passed |
| meld case 6 | ['valid', 0, 40] | ['valid', 0, 40] | Passed |
| meld case 7 | ['valid', 0, 60] | ['valid', 0, 60] | Passed |
SHA-256 / 6d385832861d3fd2d0011cc763705bfadb49c7d687a68bf1c676abc8699adab0
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:25.215335+00:00.
Case digest / 1e9dab444c028acf2d38c38a23762c988851b8a3c25bc18768cf220d92d609a2