{"abstract":"More crafts are performed than the stockpile can pay for and inventories go negative.","category":"Game economy crafting balance","checks":8,"contract":"recipe = {inputs:{material:qty}, output, yield, stack}. Crafts = min(requested, floor(have/qty) per input), 0 when requested <= 0. With skill in [50, inf) every 5th craft adds one bonus item (bonus = crafts//5). made = crafts*yield + bonus, split into full stacks of size stack plus one partial stack. left = whole inventory (all materials) after consuming crafts*qty of each input, sorted by name.","evaluation_group":"w2-game-economy-crafting-balance-batch-craft","failed_approach":"Rounding the division up still lets a partial material bundle pay for a whole craft.","family":"w2-game-economy-crafting-balance-batch-craft-material-availability","id":"FA-85841","implementations":{"attempt":{"sha256":"94bb55522d596a3a29f39ce054e81f3b798ce2b612c4debce3c2890da131640e","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(recipe, inventory, requested, skill):\n    if requested <= 0:\n        crafts = 0\n    else:\n        crafts = requested\n        for mat, qty in recipe['inputs'].items():\n            crafts = min(crafts, (inventory.get(mat, 0) + qty - 1) // qty)\n    bonus = crafts // 5 if skill >= 50 else 0\n    made = crafts * recipe['yield'] + bonus\n    cap = recipe['stack']\n    stacks = [cap] * (made // cap)\n    if made % cap:\n        stacks.append(made % cap)\n    left = dict(inventory)\n    for mat, qty in recipe['inputs'].items():\n        left[mat] = left.get(mat, 0) - crafts * qty\n    return {'crafts': crafts, 'made': made, 'stacks': stacks, 'left': dict(sorted(left.items()))}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = [[('exact material multiple #1',\n   [{'inputs': {'ore': 3}, 'output': 'bar', 'yield': 1, 'stack': 5}, {'ore': 15}, 10, 50],\n   {'crafts': 5, 'made': 6, 'stacks': [5, 1], 'left': {'ore': 0}}),\n  ('one short of a batch #1',\n   [{'inputs': {'ore': 3, 'wood': 2}, 'output': 'axe', 'yield': 2, 'stack': 4},\n    {'ore': 14, 'wood': 9, 'herb': 2},\n    9,\n    10],\n   {'crafts': 4, 'made': 8, 'stacks': [4, 4], 'left': {'herb': 2, 'ore': 2, 'wood': 1}}),\n  ('regression material availability #1',\n   [{'inputs': {'ore': 4}, 'output': 'blade', 'yield': 3, 'stack': 10}, {'ore': 6}, 2, 51],\n   {'crafts': 1, 'made': 3, 'stacks': [3], 'left': {'ore': 2}}),\n  ('regression material availability #2',\n   [{'inputs': {'wood': 2, 'hide': 3, 'gem': 3}, 'output': 'blade', 'yield': 3, 'stack': 7},\n    {'wood': 12, 'hide': 23, 'gem': 11},\n    4,\n    51],\n   {'crafts': 3, 'made': 9, 'stacks': [7, 2], 'left': {'gem': 2, 'hide': 14, 'wood': 6}}),\n  ('regression material availability #3',\n   [{'inputs': {'ore': 2, 'wood': 4, 'hide': 2}, 'output': 'blade', 'yield': 3, 'stack': 6},\n    {'ore': 20, 'wood': 13, 'hide': 16, 'herb': 2},\n    9,\n    120],\n   {'crafts': 3, 'made': 9, 'stacks': [6, 3], 'left': {'herb': 2, 'hide': 10, 'ore': 14, 'wood': 1}}),\n  ('regression material availability #4',\n   [{'inputs': {'gem': 4, 'ore': 2}, 'output': 'blade', 'yield': 1, 'stack': 9},\n    {'gem': 15, 'ore': 20, 'herb': 6},\n    12,\n    120],\n   {'crafts': 3, 'made': 3, 'stacks': [3], 'left': {'gem': 3, 'herb': 6, 'ore': 14}}),\n  ('zero request #1',\n   [{'inputs': {'hide': 2}, 'output': 'belt', 'yield': 1, 'stack': 3}, {'hide': 8}, 0, 80],\n   {'crafts': 0, 'made': 0, 'stacks': [], 'left': {'hide': 8}}),\n  ('control #1',\n   [{'inputs': {'hide': 3, 'ore': 1}, 'output': 'blade', 'yield': 1, 'stack': 5},\n    {'hide': 21, 'ore': 5},\n    3,\n    99],\n   {'crafts': 3, 'made': 3, 'stacks': [3], 'left': {'hide': 12, 'ore': 2}})],\n [('one short of a batch #1',\n   [{'inputs': {'ore': 3, 'wood': 2}, 'output': 'axe', 'yield': 2, 'stack': 4},\n    {'ore': 14, 'wood': 9, 'herb': 2},\n    9,\n    10],\n   {'crafts': 4, 'made': 8, 'stacks': [4, 4], 'left': {'herb': 2, 'ore': 2, 'wood': 1}}),\n  ('regression material availability #1',\n   [{'inputs': {'ore': 4}, 'output': 'blade', 'yield': 3, 'stack': 10}, {'ore': 6}, 2, 51],\n   {'crafts': 1, 'made': 3, 'stacks': [3], 'left': {'ore': 2}}),\n  ('regression material availability #2',\n   [{'inputs': {'wood': 2, 'hide': 3, 'gem': 3}, 'output': 'blade', 'yield': 3, 'stack': 7},\n    {'wood': 12, 'hide': 23, 'gem': 11},\n    4,\n    51],\n   {'crafts': 3, 'made': 9, 'stacks': [7, 2], 'left': {'gem': 2, 'hide': 14, 'wood': 6}}),\n  ('regression material availability #3',\n   [{'inputs': {'ore': 2, 'wood': 4, 'hide': 2}, 'output': 'blade', 'yield': 3, 'stack': 6},\n    {'ore': 20, 'wood': 13, 'hide': 16, 'herb': 2},\n    9,\n    120],\n   {'crafts': 3, 'made': 9, 'stacks': [6, 3], 'left': {'herb': 2, 'hide': 10, 'ore': 14, 'wood': 1}}),\n  ('regression material availability #4',\n   [{'inputs': {'gem': 4, 'ore': 2}, 'output': 'blade', 'yield': 1, 'stack': 9},\n    {'gem': 15, 'ore': 20, 'herb': 6},\n    12,\n    120],\n   {'crafts': 3, 'made': 3, 'stacks': [3], 'left': {'gem': 3, 'herb': 6, 'ore': 14}}),\n  ('zero request #1',\n   [{'inputs': {'hide': 2}, 'output': 'belt', 'yield': 1, 'stack': 3}, {'hide': 8}, 0, 80],\n   {'crafts': 0, 'made': 0, 'stacks': [], 'left': {'hide': 8}}),\n  ('control #1',\n   [{'inputs': {'ore': 4, 'gem': 4, 'hide': 4}, 'output': 'blade', 'yield': 2, 'stack': 7},\n    {'ore': 13, 'gem': 22, 'hide': 22, 'herb': 6},\n    2,\n    120],\n   {'crafts': 2, 'made': 4, 'stacks': [4], 'left': {'gem': 14, 'herb': 6, 'hide': 14, 'ore': 5}}),\n  ('control #2',\n   [{'inputs': {'gem': 2}, 'output': 'blade', 'yield': 3, 'stack': 9}, {'gem': 19}, 0, 120],\n   {'crafts': 0, 'made': 0, 'stacks': [], 'left': {'gem': 19}})],\n [('exact material multiple #1',\n   [{'inputs': {'ore': 3}, 'output': 'bar', 'yield': 1, 'stack': 5}, {'ore': 15}, 10, 50],\n   {'crafts': 5, 'made': 6, 'stacks': [5, 1], 'left': {'ore': 0}}),\n  ('one short of a batch #1',\n   [{'inputs': {'ore': 3, 'wood': 2}, 'output': 'axe', 'yield': 2, 'stack': 4},\n    {'ore': 14, 'wood': 9, 'herb': 2},\n    9,\n    10],\n   {'crafts': 4, 'made': 8, 'stacks': [4, 4], 'left': {'herb': 2, 'ore': 2, 'wood': 1}}),\n  ('regression material availability #1',\n   [{'inputs': {'ore': 2, 'wood': 4, 'hide': 2}, 'output': 'blade', 'yield': 3, 'stack': 6},\n    {'ore': 20, 'wood': 13, 'hide': 16, 'herb': 2},\n    9,\n    120],\n   {'crafts': 3, 'made': 9, 'stacks': [6, 3], 'left': {'herb': 2, 'hide': 10, 'ore': 14, 'wood': 1}}),\n  ('regression material availability #2',\n   [{'inputs': {'gem': 4, 'ore': 2}, 'output': 'blade', 'yield': 1, 'stack': 9},\n    {'gem': 15, 'ore': 20, 'herb': 6},\n    12,\n    120],\n   {'crafts': 3, 'made': 3, 'stacks': [3], 'left': {'gem': 3, 'herb': 6, 'ore': 14}}),\n  ('regression material availability #3',\n   [{'inputs': {'gem': 1, 'hide': 3}, 'output': 'blade', 'yield': 1, 'stack': 4},\n    {'gem': 2, 'hide': 5, 'herb': 8},\n    12,\n    99],\n   {'crafts': 1, 'made': 1, 'stacks': [1], 'left': {'gem': 1, 'herb': 8, 'hide': 2}}),\n  ('regression material availability #4',\n   [{'inputs': {'hide': 4}, 'output': 'blade', 'yield': 3, 'stack': 7}, {'hide': 15}, 7, 120],\n   {'crafts': 3, 'made': 9, 'stacks': [7, 2], 'left': {'hide': 3}}),\n  ('zero request #1',\n   [{'inputs': {'hide': 2}, 'output': 'belt', 'yield': 1, 'stack': 3}, {'hide': 8}, 0, 80],\n   {'crafts': 0, 'made': 0, 'stacks': [], 'left': {'hide': 8}}),\n  ('control #1',\n   [{'inputs': {'ore': 4, 'gem': 4, 'hide': 4}, 'output': 'blade', 'yield': 2, 'stack': 7},\n    {'ore': 13, 'gem': 22, 'hide': 22, 'herb': 6},\n    2,\n    120],\n   {'crafts': 2, 'made': 4, 'stacks': [4], 'left': {'gem': 14, 'herb': 6, 'hide': 14, 'ore': 5}})],\n [('one short of a batch #1',\n   [{'inputs': {'ore': 3, 'wood': 2}, 'output': 'axe', 'yield': 2, 'stack': 4},\n    {'ore': 14, 'wood': 9, 'herb': 2},\n    9,\n    10],\n   {'crafts': 4, 'made': 8, 'stacks': [4, 4], 'left': {'herb': 2, 'ore': 2, 'wood': 1}}),\n  ('regression material availability #1',\n   [{'inputs': {'gem': 1, 'hide': 3}, 'output': 'blade', 'yield': 1, 'stack': 4},\n    {'gem': 2, 'hide': 5, 'herb': 8},\n    12,\n    99],\n   {'crafts': 1, 'made': 1, 'stacks': [1], 'left': {'gem': 1, 'herb': 8, 'hide': 2}}),\n  ('fault site material availability #1',\n   [{'inputs': {'hide': 1, 'gem': 2, 'wood': 1}, 'output': 'blade', 'yield': 3, 'stack': 10},\n    {'hide': 28, 'gem': 10, 'wood': 23, 'herb': 6},\n    8,\n    120],\n   {'crafts': 5, 'made': 16, 'stacks': [10, 6], 'left': {'gem': 0, 'herb': 6, 'hide': 23, 'wood': 18}}),\n  ('regression material availability #2',\n   [{'inputs': {'hide': 4}, 'output': 'blade', 'yield': 3, 'stack': 7}, {'hide': 15}, 7, 120],\n   {'crafts': 3, 'made': 9, 'stacks': [7, 2], 'left': {'hide': 3}}),\n  ('regression material availability #3',\n   [{'inputs': {'ore': 2}, 'output': 'blade', 'yield': 3, 'stack': 8}, {'ore': 23, 'herb': 5}, 12, 99],\n   {'crafts': 11, 'made': 35, 'stacks': [8, 8, 8, 8, 3], 'left': {'herb': 5, 'ore': 1}}),\n  ('zero request #1',\n   [{'inputs': {'hide': 2}, 'output': 'belt', 'yield': 1, 'stack': 3}, {'hide': 8}, 0, 80],\n   {'crafts': 0, 'made': 0, 'stacks': [], 'left': {'hide': 8}}),\n  ('control #1',\n   [{'inputs': {'wood': 1, 'ore': 3, 'gem': 1}, 'output': 'blade', 'yield': 3, 'stack': 9},\n    {'wood': 2, 'ore': 29, 'gem': 5, 'herb': 7},\n    11,\n    0],\n   {'crafts': 2, 'made': 6, 'stacks': [6], 'left': {'gem': 3, 'herb': 7, 'ore': 23, 'wood': 0}}),\n  ('control #2',\n   [{'inputs': {'gem': 3, 'hide': 4}, 'output': 'blade', 'yield': 3, 'stack': 6},\n    {'gem': 16, 'hide': 29},\n    0,\n    100],\n   {'crafts': 0, 'made': 0, 'stacks': [], 'left': {'gem': 16, 'hide': 29}})],\n [('exact material multiple #1',\n   [{'inputs': {'ore': 3}, 'output': 'bar', 'yield': 1, 'stack': 5}, {'ore': 15}, 10, 50],\n   {'crafts': 5, 'made': 6, 'stacks': [5, 1], 'left': {'ore': 0}}),\n  ('one short of a batch #1',\n   [{'inputs': {'ore': 3, 'wood': 2}, 'output': 'axe', 'yield': 2, 'stack': 4},\n    {'ore': 14, 'wood': 9, 'herb': 2},\n    9,\n    10],\n   {'crafts': 4, 'made': 8, 'stacks': [4, 4], 'left': {'herb': 2, 'ore': 2, 'wood': 1}}),\n  ('fault site material availability #1',\n   [{'inputs': {'hide': 1, 'gem': 3, 'ore': 2}, 'output': 'blade', 'yield': 2, 'stack': 3},\n    {'hide': 4, 'gem': 10, 'ore': 4, 'herb': 8},\n    8,\n    120],\n   {'crafts': 2, 'made': 4, 'stacks': [3, 1], 'left': {'gem': 4, 'herb': 8, 'hide': 2, 'ore': 0}}),\n  ('regression material availability #1',\n   [{'inputs': {'hide': 4}, 'output': 'blade', 'yield': 3, 'stack': 7}, {'hide': 15}, 7, 120],\n   {'crafts': 3, 'made': 9, 'stacks': [7, 2], 'left': {'hide': 3}}),\n  ('regression material availability #2',\n   [{'inputs': {'ore': 2, 'hide': 4, 'wood': 1}, 'output': 'blade', 'yield': 1, 'stack': 9},\n    {'ore': 3, 'hide': 11, 'wood': 24, 'herb': 7},\n    9,\n    99],\n   {'crafts': 1, 'made': 1, 'stacks': [1], 'left': {'herb': 7, 'hide': 7, 'ore': 1, 'wood': 23}}),\n  ('regression material availability #3',\n   [{'inputs': {'gem': 4, 'wood': 3, 'hide': 3}, 'output': 'blade', 'yield': 2, 'stack': 3},\n    {'gem': 11, 'wood': 22, 'hide': 5, 'herb': 1},\n    11,\n    50],\n   {'crafts': 1, 'made': 2, 'stacks': [2], 'left': {'gem': 7, 'herb': 1, 'hide': 2, 'wood': 19}}),\n  ('zero request #1',\n   [{'inputs': {'hide': 2}, 'output': 'belt', 'yield': 1, 'stack': 3}, {'hide': 8}, 0, 80],\n   {'crafts': 0, 'made': 0, 'stacks': [], 'left': {'hide': 8}}),\n  ('control #1',\n   [{'inputs': {'gem': 1, 'hide': 3, 'ore': 4}, 'output': 'blade', 'yield': 1, 'stack': 6},\n    {'gem': 15, 'hide': 15, 'ore': 26},\n    2,\n    49],\n   {'crafts': 2, 'made': 2, 'stacks': [2], 'left': {'gem': 13, 'hide': 9, 'ore': 18}})]]\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":"b6beba1e1849b8a0cc4885467c50a8ea370c2a9a969f2807e9ee87d5179caed4","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(recipe, inventory, requested, skill):\n    if requested <= 0:\n        crafts = 0\n    else:\n        crafts = requested\n        for mat, qty in recipe['inputs'].items():\n            crafts = min(crafts, inventory.get(mat, 0))\n    bonus = crafts // 5 if skill >= 50 else 0\n    made = crafts * recipe['yield'] + bonus\n    cap = recipe['stack']\n    stacks = [cap] * (made // cap)\n    if made % cap:\n        stacks.append(made % cap)\n    left = dict(inventory)\n    for mat, qty in recipe['inputs'].items():\n        left[mat] = left.get(mat, 0) - crafts * qty\n    return {'crafts': crafts, 'made': made, 'stacks': stacks, 'left': dict(sorted(left.items()))}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = [[('exact material multiple #1',\n   [{'inputs': {'ore': 3}, 'output': 'bar', 'yield': 1, 'stack': 5}, {'ore': 15}, 10, 50],\n   {'crafts': 5, 'made': 6, 'stacks': [5, 1], 'left': {'ore': 0}}),\n  ('one short of a batch #1',\n   [{'inputs': {'ore': 3, 'wood': 2}, 'output': 'axe', 'yield': 2, 'stack': 4},\n    {'ore': 14, 'wood': 9, 'herb': 2},\n    9,\n    10],\n   {'crafts': 4, 'made': 8, 'stacks': [4, 4], 'left': {'herb': 2, 'ore': 2, 'wood': 1}}),\n  ('regression material availability #1',\n   [{'inputs': {'ore': 4}, 'output': 'blade', 'yield': 3, 'stack': 10}, {'ore': 6}, 2, 51],\n   {'crafts': 1, 'made': 3, 'stacks': [3], 'left': {'ore': 2}}),\n  ('regression material availability #2',\n   [{'inputs': {'wood': 2, 'hide': 3, 'gem': 3}, 'output': 'blade', 'yield': 3, 'stack': 7},\n    {'wood': 12, 'hide': 23, 'gem': 11},\n    4,\n    51],\n   {'crafts': 3, 'made': 9, 'stacks': [7, 2], 'left': {'gem': 2, 'hide': 14, 'wood': 6}}),\n  ('regression material availability #3',\n   [{'inputs': {'ore': 2, 'wood': 4, 'hide': 2}, 'output': 'blade', 'yield': 3, 'stack': 6},\n    {'ore': 20, 'wood': 13, 'hide': 16, 'herb': 2},\n    9,\n    120],\n   {'crafts': 3, 'made': 9, 'stacks': [6, 3], 'left': {'herb': 2, 'hide': 10, 'ore': 14, 'wood': 1}}),\n  ('regression material availability #4',\n   [{'inputs': {'gem': 4, 'ore': 2}, 'output': 'blade', 'yield': 1, 'stack': 9},\n    {'gem': 15, 'ore': 20, 'herb': 6},\n    12,\n    120],\n   {'crafts': 3, 'made': 3, 'stacks': [3], 'left': {'gem': 3, 'herb': 6, 'ore': 14}}),\n  ('zero request #1',\n   [{'inputs': {'hide': 2}, 'output': 'belt', 'yield': 1, 'stack': 3}, {'hide': 8}, 0, 80],\n   {'crafts': 0, 'made': 0, 'stacks': [], 'left': {'hide': 8}}),\n  ('control #1',\n   [{'inputs': {'hide': 3, 'ore': 1}, 'output': 'blade', 'yield': 1, 'stack': 5},\n    {'hide': 21, 'ore': 5},\n    3,\n    99],\n   {'crafts': 3, 'made': 3, 'stacks': [3], 'left': {'hide': 12, 'ore': 2}})],\n [('one short of a batch #1',\n   [{'inputs': {'ore': 3, 'wood': 2}, 'output': 'axe', 'yield': 2, 'stack': 4},\n    {'ore': 14, 'wood': 9, 'herb': 2},\n    9,\n    10],\n   {'crafts': 4, 'made': 8, 'stacks': [4, 4], 'left': {'herb': 2, 'ore': 2, 'wood': 1}}),\n  ('regression material availability #1',\n   [{'inputs': {'ore': 4}, 'output': 'blade', 'yield': 3, 'stack': 10}, {'ore': 6}, 2, 51],\n   {'crafts': 1, 'made': 3, 'stacks': [3], 'left': {'ore': 2}}),\n  ('regression material availability #2',\n   [{'inputs': {'wood': 2, 'hide': 3, 'gem': 3}, 'output': 'blade', 'yield': 3, 'stack': 7},\n    {'wood': 12, 'hide': 23, 'gem': 11},\n    4,\n    51],\n   {'crafts': 3, 'made': 9, 'stacks': [7, 2], 'left': {'gem': 2, 'hide': 14, 'wood': 6}}),\n  ('regression material availability #3',\n   [{'inputs': {'ore': 2, 'wood': 4, 'hide': 2}, 'output': 'blade', 'yield': 3, 'stack': 6},\n    {'ore': 20, 'wood': 13, 'hide': 16, 'herb': 2},\n    9,\n    120],\n   {'crafts': 3, 'made': 9, 'stacks': [6, 3], 'left': {'herb': 2, 'hide': 10, 'ore': 14, 'wood': 1}}),\n  ('regression material availability #4',\n   [{'inputs': {'gem': 4, 'ore': 2}, 'output': 'blade', 'yield': 1, 'stack': 9},\n    {'gem': 15, 'ore': 20, 'herb': 6},\n    12,\n    120],\n   {'crafts': 3, 'made': 3, 'stacks': [3], 'left': {'gem': 3, 'herb': 6, 'ore': 14}}),\n  ('zero request #1',\n   [{'inputs': {'hide': 2}, 'output': 'belt', 'yield': 1, 'stack': 3}, {'hide': 8}, 0, 80],\n   {'crafts': 0, 'made': 0, 'stacks': [], 'left': {'hide': 8}}),\n  ('control #1',\n   [{'inputs': {'ore': 4, 'gem': 4, 'hide': 4}, 'output': 'blade', 'yield': 2, 'stack': 7},\n    {'ore': 13, 'gem': 22, 'hide': 22, 'herb': 6},\n    2,\n    120],\n   {'crafts': 2, 'made': 4, 'stacks': [4], 'left': {'gem': 14, 'herb': 6, 'hide': 14, 'ore': 5}}),\n  ('control #2',\n   [{'inputs': {'gem': 2}, 'output': 'blade', 'yield': 3, 'stack': 9}, {'gem': 19}, 0, 120],\n   {'crafts': 0, 'made': 0, 'stacks': [], 'left': {'gem': 19}})],\n [('exact material multiple #1',\n   [{'inputs': {'ore': 3}, 'output': 'bar', 'yield': 1, 'stack': 5}, {'ore': 15}, 10, 50],\n   {'crafts': 5, 'made': 6, 'stacks': [5, 1], 'left': {'ore': 0}}),\n  ('one short of a batch #1',\n   [{'inputs': {'ore': 3, 'wood': 2}, 'output': 'axe', 'yield': 2, 'stack': 4},\n    {'ore': 14, 'wood': 9, 'herb': 2},\n    9,\n    10],\n   {'crafts': 4, 'made': 8, 'stacks': [4, 4], 'left': {'herb': 2, 'ore': 2, 'wood': 1}}),\n  ('regression material availability #1',\n   [{'inputs': {'ore': 2, 'wood': 4, 'hide': 2}, 'output': 'blade', 'yield': 3, 'stack': 6},\n    {'ore': 20, 'wood': 13, 'hide': 16, 'herb': 2},\n    9,\n    120],\n   {'crafts': 3, 'made': 9, 'stacks': [6, 3], 'left': {'herb': 2, 'hide': 10, 'ore': 14, 'wood': 1}}),\n  ('regression material availability #2',\n   [{'inputs': {'gem': 4, 'ore': 2}, 'output': 'blade', 'yield': 1, 'stack': 9},\n    {'gem': 15, 'ore': 20, 'herb': 6},\n    12,\n    120],\n   {'crafts': 3, 'made': 3, 'stacks': [3], 'left': {'gem': 3, 'herb': 6, 'ore': 14}}),\n  ('regression material availability #3',\n   [{'inputs': {'gem': 1, 'hide': 3}, 'output': 'blade', 'yield': 1, 'stack': 4},\n    {'gem': 2, 'hide': 5, 'herb': 8},\n    12,\n    99],\n   {'crafts': 1, 'made': 1, 'stacks': [1], 'left': {'gem': 1, 'herb': 8, 'hide': 2}}),\n  ('regression material availability #4',\n   [{'inputs': {'hide': 4}, 'output': 'blade', 'yield': 3, 'stack': 7}, {'hide': 15}, 7, 120],\n   {'crafts': 3, 'made': 9, 'stacks': [7, 2], 'left': {'hide': 3}}),\n  ('zero request #1',\n   [{'inputs': {'hide': 2}, 'output': 'belt', 'yield': 1, 'stack': 3}, {'hide': 8}, 0, 80],\n   {'crafts': 0, 'made': 0, 'stacks': [], 'left': {'hide': 8}}),\n  ('control #1',\n   [{'inputs': {'ore': 4, 'gem': 4, 'hide': 4}, 'output': 'blade', 'yield': 2, 'stack': 7},\n    {'ore': 13, 'gem': 22, 'hide': 22, 'herb': 6},\n    2,\n    120],\n   {'crafts': 2, 'made': 4, 'stacks': [4], 'left': {'gem': 14, 'herb': 6, 'hide': 14, 'ore': 5}})],\n [('one short of a batch #1',\n   [{'inputs': {'ore': 3, 'wood': 2}, 'output': 'axe', 'yield': 2, 'stack': 4},\n    {'ore': 14, 'wood': 9, 'herb': 2},\n    9,\n    10],\n   {'crafts': 4, 'made': 8, 'stacks': [4, 4], 'left': {'herb': 2, 'ore': 2, 'wood': 1}}),\n  ('regression material availability #1',\n   [{'inputs': {'gem': 1, 'hide': 3}, 'output': 'blade', 'yield': 1, 'stack': 4},\n    {'gem': 2, 'hide': 5, 'herb': 8},\n    12,\n    99],\n   {'crafts': 1, 'made': 1, 'stacks': [1], 'left': {'gem': 1, 'herb': 8, 'hide': 2}}),\n  ('fault site material availability #1',\n   [{'inputs': {'hide': 1, 'gem': 2, 'wood': 1}, 'output': 'blade', 'yield': 3, 'stack': 10},\n    {'hide': 28, 'gem': 10, 'wood': 23, 'herb': 6},\n    8,\n    120],\n   {'crafts': 5, 'made': 16, 'stacks': [10, 6], 'left': {'gem': 0, 'herb': 6, 'hide': 23, 'wood': 18}}),\n  ('regression material availability #2',\n   [{'inputs': {'hide': 4}, 'output': 'blade', 'yield': 3, 'stack': 7}, {'hide': 15}, 7, 120],\n   {'crafts': 3, 'made': 9, 'stacks': [7, 2], 'left': {'hide': 3}}),\n  ('regression material availability #3',\n   [{'inputs': {'ore': 2}, 'output': 'blade', 'yield': 3, 'stack': 8}, {'ore': 23, 'herb': 5}, 12, 99],\n   {'crafts': 11, 'made': 35, 'stacks': [8, 8, 8, 8, 3], 'left': {'herb': 5, 'ore': 1}}),\n  ('zero request #1',\n   [{'inputs': {'hide': 2}, 'output': 'belt', 'yield': 1, 'stack': 3}, {'hide': 8}, 0, 80],\n   {'crafts': 0, 'made': 0, 'stacks': [], 'left': {'hide': 8}}),\n  ('control #1',\n   [{'inputs': {'wood': 1, 'ore': 3, 'gem': 1}, 'output': 'blade', 'yield': 3, 'stack': 9},\n    {'wood': 2, 'ore': 29, 'gem': 5, 'herb': 7},\n    11,\n    0],\n   {'crafts': 2, 'made': 6, 'stacks': [6], 'left': {'gem': 3, 'herb': 7, 'ore': 23, 'wood': 0}}),\n  ('control #2',\n   [{'inputs': {'gem': 3, 'hide': 4}, 'output': 'blade', 'yield': 3, 'stack': 6},\n    {'gem': 16, 'hide': 29},\n    0,\n    100],\n   {'crafts': 0, 'made': 0, 'stacks': [], 'left': {'gem': 16, 'hide': 29}})],\n [('exact material multiple #1',\n   [{'inputs': {'ore': 3}, 'output': 'bar', 'yield': 1, 'stack': 5}, {'ore': 15}, 10, 50],\n   {'crafts': 5, 'made': 6, 'stacks': [5, 1], 'left': {'ore': 0}}),\n  ('one short of a batch #1',\n   [{'inputs': {'ore': 3, 'wood': 2}, 'output': 'axe', 'yield': 2, 'stack': 4},\n    {'ore': 14, 'wood': 9, 'herb': 2},\n    9,\n    10],\n   {'crafts': 4, 'made': 8, 'stacks': [4, 4], 'left': {'herb': 2, 'ore': 2, 'wood': 1}}),\n  ('fault site material availability #1',\n   [{'inputs': {'hide': 1, 'gem': 3, 'ore': 2}, 'output': 'blade', 'yield': 2, 'stack': 3},\n    {'hide': 4, 'gem': 10, 'ore': 4, 'herb': 8},\n    8,\n    120],\n   {'crafts': 2, 'made': 4, 'stacks': [3, 1], 'left': {'gem': 4, 'herb': 8, 'hide': 2, 'ore': 0}}),\n  ('regression material availability #1',\n   [{'inputs': {'hide': 4}, 'output': 'blade', 'yield': 3, 'stack': 7}, {'hide': 15}, 7, 120],\n   {'crafts': 3, 'made': 9, 'stacks': [7, 2], 'left': {'hide': 3}}),\n  ('regression material availability #2',\n   [{'inputs': {'ore': 2, 'hide': 4, 'wood': 1}, 'output': 'blade', 'yield': 1, 'stack': 9},\n    {'ore': 3, 'hide': 11, 'wood': 24, 'herb': 7},\n    9,\n    99],\n   {'crafts': 1, 'made': 1, 'stacks': [1], 'left': {'herb': 7, 'hide': 7, 'ore': 1, 'wood': 23}}),\n  ('regression material availability #3',\n   [{'inputs': {'gem': 4, 'wood': 3, 'hide': 3}, 'output': 'blade', 'yield': 2, 'stack': 3},\n    {'gem': 11, 'wood': 22, 'hide': 5, 'herb': 1},\n    11,\n    50],\n   {'crafts': 1, 'made': 2, 'stacks': [2], 'left': {'gem': 7, 'herb': 1, 'hide': 2, 'wood': 19}}),\n  ('zero request #1',\n   [{'inputs': {'hide': 2}, 'output': 'belt', 'yield': 1, 'stack': 3}, {'hide': 8}, 0, 80],\n   {'crafts': 0, 'made': 0, 'stacks': [], 'left': {'hide': 8}}),\n  ('control #1',\n   [{'inputs': {'gem': 1, 'hide': 3, 'ore': 4}, 'output': 'blade', 'yield': 1, 'stack': 6},\n    {'gem': 15, 'hide': 15, 'ore': 26},\n    2,\n    49],\n   {'crafts': 2, 'made': 2, 'stacks': [2], 'left': {'gem': 13, 'hide': 9, 'ore': 18}})]]\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":"ef687b1480411488ddc1c1e48676698603ee1b7870fd598297af53e99455d10a","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(recipe, inventory, requested, skill):\n    if requested <= 0:\n        crafts = 0\n    else:\n        crafts = requested\n        for mat, qty in recipe['inputs'].items():\n            crafts = min(crafts, inventory.get(mat, 0) // qty)\n    bonus = crafts // 5 if skill >= 50 else 0\n    made = crafts * recipe['yield'] + bonus\n    cap = recipe['stack']\n    stacks = [cap] * (made // cap)\n    if made % cap:\n        stacks.append(made % cap)\n    left = dict(inventory)\n    for mat, qty in recipe['inputs'].items():\n        left[mat] = left.get(mat, 0) - crafts * qty\n    return {'crafts': crafts, 'made': made, 'stacks': stacks, 'left': dict(sorted(left.items()))}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = [[('exact material multiple #1',\n   [{'inputs': {'ore': 3}, 'output': 'bar', 'yield': 1, 'stack': 5}, {'ore': 15}, 10, 50],\n   {'crafts': 5, 'made': 6, 'stacks': [5, 1], 'left': {'ore': 0}}),\n  ('one short of a batch #1',\n   [{'inputs': {'ore': 3, 'wood': 2}, 'output': 'axe', 'yield': 2, 'stack': 4},\n    {'ore': 14, 'wood': 9, 'herb': 2},\n    9,\n    10],\n   {'crafts': 4, 'made': 8, 'stacks': [4, 4], 'left': {'herb': 2, 'ore': 2, 'wood': 1}}),\n  ('regression material availability #1',\n   [{'inputs': {'ore': 4}, 'output': 'blade', 'yield': 3, 'stack': 10}, {'ore': 6}, 2, 51],\n   {'crafts': 1, 'made': 3, 'stacks': [3], 'left': {'ore': 2}}),\n  ('regression material availability #2',\n   [{'inputs': {'wood': 2, 'hide': 3, 'gem': 3}, 'output': 'blade', 'yield': 3, 'stack': 7},\n    {'wood': 12, 'hide': 23, 'gem': 11},\n    4,\n    51],\n   {'crafts': 3, 'made': 9, 'stacks': [7, 2], 'left': {'gem': 2, 'hide': 14, 'wood': 6}}),\n  ('regression material availability #3',\n   [{'inputs': {'ore': 2, 'wood': 4, 'hide': 2}, 'output': 'blade', 'yield': 3, 'stack': 6},\n    {'ore': 20, 'wood': 13, 'hide': 16, 'herb': 2},\n    9,\n    120],\n   {'crafts': 3, 'made': 9, 'stacks': [6, 3], 'left': {'herb': 2, 'hide': 10, 'ore': 14, 'wood': 1}}),\n  ('regression material availability #4',\n   [{'inputs': {'gem': 4, 'ore': 2}, 'output': 'blade', 'yield': 1, 'stack': 9},\n    {'gem': 15, 'ore': 20, 'herb': 6},\n    12,\n    120],\n   {'crafts': 3, 'made': 3, 'stacks': [3], 'left': {'gem': 3, 'herb': 6, 'ore': 14}}),\n  ('zero request #1',\n   [{'inputs': {'hide': 2}, 'output': 'belt', 'yield': 1, 'stack': 3}, {'hide': 8}, 0, 80],\n   {'crafts': 0, 'made': 0, 'stacks': [], 'left': {'hide': 8}}),\n  ('control #1',\n   [{'inputs': {'hide': 3, 'ore': 1}, 'output': 'blade', 'yield': 1, 'stack': 5},\n    {'hide': 21, 'ore': 5},\n    3,\n    99],\n   {'crafts': 3, 'made': 3, 'stacks': [3], 'left': {'hide': 12, 'ore': 2}})],\n [('one short of a batch #1',\n   [{'inputs': {'ore': 3, 'wood': 2}, 'output': 'axe', 'yield': 2, 'stack': 4},\n    {'ore': 14, 'wood': 9, 'herb': 2},\n    9,\n    10],\n   {'crafts': 4, 'made': 8, 'stacks': [4, 4], 'left': {'herb': 2, 'ore': 2, 'wood': 1}}),\n  ('regression material availability #1',\n   [{'inputs': {'ore': 4}, 'output': 'blade', 'yield': 3, 'stack': 10}, {'ore': 6}, 2, 51],\n   {'crafts': 1, 'made': 3, 'stacks': [3], 'left': {'ore': 2}}),\n  ('regression material availability #2',\n   [{'inputs': {'wood': 2, 'hide': 3, 'gem': 3}, 'output': 'blade', 'yield': 3, 'stack': 7},\n    {'wood': 12, 'hide': 23, 'gem': 11},\n    4,\n    51],\n   {'crafts': 3, 'made': 9, 'stacks': [7, 2], 'left': {'gem': 2, 'hide': 14, 'wood': 6}}),\n  ('regression material availability #3',\n   [{'inputs': {'ore': 2, 'wood': 4, 'hide': 2}, 'output': 'blade', 'yield': 3, 'stack': 6},\n    {'ore': 20, 'wood': 13, 'hide': 16, 'herb': 2},\n    9,\n    120],\n   {'crafts': 3, 'made': 9, 'stacks': [6, 3], 'left': {'herb': 2, 'hide': 10, 'ore': 14, 'wood': 1}}),\n  ('regression material availability #4',\n   [{'inputs': {'gem': 4, 'ore': 2}, 'output': 'blade', 'yield': 1, 'stack': 9},\n    {'gem': 15, 'ore': 20, 'herb': 6},\n    12,\n    120],\n   {'crafts': 3, 'made': 3, 'stacks': [3], 'left': {'gem': 3, 'herb': 6, 'ore': 14}}),\n  ('zero request #1',\n   [{'inputs': {'hide': 2}, 'output': 'belt', 'yield': 1, 'stack': 3}, {'hide': 8}, 0, 80],\n   {'crafts': 0, 'made': 0, 'stacks': [], 'left': {'hide': 8}}),\n  ('control #1',\n   [{'inputs': {'ore': 4, 'gem': 4, 'hide': 4}, 'output': 'blade', 'yield': 2, 'stack': 7},\n    {'ore': 13, 'gem': 22, 'hide': 22, 'herb': 6},\n    2,\n    120],\n   {'crafts': 2, 'made': 4, 'stacks': [4], 'left': {'gem': 14, 'herb': 6, 'hide': 14, 'ore': 5}}),\n  ('control #2',\n   [{'inputs': {'gem': 2}, 'output': 'blade', 'yield': 3, 'stack': 9}, {'gem': 19}, 0, 120],\n   {'crafts': 0, 'made': 0, 'stacks': [], 'left': {'gem': 19}})],\n [('exact material multiple #1',\n   [{'inputs': {'ore': 3}, 'output': 'bar', 'yield': 1, 'stack': 5}, {'ore': 15}, 10, 50],\n   {'crafts': 5, 'made': 6, 'stacks': [5, 1], 'left': {'ore': 0}}),\n  ('one short of a batch #1',\n   [{'inputs': {'ore': 3, 'wood': 2}, 'output': 'axe', 'yield': 2, 'stack': 4},\n    {'ore': 14, 'wood': 9, 'herb': 2},\n    9,\n    10],\n   {'crafts': 4, 'made': 8, 'stacks': [4, 4], 'left': {'herb': 2, 'ore': 2, 'wood': 1}}),\n  ('regression material availability #1',\n   [{'inputs': {'ore': 2, 'wood': 4, 'hide': 2}, 'output': 'blade', 'yield': 3, 'stack': 6},\n    {'ore': 20, 'wood': 13, 'hide': 16, 'herb': 2},\n    9,\n    120],\n   {'crafts': 3, 'made': 9, 'stacks': [6, 3], 'left': {'herb': 2, 'hide': 10, 'ore': 14, 'wood': 1}}),\n  ('regression material availability #2',\n   [{'inputs': {'gem': 4, 'ore': 2}, 'output': 'blade', 'yield': 1, 'stack': 9},\n    {'gem': 15, 'ore': 20, 'herb': 6},\n    12,\n    120],\n   {'crafts': 3, 'made': 3, 'stacks': [3], 'left': {'gem': 3, 'herb': 6, 'ore': 14}}),\n  ('regression material availability #3',\n   [{'inputs': {'gem': 1, 'hide': 3}, 'output': 'blade', 'yield': 1, 'stack': 4},\n    {'gem': 2, 'hide': 5, 'herb': 8},\n    12,\n    99],\n   {'crafts': 1, 'made': 1, 'stacks': [1], 'left': {'gem': 1, 'herb': 8, 'hide': 2}}),\n  ('regression material availability #4',\n   [{'inputs': {'hide': 4}, 'output': 'blade', 'yield': 3, 'stack': 7}, {'hide': 15}, 7, 120],\n   {'crafts': 3, 'made': 9, 'stacks': [7, 2], 'left': {'hide': 3}}),\n  ('zero request #1',\n   [{'inputs': {'hide': 2}, 'output': 'belt', 'yield': 1, 'stack': 3}, {'hide': 8}, 0, 80],\n   {'crafts': 0, 'made': 0, 'stacks': [], 'left': {'hide': 8}}),\n  ('control #1',\n   [{'inputs': {'ore': 4, 'gem': 4, 'hide': 4}, 'output': 'blade', 'yield': 2, 'stack': 7},\n    {'ore': 13, 'gem': 22, 'hide': 22, 'herb': 6},\n    2,\n    120],\n   {'crafts': 2, 'made': 4, 'stacks': [4], 'left': {'gem': 14, 'herb': 6, 'hide': 14, 'ore': 5}})],\n [('one short of a batch #1',\n   [{'inputs': {'ore': 3, 'wood': 2}, 'output': 'axe', 'yield': 2, 'stack': 4},\n    {'ore': 14, 'wood': 9, 'herb': 2},\n    9,\n    10],\n   {'crafts': 4, 'made': 8, 'stacks': [4, 4], 'left': {'herb': 2, 'ore': 2, 'wood': 1}}),\n  ('regression material availability #1',\n   [{'inputs': {'gem': 1, 'hide': 3}, 'output': 'blade', 'yield': 1, 'stack': 4},\n    {'gem': 2, 'hide': 5, 'herb': 8},\n    12,\n    99],\n   {'crafts': 1, 'made': 1, 'stacks': [1], 'left': {'gem': 1, 'herb': 8, 'hide': 2}}),\n  ('fault site material availability #1',\n   [{'inputs': {'hide': 1, 'gem': 2, 'wood': 1}, 'output': 'blade', 'yield': 3, 'stack': 10},\n    {'hide': 28, 'gem': 10, 'wood': 23, 'herb': 6},\n    8,\n    120],\n   {'crafts': 5, 'made': 16, 'stacks': [10, 6], 'left': {'gem': 0, 'herb': 6, 'hide': 23, 'wood': 18}}),\n  ('regression material availability #2',\n   [{'inputs': {'hide': 4}, 'output': 'blade', 'yield': 3, 'stack': 7}, {'hide': 15}, 7, 120],\n   {'crafts': 3, 'made': 9, 'stacks': [7, 2], 'left': {'hide': 3}}),\n  ('regression material availability #3',\n   [{'inputs': {'ore': 2}, 'output': 'blade', 'yield': 3, 'stack': 8}, {'ore': 23, 'herb': 5}, 12, 99],\n   {'crafts': 11, 'made': 35, 'stacks': [8, 8, 8, 8, 3], 'left': {'herb': 5, 'ore': 1}}),\n  ('zero request #1',\n   [{'inputs': {'hide': 2}, 'output': 'belt', 'yield': 1, 'stack': 3}, {'hide': 8}, 0, 80],\n   {'crafts': 0, 'made': 0, 'stacks': [], 'left': {'hide': 8}}),\n  ('control #1',\n   [{'inputs': {'wood': 1, 'ore': 3, 'gem': 1}, 'output': 'blade', 'yield': 3, 'stack': 9},\n    {'wood': 2, 'ore': 29, 'gem': 5, 'herb': 7},\n    11,\n    0],\n   {'crafts': 2, 'made': 6, 'stacks': [6], 'left': {'gem': 3, 'herb': 7, 'ore': 23, 'wood': 0}}),\n  ('control #2',\n   [{'inputs': {'gem': 3, 'hide': 4}, 'output': 'blade', 'yield': 3, 'stack': 6},\n    {'gem': 16, 'hide': 29},\n    0,\n    100],\n   {'crafts': 0, 'made': 0, 'stacks': [], 'left': {'gem': 16, 'hide': 29}})],\n [('exact material multiple #1',\n   [{'inputs': {'ore': 3}, 'output': 'bar', 'yield': 1, 'stack': 5}, {'ore': 15}, 10, 50],\n   {'crafts': 5, 'made': 6, 'stacks': [5, 1], 'left': {'ore': 0}}),\n  ('one short of a batch #1',\n   [{'inputs': {'ore': 3, 'wood': 2}, 'output': 'axe', 'yield': 2, 'stack': 4},\n    {'ore': 14, 'wood': 9, 'herb': 2},\n    9,\n    10],\n   {'crafts': 4, 'made': 8, 'stacks': [4, 4], 'left': {'herb': 2, 'ore': 2, 'wood': 1}}),\n  ('fault site material availability #1',\n   [{'inputs': {'hide': 1, 'gem': 3, 'ore': 2}, 'output': 'blade', 'yield': 2, 'stack': 3},\n    {'hide': 4, 'gem': 10, 'ore': 4, 'herb': 8},\n    8,\n    120],\n   {'crafts': 2, 'made': 4, 'stacks': [3, 1], 'left': {'gem': 4, 'herb': 8, 'hide': 2, 'ore': 0}}),\n  ('regression material availability #1',\n   [{'inputs': {'hide': 4}, 'output': 'blade', 'yield': 3, 'stack': 7}, {'hide': 15}, 7, 120],\n   {'crafts': 3, 'made': 9, 'stacks': [7, 2], 'left': {'hide': 3}}),\n  ('regression material availability #2',\n   [{'inputs': {'ore': 2, 'hide': 4, 'wood': 1}, 'output': 'blade', 'yield': 1, 'stack': 9},\n    {'ore': 3, 'hide': 11, 'wood': 24, 'herb': 7},\n    9,\n    99],\n   {'crafts': 1, 'made': 1, 'stacks': [1], 'left': {'herb': 7, 'hide': 7, 'ore': 1, 'wood': 23}}),\n  ('regression material availability #3',\n   [{'inputs': {'gem': 4, 'wood': 3, 'hide': 3}, 'output': 'blade', 'yield': 2, 'stack': 3},\n    {'gem': 11, 'wood': 22, 'hide': 5, 'herb': 1},\n    11,\n    50],\n   {'crafts': 1, 'made': 2, 'stacks': [2], 'left': {'gem': 7, 'herb': 1, 'hide': 2, 'wood': 19}}),\n  ('zero request #1',\n   [{'inputs': {'hide': 2}, 'output': 'belt', 'yield': 1, 'stack': 3}, {'hide': 8}, 0, 80],\n   {'crafts': 0, 'made': 0, 'stacks': [], 'left': {'hide': 8}}),\n  ('control #1',\n   [{'inputs': {'gem': 1, 'hide': 3, 'ore': 4}, 'output': 'blade', 'yield': 1, 'stack': 6},\n    {'gem': 15, 'hide': 15, 'ore': 26},\n    2,\n    49],\n   {'crafts': 2, 'made': 2, 'stacks': [2], 'left': {'gem': 13, 'hide': 9, 'ore': 18}})]]\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-batch-craft-material-availability","generated_at":"2026-09-29T14:50:44.178397+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 `inventory.get(mat, 0) // qty` at the material availability step.","root_cause":"The per-input craft limit uses the raw material count instead of dividing by the recipe quantity.","sha256":"ff9d815ed28ed50e8314c8b40390d48978af45a00691960e2919aeeb6bb19edc","title":"Batch crafting: Available crafts count raw material units · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":44.246,"exit_code":1,"observations":[{"actual":{"crafts":5,"left":{"ore":0},"made":6,"stacks":[5,1]},"check":"exact material multiple #1","expected":{"crafts":5,"left":{"ore":0},"made":6,"stacks":[5,1]},"passed":true},{"actual":{"crafts":5,"left":{"herb":2,"ore":-1,"wood":-1},"made":10,"stacks":[4,4,2]},"check":"one short of a batch #1","expected":{"crafts":4,"left":{"herb":2,"ore":2,"wood":1},"made":8,"stacks":[4,4]},"passed":false},{"actual":{"crafts":2,"left":{"ore":-2},"made":6,"stacks":[6]},"check":"regression material availability #1","expected":{"crafts":1,"left":{"ore":2},"made":3,"stacks":[3]},"passed":false},{"actual":{"crafts":4,"left":{"gem":-1,"hide":11,"wood":4},"made":12,"stacks":[7,5]},"check":"regression material availability #2","expected":{"crafts":3,"left":{"gem":2,"hide":14,"wood":6},"made":9,"stacks":[7,2]},"passed":false},{"actual":{"crafts":4,"left":{"herb":2,"hide":8,"ore":12,"wood":-3},"made":12,"stacks":[6,6]},"check":"regression material availability #3","expected":{"crafts":3,"left":{"herb":2,"hide":10,"ore":14,"wood":1},"made":9,"stacks":[6,3]},"passed":false},{"actual":{"crafts":4,"left":{"gem":-1,"herb":6,"ore":12},"made":4,"stacks":[4]},"check":"regression material availability #4","expected":{"crafts":3,"left":{"gem":3,"herb":6,"ore":14},"made":3,"stacks":[3]},"passed":false},{"actual":{"crafts":0,"left":{"hide":8},"made":0,"stacks":[]},"check":"zero request #1","expected":{"crafts":0,"left":{"hide":8},"made":0,"stacks":[]},"passed":true},{"actual":{"crafts":3,"left":{"hide":12,"ore":2},"made":3,"stacks":[3]},"check":"control #1","expected":{"crafts":3,"left":{"hide":12,"ore":2},"made":3,"stacks":[3]},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"exact material multiple #1\", \"actual\": {\"crafts\": 5, \"made\": 6, \"stacks\": [5, 1], \"left\": {\"ore\": 0}}, \"expected\": {\"crafts\": 5, \"made\": 6, \"stacks\": [5, 1], \"left\": {\"ore\": 0}}, \"passed\": true}, {\"check\": \"one short of a batch #1\", \"actual\": {\"crafts\": 5, \"made\": 10, \"stacks\": [4, 4, 2], \"left\": {\"herb\": 2, \"ore\": -1, \"wood\": -1}}, \"expected\": {\"crafts\": 4, \"made\": 8, \"stacks\": [4, 4], \"left\": {\"herb\": 2, \"ore\": 2, \"wood\": 1}}, \"passed\": false}, {\"check\": \"regression material availability #1\", \"actual\": {\"crafts\": 2, \"made\": 6, \"stacks\": [6], \"left\": {\"ore\": -2}}, \"expected\": {\"crafts\": 1, \"made\": 3, \"stacks\": [3], \"left\": {\"ore\": 2}}, \"passed\": false}, {\"check\": \"regression material availability #2\", \"actual\": {\"crafts\": 4, \"made\": 12, \"stacks\": [7, 5], \"left\": {\"gem\": -1, \"hide\": 11, \"wood\": 4}}, \"expected\": {\"crafts\": 3, \"made\": 9, \"stacks\": [7, 2], \"left\": {\"gem\": 2, \"hide\": 14, \"wood\": 6}}, \"passed\": false}, {\"check\": \"regression material availability #3\", \"actual\": {\"crafts\": 4, \"made\": 12, \"stacks\": [6, 6], \"left\": {\"herb\": 2, \"hide\": 8, \"ore\": 12, \"wood\": -3}}, \"expected\": {\"crafts\": 3, \"made\": 9, \"stacks\": [6, 3], \"left\": {\"herb\": 2, \"hide\": 10, \"ore\": 14, \"wood\": 1}}, \"passed\": false}, {\"check\": \"regression material availability #4\", \"actual\": {\"crafts\": 4, \"made\": 4, \"stacks\": [4], \"left\": {\"gem\": -1, \"herb\": 6, \"ore\": 12}}, \"expected\": {\"crafts\": 3, \"made\": 3, \"stacks\": [3], \"left\": {\"gem\": 3, \"herb\": 6, \"ore\": 14}}, \"passed\": false}, {\"check\": \"zero request #1\", \"actual\": {\"crafts\": 0, \"made\": 0, \"stacks\": [], \"left\": {\"hide\": 8}}, \"expected\": {\"crafts\": 0, \"made\": 0, \"stacks\": [], \"left\": {\"hide\": 8}}, \"passed\": true}, {\"check\": \"control #1\", \"actual\": {\"crafts\": 3, \"made\": 3, \"stacks\": [3], \"left\": {\"hide\": 12, \"ore\": 2}}, \"expected\": {\"crafts\": 3, \"made\": 3, \"stacks\": [3], \"left\": {\"hide\": 12, \"ore\": 2}}, \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":44.371,"exit_code":1,"observations":[{"actual":{"crafts":10,"left":{"ore":-15},"made":12,"stacks":[5,5,2]},"check":"exact material multiple #1","expected":{"crafts":5,"left":{"ore":0},"made":6,"stacks":[5,1]},"passed":false},{"actual":{"crafts":9,"left":{"herb":2,"ore":-13,"wood":-9},"made":18,"stacks":[4,4,4,4,2]},"check":"one short of a batch #1","expected":{"crafts":4,"left":{"herb":2,"ore":2,"wood":1},"made":8,"stacks":[4,4]},"passed":false},{"actual":{"crafts":2,"left":{"ore":-2},"made":6,"stacks":[6]},"check":"regression material availability #1","expected":{"crafts":1,"left":{"ore":2},"made":3,"stacks":[3]},"passed":false},{"actual":{"crafts":4,"left":{"gem":-1,"hide":11,"wood":4},"made":12,"stacks":[7,5]},"check":"regression material availability #2","expected":{"crafts":3,"left":{"gem":2,"hide":14,"wood":6},"made":9,"stacks":[7,2]},"passed":false},{"actual":{"crafts":9,"left":{"herb":2,"hide":-2,"ore":2,"wood":-23},"made":28,"stacks":[6,6,6,6,4]},"check":"regression material availability #3","expected":{"crafts":3,"left":{"herb":2,"hide":10,"ore":14,"wood":1},"made":9,"stacks":[6,3]},"passed":false},{"actual":{"crafts":12,"left":{"gem":-33,"herb":6,"ore":-4},"made":14,"stacks":[9,5]},"check":"regression material availability #4","expected":{"crafts":3,"left":{"gem":3,"herb":6,"ore":14},"made":3,"stacks":[3]},"passed":false},{"actual":{"crafts":0,"left":{"hide":8},"made":0,"stacks":[]},"check":"zero request #1","expected":{"crafts":0,"left":{"hide":8},"made":0,"stacks":[]},"passed":true},{"actual":{"crafts":3,"left":{"hide":12,"ore":2},"made":3,"stacks":[3]},"check":"control #1","expected":{"crafts":3,"left":{"hide":12,"ore":2},"made":3,"stacks":[3]},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"exact material multiple #1\", \"actual\": {\"crafts\": 10, \"made\": 12, \"stacks\": [5, 5, 2], \"left\": {\"ore\": -15}}, \"expected\": {\"crafts\": 5, \"made\": 6, \"stacks\": [5, 1], \"left\": {\"ore\": 0}}, \"passed\": false}, {\"check\": \"one short of a batch #1\", \"actual\": {\"crafts\": 9, \"made\": 18, \"stacks\": [4, 4, 4, 4, 2], \"left\": {\"herb\": 2, \"ore\": -13, \"wood\": -9}}, \"expected\": {\"crafts\": 4, \"made\": 8, \"stacks\": [4, 4], \"left\": {\"herb\": 2, \"ore\": 2, \"wood\": 1}}, \"passed\": false}, {\"check\": \"regression material availability #1\", \"actual\": {\"crafts\": 2, \"made\": 6, \"stacks\": [6], \"left\": {\"ore\": -2}}, \"expected\": {\"crafts\": 1, \"made\": 3, \"stacks\": [3], \"left\": {\"ore\": 2}}, \"passed\": false}, {\"check\": \"regression material availability #2\", \"actual\": {\"crafts\": 4, \"made\": 12, \"stacks\": [7, 5], \"left\": {\"gem\": -1, \"hide\": 11, \"wood\": 4}}, \"expected\": {\"crafts\": 3, \"made\": 9, \"stacks\": [7, 2], \"left\": {\"gem\": 2, \"hide\": 14, \"wood\": 6}}, \"passed\": false}, {\"check\": \"regression material availability #3\", \"actual\": {\"crafts\": 9, \"made\": 28, \"stacks\": [6, 6, 6, 6, 4], \"left\": {\"herb\": 2, \"hide\": -2, \"ore\": 2, \"wood\": -23}}, \"expected\": {\"crafts\": 3, \"made\": 9, \"stacks\": [6, 3], \"left\": {\"herb\": 2, \"hide\": 10, \"ore\": 14, \"wood\": 1}}, \"passed\": false}, {\"check\": \"regression material availability #4\", \"actual\": {\"crafts\": 12, \"made\": 14, \"stacks\": [9, 5], \"left\": {\"gem\": -33, \"herb\": 6, \"ore\": -4}}, \"expected\": {\"crafts\": 3, \"made\": 3, \"stacks\": [3], \"left\": {\"gem\": 3, \"herb\": 6, \"ore\": 14}}, \"passed\": false}, {\"check\": \"zero request #1\", \"actual\": {\"crafts\": 0, \"made\": 0, \"stacks\": [], \"left\": {\"hide\": 8}}, \"expected\": {\"crafts\": 0, \"made\": 0, \"stacks\": [], \"left\": {\"hide\": 8}}, \"passed\": true}, {\"check\": \"control #1\", \"actual\": {\"crafts\": 3, \"made\": 3, \"stacks\": [3], \"left\": {\"hide\": 12, \"ore\": 2}}, \"expected\": {\"crafts\": 3, \"made\": 3, \"stacks\": [3], \"left\": {\"hide\": 12, \"ore\": 2}}, \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":42.857,"exit_code":0,"observations":[{"actual":{"crafts":5,"left":{"ore":0},"made":6,"stacks":[5,1]},"check":"exact material multiple #1","expected":{"crafts":5,"left":{"ore":0},"made":6,"stacks":[5,1]},"passed":true},{"actual":{"crafts":4,"left":{"herb":2,"ore":2,"wood":1},"made":8,"stacks":[4,4]},"check":"one short of a batch #1","expected":{"crafts":4,"left":{"herb":2,"ore":2,"wood":1},"made":8,"stacks":[4,4]},"passed":true},{"actual":{"crafts":1,"left":{"ore":2},"made":3,"stacks":[3]},"check":"regression material availability #1","expected":{"crafts":1,"left":{"ore":2},"made":3,"stacks":[3]},"passed":true},{"actual":{"crafts":3,"left":{"gem":2,"hide":14,"wood":6},"made":9,"stacks":[7,2]},"check":"regression material availability #2","expected":{"crafts":3,"left":{"gem":2,"hide":14,"wood":6},"made":9,"stacks":[7,2]},"passed":true},{"actual":{"crafts":3,"left":{"herb":2,"hide":10,"ore":14,"wood":1},"made":9,"stacks":[6,3]},"check":"regression material availability #3","expected":{"crafts":3,"left":{"herb":2,"hide":10,"ore":14,"wood":1},"made":9,"stacks":[6,3]},"passed":true},{"actual":{"crafts":3,"left":{"gem":3,"herb":6,"ore":14},"made":3,"stacks":[3]},"check":"regression material availability #4","expected":{"crafts":3,"left":{"gem":3,"herb":6,"ore":14},"made":3,"stacks":[3]},"passed":true},{"actual":{"crafts":0,"left":{"hide":8},"made":0,"stacks":[]},"check":"zero request #1","expected":{"crafts":0,"left":{"hide":8},"made":0,"stacks":[]},"passed":true},{"actual":{"crafts":3,"left":{"hide":12,"ore":2},"made":3,"stacks":[3]},"check":"control #1","expected":{"crafts":3,"left":{"hide":12,"ore":2},"made":3,"stacks":[3]},"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"exact material multiple #1\", \"actual\": {\"crafts\": 5, \"made\": 6, \"stacks\": [5, 1], \"left\": {\"ore\": 0}}, \"expected\": {\"crafts\": 5, \"made\": 6, \"stacks\": [5, 1], \"left\": {\"ore\": 0}}, \"passed\": true}, {\"check\": \"one short of a batch #1\", \"actual\": {\"crafts\": 4, \"made\": 8, \"stacks\": [4, 4], \"left\": {\"herb\": 2, \"ore\": 2, \"wood\": 1}}, \"expected\": {\"crafts\": 4, \"made\": 8, \"stacks\": [4, 4], \"left\": {\"herb\": 2, \"ore\": 2, \"wood\": 1}}, \"passed\": true}, {\"check\": \"regression material availability #1\", \"actual\": {\"crafts\": 1, \"made\": 3, \"stacks\": [3], \"left\": {\"ore\": 2}}, \"expected\": {\"crafts\": 1, \"made\": 3, \"stacks\": [3], \"left\": {\"ore\": 2}}, \"passed\": true}, {\"check\": \"regression material availability #2\", \"actual\": {\"crafts\": 3, \"made\": 9, \"stacks\": [7, 2], \"left\": {\"gem\": 2, \"hide\": 14, \"wood\": 6}}, \"expected\": {\"crafts\": 3, \"made\": 9, \"stacks\": [7, 2], \"left\": {\"gem\": 2, \"hide\": 14, \"wood\": 6}}, \"passed\": true}, {\"check\": \"regression material availability #3\", \"actual\": {\"crafts\": 3, \"made\": 9, \"stacks\": [6, 3], \"left\": {\"herb\": 2, \"hide\": 10, \"ore\": 14, \"wood\": 1}}, \"expected\": {\"crafts\": 3, \"made\": 9, \"stacks\": [6, 3], \"left\": {\"herb\": 2, \"hide\": 10, \"ore\": 14, \"wood\": 1}}, \"passed\": true}, {\"check\": \"regression material availability #4\", \"actual\": {\"crafts\": 3, \"made\": 3, \"stacks\": [3], \"left\": {\"gem\": 3, \"herb\": 6, \"ore\": 14}}, \"expected\": {\"crafts\": 3, \"made\": 3, \"stacks\": [3], \"left\": {\"gem\": 3, \"herb\": 6, \"ore\": 14}}, \"passed\": true}, {\"check\": \"zero request #1\", \"actual\": {\"crafts\": 0, \"made\": 0, \"stacks\": [], \"left\": {\"hide\": 8}}, \"expected\": {\"crafts\": 0, \"made\": 0, \"stacks\": [], \"left\": {\"hide\": 8}}, \"passed\": true}, {\"check\": \"control #1\", \"actual\": {\"crafts\": 3, \"made\": 3, \"stacks\": [3], \"left\": {\"hide\": 12, \"ore\": 2}}, \"expected\": {\"crafts\": 3, \"made\": 3, \"stacks\": [3], \"left\": {\"hide\": 12, \"ore\": 2}}, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}