{"abstract":"The doubled portion is taken although the contract refunds it.","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.","contract_signature":"x","evaluation_group":"w2-card-game-rule-engines-bj-settlement","failed_approach":"Refunding the whole wager on doubled hands loses nothing at all.","family":"w2-card-game-rule-engines-bj-settlement-dealer-natural-stake","id":"FA-83416","implementations":{"attempt":{"sha256":"ab3b5a41833a37650e8c5cc6ffa4e5240508304ecf79319fd8ac9d6b09baf9fd","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 0 if doubled else -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], [[['6D', 'JS', '3D'], ['5D', '9H'], 4, True, True], 8], [[['9S', '8H'], ['AC', 'QD'], 10, True, False], -10]], [[[['JD', 'QC'], ['JC', '2D'], 20, False, False], 20], [[['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], [[['7S', '4H', 'TC'], ['TC', 'AD'], 10, True, False], -10], [[['7S', '4H', 'TC'], ['TC', 'AD'], 10, True, False], -10]], [[[['KH', '5D'], ['AD', 'JD'], 4, True, 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], [[['3H', 'TD'], ['8H', '5D'], 10, False, False], 0], [[['9S', '8H'], ['AC', 'QD'], 10, True, False], -10]], [[[['2D', '7C'], ['AC', 'TC'], 2, True, False], -2], [[['2D', '7C'], ['AC', 'TC'], 2, True, False], -2], [[['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], [[['6S', 'AH'], ['8S', 'QC', '7D'], 4, False, False], 4]], [[[['KH', '5D'], ['AD', 'JD'], 4, 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], [[['8D', 'JH', '2S', '6S'], ['JD', 'TS'], 10, False, False], -10], [[['9S', '8H'], ['AC', 'QD'], 10, True, False], -10]]]\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":"c3e235f809aa9fec7aecfb9334cfebf56b9eedf3f1713fe9610a96ece6c3ad4d","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 -stake\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], [[['6D', 'JS', '3D'], ['5D', '9H'], 4, True, True], 8], [[['9S', '8H'], ['AC', 'QD'], 10, True, False], -10]], [[[['JD', 'QC'], ['JC', '2D'], 20, False, False], 20], [[['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], [[['7S', '4H', 'TC'], ['TC', 'AD'], 10, True, False], -10], [[['7S', '4H', 'TC'], ['TC', 'AD'], 10, True, False], -10]], [[[['KH', '5D'], ['AD', 'JD'], 4, True, 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], [[['3H', 'TD'], ['8H', '5D'], 10, False, False], 0], [[['9S', '8H'], ['AC', 'QD'], 10, True, False], -10]], [[[['2D', '7C'], ['AC', 'TC'], 2, True, False], -2], [[['2D', '7C'], ['AC', 'TC'], 2, True, False], -2], [[['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], [[['6S', 'AH'], ['8S', 'QC', '7D'], 4, False, False], 4]], [[[['KH', '5D'], ['AD', 'JD'], 4, 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], [[['8D', 'JH', '2S', '6S'], ['JD', 'TS'], 10, False, False], -10], [[['9S', '8H'], ['AC', 'QD'], 10, True, False], -10]]]\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-dealer-natural-stake","generated_at":"2026-09-29T14:50:21.343881+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.","root_cause":"The dealer-natural branch returns the doubled stake.","sha256":"17aa8c9b337a57c089ab9c534302a2c644b0492190febe662f1ccd0dae6f4bde","title":"Doubled wagers lose the full stake to a dealer natural · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verified":true,"visibility":"public","verification":{"attempt":{"elapsed_ms":41.17,"exit_code":1,"observations":[{"actual":4,"check":"settlement case 0","expected":4,"passed":true},{"actual":0,"check":"settlement case 1","expected":-4,"passed":false},{"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":8,"check":"settlement case 6","expected":8,"passed":true},{"actual":0,"check":"settlement case 7","expected":-10,"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"settlement case 0\", \"actual\": 4, \"expected\": 4, \"passed\": true}, {\"check\": \"settlement case 1\", \"actual\": 0, \"expected\": -4, \"passed\": false}, {\"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\": 8, \"expected\": 8, \"passed\": true}, {\"check\": \"settlement case 7\", \"actual\": 0, \"expected\": -10, \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":40.987,"exit_code":1,"observations":[{"actual":4,"check":"settlement case 0","expected":4,"passed":true},{"actual":-8,"check":"settlement case 1","expected":-4,"passed":false},{"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":8,"check":"settlement case 6","expected":8,"passed":true},{"actual":-20,"check":"settlement case 7","expected":-10,"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"settlement case 0\", \"actual\": 4, \"expected\": 4, \"passed\": true}, {\"check\": \"settlement case 1\", \"actual\": -8, \"expected\": -4, \"passed\": false}, {\"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\": 8, \"expected\": 8, \"passed\": true}, {\"check\": \"settlement case 7\", \"actual\": -20, \"expected\": -10, \"passed\": false}], \"passed\": false}\n"}},"member_only":{"stages":["fixed"],"fields":["implementations.fixed","verification.fixed","harness","repair"],"note":"The verified repair, its recorded checks, the repair description, and the scoring harness are available to members."}}