{"abstract":"6S vulnerable made is 250 short.","category":"Card game rule engines","checks":8,"contract":"Input [level, strain, doubled(0/1/2), vulnerable, tricks]. Trick score C/D 20, H/S 30, NT 40+30; x2/x4 doubled/redoubled. Game bonus 300/500 when trick score >= 100 else 50 partscore; slam 500/750 (6) or 1000/1500 (7); overtricks trick value undoubled, 100/200 per double level; insult 50 per double level. Undertricks: 50/100 undoubled; doubled NV 100, 200, 200, then 300; doubled V 200 then 300; redoubled x2.","evaluation_group":"w2-card-game-rule-engines-bridge-score","failed_approach":"Granting the bonus only with exactly twelve tricks drops it when an overtrick is made.","family":"w2-card-game-rule-engines-bridge-score-slam-bonus-conditions","id":"FA-83606","implementations":{"attempt":{"sha256":"a09e69373d7780f5d8488c4ec5b48b9d004a2f1f69fc347883db050edcf5be1d","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    level, strain, dbl, vul, tricks = x\n    need = 6 + level\n    if tricks < need:\n        down = need - tricks\n        if dbl == 0:\n            return -(100 if vul else 50) * down\n        pen = 0\n        for k in range(1, down + 1):\n            if vul:\n                pen += 200 if k == 1 else 300\n            else:\n                pen += 100 if k == 1 else 200 if k <= 3 else 300\n        return -pen * dbl\n    per = 20 if strain in 'CD' else 30\n    base = per * level + (10 if strain == 'N' else 0)\n    mult = [1, 2, 4][dbl]\n    trick_score = base * mult\n    score = trick_score\n    score += (500 if vul else 300) if trick_score >= 100 else 50\n    if level == 6 and tricks == 12:\n        score += 750 if vul else 500\n    elif level == 7:\n        score += 1500 if vul else 1000\n    over = tricks - need\n    if dbl == 0:\n        score += over * per\n    else:\n        score += over * (200 if vul else 100) * dbl\n    score += 50 * dbl\n    return score\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[[[4, 'C', 1, False, 10], 510], [[7, 'S', 0, True, 12], -100], [[6, 'N', 0, True, 12], 1440], [[2, 'H', 1, True, 9], 870], [[3, 'H', 2, False, 11], 1160], [[5, 'N', 0, False, 11], 460], [[2, 'D', 0, True, 8], 90], [[6, 'H', 0, False, 13], 1010]], [[[6, 'S', 0, False, 12], 980], [[7, 'D', 0, True, 8], -500], [[6, 'H', 0, False, 12], 980], [[6, 'H', 0, False, 11], -50], [[6, 'N', 0, False, 12], 990], [[6, 'D', 2, True, 13], 2230], [[6, 'S', 0, True, 12], 1430], [[6, 'H', 1, True, 13], 1860]], [[[6, 'H', 0, True, 13], 1460], [[2, 'C', 0, True, 9], 110], [[4, 'N', 0, False, 12], 490], [[7, 'C', 0, True, 13], 2140], [[3, 'S', 1, False, 5], -800], [[5, 'C', 2, False, 13], 1200], [[6, 'S', 1, True, 13], 1860], [[6, 'D', 2, True, 12], 1830]], [[[6, 'D', 2, True, 13], 2230], [[2, 'C', 2, False, 7], -200], [[2, 'H', 2, False, 5], -1000], [[7, 'H', 2, False, 11], -600], [[3, 'N', 1, True, 7], -500], [[6, 'S', 0, True, 12], 1430], [[4, 'C', 0, False, 6], -200], [[6, 'H', 1, True, 13], 1860]], [[[1, 'D', 2, True, 6], -400], [[5, 'H', 0, True, 11], 650], [[4, 'D', 0, True, 7], -300], [[7, 'D', 1, True, 10], -800], [[4, 'C', 1, True, 9], -200], [[3, 'S', 2, True, 9], 960], [[6, 'S', 0, True, 13], 1460], [[6, 'S', 0, True, 13], 1460]]]\nfor i, (args, expected) in enumerate(fixtures[N-1]):\n    check(\"duplicate score 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":"66b8f6308cd0f00fdf01f2731f2dc063b9981bd8f359b3e509263b953c350de9","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    level, strain, dbl, vul, tricks = x\n    need = 6 + level\n    if tricks < need:\n        down = need - tricks\n        if dbl == 0:\n            return -(100 if vul else 50) * down\n        pen = 0\n        for k in range(1, down + 1):\n            if vul:\n                pen += 200 if k == 1 else 300\n            else:\n                pen += 100 if k == 1 else 200 if k <= 3 else 300\n        return -pen * dbl\n    per = 20 if strain in 'CD' else 30\n    base = per * level + (10 if strain == 'N' else 0)\n    mult = [1, 2, 4][dbl]\n    trick_score = base * mult\n    score = trick_score\n    score += (500 if vul else 300) if trick_score >= 100 else 50\n    if level == 6:\n        score += 500\n    elif level == 7:\n        score += 1500 if vul else 1000\n    over = tricks - need\n    if dbl == 0:\n        score += over * per\n    else:\n        score += over * (200 if vul else 100) * dbl\n    score += 50 * dbl\n    return score\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[[[4, 'C', 1, False, 10], 510], [[7, 'S', 0, True, 12], -100], [[6, 'N', 0, True, 12], 1440], [[2, 'H', 1, True, 9], 870], [[3, 'H', 2, False, 11], 1160], [[5, 'N', 0, False, 11], 460], [[2, 'D', 0, True, 8], 90], [[6, 'H', 0, False, 13], 1010]], [[[6, 'S', 0, False, 12], 980], [[7, 'D', 0, True, 8], -500], [[6, 'H', 0, False, 12], 980], [[6, 'H', 0, False, 11], -50], [[6, 'N', 0, False, 12], 990], [[6, 'D', 2, True, 13], 2230], [[6, 'S', 0, True, 12], 1430], [[6, 'H', 1, True, 13], 1860]], [[[6, 'H', 0, True, 13], 1460], [[2, 'C', 0, True, 9], 110], [[4, 'N', 0, False, 12], 490], [[7, 'C', 0, True, 13], 2140], [[3, 'S', 1, False, 5], -800], [[5, 'C', 2, False, 13], 1200], [[6, 'S', 1, True, 13], 1860], [[6, 'D', 2, True, 12], 1830]], [[[6, 'D', 2, True, 13], 2230], [[2, 'C', 2, False, 7], -200], [[2, 'H', 2, False, 5], -1000], [[7, 'H', 2, False, 11], -600], [[3, 'N', 1, True, 7], -500], [[6, 'S', 0, True, 12], 1430], [[4, 'C', 0, False, 6], -200], [[6, 'H', 1, True, 13], 1860]], [[[1, 'D', 2, True, 6], -400], [[5, 'H', 0, True, 11], 650], [[4, 'D', 0, True, 7], -300], [[7, 'D', 1, True, 10], -800], [[4, 'C', 1, True, 9], -200], [[3, 'S', 2, True, 9], 960], [[6, 'S', 0, True, 13], 1460], [[6, 'S', 0, True, 13], 1460]]]\nfor i, (args, expected) in enumerate(fixtures[N-1]):\n    check(\"duplicate score 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":"9824a2f6823c53bb57b1230e46fff914793bbdaee91cc7a138ec8ff82ee13100","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    level, strain, dbl, vul, tricks = x\n    need = 6 + level\n    if tricks < need:\n        down = need - tricks\n        if dbl == 0:\n            return -(100 if vul else 50) * down\n        pen = 0\n        for k in range(1, down + 1):\n            if vul:\n                pen += 200 if k == 1 else 300\n            else:\n                pen += 100 if k == 1 else 200 if k <= 3 else 300\n        return -pen * dbl\n    per = 20 if strain in 'CD' else 30\n    base = per * level + (10 if strain == 'N' else 0)\n    mult = [1, 2, 4][dbl]\n    trick_score = base * mult\n    score = trick_score\n    score += (500 if vul else 300) if trick_score >= 100 else 50\n    if level == 6:\n        score += 750 if vul else 500\n    elif level == 7:\n        score += 1500 if vul else 1000\n    over = tricks - need\n    if dbl == 0:\n        score += over * per\n    else:\n        score += over * (200 if vul else 100) * dbl\n    score += 50 * dbl\n    return score\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[[[4, 'C', 1, False, 10], 510], [[7, 'S', 0, True, 12], -100], [[6, 'N', 0, True, 12], 1440], [[2, 'H', 1, True, 9], 870], [[3, 'H', 2, False, 11], 1160], [[5, 'N', 0, False, 11], 460], [[2, 'D', 0, True, 8], 90], [[6, 'H', 0, False, 13], 1010]], [[[6, 'S', 0, False, 12], 980], [[7, 'D', 0, True, 8], -500], [[6, 'H', 0, False, 12], 980], [[6, 'H', 0, False, 11], -50], [[6, 'N', 0, False, 12], 990], [[6, 'D', 2, True, 13], 2230], [[6, 'S', 0, True, 12], 1430], [[6, 'H', 1, True, 13], 1860]], [[[6, 'H', 0, True, 13], 1460], [[2, 'C', 0, True, 9], 110], [[4, 'N', 0, False, 12], 490], [[7, 'C', 0, True, 13], 2140], [[3, 'S', 1, False, 5], -800], [[5, 'C', 2, False, 13], 1200], [[6, 'S', 1, True, 13], 1860], [[6, 'D', 2, True, 12], 1830]], [[[6, 'D', 2, True, 13], 2230], [[2, 'C', 2, False, 7], -200], [[2, 'H', 2, False, 5], -1000], [[7, 'H', 2, False, 11], -600], [[3, 'N', 1, True, 7], -500], [[6, 'S', 0, True, 12], 1430], [[4, 'C', 0, False, 6], -200], [[6, 'H', 1, True, 13], 1860]], [[[1, 'D', 2, True, 6], -400], [[5, 'H', 0, True, 11], 650], [[4, 'D', 0, True, 7], -300], [[7, 'D', 1, True, 10], -800], [[4, 'C', 1, True, 9], -200], [[3, 'S', 2, True, 9], 960], [[6, 'S', 0, True, 13], 1460], [[6, 'S', 0, True, 13], 1460]]]\nfor i, (args, expected) in enumerate(fixtures[N-1]):\n    check(\"duplicate score 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-bridge-score-slam-bonus-conditions","generated_at":"2026-09-29T14:50:23.294386+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":"Small slam is 750 vulnerable and 500 not.","root_cause":"The small-slam bonus ignores vulnerability.","sha256":"80e8c6e65379c82afd257dd4871db2195721ef4d107a38f093e91cb059823afe","title":"Vulnerable small slams get the non-vulnerable bonus · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":49.198,"exit_code":1,"observations":[{"actual":510,"check":"duplicate score case 0","expected":510,"passed":true},{"actual":-100,"check":"duplicate score case 1","expected":-100,"passed":true},{"actual":1440,"check":"duplicate score case 2","expected":1440,"passed":true},{"actual":870,"check":"duplicate score case 3","expected":870,"passed":true},{"actual":1160,"check":"duplicate score case 4","expected":1160,"passed":true},{"actual":460,"check":"duplicate score case 5","expected":460,"passed":true},{"actual":90,"check":"duplicate score case 6","expected":90,"passed":true},{"actual":510,"check":"duplicate score case 7","expected":1010,"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"duplicate score case 0\", \"actual\": 510, \"expected\": 510, \"passed\": true}, {\"check\": \"duplicate score case 1\", \"actual\": -100, \"expected\": -100, \"passed\": true}, {\"check\": \"duplicate score case 2\", \"actual\": 1440, \"expected\": 1440, \"passed\": true}, {\"check\": \"duplicate score case 3\", \"actual\": 870, \"expected\": 870, \"passed\": true}, {\"check\": \"duplicate score case 4\", \"actual\": 1160, \"expected\": 1160, \"passed\": true}, {\"check\": \"duplicate score case 5\", \"actual\": 460, \"expected\": 460, \"passed\": true}, {\"check\": \"duplicate score case 6\", \"actual\": 90, \"expected\": 90, \"passed\": true}, {\"check\": \"duplicate score case 7\", \"actual\": 510, \"expected\": 1010, \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":40.162,"exit_code":1,"observations":[{"actual":510,"check":"duplicate score case 0","expected":510,"passed":true},{"actual":-100,"check":"duplicate score case 1","expected":-100,"passed":true},{"actual":1190,"check":"duplicate score case 2","expected":1440,"passed":false},{"actual":870,"check":"duplicate score case 3","expected":870,"passed":true},{"actual":1160,"check":"duplicate score case 4","expected":1160,"passed":true},{"actual":460,"check":"duplicate score case 5","expected":460,"passed":true},{"actual":90,"check":"duplicate score case 6","expected":90,"passed":true},{"actual":1010,"check":"duplicate score case 7","expected":1010,"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"duplicate score case 0\", \"actual\": 510, \"expected\": 510, \"passed\": true}, {\"check\": \"duplicate score case 1\", \"actual\": -100, \"expected\": -100, \"passed\": true}, {\"check\": \"duplicate score case 2\", \"actual\": 1190, \"expected\": 1440, \"passed\": false}, {\"check\": \"duplicate score case 3\", \"actual\": 870, \"expected\": 870, \"passed\": true}, {\"check\": \"duplicate score case 4\", \"actual\": 1160, \"expected\": 1160, \"passed\": true}, {\"check\": \"duplicate score case 5\", \"actual\": 460, \"expected\": 460, \"passed\": true}, {\"check\": \"duplicate score case 6\", \"actual\": 90, \"expected\": 90, \"passed\": true}, {\"check\": \"duplicate score case 7\", \"actual\": 1010, \"expected\": 1010, \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":91.052,"exit_code":0,"observations":[{"actual":510,"check":"duplicate score case 0","expected":510,"passed":true},{"actual":-100,"check":"duplicate score case 1","expected":-100,"passed":true},{"actual":1440,"check":"duplicate score case 2","expected":1440,"passed":true},{"actual":870,"check":"duplicate score case 3","expected":870,"passed":true},{"actual":1160,"check":"duplicate score case 4","expected":1160,"passed":true},{"actual":460,"check":"duplicate score case 5","expected":460,"passed":true},{"actual":90,"check":"duplicate score case 6","expected":90,"passed":true},{"actual":1010,"check":"duplicate score case 7","expected":1010,"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"duplicate score case 0\", \"actual\": 510, \"expected\": 510, \"passed\": true}, {\"check\": \"duplicate score case 1\", \"actual\": -100, \"expected\": -100, \"passed\": true}, {\"check\": \"duplicate score case 2\", \"actual\": 1440, \"expected\": 1440, \"passed\": true}, {\"check\": \"duplicate score case 3\", \"actual\": 870, \"expected\": 870, \"passed\": true}, {\"check\": \"duplicate score case 4\", \"actual\": 1160, \"expected\": 1160, \"passed\": true}, {\"check\": \"duplicate score case 5\", \"actual\": 460, \"expected\": 460, \"passed\": true}, {\"check\": \"duplicate score case 6\", \"actual\": 90, \"expected\": 90, \"passed\": true}, {\"check\": \"duplicate score case 7\", \"actual\": 1010, \"expected\": 1010, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}