{"abstract":"Non-natural 21 ties are paid instead of pushed.","category":"Card game rule engines","checks":8,"contract":"Input [player_cards, dealer_cards, bet, doubled, from_split]. A natural is a two-card 21 not from a split. Player bust loses the stake (2*bet if doubled) first; both naturals push; player natural pays 3:2 on the bet; dealer natural takes only the original bet; dealer bust pays the stake; otherwise compare totals, equal totals push. Return net units.","evaluation_group":"w2-card-game-rule-engines-bj-settlement","failed_approach":"Treating all ties as losses charges pushes.","family":"w2-card-game-rule-engines-bj-settlement-equal-total-push","id":"FA-83421","implementations":{"attempt":{"sha256":"c6e46a2e02acf312bdda1ce7b93eecf50388fb973f484ca445e559435026630a","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    p, d, bet, doubled, split = x\n    def total(h):\n        t = 0\n        a = 0\n        for c in h:\n            if c[0] == 'A':\n                a += 1\n                t += 1\n            elif c[0] in 'TJQK':\n                t += 10\n            else:\n                t += int(c[0])\n        if a and t + 10 <= 21:\n            t += 10\n        return t\n    stake = bet * 2 if doubled else bet\n    pt = total(p)\n    dt = total(d)\n    pn = pt == 21 and len(p) == 2 and not split\n    dn = dt == 21 and len(d) == 2\n    if pt > 21:\n        return -stake\n    if pn and dn:\n        return 0\n    if pn:\n        return bet * 3 // 2\n    if dn:\n        return -bet\n    if dt > 21:\n        return stake\n    if pt > dt:\n        return stake\n    return -stake\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[[[['7D', '8C'], ['JC', '7S', 'QD'], 4, False, True], 4], [[['KH', '5D'], ['AD', 'JD'], 4, True, False], -4], [[['9H', '2H', '2D'], ['KC', '3C'], 10, False, False], 0], [[['7S', '6D'], ['4H', 'AC'], 20, False, False], -20], [[['6D', 'JC'], ['9H', '6C'], 4, True, False], 8], [[['7H', 'JS'], ['8S', '2D'], 20, True, False], 40], [[['KS', '6D', 'AD'], ['3C', '4D', 'TH'], 4, False, False], 0], [[['5S', '6H', 'TD'], ['9C', '5D', '7H'], 10, False, False], 0]], [[[['2S', '6D', 'JS'], ['7H', 'AC', 'TD'], 4, False, False], 0], [[['3C', 'TH'], ['AC', '8C'], 4, False, True], -4], [[['9C', '2D', '5D', '8D'], ['6H', 'KH'], 20, False, False], -20], [[['2D', '6S'], ['6H', 'TC'], 4, False, False], -4], [[['4H', '7S', '2C'], ['JC', '4S'], 20, False, False], -20], [[['9C', '8S'], ['9S', '5H'], 4, False, False], 4], [[['8D', 'TH', '5H'], ['KD', '6D', '7D'], 20, False, True], -20], [[['5S', '6H', 'TD'], ['9C', '5D', '7H'], 10, False, False], 0]], [[[['QS', 'QD', '5S'], ['8D', 'QH'], 4, False, False], -4], [[['4D', 'KS'], ['9D', 'JH', '9C'], 20, False, True], 20], [[['5H', '4D'], ['QH', '6D'], 2, False, False], -2], [[['5D', 'TC', '2C', '5S'], ['KD', 'QD'], 10, False, False], -10], [[['TH', '9S', '2H', '3H'], ['AS', 'QD'], 2, False, False], -2], [[['2D', '7C'], ['AC', 'TC'], 2, True, False], -2], [[['AS', '8D', '7S'], ['KS', '6C'], 20, False, False], 0], [[['5S', '6H', 'TD'], ['9C', '5D', '7H'], 10, False, False], 0]], [[[['3D', '3S', '3C', 'JC'], ['TC', '9D'], 20, False, False], 0], [[['QS', '5S'], ['7S', '9C', '9S'], 2, False, True], 2], [[['4C', 'KH'], ['7H', 'TS'], 10, True, False], -20], [[['KH', '4D'], ['QD', '7S'], 2, False, False], -2], [[['TH', '3S', '5C', '8D'], ['8S', '6S'], 4, False, False], -4], [[['JC', '7S'], ['9D', 'JH', '6C'], 20, False, False], 20], [[['5S', '6H', 'TD'], ['9C', '5D', '7H'], 10, False, False], 0], [[['5S', '6H', 'TD'], ['9C', '5D', '7H'], 10, False, False], 0]], [[[['6D', '7C'], ['JD', '8S'], 2, True, False], -4], [[['7H', 'QH'], ['7S', '4C'], 10, False, False], 10], [[['AC', '7D'], ['4D', '4C'], 20, False, False], 20], [[['AS', '3C'], ['QD', '9C'], 4, False, False], -4], [[['KS', '8H', 'JD'], ['TS', 'AS'], 4, False, True], -4], [[['TD', 'QS', 'TH'], ['8H', 'TS'], 20, False, False], -20], [[['JH', '7D', 'AS'], ['TD', '8S'], 20, True, False], 0], [[['5S', '6H', 'TD'], ['9C', '5D', '7H'], 10, False, False], 0]]]\nfor i, (args, expected) in enumerate(fixtures[N-1]):\n    check(\"settlement case %d\" % i, solve(args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"broken":{"sha256":"0e7f5ad63b0b43737d3302363d719ff9ac1ec23d9aea57ecec3a7e7858cd7e73","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    p, d, bet, doubled, split = x\n    def total(h):\n        t = 0\n        a = 0\n        for c in h:\n            if c[0] == 'A':\n                a += 1\n                t += 1\n            elif c[0] in 'TJQK':\n                t += 10\n            else:\n                t += int(c[0])\n        if a and t + 10 <= 21:\n            t += 10\n        return t\n    stake = bet * 2 if doubled else bet\n    pt = total(p)\n    dt = total(d)\n    pn = pt == 21 and len(p) == 2 and not split\n    dn = dt == 21 and len(d) == 2\n    if pt > 21:\n        return -stake\n    if pn and dn:\n        return 0\n    if pn:\n        return bet * 3 // 2\n    if dn:\n        return -bet\n    if dt > 21:\n        return stake\n    if pt > dt:\n        return stake\n    if pt < dt:\n        return -stake\n    return stake if pt == 21 else 0\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[[[['7D', '8C'], ['JC', '7S', 'QD'], 4, False, True], 4], [[['KH', '5D'], ['AD', 'JD'], 4, True, False], -4], [[['9H', '2H', '2D'], ['KC', '3C'], 10, False, False], 0], [[['7S', '6D'], ['4H', 'AC'], 20, False, False], -20], [[['6D', 'JC'], ['9H', '6C'], 4, True, False], 8], [[['7H', 'JS'], ['8S', '2D'], 20, True, False], 40], [[['KS', '6D', 'AD'], ['3C', '4D', 'TH'], 4, False, False], 0], [[['5S', '6H', 'TD'], ['9C', '5D', '7H'], 10, False, False], 0]], [[[['2S', '6D', 'JS'], ['7H', 'AC', 'TD'], 4, False, False], 0], [[['3C', 'TH'], ['AC', '8C'], 4, False, True], -4], [[['9C', '2D', '5D', '8D'], ['6H', 'KH'], 20, False, False], -20], [[['2D', '6S'], ['6H', 'TC'], 4, False, False], -4], [[['4H', '7S', '2C'], ['JC', '4S'], 20, False, False], -20], [[['9C', '8S'], ['9S', '5H'], 4, False, False], 4], [[['8D', 'TH', '5H'], ['KD', '6D', '7D'], 20, False, True], -20], [[['5S', '6H', 'TD'], ['9C', '5D', '7H'], 10, False, False], 0]], [[[['QS', 'QD', '5S'], ['8D', 'QH'], 4, False, False], -4], [[['4D', 'KS'], ['9D', 'JH', '9C'], 20, False, True], 20], [[['5H', '4D'], ['QH', '6D'], 2, False, False], -2], [[['5D', 'TC', '2C', '5S'], ['KD', 'QD'], 10, False, False], -10], [[['TH', '9S', '2H', '3H'], ['AS', 'QD'], 2, False, False], -2], [[['2D', '7C'], ['AC', 'TC'], 2, True, False], -2], [[['AS', '8D', '7S'], ['KS', '6C'], 20, False, False], 0], [[['5S', '6H', 'TD'], ['9C', '5D', '7H'], 10, False, False], 0]], [[[['3D', '3S', '3C', 'JC'], ['TC', '9D'], 20, False, False], 0], [[['QS', '5S'], ['7S', '9C', '9S'], 2, False, True], 2], [[['4C', 'KH'], ['7H', 'TS'], 10, True, False], -20], [[['KH', '4D'], ['QD', '7S'], 2, False, False], -2], [[['TH', '3S', '5C', '8D'], ['8S', '6S'], 4, False, False], -4], [[['JC', '7S'], ['9D', 'JH', '6C'], 20, False, False], 20], [[['5S', '6H', 'TD'], ['9C', '5D', '7H'], 10, False, False], 0], [[['5S', '6H', 'TD'], ['9C', '5D', '7H'], 10, False, False], 0]], [[[['6D', '7C'], ['JD', '8S'], 2, True, False], -4], [[['7H', 'QH'], ['7S', '4C'], 10, False, False], 10], [[['AC', '7D'], ['4D', '4C'], 20, False, False], 20], [[['AS', '3C'], ['QD', '9C'], 4, False, False], -4], [[['KS', '8H', 'JD'], ['TS', 'AS'], 4, False, True], -4], [[['TD', 'QS', 'TH'], ['8H', 'TS'], 20, False, False], -20], [[['JH', '7D', 'AS'], ['TD', '8S'], 20, True, False], 0], [[['5S', '6H', 'TD'], ['9C', '5D', '7H'], 10, False, False], 0]]]\nfor i, (args, expected) in enumerate(fixtures[N-1]):\n    check(\"settlement case %d\" % i, solve(args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"fixed":{"sha256":"7bf504cc045d2988410e20c0eb3cd254b7090dbf422409958fa4c921d8a4fda5","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    p, d, bet, doubled, split = x\n    def total(h):\n        t = 0\n        a = 0\n        for c in h:\n            if c[0] == 'A':\n                a += 1\n                t += 1\n            elif c[0] in 'TJQK':\n                t += 10\n            else:\n                t += int(c[0])\n        if a and t + 10 <= 21:\n            t += 10\n        return t\n    stake = bet * 2 if doubled else bet\n    pt = total(p)\n    dt = total(d)\n    pn = pt == 21 and len(p) == 2 and not split\n    dn = dt == 21 and len(d) == 2\n    if pt > 21:\n        return -stake\n    if pn and dn:\n        return 0\n    if pn:\n        return bet * 3 // 2\n    if dn:\n        return -bet\n    if dt > 21:\n        return stake\n    if pt > dt:\n        return stake\n    if pt < dt:\n        return -stake\n    return 0\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[[[['7D', '8C'], ['JC', '7S', 'QD'], 4, False, True], 4], [[['KH', '5D'], ['AD', 'JD'], 4, True, False], -4], [[['9H', '2H', '2D'], ['KC', '3C'], 10, False, False], 0], [[['7S', '6D'], ['4H', 'AC'], 20, False, False], -20], [[['6D', 'JC'], ['9H', '6C'], 4, True, False], 8], [[['7H', 'JS'], ['8S', '2D'], 20, True, False], 40], [[['KS', '6D', 'AD'], ['3C', '4D', 'TH'], 4, False, False], 0], [[['5S', '6H', 'TD'], ['9C', '5D', '7H'], 10, False, False], 0]], [[[['2S', '6D', 'JS'], ['7H', 'AC', 'TD'], 4, False, False], 0], [[['3C', 'TH'], ['AC', '8C'], 4, False, True], -4], [[['9C', '2D', '5D', '8D'], ['6H', 'KH'], 20, False, False], -20], [[['2D', '6S'], ['6H', 'TC'], 4, False, False], -4], [[['4H', '7S', '2C'], ['JC', '4S'], 20, False, False], -20], [[['9C', '8S'], ['9S', '5H'], 4, False, False], 4], [[['8D', 'TH', '5H'], ['KD', '6D', '7D'], 20, False, True], -20], [[['5S', '6H', 'TD'], ['9C', '5D', '7H'], 10, False, False], 0]], [[[['QS', 'QD', '5S'], ['8D', 'QH'], 4, False, False], -4], [[['4D', 'KS'], ['9D', 'JH', '9C'], 20, False, True], 20], [[['5H', '4D'], ['QH', '6D'], 2, False, False], -2], [[['5D', 'TC', '2C', '5S'], ['KD', 'QD'], 10, False, False], -10], [[['TH', '9S', '2H', '3H'], ['AS', 'QD'], 2, False, False], -2], [[['2D', '7C'], ['AC', 'TC'], 2, True, False], -2], [[['AS', '8D', '7S'], ['KS', '6C'], 20, False, False], 0], [[['5S', '6H', 'TD'], ['9C', '5D', '7H'], 10, False, False], 0]], [[[['3D', '3S', '3C', 'JC'], ['TC', '9D'], 20, False, False], 0], [[['QS', '5S'], ['7S', '9C', '9S'], 2, False, True], 2], [[['4C', 'KH'], ['7H', 'TS'], 10, True, False], -20], [[['KH', '4D'], ['QD', '7S'], 2, False, False], -2], [[['TH', '3S', '5C', '8D'], ['8S', '6S'], 4, False, False], -4], [[['JC', '7S'], ['9D', 'JH', '6C'], 20, False, False], 20], [[['5S', '6H', 'TD'], ['9C', '5D', '7H'], 10, False, False], 0], [[['5S', '6H', 'TD'], ['9C', '5D', '7H'], 10, False, False], 0]], [[[['6D', '7C'], ['JD', '8S'], 2, True, False], -4], [[['7H', 'QH'], ['7S', '4C'], 10, False, False], 10], [[['AC', '7D'], ['4D', '4C'], 20, False, False], 20], [[['AS', '3C'], ['QD', '9C'], 4, False, False], -4], [[['KS', '8H', 'JD'], ['TS', 'AS'], 4, False, True], -4], [[['TD', 'QS', 'TH'], ['8H', 'TS'], 20, False, False], -20], [[['JH', '7D', 'AS'], ['TD', '8S'], 20, True, False], 0], [[['5S', '6H', 'TD'], ['9C', '5D', '7H'], 10, False, False], 0]]]\nfor i, (args, expected) in enumerate(fixtures[N-1]):\n    check(\"settlement case %d\" % i, solve(args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"}},"limitations":"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.","method":"Deterministic executable model with adversarial boundary fixtures.","provenance":{"created_by":"Failure Map","dependencies":"Python standard library","family":"w2-card-game-rule-engines-bj-settlement-equal-total-push","generated_at":"2026-09-29T14:50:21.344623+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Card-game engines, scoring apps and online tables apply this rule automatically on every hand.","repair":"Any remaining equal totals push.","root_cause":"The final tie branch pays when both totals are 21.","sha256":"e6a98cab22ed09f16c802a42d79bc6a7503e4ad00b816354b2416560e66b465f","title":"Twenty-one against twenty-one is paid as a win · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":42.875,"exit_code":1,"observations":[{"actual":4,"check":"settlement case 0","expected":4,"passed":true},{"actual":-4,"check":"settlement case 1","expected":-4,"passed":true},{"actual":-10,"check":"settlement case 2","expected":0,"passed":false},{"actual":-20,"check":"settlement case 3","expected":-20,"passed":true},{"actual":8,"check":"settlement case 4","expected":8,"passed":true},{"actual":40,"check":"settlement case 5","expected":40,"passed":true},{"actual":-4,"check":"settlement case 6","expected":0,"passed":false},{"actual":-10,"check":"settlement case 7","expected":0,"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"settlement case 0\", \"actual\": 4, \"expected\": 4, \"passed\": true}, {\"check\": \"settlement case 1\", \"actual\": -4, \"expected\": -4, \"passed\": true}, {\"check\": \"settlement case 2\", \"actual\": -10, \"expected\": 0, \"passed\": false}, {\"check\": \"settlement case 3\", \"actual\": -20, \"expected\": -20, \"passed\": true}, {\"check\": \"settlement case 4\", \"actual\": 8, \"expected\": 8, \"passed\": true}, {\"check\": \"settlement case 5\", \"actual\": 40, \"expected\": 40, \"passed\": true}, {\"check\": \"settlement case 6\", \"actual\": -4, \"expected\": 0, \"passed\": false}, {\"check\": \"settlement case 7\", \"actual\": -10, \"expected\": 0, \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":41.485,"exit_code":1,"observations":[{"actual":4,"check":"settlement case 0","expected":4,"passed":true},{"actual":-4,"check":"settlement case 1","expected":-4,"passed":true},{"actual":0,"check":"settlement case 2","expected":0,"passed":true},{"actual":-20,"check":"settlement case 3","expected":-20,"passed":true},{"actual":8,"check":"settlement case 4","expected":8,"passed":true},{"actual":40,"check":"settlement case 5","expected":40,"passed":true},{"actual":0,"check":"settlement case 6","expected":0,"passed":true},{"actual":10,"check":"settlement case 7","expected":0,"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"settlement case 0\", \"actual\": 4, \"expected\": 4, \"passed\": true}, {\"check\": \"settlement case 1\", \"actual\": -4, \"expected\": -4, \"passed\": true}, {\"check\": \"settlement case 2\", \"actual\": 0, \"expected\": 0, \"passed\": true}, {\"check\": \"settlement case 3\", \"actual\": -20, \"expected\": -20, \"passed\": true}, {\"check\": \"settlement case 4\", \"actual\": 8, \"expected\": 8, \"passed\": true}, {\"check\": \"settlement case 5\", \"actual\": 40, \"expected\": 40, \"passed\": true}, {\"check\": \"settlement case 6\", \"actual\": 0, \"expected\": 0, \"passed\": true}, {\"check\": \"settlement case 7\", \"actual\": 10, \"expected\": 0, \"passed\": false}], \"passed\": false}\n"},"fixed":{"elapsed_ms":40.031,"exit_code":0,"observations":[{"actual":4,"check":"settlement case 0","expected":4,"passed":true},{"actual":-4,"check":"settlement case 1","expected":-4,"passed":true},{"actual":0,"check":"settlement case 2","expected":0,"passed":true},{"actual":-20,"check":"settlement case 3","expected":-20,"passed":true},{"actual":8,"check":"settlement case 4","expected":8,"passed":true},{"actual":40,"check":"settlement case 5","expected":40,"passed":true},{"actual":0,"check":"settlement case 6","expected":0,"passed":true},{"actual":0,"check":"settlement case 7","expected":0,"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"settlement case 0\", \"actual\": 4, \"expected\": 4, \"passed\": true}, {\"check\": \"settlement case 1\", \"actual\": -4, \"expected\": -4, \"passed\": true}, {\"check\": \"settlement case 2\", \"actual\": 0, \"expected\": 0, \"passed\": true}, {\"check\": \"settlement case 3\", \"actual\": -20, \"expected\": -20, \"passed\": true}, {\"check\": \"settlement case 4\", \"actual\": 8, \"expected\": 8, \"passed\": true}, {\"check\": \"settlement case 5\", \"actual\": 40, \"expected\": 40, \"passed\": true}, {\"check\": \"settlement case 6\", \"actual\": 0, \"expected\": 0, \"passed\": true}, {\"check\": \"settlement case 7\", \"actual\": 0, \"expected\": 0, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}