{"abstract":"A pot with no eligible players appears when a folder committed more than any live player.","category":"Poker hand evaluation","checks":8,"contract":"Input: {\"bets\": {player: total chips committed this hand}, \"folded\": [players]}. Build pots by layering at each distinct live (non-folded) commitment level, main pot first. Each layer takes from every player (folded ones included) the part of their commitment between the previous and current level; eligible players are the live players committed at least to the level, sorted. Folded chips above the top live level go to the last pot. Return [{\"amount\", \"eligible\"}].","evaluation_group":"w2-poker_hand_evaluation-side-pot-layers","failed_approach":"Adding them to the main pot hands them to players who may not be eligible for the top layer.","family":"w2-poker_hand_evaluation-side-pot-layers-overflow-from-folded-chips","id":"FA-82031","implementations":{"attempt":{"sha256":"d03bc68fbb527fcac09f0a68b82207fd391f9b6d636cab845b0cebc8457bb490","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    bets=x['bets']; folded=set(x['folded'])\n    levels=sorted({v for p,v in bets.items() if p not in folded and v>0})\n    pots=[]; prev=0\n    for lv in levels:\n        amt=sum(min(v,lv)-min(v,prev) for v in bets.values())\n        elig=sorted(p for p,v in bets.items() if p not in folded and v>=lv)\n        pots.append({'amount':amt,'eligible':elig})\n        prev=lv\n    extra=sum(max(0,v-prev) for v in bets.values())\n    if extra and pots: pots[0]['amount']+=extra\n    return pots\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('single all-in', {'bets': {'a': 100, 'b': 50, 'c': 100}, 'folded': []},\n   [{'amount': 150, 'eligible': ['a', 'b', 'c']}, {'amount': 100, 'eligible': ['a', 'c']}]),\n  ('folded partial caller', {'bets': {'a': 100, 'b': 50, 'c': 30}, 'folded': ['c']},\n   [{'amount': 130, 'eligible': ['a', 'b']}, {'amount': 50, 'eligible': ['a']}]),\n  ('folded between levels', {'bets': {'a': 100, 'b': 50, 'c': 75}, 'folded': ['c']},\n   [{'amount': 150, 'eligible': ['a', 'b']}, {'amount': 75, 'eligible': ['a']}]),\n  ('two all-ins', {'bets': {'a': 20, 'b': 60, 'c': 100, 'd': 100}, 'folded': []},\n   [{'amount': 80, 'eligible': ['a', 'b', 'c', 'd']}, {'amount': 120, 'eligible': ['b', 'c', 'd']},\n    {'amount': 80, 'eligible': ['c', 'd']}]),\n  ('everyone equal', {'bets': {'a': 40, 'b': 40, 'c': 40}, 'folded': []},\n   [{'amount': 120, 'eligible': ['a', 'b', 'c']}]),\n  ('folded above top', {'bets': {'a': 50, 'b': 50, 'c': 80}, 'folded': ['c']},\n   [{'amount': 180, 'eligible': ['a', 'b']}]),\n  ('checked live player', {'bets': {'a': 0, 'b': 30, 'c': 10}, 'folded': ['c']},\n   [{'amount': 40, 'eligible': ['b']}]),\n  ('folded overbet over two pots', {'bets': {'a': 20, 'b': 60, 'c': 90}, 'folded': ['c']},\n   [{'amount': 60, 'eligible': ['a', 'b']}, {'amount': 110, 'eligible': ['b']}])],\n [('two all-ins', {'bets': {'a': 20, 'b': 60, 'c': 100, 'd': 100}, 'folded': []},\n   [{'amount': 80, 'eligible': ['a', 'b', 'c', 'd']}, {'amount': 120, 'eligible': ['b', 'c', 'd']},\n    {'amount': 80, 'eligible': ['c', 'd']}]),\n  ('everyone equal', {'bets': {'a': 40, 'b': 40, 'c': 40}, 'folded': []},\n   [{'amount': 120, 'eligible': ['a', 'b', 'c']}]),\n  ('folded above top', {'bets': {'a': 50, 'b': 50, 'c': 80}, 'folded': ['c']},\n   [{'amount': 180, 'eligible': ['a', 'b']}]),\n  ('checked live player', {'bets': {'a': 0, 'b': 30, 'c': 10}, 'folded': ['c']},\n   [{'amount': 40, 'eligible': ['b']}]),\n  ('blind folded small', {'bets': {'a': 200, 'b': 200, 'c': 5}, 'folded': ['c']},\n   [{'amount': 405, 'eligible': ['a', 'b']}]),\n  ('short stack all-in with folders',\n   {'bets': {'a': 30, 'b': 90, 'c': 90, 'd': 45}, 'folded': ['d']},\n   [{'amount': 120, 'eligible': ['a', 'b', 'c']}, {'amount': 135, 'eligible': ['b', 'c']}]),\n  ('no chips committed', {'bets': {'a': 0, 'b': 0}, 'folded': []}, []),\n  ('folded overbet over two pots', {'bets': {'a': 20, 'b': 60, 'c': 90}, 'folded': ['c']},\n   [{'amount': 60, 'eligible': ['a', 'b']}, {'amount': 110, 'eligible': ['b']}])],\n [('single all-in', {'bets': {'a': 100, 'b': 50, 'c': 100}, 'folded': []},\n   [{'amount': 150, 'eligible': ['a', 'b', 'c']}, {'amount': 100, 'eligible': ['a', 'c']}]),\n  ('folded partial caller', {'bets': {'a': 100, 'b': 50, 'c': 30}, 'folded': ['c']},\n   [{'amount': 130, 'eligible': ['a', 'b']}, {'amount': 50, 'eligible': ['a']}]),\n  ('folded above top', {'bets': {'a': 50, 'b': 50, 'c': 80}, 'folded': ['c']},\n   [{'amount': 180, 'eligible': ['a', 'b']}]),\n  ('blind folded small', {'bets': {'a': 200, 'b': 200, 'c': 5}, 'folded': ['c']},\n   [{'amount': 405, 'eligible': ['a', 'b']}]),\n  ('short stack all-in with folders',\n   {'bets': {'a': 30, 'b': 90, 'c': 90, 'd': 45}, 'folded': ['d']},\n   [{'amount': 120, 'eligible': ['a', 'b', 'c']}, {'amount': 135, 'eligible': ['b', 'c']}]),\n  ('no chips committed', {'bets': {'a': 0, 'b': 0}, 'folded': []}, []),\n  ('folded overbet over two pots', {'bets': {'a': 20, 'b': 60, 'c': 90}, 'folded': ['c']},\n   [{'amount': 60, 'eligible': ['a', 'b']}, {'amount': 110, 'eligible': ['b']}]),\n  ('three layers', {'bets': {'a': 10, 'b': 25, 'c': 50, 'd': 50}, 'folded': []},\n   [{'amount': 40, 'eligible': ['a', 'b', 'c', 'd']}, {'amount': 45, 'eligible': ['b', 'c', 'd']},\n    {'amount': 50, 'eligible': ['c', 'd']}])],\n [('single all-in', {'bets': {'a': 100, 'b': 50, 'c': 100}, 'folded': []},\n   [{'amount': 150, 'eligible': ['a', 'b', 'c']}, {'amount': 100, 'eligible': ['a', 'c']}]),\n  ('folded partial caller', {'bets': {'a': 100, 'b': 50, 'c': 30}, 'folded': ['c']},\n   [{'amount': 130, 'eligible': ['a', 'b']}, {'amount': 50, 'eligible': ['a']}]),\n  ('folded between levels', {'bets': {'a': 100, 'b': 50, 'c': 75}, 'folded': ['c']},\n   [{'amount': 150, 'eligible': ['a', 'b']}, {'amount': 75, 'eligible': ['a']}]),\n  ('two all-ins', {'bets': {'a': 20, 'b': 60, 'c': 100, 'd': 100}, 'folded': []},\n   [{'amount': 80, 'eligible': ['a', 'b', 'c', 'd']}, {'amount': 120, 'eligible': ['b', 'c', 'd']},\n    {'amount': 80, 'eligible': ['c', 'd']}]),\n  ('everyone equal', {'bets': {'a': 40, 'b': 40, 'c': 40}, 'folded': []},\n   [{'amount': 120, 'eligible': ['a', 'b', 'c']}]),\n  ('folded above top', {'bets': {'a': 50, 'b': 50, 'c': 80}, 'folded': ['c']},\n   [{'amount': 180, 'eligible': ['a', 'b']}]),\n  ('folded overbet over two pots', {'bets': {'a': 20, 'b': 60, 'c': 90}, 'folded': ['c']},\n   [{'amount': 60, 'eligible': ['a', 'b']}, {'amount': 110, 'eligible': ['b']}]),\n  ('three layers', {'bets': {'a': 10, 'b': 25, 'c': 50, 'd': 50}, 'folded': []},\n   [{'amount': 40, 'eligible': ['a', 'b', 'c', 'd']}, {'amount': 45, 'eligible': ['b', 'c', 'd']},\n    {'amount': 50, 'eligible': ['c', 'd']}])],\n [('single all-in', {'bets': {'a': 100, 'b': 50, 'c': 100}, 'folded': []},\n   [{'amount': 150, 'eligible': ['a', 'b', 'c']}, {'amount': 100, 'eligible': ['a', 'c']}]),\n  ('folded partial caller', {'bets': {'a': 100, 'b': 50, 'c': 30}, 'folded': ['c']},\n   [{'amount': 130, 'eligible': ['a', 'b']}, {'amount': 50, 'eligible': ['a']}]),\n  ('folded between levels', {'bets': {'a': 100, 'b': 50, 'c': 75}, 'folded': ['c']},\n   [{'amount': 150, 'eligible': ['a', 'b']}, {'amount': 75, 'eligible': ['a']}]),\n  ('two all-ins', {'bets': {'a': 20, 'b': 60, 'c': 100, 'd': 100}, 'folded': []},\n   [{'amount': 80, 'eligible': ['a', 'b', 'c', 'd']}, {'amount': 120, 'eligible': ['b', 'c', 'd']},\n    {'amount': 80, 'eligible': ['c', 'd']}]),\n  ('everyone equal', {'bets': {'a': 40, 'b': 40, 'c': 40}, 'folded': []},\n   [{'amount': 120, 'eligible': ['a', 'b', 'c']}]),\n  ('folded above top', {'bets': {'a': 50, 'b': 50, 'c': 80}, 'folded': ['c']},\n   [{'amount': 180, 'eligible': ['a', 'b']}]),\n  ('checked live player', {'bets': {'a': 0, 'b': 30, 'c': 10}, 'folded': ['c']},\n   [{'amount': 40, 'eligible': ['b']}]),\n  ('folded overbet over two pots', {'bets': {'a': 20, 'b': 60, 'c': 90}, 'folded': ['c']},\n   [{'amount': 60, 'eligible': ['a', 'b']}, {'amount': 110, 'eligible': ['b']}])]]\nfor label, args, expected in fixtures[N-1]:\n    try:\n        actual = solve(args)\n    except Exception as exc:\n        actual = 'error:' + type(exc).__name__\n    check(label, actual, 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":"bf0d3240f026073e45da8e165bcc8aececc33b74940635bd661542bf25c5d685","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    bets=x['bets']; folded=set(x['folded'])\n    levels=sorted({v for p,v in bets.items() if p not in folded and v>0})\n    pots=[]; prev=0\n    for lv in levels:\n        amt=sum(min(v,lv)-min(v,prev) for v in bets.values())\n        elig=sorted(p for p,v in bets.items() if p not in folded and v>=lv)\n        pots.append({'amount':amt,'eligible':elig})\n        prev=lv\n    extra=sum(max(0,v-prev) for v in bets.values())\n    if extra and pots: pots.append({'amount':extra,'eligible':[]})\n    return pots\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('single all-in', {'bets': {'a': 100, 'b': 50, 'c': 100}, 'folded': []},\n   [{'amount': 150, 'eligible': ['a', 'b', 'c']}, {'amount': 100, 'eligible': ['a', 'c']}]),\n  ('folded partial caller', {'bets': {'a': 100, 'b': 50, 'c': 30}, 'folded': ['c']},\n   [{'amount': 130, 'eligible': ['a', 'b']}, {'amount': 50, 'eligible': ['a']}]),\n  ('folded between levels', {'bets': {'a': 100, 'b': 50, 'c': 75}, 'folded': ['c']},\n   [{'amount': 150, 'eligible': ['a', 'b']}, {'amount': 75, 'eligible': ['a']}]),\n  ('two all-ins', {'bets': {'a': 20, 'b': 60, 'c': 100, 'd': 100}, 'folded': []},\n   [{'amount': 80, 'eligible': ['a', 'b', 'c', 'd']}, {'amount': 120, 'eligible': ['b', 'c', 'd']},\n    {'amount': 80, 'eligible': ['c', 'd']}]),\n  ('everyone equal', {'bets': {'a': 40, 'b': 40, 'c': 40}, 'folded': []},\n   [{'amount': 120, 'eligible': ['a', 'b', 'c']}]),\n  ('folded above top', {'bets': {'a': 50, 'b': 50, 'c': 80}, 'folded': ['c']},\n   [{'amount': 180, 'eligible': ['a', 'b']}]),\n  ('checked live player', {'bets': {'a': 0, 'b': 30, 'c': 10}, 'folded': ['c']},\n   [{'amount': 40, 'eligible': ['b']}]),\n  ('folded overbet over two pots', {'bets': {'a': 20, 'b': 60, 'c': 90}, 'folded': ['c']},\n   [{'amount': 60, 'eligible': ['a', 'b']}, {'amount': 110, 'eligible': ['b']}])],\n [('two all-ins', {'bets': {'a': 20, 'b': 60, 'c': 100, 'd': 100}, 'folded': []},\n   [{'amount': 80, 'eligible': ['a', 'b', 'c', 'd']}, {'amount': 120, 'eligible': ['b', 'c', 'd']},\n    {'amount': 80, 'eligible': ['c', 'd']}]),\n  ('everyone equal', {'bets': {'a': 40, 'b': 40, 'c': 40}, 'folded': []},\n   [{'amount': 120, 'eligible': ['a', 'b', 'c']}]),\n  ('folded above top', {'bets': {'a': 50, 'b': 50, 'c': 80}, 'folded': ['c']},\n   [{'amount': 180, 'eligible': ['a', 'b']}]),\n  ('checked live player', {'bets': {'a': 0, 'b': 30, 'c': 10}, 'folded': ['c']},\n   [{'amount': 40, 'eligible': ['b']}]),\n  ('blind folded small', {'bets': {'a': 200, 'b': 200, 'c': 5}, 'folded': ['c']},\n   [{'amount': 405, 'eligible': ['a', 'b']}]),\n  ('short stack all-in with folders',\n   {'bets': {'a': 30, 'b': 90, 'c': 90, 'd': 45}, 'folded': ['d']},\n   [{'amount': 120, 'eligible': ['a', 'b', 'c']}, {'amount': 135, 'eligible': ['b', 'c']}]),\n  ('no chips committed', {'bets': {'a': 0, 'b': 0}, 'folded': []}, []),\n  ('folded overbet over two pots', {'bets': {'a': 20, 'b': 60, 'c': 90}, 'folded': ['c']},\n   [{'amount': 60, 'eligible': ['a', 'b']}, {'amount': 110, 'eligible': ['b']}])],\n [('single all-in', {'bets': {'a': 100, 'b': 50, 'c': 100}, 'folded': []},\n   [{'amount': 150, 'eligible': ['a', 'b', 'c']}, {'amount': 100, 'eligible': ['a', 'c']}]),\n  ('folded partial caller', {'bets': {'a': 100, 'b': 50, 'c': 30}, 'folded': ['c']},\n   [{'amount': 130, 'eligible': ['a', 'b']}, {'amount': 50, 'eligible': ['a']}]),\n  ('folded above top', {'bets': {'a': 50, 'b': 50, 'c': 80}, 'folded': ['c']},\n   [{'amount': 180, 'eligible': ['a', 'b']}]),\n  ('blind folded small', {'bets': {'a': 200, 'b': 200, 'c': 5}, 'folded': ['c']},\n   [{'amount': 405, 'eligible': ['a', 'b']}]),\n  ('short stack all-in with folders',\n   {'bets': {'a': 30, 'b': 90, 'c': 90, 'd': 45}, 'folded': ['d']},\n   [{'amount': 120, 'eligible': ['a', 'b', 'c']}, {'amount': 135, 'eligible': ['b', 'c']}]),\n  ('no chips committed', {'bets': {'a': 0, 'b': 0}, 'folded': []}, []),\n  ('folded overbet over two pots', {'bets': {'a': 20, 'b': 60, 'c': 90}, 'folded': ['c']},\n   [{'amount': 60, 'eligible': ['a', 'b']}, {'amount': 110, 'eligible': ['b']}]),\n  ('three layers', {'bets': {'a': 10, 'b': 25, 'c': 50, 'd': 50}, 'folded': []},\n   [{'amount': 40, 'eligible': ['a', 'b', 'c', 'd']}, {'amount': 45, 'eligible': ['b', 'c', 'd']},\n    {'amount': 50, 'eligible': ['c', 'd']}])],\n [('single all-in', {'bets': {'a': 100, 'b': 50, 'c': 100}, 'folded': []},\n   [{'amount': 150, 'eligible': ['a', 'b', 'c']}, {'amount': 100, 'eligible': ['a', 'c']}]),\n  ('folded partial caller', {'bets': {'a': 100, 'b': 50, 'c': 30}, 'folded': ['c']},\n   [{'amount': 130, 'eligible': ['a', 'b']}, {'amount': 50, 'eligible': ['a']}]),\n  ('folded between levels', {'bets': {'a': 100, 'b': 50, 'c': 75}, 'folded': ['c']},\n   [{'amount': 150, 'eligible': ['a', 'b']}, {'amount': 75, 'eligible': ['a']}]),\n  ('two all-ins', {'bets': {'a': 20, 'b': 60, 'c': 100, 'd': 100}, 'folded': []},\n   [{'amount': 80, 'eligible': ['a', 'b', 'c', 'd']}, {'amount': 120, 'eligible': ['b', 'c', 'd']},\n    {'amount': 80, 'eligible': ['c', 'd']}]),\n  ('everyone equal', {'bets': {'a': 40, 'b': 40, 'c': 40}, 'folded': []},\n   [{'amount': 120, 'eligible': ['a', 'b', 'c']}]),\n  ('folded above top', {'bets': {'a': 50, 'b': 50, 'c': 80}, 'folded': ['c']},\n   [{'amount': 180, 'eligible': ['a', 'b']}]),\n  ('folded overbet over two pots', {'bets': {'a': 20, 'b': 60, 'c': 90}, 'folded': ['c']},\n   [{'amount': 60, 'eligible': ['a', 'b']}, {'amount': 110, 'eligible': ['b']}]),\n  ('three layers', {'bets': {'a': 10, 'b': 25, 'c': 50, 'd': 50}, 'folded': []},\n   [{'amount': 40, 'eligible': ['a', 'b', 'c', 'd']}, {'amount': 45, 'eligible': ['b', 'c', 'd']},\n    {'amount': 50, 'eligible': ['c', 'd']}])],\n [('single all-in', {'bets': {'a': 100, 'b': 50, 'c': 100}, 'folded': []},\n   [{'amount': 150, 'eligible': ['a', 'b', 'c']}, {'amount': 100, 'eligible': ['a', 'c']}]),\n  ('folded partial caller', {'bets': {'a': 100, 'b': 50, 'c': 30}, 'folded': ['c']},\n   [{'amount': 130, 'eligible': ['a', 'b']}, {'amount': 50, 'eligible': ['a']}]),\n  ('folded between levels', {'bets': {'a': 100, 'b': 50, 'c': 75}, 'folded': ['c']},\n   [{'amount': 150, 'eligible': ['a', 'b']}, {'amount': 75, 'eligible': ['a']}]),\n  ('two all-ins', {'bets': {'a': 20, 'b': 60, 'c': 100, 'd': 100}, 'folded': []},\n   [{'amount': 80, 'eligible': ['a', 'b', 'c', 'd']}, {'amount': 120, 'eligible': ['b', 'c', 'd']},\n    {'amount': 80, 'eligible': ['c', 'd']}]),\n  ('everyone equal', {'bets': {'a': 40, 'b': 40, 'c': 40}, 'folded': []},\n   [{'amount': 120, 'eligible': ['a', 'b', 'c']}]),\n  ('folded above top', {'bets': {'a': 50, 'b': 50, 'c': 80}, 'folded': ['c']},\n   [{'amount': 180, 'eligible': ['a', 'b']}]),\n  ('checked live player', {'bets': {'a': 0, 'b': 30, 'c': 10}, 'folded': ['c']},\n   [{'amount': 40, 'eligible': ['b']}]),\n  ('folded overbet over two pots', {'bets': {'a': 20, 'b': 60, 'c': 90}, 'folded': ['c']},\n   [{'amount': 60, 'eligible': ['a', 'b']}, {'amount': 110, 'eligible': ['b']}])]]\nfor label, args, expected in fixtures[N-1]:\n    try:\n        actual = solve(args)\n    except Exception as exc:\n        actual = 'error:' + type(exc).__name__\n    check(label, actual, 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":"f9b4c75d8557009084245933e9bb91f434065ef03048d24b51ccedb277d5cdc0","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    bets=x['bets']; folded=set(x['folded'])\n    levels=sorted({v for p,v in bets.items() if p not in folded and v>0})\n    pots=[]; prev=0\n    for lv in levels:\n        amt=sum(min(v,lv)-min(v,prev) for v in bets.values())\n        elig=sorted(p for p,v in bets.items() if p not in folded and v>=lv)\n        pots.append({'amount':amt,'eligible':elig})\n        prev=lv\n    extra=sum(max(0,v-prev) for v in bets.values())\n    if extra and pots: pots[-1]['amount']+=extra\n    return pots\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('single all-in', {'bets': {'a': 100, 'b': 50, 'c': 100}, 'folded': []},\n   [{'amount': 150, 'eligible': ['a', 'b', 'c']}, {'amount': 100, 'eligible': ['a', 'c']}]),\n  ('folded partial caller', {'bets': {'a': 100, 'b': 50, 'c': 30}, 'folded': ['c']},\n   [{'amount': 130, 'eligible': ['a', 'b']}, {'amount': 50, 'eligible': ['a']}]),\n  ('folded between levels', {'bets': {'a': 100, 'b': 50, 'c': 75}, 'folded': ['c']},\n   [{'amount': 150, 'eligible': ['a', 'b']}, {'amount': 75, 'eligible': ['a']}]),\n  ('two all-ins', {'bets': {'a': 20, 'b': 60, 'c': 100, 'd': 100}, 'folded': []},\n   [{'amount': 80, 'eligible': ['a', 'b', 'c', 'd']}, {'amount': 120, 'eligible': ['b', 'c', 'd']},\n    {'amount': 80, 'eligible': ['c', 'd']}]),\n  ('everyone equal', {'bets': {'a': 40, 'b': 40, 'c': 40}, 'folded': []},\n   [{'amount': 120, 'eligible': ['a', 'b', 'c']}]),\n  ('folded above top', {'bets': {'a': 50, 'b': 50, 'c': 80}, 'folded': ['c']},\n   [{'amount': 180, 'eligible': ['a', 'b']}]),\n  ('checked live player', {'bets': {'a': 0, 'b': 30, 'c': 10}, 'folded': ['c']},\n   [{'amount': 40, 'eligible': ['b']}]),\n  ('folded overbet over two pots', {'bets': {'a': 20, 'b': 60, 'c': 90}, 'folded': ['c']},\n   [{'amount': 60, 'eligible': ['a', 'b']}, {'amount': 110, 'eligible': ['b']}])],\n [('two all-ins', {'bets': {'a': 20, 'b': 60, 'c': 100, 'd': 100}, 'folded': []},\n   [{'amount': 80, 'eligible': ['a', 'b', 'c', 'd']}, {'amount': 120, 'eligible': ['b', 'c', 'd']},\n    {'amount': 80, 'eligible': ['c', 'd']}]),\n  ('everyone equal', {'bets': {'a': 40, 'b': 40, 'c': 40}, 'folded': []},\n   [{'amount': 120, 'eligible': ['a', 'b', 'c']}]),\n  ('folded above top', {'bets': {'a': 50, 'b': 50, 'c': 80}, 'folded': ['c']},\n   [{'amount': 180, 'eligible': ['a', 'b']}]),\n  ('checked live player', {'bets': {'a': 0, 'b': 30, 'c': 10}, 'folded': ['c']},\n   [{'amount': 40, 'eligible': ['b']}]),\n  ('blind folded small', {'bets': {'a': 200, 'b': 200, 'c': 5}, 'folded': ['c']},\n   [{'amount': 405, 'eligible': ['a', 'b']}]),\n  ('short stack all-in with folders',\n   {'bets': {'a': 30, 'b': 90, 'c': 90, 'd': 45}, 'folded': ['d']},\n   [{'amount': 120, 'eligible': ['a', 'b', 'c']}, {'amount': 135, 'eligible': ['b', 'c']}]),\n  ('no chips committed', {'bets': {'a': 0, 'b': 0}, 'folded': []}, []),\n  ('folded overbet over two pots', {'bets': {'a': 20, 'b': 60, 'c': 90}, 'folded': ['c']},\n   [{'amount': 60, 'eligible': ['a', 'b']}, {'amount': 110, 'eligible': ['b']}])],\n [('single all-in', {'bets': {'a': 100, 'b': 50, 'c': 100}, 'folded': []},\n   [{'amount': 150, 'eligible': ['a', 'b', 'c']}, {'amount': 100, 'eligible': ['a', 'c']}]),\n  ('folded partial caller', {'bets': {'a': 100, 'b': 50, 'c': 30}, 'folded': ['c']},\n   [{'amount': 130, 'eligible': ['a', 'b']}, {'amount': 50, 'eligible': ['a']}]),\n  ('folded above top', {'bets': {'a': 50, 'b': 50, 'c': 80}, 'folded': ['c']},\n   [{'amount': 180, 'eligible': ['a', 'b']}]),\n  ('blind folded small', {'bets': {'a': 200, 'b': 200, 'c': 5}, 'folded': ['c']},\n   [{'amount': 405, 'eligible': ['a', 'b']}]),\n  ('short stack all-in with folders',\n   {'bets': {'a': 30, 'b': 90, 'c': 90, 'd': 45}, 'folded': ['d']},\n   [{'amount': 120, 'eligible': ['a', 'b', 'c']}, {'amount': 135, 'eligible': ['b', 'c']}]),\n  ('no chips committed', {'bets': {'a': 0, 'b': 0}, 'folded': []}, []),\n  ('folded overbet over two pots', {'bets': {'a': 20, 'b': 60, 'c': 90}, 'folded': ['c']},\n   [{'amount': 60, 'eligible': ['a', 'b']}, {'amount': 110, 'eligible': ['b']}]),\n  ('three layers', {'bets': {'a': 10, 'b': 25, 'c': 50, 'd': 50}, 'folded': []},\n   [{'amount': 40, 'eligible': ['a', 'b', 'c', 'd']}, {'amount': 45, 'eligible': ['b', 'c', 'd']},\n    {'amount': 50, 'eligible': ['c', 'd']}])],\n [('single all-in', {'bets': {'a': 100, 'b': 50, 'c': 100}, 'folded': []},\n   [{'amount': 150, 'eligible': ['a', 'b', 'c']}, {'amount': 100, 'eligible': ['a', 'c']}]),\n  ('folded partial caller', {'bets': {'a': 100, 'b': 50, 'c': 30}, 'folded': ['c']},\n   [{'amount': 130, 'eligible': ['a', 'b']}, {'amount': 50, 'eligible': ['a']}]),\n  ('folded between levels', {'bets': {'a': 100, 'b': 50, 'c': 75}, 'folded': ['c']},\n   [{'amount': 150, 'eligible': ['a', 'b']}, {'amount': 75, 'eligible': ['a']}]),\n  ('two all-ins', {'bets': {'a': 20, 'b': 60, 'c': 100, 'd': 100}, 'folded': []},\n   [{'amount': 80, 'eligible': ['a', 'b', 'c', 'd']}, {'amount': 120, 'eligible': ['b', 'c', 'd']},\n    {'amount': 80, 'eligible': ['c', 'd']}]),\n  ('everyone equal', {'bets': {'a': 40, 'b': 40, 'c': 40}, 'folded': []},\n   [{'amount': 120, 'eligible': ['a', 'b', 'c']}]),\n  ('folded above top', {'bets': {'a': 50, 'b': 50, 'c': 80}, 'folded': ['c']},\n   [{'amount': 180, 'eligible': ['a', 'b']}]),\n  ('folded overbet over two pots', {'bets': {'a': 20, 'b': 60, 'c': 90}, 'folded': ['c']},\n   [{'amount': 60, 'eligible': ['a', 'b']}, {'amount': 110, 'eligible': ['b']}]),\n  ('three layers', {'bets': {'a': 10, 'b': 25, 'c': 50, 'd': 50}, 'folded': []},\n   [{'amount': 40, 'eligible': ['a', 'b', 'c', 'd']}, {'amount': 45, 'eligible': ['b', 'c', 'd']},\n    {'amount': 50, 'eligible': ['c', 'd']}])],\n [('single all-in', {'bets': {'a': 100, 'b': 50, 'c': 100}, 'folded': []},\n   [{'amount': 150, 'eligible': ['a', 'b', 'c']}, {'amount': 100, 'eligible': ['a', 'c']}]),\n  ('folded partial caller', {'bets': {'a': 100, 'b': 50, 'c': 30}, 'folded': ['c']},\n   [{'amount': 130, 'eligible': ['a', 'b']}, {'amount': 50, 'eligible': ['a']}]),\n  ('folded between levels', {'bets': {'a': 100, 'b': 50, 'c': 75}, 'folded': ['c']},\n   [{'amount': 150, 'eligible': ['a', 'b']}, {'amount': 75, 'eligible': ['a']}]),\n  ('two all-ins', {'bets': {'a': 20, 'b': 60, 'c': 100, 'd': 100}, 'folded': []},\n   [{'amount': 80, 'eligible': ['a', 'b', 'c', 'd']}, {'amount': 120, 'eligible': ['b', 'c', 'd']},\n    {'amount': 80, 'eligible': ['c', 'd']}]),\n  ('everyone equal', {'bets': {'a': 40, 'b': 40, 'c': 40}, 'folded': []},\n   [{'amount': 120, 'eligible': ['a', 'b', 'c']}]),\n  ('folded above top', {'bets': {'a': 50, 'b': 50, 'c': 80}, 'folded': ['c']},\n   [{'amount': 180, 'eligible': ['a', 'b']}]),\n  ('checked live player', {'bets': {'a': 0, 'b': 30, 'c': 10}, 'folded': ['c']},\n   [{'amount': 40, 'eligible': ['b']}]),\n  ('folded overbet over two pots', {'bets': {'a': 20, 'b': 60, 'c': 90}, 'folded': ['c']},\n   [{'amount': 60, 'eligible': ['a', 'b']}, {'amount': 110, 'eligible': ['b']}])]]\nfor label, args, expected in fixtures[N-1]:\n    try:\n        actual = solve(args)\n    except Exception as exc:\n        actual = 'error:' + type(exc).__name__\n    check(label, actual, 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 deterministic toy model with an explicitly stated contract; no claim of conformance to any casino or tournament rulebook. 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-poker_hand_evaluation-side-pot-layers-overflow-from-folded-chips","generated_at":"2026-09-29T14:50:08.283518+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Side-pot construction decides which all-in players can win which chips.","repair":"Add folded chips above the top live level to the last pot.","root_cause":"Chips above the top live level are placed in a new pot instead of the last contestable pot.","sha256":"39e61df22e4f1e3fbbb7fcb517230765f2d29a8a1c293c0879c358fdd3f6e5f9","title":"Folded overbet stranded in an unwinnable pot · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":41.27,"exit_code":1,"observations":[{"actual":[{"amount":150,"eligible":["a","b","c"]},{"amount":100,"eligible":["a","c"]}],"check":"single all-in","expected":[{"amount":150,"eligible":["a","b","c"]},{"amount":100,"eligible":["a","c"]}],"passed":true},{"actual":[{"amount":130,"eligible":["a","b"]},{"amount":50,"eligible":["a"]}],"check":"folded partial caller","expected":[{"amount":130,"eligible":["a","b"]},{"amount":50,"eligible":["a"]}],"passed":true},{"actual":[{"amount":150,"eligible":["a","b"]},{"amount":75,"eligible":["a"]}],"check":"folded between levels","expected":[{"amount":150,"eligible":["a","b"]},{"amount":75,"eligible":["a"]}],"passed":true},{"actual":[{"amount":80,"eligible":["a","b","c","d"]},{"amount":120,"eligible":["b","c","d"]},{"amount":80,"eligible":["c","d"]}],"check":"two all-ins","expected":[{"amount":80,"eligible":["a","b","c","d"]},{"amount":120,"eligible":["b","c","d"]},{"amount":80,"eligible":["c","d"]}],"passed":true},{"actual":[{"amount":120,"eligible":["a","b","c"]}],"check":"everyone equal","expected":[{"amount":120,"eligible":["a","b","c"]}],"passed":true},{"actual":[{"amount":180,"eligible":["a","b"]}],"check":"folded above top","expected":[{"amount":180,"eligible":["a","b"]}],"passed":true},{"actual":[{"amount":40,"eligible":["b"]}],"check":"checked live player","expected":[{"amount":40,"eligible":["b"]}],"passed":true},{"actual":[{"amount":90,"eligible":["a","b"]},{"amount":80,"eligible":["b"]}],"check":"folded overbet over two pots","expected":[{"amount":60,"eligible":["a","b"]},{"amount":110,"eligible":["b"]}],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"single all-in\", \"actual\": [{\"amount\": 150, \"eligible\": [\"a\", \"b\", \"c\"]}, {\"amount\": 100, \"eligible\": [\"a\", \"c\"]}], \"expected\": [{\"amount\": 150, \"eligible\": [\"a\", \"b\", \"c\"]}, {\"amount\": 100, \"eligible\": [\"a\", \"c\"]}], \"passed\": true}, {\"check\": \"folded partial caller\", \"actual\": [{\"amount\": 130, \"eligible\": [\"a\", \"b\"]}, {\"amount\": 50, \"eligible\": [\"a\"]}], \"expected\": [{\"amount\": 130, \"eligible\": [\"a\", \"b\"]}, {\"amount\": 50, \"eligible\": [\"a\"]}], \"passed\": true}, {\"check\": \"folded between levels\", \"actual\": [{\"amount\": 150, \"eligible\": [\"a\", \"b\"]}, {\"amount\": 75, \"eligible\": [\"a\"]}], \"expected\": [{\"amount\": 150, \"eligible\": [\"a\", \"b\"]}, {\"amount\": 75, \"eligible\": [\"a\"]}], \"passed\": true}, {\"check\": \"two all-ins\", \"actual\": [{\"amount\": 80, \"eligible\": [\"a\", \"b\", \"c\", \"d\"]}, {\"amount\": 120, \"eligible\": [\"b\", \"c\", \"d\"]}, {\"amount\": 80, \"eligible\": [\"c\", \"d\"]}], \"expected\": [{\"amount\": 80, \"eligible\": [\"a\", \"b\", \"c\", \"d\"]}, {\"amount\": 120, \"eligible\": [\"b\", \"c\", \"d\"]}, {\"amount\": 80, \"eligible\": [\"c\", \"d\"]}], \"passed\": true}, {\"check\": \"everyone equal\", \"actual\": [{\"amount\": 120, \"eligible\": [\"a\", \"b\", \"c\"]}], \"expected\": [{\"amount\": 120, \"eligible\": [\"a\", \"b\", \"c\"]}], \"passed\": true}, {\"check\": \"folded above top\", \"actual\": [{\"amount\": 180, \"eligible\": [\"a\", \"b\"]}], \"expected\": [{\"amount\": 180, \"eligible\": [\"a\", \"b\"]}], \"passed\": true}, {\"check\": \"checked live player\", \"actual\": [{\"amount\": 40, \"eligible\": [\"b\"]}], \"expected\": [{\"amount\": 40, \"eligible\": [\"b\"]}], \"passed\": true}, {\"check\": \"folded overbet over two pots\", \"actual\": [{\"amount\": 90, \"eligible\": [\"a\", \"b\"]}, {\"amount\": 80, \"eligible\": [\"b\"]}], \"expected\": [{\"amount\": 60, \"eligible\": [\"a\", \"b\"]}, {\"amount\": 110, \"eligible\": [\"b\"]}], \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":39.347,"exit_code":1,"observations":[{"actual":[{"amount":150,"eligible":["a","b","c"]},{"amount":100,"eligible":["a","c"]}],"check":"single all-in","expected":[{"amount":150,"eligible":["a","b","c"]},{"amount":100,"eligible":["a","c"]}],"passed":true},{"actual":[{"amount":130,"eligible":["a","b"]},{"amount":50,"eligible":["a"]}],"check":"folded partial caller","expected":[{"amount":130,"eligible":["a","b"]},{"amount":50,"eligible":["a"]}],"passed":true},{"actual":[{"amount":150,"eligible":["a","b"]},{"amount":75,"eligible":["a"]}],"check":"folded between levels","expected":[{"amount":150,"eligible":["a","b"]},{"amount":75,"eligible":["a"]}],"passed":true},{"actual":[{"amount":80,"eligible":["a","b","c","d"]},{"amount":120,"eligible":["b","c","d"]},{"amount":80,"eligible":["c","d"]}],"check":"two all-ins","expected":[{"amount":80,"eligible":["a","b","c","d"]},{"amount":120,"eligible":["b","c","d"]},{"amount":80,"eligible":["c","d"]}],"passed":true},{"actual":[{"amount":120,"eligible":["a","b","c"]}],"check":"everyone equal","expected":[{"amount":120,"eligible":["a","b","c"]}],"passed":true},{"actual":[{"amount":150,"eligible":["a","b"]},{"amount":30,"eligible":[]}],"check":"folded above top","expected":[{"amount":180,"eligible":["a","b"]}],"passed":false},{"actual":[{"amount":40,"eligible":["b"]}],"check":"checked live player","expected":[{"amount":40,"eligible":["b"]}],"passed":true},{"actual":[{"amount":60,"eligible":["a","b"]},{"amount":80,"eligible":["b"]},{"amount":30,"eligible":[]}],"check":"folded overbet over two pots","expected":[{"amount":60,"eligible":["a","b"]},{"amount":110,"eligible":["b"]}],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"single all-in\", \"actual\": [{\"amount\": 150, \"eligible\": [\"a\", \"b\", \"c\"]}, {\"amount\": 100, \"eligible\": [\"a\", \"c\"]}], \"expected\": [{\"amount\": 150, \"eligible\": [\"a\", \"b\", \"c\"]}, {\"amount\": 100, \"eligible\": [\"a\", \"c\"]}], \"passed\": true}, {\"check\": \"folded partial caller\", \"actual\": [{\"amount\": 130, \"eligible\": [\"a\", \"b\"]}, {\"amount\": 50, \"eligible\": [\"a\"]}], \"expected\": [{\"amount\": 130, \"eligible\": [\"a\", \"b\"]}, {\"amount\": 50, \"eligible\": [\"a\"]}], \"passed\": true}, {\"check\": \"folded between levels\", \"actual\": [{\"amount\": 150, \"eligible\": [\"a\", \"b\"]}, {\"amount\": 75, \"eligible\": [\"a\"]}], \"expected\": [{\"amount\": 150, \"eligible\": [\"a\", \"b\"]}, {\"amount\": 75, \"eligible\": [\"a\"]}], \"passed\": true}, {\"check\": \"two all-ins\", \"actual\": [{\"amount\": 80, \"eligible\": [\"a\", \"b\", \"c\", \"d\"]}, {\"amount\": 120, \"eligible\": [\"b\", \"c\", \"d\"]}, {\"amount\": 80, \"eligible\": [\"c\", \"d\"]}], \"expected\": [{\"amount\": 80, \"eligible\": [\"a\", \"b\", \"c\", \"d\"]}, {\"amount\": 120, \"eligible\": [\"b\", \"c\", \"d\"]}, {\"amount\": 80, \"eligible\": [\"c\", \"d\"]}], \"passed\": true}, {\"check\": \"everyone equal\", \"actual\": [{\"amount\": 120, \"eligible\": [\"a\", \"b\", \"c\"]}], \"expected\": [{\"amount\": 120, \"eligible\": [\"a\", \"b\", \"c\"]}], \"passed\": true}, {\"check\": \"folded above top\", \"actual\": [{\"amount\": 150, \"eligible\": [\"a\", \"b\"]}, {\"amount\": 30, \"eligible\": []}], \"expected\": [{\"amount\": 180, \"eligible\": [\"a\", \"b\"]}], \"passed\": false}, {\"check\": \"checked live player\", \"actual\": [{\"amount\": 40, \"eligible\": [\"b\"]}], \"expected\": [{\"amount\": 40, \"eligible\": [\"b\"]}], \"passed\": true}, {\"check\": \"folded overbet over two pots\", \"actual\": [{\"amount\": 60, \"eligible\": [\"a\", \"b\"]}, {\"amount\": 80, \"eligible\": [\"b\"]}, {\"amount\": 30, \"eligible\": []}], \"expected\": [{\"amount\": 60, \"eligible\": [\"a\", \"b\"]}, {\"amount\": 110, \"eligible\": [\"b\"]}], \"passed\": false}], \"passed\": false}\n"},"fixed":{"elapsed_ms":41.678,"exit_code":0,"observations":[{"actual":[{"amount":150,"eligible":["a","b","c"]},{"amount":100,"eligible":["a","c"]}],"check":"single all-in","expected":[{"amount":150,"eligible":["a","b","c"]},{"amount":100,"eligible":["a","c"]}],"passed":true},{"actual":[{"amount":130,"eligible":["a","b"]},{"amount":50,"eligible":["a"]}],"check":"folded partial caller","expected":[{"amount":130,"eligible":["a","b"]},{"amount":50,"eligible":["a"]}],"passed":true},{"actual":[{"amount":150,"eligible":["a","b"]},{"amount":75,"eligible":["a"]}],"check":"folded between levels","expected":[{"amount":150,"eligible":["a","b"]},{"amount":75,"eligible":["a"]}],"passed":true},{"actual":[{"amount":80,"eligible":["a","b","c","d"]},{"amount":120,"eligible":["b","c","d"]},{"amount":80,"eligible":["c","d"]}],"check":"two all-ins","expected":[{"amount":80,"eligible":["a","b","c","d"]},{"amount":120,"eligible":["b","c","d"]},{"amount":80,"eligible":["c","d"]}],"passed":true},{"actual":[{"amount":120,"eligible":["a","b","c"]}],"check":"everyone equal","expected":[{"amount":120,"eligible":["a","b","c"]}],"passed":true},{"actual":[{"amount":180,"eligible":["a","b"]}],"check":"folded above top","expected":[{"amount":180,"eligible":["a","b"]}],"passed":true},{"actual":[{"amount":40,"eligible":["b"]}],"check":"checked live player","expected":[{"amount":40,"eligible":["b"]}],"passed":true},{"actual":[{"amount":60,"eligible":["a","b"]},{"amount":110,"eligible":["b"]}],"check":"folded overbet over two pots","expected":[{"amount":60,"eligible":["a","b"]},{"amount":110,"eligible":["b"]}],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"single all-in\", \"actual\": [{\"amount\": 150, \"eligible\": [\"a\", \"b\", \"c\"]}, {\"amount\": 100, \"eligible\": [\"a\", \"c\"]}], \"expected\": [{\"amount\": 150, \"eligible\": [\"a\", \"b\", \"c\"]}, {\"amount\": 100, \"eligible\": [\"a\", \"c\"]}], \"passed\": true}, {\"check\": \"folded partial caller\", \"actual\": [{\"amount\": 130, \"eligible\": [\"a\", \"b\"]}, {\"amount\": 50, \"eligible\": [\"a\"]}], \"expected\": [{\"amount\": 130, \"eligible\": [\"a\", \"b\"]}, {\"amount\": 50, \"eligible\": [\"a\"]}], \"passed\": true}, {\"check\": \"folded between levels\", \"actual\": [{\"amount\": 150, \"eligible\": [\"a\", \"b\"]}, {\"amount\": 75, \"eligible\": [\"a\"]}], \"expected\": [{\"amount\": 150, \"eligible\": [\"a\", \"b\"]}, {\"amount\": 75, \"eligible\": [\"a\"]}], \"passed\": true}, {\"check\": \"two all-ins\", \"actual\": [{\"amount\": 80, \"eligible\": [\"a\", \"b\", \"c\", \"d\"]}, {\"amount\": 120, \"eligible\": [\"b\", \"c\", \"d\"]}, {\"amount\": 80, \"eligible\": [\"c\", \"d\"]}], \"expected\": [{\"amount\": 80, \"eligible\": [\"a\", \"b\", \"c\", \"d\"]}, {\"amount\": 120, \"eligible\": [\"b\", \"c\", \"d\"]}, {\"amount\": 80, \"eligible\": [\"c\", \"d\"]}], \"passed\": true}, {\"check\": \"everyone equal\", \"actual\": [{\"amount\": 120, \"eligible\": [\"a\", \"b\", \"c\"]}], \"expected\": [{\"amount\": 120, \"eligible\": [\"a\", \"b\", \"c\"]}], \"passed\": true}, {\"check\": \"folded above top\", \"actual\": [{\"amount\": 180, \"eligible\": [\"a\", \"b\"]}], \"expected\": [{\"amount\": 180, \"eligible\": [\"a\", \"b\"]}], \"passed\": true}, {\"check\": \"checked live player\", \"actual\": [{\"amount\": 40, \"eligible\": [\"b\"]}], \"expected\": [{\"amount\": 40, \"eligible\": [\"b\"]}], \"passed\": true}, {\"check\": \"folded overbet over two pots\", \"actual\": [{\"amount\": 60, \"eligible\": [\"a\", \"b\"]}, {\"amount\": 110, \"eligible\": [\"b\"]}], \"expected\": [{\"amount\": 60, \"eligible\": [\"a\", \"b\"]}, {\"amount\": 110, \"eligible\": [\"b\"]}], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}