{"abstract":"Chips from a folded short contributor vanish and the pots sum to less than the total bet.","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":"Subtracting the previous level without clamping produces negative slices for players below it.","family":"w2-poker_hand_evaluation-side-pot-layers-layer-contribution","id":"FA-82016","implementations":{"attempt":{"sha256":"7b068ac9a345993ff40d73b2277b8499101c3055fda1236a5bce72626af14cf8","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)-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  ('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 [('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  ('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  ('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  ('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  ('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  ('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  ('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  ('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  ('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  ('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  ('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']}])]]\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":"fc42baaefc3d21413697adbdc586b7148978baa24fab21de5f653fb068fc9b15","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=(lv-prev)*sum(1 for v in bets.values() if v>=lv)\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  ('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 [('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  ('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  ('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  ('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  ('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  ('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  ('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  ('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  ('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  ('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  ('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']}])]]\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":"19e530705238ce5c66d30796ac0c267367acdfeecedcc5483d628e51ead1f4c7","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  ('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 [('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  ('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  ('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  ('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  ('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  ('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  ('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  ('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  ('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  ('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  ('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']}])]]\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-layer-contribution","generated_at":"2026-09-29T14:50:08.237780+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":"Take from every player the slice of their commitment that lies between the previous and current levels.","root_cause":"Each layer is sized as layer height times the number of players who reached the level, ignoring players who only partly filled it.","sha256":"11ad600d72dd3768832c7d8cdbdf42d97fcd10347c20d5f143bc784a695ed142","title":"Partial contributions below a level are dropped · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":39.758,"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":30,"eligible":["a"]}],"check":"folded partial caller","expected":[{"amount":130,"eligible":["a","b"]},{"amount":50,"eligible":["a"]}],"passed":false},{"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":40,"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":false},{"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":[],"check":"no chips committed","expected":[],"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":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\": 30, \"eligible\": [\"a\"]}], \"expected\": [{\"amount\": 130, \"eligible\": [\"a\", \"b\"]}, {\"amount\": 50, \"eligible\": [\"a\"]}], \"passed\": false}, {\"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\": 40, \"eligible\": [\"c\", \"d\"]}], \"expected\": [{\"amount\": 80, \"eligible\": [\"a\", \"b\", \"c\", \"d\"]}, {\"amount\": 120, \"eligible\": [\"b\", \"c\", \"d\"]}, {\"amount\": 80, \"eligible\": [\"c\", \"d\"]}], \"passed\": false}, {\"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\": \"no chips committed\", \"actual\": [], \"expected\": [], \"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\": false}\n"},"broken":{"elapsed_ms":42.436,"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":100,"eligible":["a","b"]},{"amount":50,"eligible":["a"]}],"check":"folded partial caller","expected":[{"amount":130,"eligible":["a","b"]},{"amount":50,"eligible":["a"]}],"passed":false},{"actual":[{"amount":150,"eligible":["a","b"]},{"amount":50,"eligible":["a"]}],"check":"folded between levels","expected":[{"amount":150,"eligible":["a","b"]},{"amount":75,"eligible":["a"]}],"passed":false},{"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":[],"check":"no chips committed","expected":[],"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":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\": 100, \"eligible\": [\"a\", \"b\"]}, {\"amount\": 50, \"eligible\": [\"a\"]}], \"expected\": [{\"amount\": 130, \"eligible\": [\"a\", \"b\"]}, {\"amount\": 50, \"eligible\": [\"a\"]}], \"passed\": false}, {\"check\": \"folded between levels\", \"actual\": [{\"amount\": 150, \"eligible\": [\"a\", \"b\"]}, {\"amount\": 50, \"eligible\": [\"a\"]}], \"expected\": [{\"amount\": 150, \"eligible\": [\"a\", \"b\"]}, {\"amount\": 75, \"eligible\": [\"a\"]}], \"passed\": false}, {\"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\": \"no chips committed\", \"actual\": [], \"expected\": [], \"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\": false}\n"},"fixed":{"elapsed_ms":39.073,"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":[],"check":"no chips committed","expected":[],"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\": \"no chips committed\", \"actual\": [], \"expected\": [], \"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"}