{"abstract":"Both jacks of diamonds and queens of spades score 80.","category":"Card game rule engines","checks":8,"contract":"Input [hand, trump]. Arounds (one of the rank in each suit): A 100, K 80, Q 60, J 40; double around x10. Run in trump (A T K Q J) 150 each; marriages (K+Q same suit) 20, royal marriage in trump 40, but a K+Q used in a run is not also a royal marriage. Pinochle (JD+QS) 40, double pinochle 300. Return the meld total.","contract_signature":"x","evaluation_group":"w2-card-game-rule-engines-pinochle-meld","failed_approach":"Treating two JD with one QS as double pinochle overpays.","family":"w2-card-game-rule-engines-pinochle-meld-double-pinochle","id":"FA-83771","implementations":{"attempt":{"sha256":"0f53b89ad10d5458eab4bd528865d2127f2a2d15a3fb3da83cf9d801af9a9b6c","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nfrom collections import Counter\nN = 1\nobservations = []\ndef solve(x):\n    hand, trump = x\n    cnt = Counter(hand)\n    pts = 0\n    for r, v in (('A', 100), ('K', 80), ('Q', 60), ('J', 40)):\n        k = min(cnt[r + s] for s in 'SHDC')\n        if k >= 2:\n            pts += v * 10\n        elif k == 1:\n            pts += v\n    runs = min(cnt[r + trump] for r in 'ATKQJ')\n    pts += 150 * runs\n    for s in 'SHDC':\n        m = min(cnt['K' + s], cnt['Q' + s])\n        if s == trump:\n            m -= runs\n            pts += 40 * m\n        else:\n            pts += 20 * m\n    p = min(cnt['JD'], cnt['QS'])\n    pts += 300 if p >= 1 and cnt['JD'] == 2 else 40 * p\n    return pts\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[[[['9H', 'AC', 'AD', 'AD', 'JD', 'JD', 'KH', 'QC', 'QD', 'QS', 'QS', 'TS'], 'D'], 300], [[['9C', '9D', '9S', 'AC', 'AH', 'JH', 'JS', 'KH', 'KH', 'KS', 'QH', 'TD'], 'C'], 20], [[['9D', 'JC', 'JD', 'JD', 'JH', 'KD', 'KS', 'QH', 'QS', 'QS', 'TC', 'TD'], 'H'], 320], [[['AC', 'AC', 'AD', 'AD', 'AH', 'AH', 'AS', 'AS', 'JD', 'JD', 'QS', 'QS'], 'D'], 1300], [[['9S', 'AH', 'AS', 'JC', 'JS', 'KD', 'KS', 'KS', 'QD', 'QS', 'TC', 'TS'], 'S'], 170], [[['AH', 'AH', 'AS', 'AS', 'JH', 'KC', 'KH', 'QH', 'QS', 'TH', 'TH', 'TS'], 'C'], 20], [[['9S', '9S', 'AC', 'JD', 'JD', 'KD', 'KS', 'QD', 'QS', 'QS', 'QS', 'TD'], 'D'], 360], [[['AD', 'JD', 'JD', 'JD', 'JH', 'KC', 'KS', 'QD', 'QH', 'QS', 'QS', 'TC'], 'S'], 340]], [[[['AC', 'AC', 'AD', 'AD', 'AH', 'AH', 'AS', 'AS', 'JD', 'JD', 'QS', 'QS'], 'D'], 1300], [[['9C', 'AC', 'AC', 'AD', 'AH', 'AH', 'JD', 'JH', 'QC', 'QD', 'QH', 'TS'], 'C'], 0], [[['9C', '9D', '9S', 'AD', 'JH', 'JS', 'KC', 'QD', 'QH', 'TC', 'TD', 'TH'], 'D'], 0], [[['AC', 'AC', 'AD', 'AD', 'AH', 'AH', 'AS', 'AS', 'AS', 'QC', 'TC', 'TD'], 'H'], 1000], [[['9C', '9H', 'AC', 'AS', 'JC', 'KD', 'KH', 'QC', 'QH', 'TD', 'TH', 'TH'], 'S'], 20], [[['9D', '9S', 'AS', 'JC', 'JH', 'JS', 'KD', 'KH', 'KS', 'QC', 'QD', 'QS'], 'D'], 60], [[['9C', 'AS', 'AS', 'JD', 'JH', 'JS', 'KC', 'KS', 'QC', 'QS', 'TD', 'TS'], 'S'], 210], [[['9H', '9S', 'AC', 'JD', 'JD', 'JD', 'JD', 'KD', 'QH', 'QS', 'QS', 'TD'], 'S'], 300]], [[[['9C', 'AS', 'JC', 'JH', 'KD', 'KD', 'KH', 'KS', 'QS', 'QS', 'TD', 'TH'], 'S'], 40], [[['AH', 'AH', 'JC', 'JH', 'JH', 'KH', 'KH', 'QH', 'QH', 'QS', 'TH', 'TH'], 'C'], 40], [[['AC', 'AC', 'AD', 'AD', 'AH', 'AH', 'AS', 'AS', 'JD', 'JD', 'QS', 'QS'], 'H'], 1300], [[['9C', '9D', 'AC', 'AD', 'AD', 'JD', 'JH', 'KD', 'KD', 'QD', 'QH', 'TD'], 'C'], 20], [[['9D', '9S', 'AD', 'JD', 'JD', 'KS', 'QD', 'QD', 'QH', 'QS', 'QS', 'TH'], 'S'], 340], [[['AC', 'AC', 'AC', 'AD', 'AD', 'AH', 'AH', 'AS', 'AS', 'KC', 'QC', 'TC'], 'D'], 1020], [[['AD', 'AH', 'AS', 'JD', 'JH', 'JS', 'KC', 'KD', 'QC', 'QD', 'QD', 'TD'], 'D'], 170], [[['AC', 'AD', 'AD', 'JD', 'JD', 'KD', 'KD', 'KS', 'QD', 'QH', 'QS', 'TD'], 'H'], 80]], [[[['9C', '9D', 'AC', 'AH', 'AH', 'KC', 'KD', 'KS', 'QC', 'QD', 'QS', 'TH'], 'H'], 60], [[['9C', '9C', 'AC', 'JD', 'KD', 'KD', 'KH', 'KS', 'QC', 'QH', 'TC', 'TD'], 'H'], 40], [[['9H', 'AC', 'AD', 'AS', 'JH', 'JS', 'KC', 'KD', 'QD', 'QH', 'TC', 'TD'], 'D'], 40], [[['AC', 'AC', 'AD', 'AD', 'AH', 'AH', 'AS', 'AS', 'JC', 'KS', 'QH', 'TS'], 'H'], 1000], [[['9C', '9D', '9D', '9H', 'AC', 'AH', 'JC', 'KC', 'KS', 'TC', 'TD', 'TH'], 'S'], 0], [[['AH', 'AH', 'JH', 'JH', 'JS', 'KH', 'KH', 'QH', 'QH', 'TD', 'TH', 'TH'], 'D'], 40], [[['AC', 'AC', 'AD', 'AD', 'AH', 'AH', 'AS', 'AS', 'JD', 'JD', 'QS', 'QS'], 'S'], 1300], [[['AD', 'JD', 'JD', 'JD', 'JH', 'KC', 'KS', 'QD', 'QH', 'QS', 'QS', 'TC'], 'S'], 340]], [[[['9D', '9S', 'AH', 'JH', 'KC', 'KD', 'KS', 'QD', 'QD', 'TC', 'TC', 'TS'], 'D'], 40], [[['9D', 'AC', 'AH', 'JC', 'JH', 'JS', 'KC', 'KH', 'QC', 'TC', 'TH', 'TS'], 'S'], 20], [[['AC', 'AC', 'AD', 'AD', 'AH', 'AH', 'AS', 'AS', 'JD', 'JD', 'QS', 'QS'], 'S'], 1300], [[['AH', 'AH', 'JH', 'JH', 'KD', 'KD', 'KH', 'KH', 'QH', 'QH', 'TH', 'TH'], 'C'], 40], [[['9C', '9D', '9S', '9S', 'AD', 'AD', 'AH', 'AS', 'JC', 'JD', 'KH', 'QS'], 'C'], 40], [[['9C', '9H', 'AD', 'JC', 'JD', 'JS', 'JS', 'KC', 'KD', 'KH', 'TD', 'TH'], 'D'], 0], [[['AC', 'AC', 'AD', 'AD', 'AH', 'AH', 'AS', 'AS', 'JD', 'JD', 'QS', 'QS'], 'H'], 1300], [[['9H', '9S', 'AC', 'JD', 'JD', 'JD', 'JD', 'KD', 'QH', 'QS', 'QS', 'TD'], 'S'], 300]]]\nfor i, (args, expected) in enumerate(fixtures[N-1]):\n    check(\"meld points 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":"90cd2b10fc4daf73cca64b056c27d3ead1edada6e6cefbb9837def1f97c585b5","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nfrom collections import Counter\nN = 1\nobservations = []\ndef solve(x):\n    hand, trump = x\n    cnt = Counter(hand)\n    pts = 0\n    for r, v in (('A', 100), ('K', 80), ('Q', 60), ('J', 40)):\n        k = min(cnt[r + s] for s in 'SHDC')\n        if k >= 2:\n            pts += v * 10\n        elif k == 1:\n            pts += v\n    runs = min(cnt[r + trump] for r in 'ATKQJ')\n    pts += 150 * runs\n    for s in 'SHDC':\n        m = min(cnt['K' + s], cnt['Q' + s])\n        if s == trump:\n            m -= runs\n            pts += 40 * m\n        else:\n            pts += 20 * m\n    p = min(cnt['JD'], cnt['QS'])\n    pts += 40 * p\n    return pts\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[[[['9H', 'AC', 'AD', 'AD', 'JD', 'JD', 'KH', 'QC', 'QD', 'QS', 'QS', 'TS'], 'D'], 300], [[['9C', '9D', '9S', 'AC', 'AH', 'JH', 'JS', 'KH', 'KH', 'KS', 'QH', 'TD'], 'C'], 20], [[['9D', 'JC', 'JD', 'JD', 'JH', 'KD', 'KS', 'QH', 'QS', 'QS', 'TC', 'TD'], 'H'], 320], [[['AC', 'AC', 'AD', 'AD', 'AH', 'AH', 'AS', 'AS', 'JD', 'JD', 'QS', 'QS'], 'D'], 1300], [[['9S', 'AH', 'AS', 'JC', 'JS', 'KD', 'KS', 'KS', 'QD', 'QS', 'TC', 'TS'], 'S'], 170], [[['AH', 'AH', 'AS', 'AS', 'JH', 'KC', 'KH', 'QH', 'QS', 'TH', 'TH', 'TS'], 'C'], 20], [[['9S', '9S', 'AC', 'JD', 'JD', 'KD', 'KS', 'QD', 'QS', 'QS', 'QS', 'TD'], 'D'], 360], [[['AD', 'JD', 'JD', 'JD', 'JH', 'KC', 'KS', 'QD', 'QH', 'QS', 'QS', 'TC'], 'S'], 340]], [[[['AC', 'AC', 'AD', 'AD', 'AH', 'AH', 'AS', 'AS', 'JD', 'JD', 'QS', 'QS'], 'D'], 1300], [[['9C', 'AC', 'AC', 'AD', 'AH', 'AH', 'JD', 'JH', 'QC', 'QD', 'QH', 'TS'], 'C'], 0], [[['9C', '9D', '9S', 'AD', 'JH', 'JS', 'KC', 'QD', 'QH', 'TC', 'TD', 'TH'], 'D'], 0], [[['AC', 'AC', 'AD', 'AD', 'AH', 'AH', 'AS', 'AS', 'AS', 'QC', 'TC', 'TD'], 'H'], 1000], [[['9C', '9H', 'AC', 'AS', 'JC', 'KD', 'KH', 'QC', 'QH', 'TD', 'TH', 'TH'], 'S'], 20], [[['9D', '9S', 'AS', 'JC', 'JH', 'JS', 'KD', 'KH', 'KS', 'QC', 'QD', 'QS'], 'D'], 60], [[['9C', 'AS', 'AS', 'JD', 'JH', 'JS', 'KC', 'KS', 'QC', 'QS', 'TD', 'TS'], 'S'], 210], [[['9H', '9S', 'AC', 'JD', 'JD', 'JD', 'JD', 'KD', 'QH', 'QS', 'QS', 'TD'], 'S'], 300]], [[[['9C', 'AS', 'JC', 'JH', 'KD', 'KD', 'KH', 'KS', 'QS', 'QS', 'TD', 'TH'], 'S'], 40], [[['AH', 'AH', 'JC', 'JH', 'JH', 'KH', 'KH', 'QH', 'QH', 'QS', 'TH', 'TH'], 'C'], 40], [[['AC', 'AC', 'AD', 'AD', 'AH', 'AH', 'AS', 'AS', 'JD', 'JD', 'QS', 'QS'], 'H'], 1300], [[['9C', '9D', 'AC', 'AD', 'AD', 'JD', 'JH', 'KD', 'KD', 'QD', 'QH', 'TD'], 'C'], 20], [[['9D', '9S', 'AD', 'JD', 'JD', 'KS', 'QD', 'QD', 'QH', 'QS', 'QS', 'TH'], 'S'], 340], [[['AC', 'AC', 'AC', 'AD', 'AD', 'AH', 'AH', 'AS', 'AS', 'KC', 'QC', 'TC'], 'D'], 1020], [[['AD', 'AH', 'AS', 'JD', 'JH', 'JS', 'KC', 'KD', 'QC', 'QD', 'QD', 'TD'], 'D'], 170], [[['AC', 'AD', 'AD', 'JD', 'JD', 'KD', 'KD', 'KS', 'QD', 'QH', 'QS', 'TD'], 'H'], 80]], [[[['9C', '9D', 'AC', 'AH', 'AH', 'KC', 'KD', 'KS', 'QC', 'QD', 'QS', 'TH'], 'H'], 60], [[['9C', '9C', 'AC', 'JD', 'KD', 'KD', 'KH', 'KS', 'QC', 'QH', 'TC', 'TD'], 'H'], 40], [[['9H', 'AC', 'AD', 'AS', 'JH', 'JS', 'KC', 'KD', 'QD', 'QH', 'TC', 'TD'], 'D'], 40], [[['AC', 'AC', 'AD', 'AD', 'AH', 'AH', 'AS', 'AS', 'JC', 'KS', 'QH', 'TS'], 'H'], 1000], [[['9C', '9D', '9D', '9H', 'AC', 'AH', 'JC', 'KC', 'KS', 'TC', 'TD', 'TH'], 'S'], 0], [[['AH', 'AH', 'JH', 'JH', 'JS', 'KH', 'KH', 'QH', 'QH', 'TD', 'TH', 'TH'], 'D'], 40], [[['AC', 'AC', 'AD', 'AD', 'AH', 'AH', 'AS', 'AS', 'JD', 'JD', 'QS', 'QS'], 'S'], 1300], [[['AD', 'JD', 'JD', 'JD', 'JH', 'KC', 'KS', 'QD', 'QH', 'QS', 'QS', 'TC'], 'S'], 340]], [[[['9D', '9S', 'AH', 'JH', 'KC', 'KD', 'KS', 'QD', 'QD', 'TC', 'TC', 'TS'], 'D'], 40], [[['9D', 'AC', 'AH', 'JC', 'JH', 'JS', 'KC', 'KH', 'QC', 'TC', 'TH', 'TS'], 'S'], 20], [[['AC', 'AC', 'AD', 'AD', 'AH', 'AH', 'AS', 'AS', 'JD', 'JD', 'QS', 'QS'], 'S'], 1300], [[['AH', 'AH', 'JH', 'JH', 'KD', 'KD', 'KH', 'KH', 'QH', 'QH', 'TH', 'TH'], 'C'], 40], [[['9C', '9D', '9S', '9S', 'AD', 'AD', 'AH', 'AS', 'JC', 'JD', 'KH', 'QS'], 'C'], 40], [[['9C', '9H', 'AD', 'JC', 'JD', 'JS', 'JS', 'KC', 'KD', 'KH', 'TD', 'TH'], 'D'], 0], [[['AC', 'AC', 'AD', 'AD', 'AH', 'AH', 'AS', 'AS', 'JD', 'JD', 'QS', 'QS'], 'H'], 1300], [[['9H', '9S', 'AC', 'JD', 'JD', 'JD', 'JD', 'KD', 'QH', 'QS', 'QS', 'TD'], 'S'], 300]]]\nfor i, (args, expected) in enumerate(fixtures[N-1]):\n    check(\"meld points 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-pinochle-meld-double-pinochle","generated_at":"2026-09-29T14:50:24.624120+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 double pinochle bonus is missing.","sha256":"d41f7306537c4b5ac70e3d407d6a589ae146c92ca2da6cd840de56a72d25b94d","title":"Double pinochle scores as two single pinochles · 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":38.068,"exit_code":1,"observations":[{"actual":300,"check":"meld points case 0","expected":300,"passed":true},{"actual":20,"check":"meld points case 1","expected":20,"passed":true},{"actual":320,"check":"meld points case 2","expected":320,"passed":true},{"actual":1300,"check":"meld points case 3","expected":1300,"passed":true},{"actual":170,"check":"meld points case 4","expected":170,"passed":true},{"actual":20,"check":"meld points case 5","expected":20,"passed":true},{"actual":360,"check":"meld points case 6","expected":360,"passed":true},{"actual":120,"check":"meld points case 7","expected":340,"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"meld points case 0\", \"actual\": 300, \"expected\": 300, \"passed\": true}, {\"check\": \"meld points case 1\", \"actual\": 20, \"expected\": 20, \"passed\": true}, {\"check\": \"meld points case 2\", \"actual\": 320, \"expected\": 320, \"passed\": true}, {\"check\": \"meld points case 3\", \"actual\": 1300, \"expected\": 1300, \"passed\": true}, {\"check\": \"meld points case 4\", \"actual\": 170, \"expected\": 170, \"passed\": true}, {\"check\": \"meld points case 5\", \"actual\": 20, \"expected\": 20, \"passed\": true}, {\"check\": \"meld points case 6\", \"actual\": 360, \"expected\": 360, \"passed\": true}, {\"check\": \"meld points case 7\", \"actual\": 120, \"expected\": 340, \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":39.239,"exit_code":1,"observations":[{"actual":80,"check":"meld points case 0","expected":300,"passed":false},{"actual":20,"check":"meld points case 1","expected":20,"passed":true},{"actual":100,"check":"meld points case 2","expected":320,"passed":false},{"actual":1080,"check":"meld points case 3","expected":1300,"passed":false},{"actual":170,"check":"meld points case 4","expected":170,"passed":true},{"actual":20,"check":"meld points case 5","expected":20,"passed":true},{"actual":140,"check":"meld points case 6","expected":360,"passed":false},{"actual":120,"check":"meld points case 7","expected":340,"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"meld points case 0\", \"actual\": 80, \"expected\": 300, \"passed\": false}, {\"check\": \"meld points case 1\", \"actual\": 20, \"expected\": 20, \"passed\": true}, {\"check\": \"meld points case 2\", \"actual\": 100, \"expected\": 320, \"passed\": false}, {\"check\": \"meld points case 3\", \"actual\": 1080, \"expected\": 1300, \"passed\": false}, {\"check\": \"meld points case 4\", \"actual\": 170, \"expected\": 170, \"passed\": true}, {\"check\": \"meld points case 5\", \"actual\": 20, \"expected\": 20, \"passed\": true}, {\"check\": \"meld points case 6\", \"actual\": 140, \"expected\": 360, \"passed\": false}, {\"check\": \"meld points case 7\", \"actual\": 120, \"expected\": 340, \"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."}}