{"abstract":"Sellers cancel listings with bids without the bid penalty.","category":"Game economy crafting balance","checks":8,"contract":"Deposit = per_block * (hours//12) where per_block = max(1, floor(stack_value*15/100)). Sold: net = price - cut with cut = 5% of price rounded half up (deposit refunded). Expired: net = -deposit. Cancelled: net = -deposit - floor(bid*5/100) (bid defaults to 0). Returns {deposit, net} in copper.","evaluation_group":"w2-game-economy-crafting-balance-auction-fees","failed_approach":"Charging only the bid penalty refunds a forfeited deposit.","family":"w2-game-economy-crafting-balance-auction-fees-cancellation-penalty","id":"FA-85996","implementations":{"attempt":{"sha256":"a9fde151d10c3350fc278b65c0f8e15cd3aecc83cc6ab29ee7fe98c0468dd628","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(listing, outcome):\n    blocks = listing['hours'] // 12\n    per_block = max(1, listing['stack_value'] * 15 // 100)\n    deposit = per_block * blocks\n    status = outcome['status']\n    if status == 'sold':\n        cut = (listing['price'] * 5 + 50) // 100\n        net = listing['price'] - cut\n    elif status == 'cancelled':\n        net = -outcome.get('bid', 0) * 5 // 100\n    else:\n        net = -deposit\n    return {'deposit': deposit, 'net': net}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = [[('cancel with bid #1',\n   [{'price': 500, 'hours': 24, 'stack_value': 40}, {'status': 'cancelled', 'bid': 390}],\n   {'deposit': 12, 'net': -31}),\n  ('fault site cancellation penalty #1',\n   [{'price': 10, 'hours': 12, 'stack_value': 0}, {'status': 'cancelled', 'bid': 99}],\n   {'deposit': 1, 'net': -5}),\n  ('regression cancellation penalty #1',\n   [{'price': 190, 'hours': 48, 'stack_value': 0}, {'status': 'cancelled', 'bid': 99}],\n   {'deposit': 4, 'net': -8}),\n  ('partial repair boundary #1',\n   [{'price': 11, 'hours': 24, 'stack_value': 13}, {'status': 'cancelled', 'bid': 0}],\n   {'deposit': 2, 'net': -2}),\n  ('partial repair boundary #2',\n   [{'price': 1, 'hours': 12, 'stack_value': 4743}, {'status': 'cancelled', 'bid': 0}],\n   {'deposit': 711, 'net': -711}),\n  ('long cheap listing #1',\n   [{'price': 10, 'hours': 48, 'stack_value': 3}, {'status': 'expired'}],\n   {'deposit': 4, 'net': -4}),\n  ('half-up cut boundary #1',\n   [{'price': 10, 'hours': 12, 'stack_value': 100}, {'status': 'sold'}],\n   {'deposit': 15, 'net': 9}),\n  ('control #1',\n   [{'price': 10, 'hours': 48, 'stack_value': 0}, {'status': 'expired'}],\n   {'deposit': 4, 'net': -4})],\n [('cancel with bid #1',\n   [{'price': 500, 'hours': 24, 'stack_value': 40}, {'status': 'cancelled', 'bid': 390}],\n   {'deposit': 12, 'net': -31}),\n  ('regression cancellation penalty #1',\n   [{'price': 190, 'hours': 48, 'stack_value': 0}, {'status': 'cancelled', 'bid': 99}],\n   {'deposit': 4, 'net': -8}),\n  ('fault site cancellation penalty #1',\n   [{'price': 10, 'hours': 12, 'stack_value': 13}, {'status': 'cancelled', 'bid': 99}],\n   {'deposit': 1, 'net': -5}),\n  ('partial repair boundary #1',\n   [{'price': 1, 'hours': 12, 'stack_value': 4743}, {'status': 'cancelled', 'bid': 0}],\n   {'deposit': 711, 'net': -711}),\n  ('partial repair boundary #2',\n   [{'price': 190, 'hours': 12, 'stack_value': 13}, {'status': 'cancelled'}],\n   {'deposit': 1, 'net': -1}),\n  ('long cheap listing #1',\n   [{'price': 10, 'hours': 48, 'stack_value': 3}, {'status': 'expired'}],\n   {'deposit': 4, 'net': -4}),\n  ('half-up cut boundary #1',\n   [{'price': 10, 'hours': 12, 'stack_value': 100}, {'status': 'sold'}],\n   {'deposit': 15, 'net': 9}),\n  ('control #1',\n   [{'price': 10, 'hours': 48, 'stack_value': 0}, {'status': 'expired'}],\n   {'deposit': 4, 'net': -4})],\n [('cancel with bid #1',\n   [{'price': 500, 'hours': 24, 'stack_value': 40}, {'status': 'cancelled', 'bid': 390}],\n   {'deposit': 12, 'net': -31}),\n  ('regression cancellation penalty #1',\n   [{'price': 50, 'hours': 24, 'stack_value': 6}, {'status': 'cancelled', 'bid': 323}],\n   {'deposit': 2, 'net': -18}),\n  ('regression cancellation penalty #2',\n   [{'price': 11, 'hours': 12, 'stack_value': 6}, {'status': 'cancelled', 'bid': 20}],\n   {'deposit': 1, 'net': -2}),\n  ('partial repair boundary #1',\n   [{'price': 912, 'hours': 24, 'stack_value': 0}, {'status': 'cancelled'}],\n   {'deposit': 2, 'net': -2}),\n  ('regression cancellation penalty #3',\n   [{'price': 190, 'hours': 48, 'stack_value': 0}, {'status': 'cancelled', 'bid': 99}],\n   {'deposit': 4, 'net': -8}),\n  ('long cheap listing #1',\n   [{'price': 10, 'hours': 48, 'stack_value': 3}, {'status': 'expired'}],\n   {'deposit': 4, 'net': -4}),\n  ('half-up cut boundary #1',\n   [{'price': 10, 'hours': 12, 'stack_value': 100}, {'status': 'sold'}],\n   {'deposit': 15, 'net': 9}),\n  ('control #1',\n   [{'price': 10, 'hours': 48, 'stack_value': 0}, {'status': 'expired'}],\n   {'deposit': 4, 'net': -4})],\n [('cancel with bid #1',\n   [{'price': 500, 'hours': 24, 'stack_value': 40}, {'status': 'cancelled', 'bid': 390}],\n   {'deposit': 12, 'net': -31}),\n  ('regression cancellation penalty #1',\n   [{'price': 190, 'hours': 24, 'stack_value': 1}, {'status': 'cancelled', 'bid': 2339}],\n   {'deposit': 2, 'net': -118}),\n  ('regression cancellation penalty #2',\n   [{'price': 1, 'hours': 24, 'stack_value': 6}, {'status': 'cancelled', 'bid': 99}],\n   {'deposit': 2, 'net': -6}),\n  ('regression cancellation penalty #3',\n   [{'price': 50, 'hours': 24, 'stack_value': 6}, {'status': 'cancelled', 'bid': 323}],\n   {'deposit': 2, 'net': -18}),\n  ('regression cancellation penalty #4',\n   [{'price': 11, 'hours': 12, 'stack_value': 6}, {'status': 'cancelled', 'bid': 20}],\n   {'deposit': 1, 'net': -2}),\n  ('long cheap listing #1',\n   [{'price': 10, 'hours': 48, 'stack_value': 3}, {'status': 'expired'}],\n   {'deposit': 4, 'net': -4}),\n  ('half-up cut boundary #1',\n   [{'price': 10, 'hours': 12, 'stack_value': 100}, {'status': 'sold'}],\n   {'deposit': 15, 'net': 9}),\n  ('control #1',\n   [{'price': 50, 'hours': 24, 'stack_value': 6}, {'status': 'expired'}],\n   {'deposit': 2, 'net': -2})],\n [('cancel with bid #1',\n   [{'price': 500, 'hours': 24, 'stack_value': 40}, {'status': 'cancelled', 'bid': 390}],\n   {'deposit': 12, 'net': -31}),\n  ('fault site cancellation penalty #1',\n   [{'price': 1, 'hours': 12, 'stack_value': 1}, {'status': 'cancelled', 'bid': 99}],\n   {'deposit': 1, 'net': -5}),\n  ('fault site cancellation penalty #2',\n   [{'price': 50, 'hours': 12, 'stack_value': 1}, {'status': 'cancelled', 'bid': 99}],\n   {'deposit': 1, 'net': -5}),\n  ('partial repair boundary #1',\n   [{'price': 30, 'hours': 48, 'stack_value': 2507}, {'status': 'cancelled', 'bid': 19}],\n   {'deposit': 1504, 'net': -1504}),\n  ('regression cancellation penalty #1',\n   [{'price': 190, 'hours': 24, 'stack_value': 1}, {'status': 'cancelled', 'bid': 2339}],\n   {'deposit': 2, 'net': -118}),\n  ('long cheap listing #1',\n   [{'price': 10, 'hours': 48, 'stack_value': 3}, {'status': 'expired'}],\n   {'deposit': 4, 'net': -4}),\n  ('half-up cut boundary #1',\n   [{'price': 10, 'hours': 12, 'stack_value': 100}, {'status': 'sold'}],\n   {'deposit': 15, 'net': 9}),\n  ('control #1',\n   [{'price': 11, 'hours': 12, 'stack_value': 0}, {'status': 'expired'}],\n   {'deposit': 1, 'net': -1})]]\nfor label, args, expected in cases[N-1]:\n    check(label, 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":"8e537c6d5a76c15c32c4453a21ffde2c1674ad2d7e8f2f19ec42530a76d4bcf8","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(listing, outcome):\n    blocks = listing['hours'] // 12\n    per_block = max(1, listing['stack_value'] * 15 // 100)\n    deposit = per_block * blocks\n    status = outcome['status']\n    if status == 'sold':\n        cut = (listing['price'] * 5 + 50) // 100\n        net = listing['price'] - cut\n    elif status == 'cancelled':\n        net = -deposit\n    else:\n        net = -deposit\n    return {'deposit': deposit, 'net': net}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = [[('cancel with bid #1',\n   [{'price': 500, 'hours': 24, 'stack_value': 40}, {'status': 'cancelled', 'bid': 390}],\n   {'deposit': 12, 'net': -31}),\n  ('fault site cancellation penalty #1',\n   [{'price': 10, 'hours': 12, 'stack_value': 0}, {'status': 'cancelled', 'bid': 99}],\n   {'deposit': 1, 'net': -5}),\n  ('regression cancellation penalty #1',\n   [{'price': 190, 'hours': 48, 'stack_value': 0}, {'status': 'cancelled', 'bid': 99}],\n   {'deposit': 4, 'net': -8}),\n  ('partial repair boundary #1',\n   [{'price': 11, 'hours': 24, 'stack_value': 13}, {'status': 'cancelled', 'bid': 0}],\n   {'deposit': 2, 'net': -2}),\n  ('partial repair boundary #2',\n   [{'price': 1, 'hours': 12, 'stack_value': 4743}, {'status': 'cancelled', 'bid': 0}],\n   {'deposit': 711, 'net': -711}),\n  ('long cheap listing #1',\n   [{'price': 10, 'hours': 48, 'stack_value': 3}, {'status': 'expired'}],\n   {'deposit': 4, 'net': -4}),\n  ('half-up cut boundary #1',\n   [{'price': 10, 'hours': 12, 'stack_value': 100}, {'status': 'sold'}],\n   {'deposit': 15, 'net': 9}),\n  ('control #1',\n   [{'price': 10, 'hours': 48, 'stack_value': 0}, {'status': 'expired'}],\n   {'deposit': 4, 'net': -4})],\n [('cancel with bid #1',\n   [{'price': 500, 'hours': 24, 'stack_value': 40}, {'status': 'cancelled', 'bid': 390}],\n   {'deposit': 12, 'net': -31}),\n  ('regression cancellation penalty #1',\n   [{'price': 190, 'hours': 48, 'stack_value': 0}, {'status': 'cancelled', 'bid': 99}],\n   {'deposit': 4, 'net': -8}),\n  ('fault site cancellation penalty #1',\n   [{'price': 10, 'hours': 12, 'stack_value': 13}, {'status': 'cancelled', 'bid': 99}],\n   {'deposit': 1, 'net': -5}),\n  ('partial repair boundary #1',\n   [{'price': 1, 'hours': 12, 'stack_value': 4743}, {'status': 'cancelled', 'bid': 0}],\n   {'deposit': 711, 'net': -711}),\n  ('partial repair boundary #2',\n   [{'price': 190, 'hours': 12, 'stack_value': 13}, {'status': 'cancelled'}],\n   {'deposit': 1, 'net': -1}),\n  ('long cheap listing #1',\n   [{'price': 10, 'hours': 48, 'stack_value': 3}, {'status': 'expired'}],\n   {'deposit': 4, 'net': -4}),\n  ('half-up cut boundary #1',\n   [{'price': 10, 'hours': 12, 'stack_value': 100}, {'status': 'sold'}],\n   {'deposit': 15, 'net': 9}),\n  ('control #1',\n   [{'price': 10, 'hours': 48, 'stack_value': 0}, {'status': 'expired'}],\n   {'deposit': 4, 'net': -4})],\n [('cancel with bid #1',\n   [{'price': 500, 'hours': 24, 'stack_value': 40}, {'status': 'cancelled', 'bid': 390}],\n   {'deposit': 12, 'net': -31}),\n  ('regression cancellation penalty #1',\n   [{'price': 50, 'hours': 24, 'stack_value': 6}, {'status': 'cancelled', 'bid': 323}],\n   {'deposit': 2, 'net': -18}),\n  ('regression cancellation penalty #2',\n   [{'price': 11, 'hours': 12, 'stack_value': 6}, {'status': 'cancelled', 'bid': 20}],\n   {'deposit': 1, 'net': -2}),\n  ('partial repair boundary #1',\n   [{'price': 912, 'hours': 24, 'stack_value': 0}, {'status': 'cancelled'}],\n   {'deposit': 2, 'net': -2}),\n  ('regression cancellation penalty #3',\n   [{'price': 190, 'hours': 48, 'stack_value': 0}, {'status': 'cancelled', 'bid': 99}],\n   {'deposit': 4, 'net': -8}),\n  ('long cheap listing #1',\n   [{'price': 10, 'hours': 48, 'stack_value': 3}, {'status': 'expired'}],\n   {'deposit': 4, 'net': -4}),\n  ('half-up cut boundary #1',\n   [{'price': 10, 'hours': 12, 'stack_value': 100}, {'status': 'sold'}],\n   {'deposit': 15, 'net': 9}),\n  ('control #1',\n   [{'price': 10, 'hours': 48, 'stack_value': 0}, {'status': 'expired'}],\n   {'deposit': 4, 'net': -4})],\n [('cancel with bid #1',\n   [{'price': 500, 'hours': 24, 'stack_value': 40}, {'status': 'cancelled', 'bid': 390}],\n   {'deposit': 12, 'net': -31}),\n  ('regression cancellation penalty #1',\n   [{'price': 190, 'hours': 24, 'stack_value': 1}, {'status': 'cancelled', 'bid': 2339}],\n   {'deposit': 2, 'net': -118}),\n  ('regression cancellation penalty #2',\n   [{'price': 1, 'hours': 24, 'stack_value': 6}, {'status': 'cancelled', 'bid': 99}],\n   {'deposit': 2, 'net': -6}),\n  ('regression cancellation penalty #3',\n   [{'price': 50, 'hours': 24, 'stack_value': 6}, {'status': 'cancelled', 'bid': 323}],\n   {'deposit': 2, 'net': -18}),\n  ('regression cancellation penalty #4',\n   [{'price': 11, 'hours': 12, 'stack_value': 6}, {'status': 'cancelled', 'bid': 20}],\n   {'deposit': 1, 'net': -2}),\n  ('long cheap listing #1',\n   [{'price': 10, 'hours': 48, 'stack_value': 3}, {'status': 'expired'}],\n   {'deposit': 4, 'net': -4}),\n  ('half-up cut boundary #1',\n   [{'price': 10, 'hours': 12, 'stack_value': 100}, {'status': 'sold'}],\n   {'deposit': 15, 'net': 9}),\n  ('control #1',\n   [{'price': 50, 'hours': 24, 'stack_value': 6}, {'status': 'expired'}],\n   {'deposit': 2, 'net': -2})],\n [('cancel with bid #1',\n   [{'price': 500, 'hours': 24, 'stack_value': 40}, {'status': 'cancelled', 'bid': 390}],\n   {'deposit': 12, 'net': -31}),\n  ('fault site cancellation penalty #1',\n   [{'price': 1, 'hours': 12, 'stack_value': 1}, {'status': 'cancelled', 'bid': 99}],\n   {'deposit': 1, 'net': -5}),\n  ('fault site cancellation penalty #2',\n   [{'price': 50, 'hours': 12, 'stack_value': 1}, {'status': 'cancelled', 'bid': 99}],\n   {'deposit': 1, 'net': -5}),\n  ('partial repair boundary #1',\n   [{'price': 30, 'hours': 48, 'stack_value': 2507}, {'status': 'cancelled', 'bid': 19}],\n   {'deposit': 1504, 'net': -1504}),\n  ('regression cancellation penalty #1',\n   [{'price': 190, 'hours': 24, 'stack_value': 1}, {'status': 'cancelled', 'bid': 2339}],\n   {'deposit': 2, 'net': -118}),\n  ('long cheap listing #1',\n   [{'price': 10, 'hours': 48, 'stack_value': 3}, {'status': 'expired'}],\n   {'deposit': 4, 'net': -4}),\n  ('half-up cut boundary #1',\n   [{'price': 10, 'hours': 12, 'stack_value': 100}, {'status': 'sold'}],\n   {'deposit': 15, 'net': 9}),\n  ('control #1',\n   [{'price': 11, 'hours': 12, 'stack_value': 0}, {'status': 'expired'}],\n   {'deposit': 1, 'net': -1})]]\nfor label, args, expected in cases[N-1]:\n    check(label, 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":"1ac3b0019f345265a3da22c88e72bfaf310ded296308bd5e24c8f7a309f83a4c","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(listing, outcome):\n    blocks = listing['hours'] // 12\n    per_block = max(1, listing['stack_value'] * 15 // 100)\n    deposit = per_block * blocks\n    status = outcome['status']\n    if status == 'sold':\n        cut = (listing['price'] * 5 + 50) // 100\n        net = listing['price'] - cut\n    elif status == 'cancelled':\n        net = -deposit - outcome.get('bid', 0) * 5 // 100\n    else:\n        net = -deposit\n    return {'deposit': deposit, 'net': net}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = [[('cancel with bid #1',\n   [{'price': 500, 'hours': 24, 'stack_value': 40}, {'status': 'cancelled', 'bid': 390}],\n   {'deposit': 12, 'net': -31}),\n  ('fault site cancellation penalty #1',\n   [{'price': 10, 'hours': 12, 'stack_value': 0}, {'status': 'cancelled', 'bid': 99}],\n   {'deposit': 1, 'net': -5}),\n  ('regression cancellation penalty #1',\n   [{'price': 190, 'hours': 48, 'stack_value': 0}, {'status': 'cancelled', 'bid': 99}],\n   {'deposit': 4, 'net': -8}),\n  ('partial repair boundary #1',\n   [{'price': 11, 'hours': 24, 'stack_value': 13}, {'status': 'cancelled', 'bid': 0}],\n   {'deposit': 2, 'net': -2}),\n  ('partial repair boundary #2',\n   [{'price': 1, 'hours': 12, 'stack_value': 4743}, {'status': 'cancelled', 'bid': 0}],\n   {'deposit': 711, 'net': -711}),\n  ('long cheap listing #1',\n   [{'price': 10, 'hours': 48, 'stack_value': 3}, {'status': 'expired'}],\n   {'deposit': 4, 'net': -4}),\n  ('half-up cut boundary #1',\n   [{'price': 10, 'hours': 12, 'stack_value': 100}, {'status': 'sold'}],\n   {'deposit': 15, 'net': 9}),\n  ('control #1',\n   [{'price': 10, 'hours': 48, 'stack_value': 0}, {'status': 'expired'}],\n   {'deposit': 4, 'net': -4})],\n [('cancel with bid #1',\n   [{'price': 500, 'hours': 24, 'stack_value': 40}, {'status': 'cancelled', 'bid': 390}],\n   {'deposit': 12, 'net': -31}),\n  ('regression cancellation penalty #1',\n   [{'price': 190, 'hours': 48, 'stack_value': 0}, {'status': 'cancelled', 'bid': 99}],\n   {'deposit': 4, 'net': -8}),\n  ('fault site cancellation penalty #1',\n   [{'price': 10, 'hours': 12, 'stack_value': 13}, {'status': 'cancelled', 'bid': 99}],\n   {'deposit': 1, 'net': -5}),\n  ('partial repair boundary #1',\n   [{'price': 1, 'hours': 12, 'stack_value': 4743}, {'status': 'cancelled', 'bid': 0}],\n   {'deposit': 711, 'net': -711}),\n  ('partial repair boundary #2',\n   [{'price': 190, 'hours': 12, 'stack_value': 13}, {'status': 'cancelled'}],\n   {'deposit': 1, 'net': -1}),\n  ('long cheap listing #1',\n   [{'price': 10, 'hours': 48, 'stack_value': 3}, {'status': 'expired'}],\n   {'deposit': 4, 'net': -4}),\n  ('half-up cut boundary #1',\n   [{'price': 10, 'hours': 12, 'stack_value': 100}, {'status': 'sold'}],\n   {'deposit': 15, 'net': 9}),\n  ('control #1',\n   [{'price': 10, 'hours': 48, 'stack_value': 0}, {'status': 'expired'}],\n   {'deposit': 4, 'net': -4})],\n [('cancel with bid #1',\n   [{'price': 500, 'hours': 24, 'stack_value': 40}, {'status': 'cancelled', 'bid': 390}],\n   {'deposit': 12, 'net': -31}),\n  ('regression cancellation penalty #1',\n   [{'price': 50, 'hours': 24, 'stack_value': 6}, {'status': 'cancelled', 'bid': 323}],\n   {'deposit': 2, 'net': -18}),\n  ('regression cancellation penalty #2',\n   [{'price': 11, 'hours': 12, 'stack_value': 6}, {'status': 'cancelled', 'bid': 20}],\n   {'deposit': 1, 'net': -2}),\n  ('partial repair boundary #1',\n   [{'price': 912, 'hours': 24, 'stack_value': 0}, {'status': 'cancelled'}],\n   {'deposit': 2, 'net': -2}),\n  ('regression cancellation penalty #3',\n   [{'price': 190, 'hours': 48, 'stack_value': 0}, {'status': 'cancelled', 'bid': 99}],\n   {'deposit': 4, 'net': -8}),\n  ('long cheap listing #1',\n   [{'price': 10, 'hours': 48, 'stack_value': 3}, {'status': 'expired'}],\n   {'deposit': 4, 'net': -4}),\n  ('half-up cut boundary #1',\n   [{'price': 10, 'hours': 12, 'stack_value': 100}, {'status': 'sold'}],\n   {'deposit': 15, 'net': 9}),\n  ('control #1',\n   [{'price': 10, 'hours': 48, 'stack_value': 0}, {'status': 'expired'}],\n   {'deposit': 4, 'net': -4})],\n [('cancel with bid #1',\n   [{'price': 500, 'hours': 24, 'stack_value': 40}, {'status': 'cancelled', 'bid': 390}],\n   {'deposit': 12, 'net': -31}),\n  ('regression cancellation penalty #1',\n   [{'price': 190, 'hours': 24, 'stack_value': 1}, {'status': 'cancelled', 'bid': 2339}],\n   {'deposit': 2, 'net': -118}),\n  ('regression cancellation penalty #2',\n   [{'price': 1, 'hours': 24, 'stack_value': 6}, {'status': 'cancelled', 'bid': 99}],\n   {'deposit': 2, 'net': -6}),\n  ('regression cancellation penalty #3',\n   [{'price': 50, 'hours': 24, 'stack_value': 6}, {'status': 'cancelled', 'bid': 323}],\n   {'deposit': 2, 'net': -18}),\n  ('regression cancellation penalty #4',\n   [{'price': 11, 'hours': 12, 'stack_value': 6}, {'status': 'cancelled', 'bid': 20}],\n   {'deposit': 1, 'net': -2}),\n  ('long cheap listing #1',\n   [{'price': 10, 'hours': 48, 'stack_value': 3}, {'status': 'expired'}],\n   {'deposit': 4, 'net': -4}),\n  ('half-up cut boundary #1',\n   [{'price': 10, 'hours': 12, 'stack_value': 100}, {'status': 'sold'}],\n   {'deposit': 15, 'net': 9}),\n  ('control #1',\n   [{'price': 50, 'hours': 24, 'stack_value': 6}, {'status': 'expired'}],\n   {'deposit': 2, 'net': -2})],\n [('cancel with bid #1',\n   [{'price': 500, 'hours': 24, 'stack_value': 40}, {'status': 'cancelled', 'bid': 390}],\n   {'deposit': 12, 'net': -31}),\n  ('fault site cancellation penalty #1',\n   [{'price': 1, 'hours': 12, 'stack_value': 1}, {'status': 'cancelled', 'bid': 99}],\n   {'deposit': 1, 'net': -5}),\n  ('fault site cancellation penalty #2',\n   [{'price': 50, 'hours': 12, 'stack_value': 1}, {'status': 'cancelled', 'bid': 99}],\n   {'deposit': 1, 'net': -5}),\n  ('partial repair boundary #1',\n   [{'price': 30, 'hours': 48, 'stack_value': 2507}, {'status': 'cancelled', 'bid': 19}],\n   {'deposit': 1504, 'net': -1504}),\n  ('regression cancellation penalty #1',\n   [{'price': 190, 'hours': 24, 'stack_value': 1}, {'status': 'cancelled', 'bid': 2339}],\n   {'deposit': 2, 'net': -118}),\n  ('long cheap listing #1',\n   [{'price': 10, 'hours': 48, 'stack_value': 3}, {'status': 'expired'}],\n   {'deposit': 4, 'net': -4}),\n  ('half-up cut boundary #1',\n   [{'price': 10, 'hours': 12, 'stack_value': 100}, {'status': 'sold'}],\n   {'deposit': 15, 'net': 9}),\n  ('control #1',\n   [{'price': 11, 'hours': 12, 'stack_value': 0}, {'status': 'expired'}],\n   {'deposit': 1, 'net': -1})]]\nfor label, args, expected in cases[N-1]:\n    check(label, 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":"Deterministic toy contract stipulated for this model; integer or exact arithmetic only, not a reproduction of any specific game engine. 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-game-economy-crafting-balance-auction-fees-cancellation-penalty","generated_at":"2026-09-29T14:50:45.491480+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Game economies leak or destroy currency when one crafting or pricing rule is off by one boundary, rounding stage or state update; the defect is observable in exact integer outcomes.","repair":"Restore `net = -deposit - outcome.get('bid', 0) * 5 // 100` at the cancellation penalty step.","root_cause":"The cancellation branch omits the 5% bid penalty.","sha256":"9e04c25f86168b1b781ce9472b23c1faef9313367b03b509577403ff7ef04381","title":"Auction house fees: Cancelling over a bid is free · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":38.586,"exit_code":1,"observations":[{"actual":{"deposit":12,"net":-20},"check":"cancel with bid #1","expected":{"deposit":12,"net":-31},"passed":false},{"actual":{"deposit":1,"net":-5},"check":"fault site cancellation penalty #1","expected":{"deposit":1,"net":-5},"passed":true},{"actual":{"deposit":4,"net":-5},"check":"regression cancellation penalty #1","expected":{"deposit":4,"net":-8},"passed":false},{"actual":{"deposit":2,"net":0},"check":"partial repair boundary #1","expected":{"deposit":2,"net":-2},"passed":false},{"actual":{"deposit":711,"net":0},"check":"partial repair boundary #2","expected":{"deposit":711,"net":-711},"passed":false},{"actual":{"deposit":4,"net":-4},"check":"long cheap listing #1","expected":{"deposit":4,"net":-4},"passed":true},{"actual":{"deposit":15,"net":9},"check":"half-up cut boundary #1","expected":{"deposit":15,"net":9},"passed":true},{"actual":{"deposit":4,"net":-4},"check":"control #1","expected":{"deposit":4,"net":-4},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"cancel with bid #1\", \"actual\": {\"deposit\": 12, \"net\": -20}, \"expected\": {\"deposit\": 12, \"net\": -31}, \"passed\": false}, {\"check\": \"fault site cancellation penalty #1\", \"actual\": {\"deposit\": 1, \"net\": -5}, \"expected\": {\"deposit\": 1, \"net\": -5}, \"passed\": true}, {\"check\": \"regression cancellation penalty #1\", \"actual\": {\"deposit\": 4, \"net\": -5}, \"expected\": {\"deposit\": 4, \"net\": -8}, \"passed\": false}, {\"check\": \"partial repair boundary #1\", \"actual\": {\"deposit\": 2, \"net\": 0}, \"expected\": {\"deposit\": 2, \"net\": -2}, \"passed\": false}, {\"check\": \"partial repair boundary #2\", \"actual\": {\"deposit\": 711, \"net\": 0}, \"expected\": {\"deposit\": 711, \"net\": -711}, \"passed\": false}, {\"check\": \"long cheap listing #1\", \"actual\": {\"deposit\": 4, \"net\": -4}, \"expected\": {\"deposit\": 4, \"net\": -4}, \"passed\": true}, {\"check\": \"half-up cut boundary #1\", \"actual\": {\"deposit\": 15, \"net\": 9}, \"expected\": {\"deposit\": 15, \"net\": 9}, \"passed\": true}, {\"check\": \"control #1\", \"actual\": {\"deposit\": 4, \"net\": -4}, \"expected\": {\"deposit\": 4, \"net\": -4}, \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":38.248,"exit_code":1,"observations":[{"actual":{"deposit":12,"net":-12},"check":"cancel with bid #1","expected":{"deposit":12,"net":-31},"passed":false},{"actual":{"deposit":1,"net":-1},"check":"fault site cancellation penalty #1","expected":{"deposit":1,"net":-5},"passed":false},{"actual":{"deposit":4,"net":-4},"check":"regression cancellation penalty #1","expected":{"deposit":4,"net":-8},"passed":false},{"actual":{"deposit":2,"net":-2},"check":"partial repair boundary #1","expected":{"deposit":2,"net":-2},"passed":true},{"actual":{"deposit":711,"net":-711},"check":"partial repair boundary #2","expected":{"deposit":711,"net":-711},"passed":true},{"actual":{"deposit":4,"net":-4},"check":"long cheap listing #1","expected":{"deposit":4,"net":-4},"passed":true},{"actual":{"deposit":15,"net":9},"check":"half-up cut boundary #1","expected":{"deposit":15,"net":9},"passed":true},{"actual":{"deposit":4,"net":-4},"check":"control #1","expected":{"deposit":4,"net":-4},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"cancel with bid #1\", \"actual\": {\"deposit\": 12, \"net\": -12}, \"expected\": {\"deposit\": 12, \"net\": -31}, \"passed\": false}, {\"check\": \"fault site cancellation penalty #1\", \"actual\": {\"deposit\": 1, \"net\": -1}, \"expected\": {\"deposit\": 1, \"net\": -5}, \"passed\": false}, {\"check\": \"regression cancellation penalty #1\", \"actual\": {\"deposit\": 4, \"net\": -4}, \"expected\": {\"deposit\": 4, \"net\": -8}, \"passed\": false}, {\"check\": \"partial repair boundary #1\", \"actual\": {\"deposit\": 2, \"net\": -2}, \"expected\": {\"deposit\": 2, \"net\": -2}, \"passed\": true}, {\"check\": \"partial repair boundary #2\", \"actual\": {\"deposit\": 711, \"net\": -711}, \"expected\": {\"deposit\": 711, \"net\": -711}, \"passed\": true}, {\"check\": \"long cheap listing #1\", \"actual\": {\"deposit\": 4, \"net\": -4}, \"expected\": {\"deposit\": 4, \"net\": -4}, \"passed\": true}, {\"check\": \"half-up cut boundary #1\", \"actual\": {\"deposit\": 15, \"net\": 9}, \"expected\": {\"deposit\": 15, \"net\": 9}, \"passed\": true}, {\"check\": \"control #1\", \"actual\": {\"deposit\": 4, \"net\": -4}, \"expected\": {\"deposit\": 4, \"net\": -4}, \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":37.067,"exit_code":0,"observations":[{"actual":{"deposit":12,"net":-31},"check":"cancel with bid #1","expected":{"deposit":12,"net":-31},"passed":true},{"actual":{"deposit":1,"net":-5},"check":"fault site cancellation penalty #1","expected":{"deposit":1,"net":-5},"passed":true},{"actual":{"deposit":4,"net":-8},"check":"regression cancellation penalty #1","expected":{"deposit":4,"net":-8},"passed":true},{"actual":{"deposit":2,"net":-2},"check":"partial repair boundary #1","expected":{"deposit":2,"net":-2},"passed":true},{"actual":{"deposit":711,"net":-711},"check":"partial repair boundary #2","expected":{"deposit":711,"net":-711},"passed":true},{"actual":{"deposit":4,"net":-4},"check":"long cheap listing #1","expected":{"deposit":4,"net":-4},"passed":true},{"actual":{"deposit":15,"net":9},"check":"half-up cut boundary #1","expected":{"deposit":15,"net":9},"passed":true},{"actual":{"deposit":4,"net":-4},"check":"control #1","expected":{"deposit":4,"net":-4},"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"cancel with bid #1\", \"actual\": {\"deposit\": 12, \"net\": -31}, \"expected\": {\"deposit\": 12, \"net\": -31}, \"passed\": true}, {\"check\": \"fault site cancellation penalty #1\", \"actual\": {\"deposit\": 1, \"net\": -5}, \"expected\": {\"deposit\": 1, \"net\": -5}, \"passed\": true}, {\"check\": \"regression cancellation penalty #1\", \"actual\": {\"deposit\": 4, \"net\": -8}, \"expected\": {\"deposit\": 4, \"net\": -8}, \"passed\": true}, {\"check\": \"partial repair boundary #1\", \"actual\": {\"deposit\": 2, \"net\": -2}, \"expected\": {\"deposit\": 2, \"net\": -2}, \"passed\": true}, {\"check\": \"partial repair boundary #2\", \"actual\": {\"deposit\": 711, \"net\": -711}, \"expected\": {\"deposit\": 711, \"net\": -711}, \"passed\": true}, {\"check\": \"long cheap listing #1\", \"actual\": {\"deposit\": 4, \"net\": -4}, \"expected\": {\"deposit\": 4, \"net\": -4}, \"passed\": true}, {\"check\": \"half-up cut boundary #1\", \"actual\": {\"deposit\": 15, \"net\": 9}, \"expected\": {\"deposit\": 15, \"net\": 9}, \"passed\": true}, {\"check\": \"control #1\", \"actual\": {\"deposit\": 4, \"net\": -4}, \"expected\": {\"deposit\": 4, \"net\": -4}, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}