{"abstract":"An impossible ending count larger than purchases alone is rejected, even though beginning units make it valid.","category":"Inventory cost layering","checks":9,"contract":"Input {begin:[[qty,unit]] oldest first, purchases:[[qty,unit]] chronological, ending_qty}. Ending inventory keeps the oldest units: if ending_qty covers the base, all base layers stay and one increment layer is priced at the EARLIEST purchases of the year; otherwise the newest base layers are liquidated. ending_qty outside [0, available] returns {\"error\"}. Return {layers:[[qty,value]], ending_value, cogs}.","evaluation_group":"w2-inventory-cost-layering-periodic-lifo-increment","failed_approach":"Using beginning units alone rejects any count that relies on purchases.","family":"w2-inventory-cost-layering-periodic-lifo-increment-available-quantity-bound","id":"FA-59881","implementations":{"attempt":{"sha256":"b2e4e4626111d002b07aa78a4b102bcdbf2970c72006e29bef9b11eaad6a461e","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    begin = [list(l) for l in x['begin']]\n    purchases = x['purchases']\n    end_q = x['ending_qty']\n    base_q = sum(l[0] for l in begin)\n    buy_q = sum(p[0] for p in purchases)\n    avail = base_q\n    if end_q < 0 or end_q > avail:\n        return {'error': 'invalid ending quantity'}\n    layers = []\n    if end_q >= base_q:\n        layers = [[q, q * c] for q, c in begin]\n        inc = end_q - base_q\n        new_q = 0\n        new_v = 0\n        for q, c in purchases:\n            if inc == 0:\n                break\n            take = min(inc, q)\n            new_q += take\n            new_v += take * c\n            inc -= take\n        if new_q > 0:\n            layers.append([new_q, new_v])\n    else:\n        rem = end_q\n        for bq, bc in begin:\n            take = min(rem, bq)\n            if take > 0:\n                layers.append([take, take * bc])\n            rem -= take\n    begin_value = sum(q * c for q, c in begin)\n    buy_value = sum(q * c for q, c in purchases)\n    ending_value = sum(v for q, v in layers)\n    return {'layers': layers, 'ending_value': ending_value, 'cogs': begin_value + buy_value - ending_value}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['increment layer', {'begin': [[10, 5], [4, 6]], 'purchases': [[6, 7], [8, 10]], 'ending_qty': 18}, {'layers': [[10, 50], [4, 24], [4, 28]], 'ending_value': 102, 'cogs': 94}], ['liquidation', {'begin': [[10, 5], [4, 6]], 'purchases': [[6, 7]], 'ending_qty': 10}, {'layers': [[10, 50]], 'ending_value': 50, 'cogs': 66}], ['deep liquidation', {'begin': [[3, 2], [3, 4], [3, 6]], 'purchases': [[2, 8]], 'ending_qty': 1}, {'layers': [[1, 2]], 'ending_value': 2, 'cogs': 50}], ['over available', {'begin': [[2, 3]], 'purchases': [[3, 4]], 'ending_qty': 6}, {'error': 'invalid ending quantity'}], ['negative ending', {'begin': [[2, 3]], 'purchases': [[3, 4]], 'ending_qty': -1}, {'error': 'invalid ending quantity'}], ['count of minus one', {'begin': [[3, 3]], 'purchases': [[3, 4]], 'ending_qty': -1}, {'error': 'invalid ending quantity'}], ['all sold', {'begin': [[5, 3]], 'purchases': [[5, 4]], 'ending_qty': 0}, {'layers': [], 'ending_value': 0, 'cogs': 35}], ['exact base', {'begin': [[4, 10]], 'purchases': [[1, 11], [2, 12]], 'ending_qty': 4}, {'layers': [[4, 40]], 'ending_value': 40, 'cogs': 35}], ['uses both pools', {'begin': [[6, 2]], 'purchases': [[3, 5]], 'ending_qty': 8}, {'layers': [[6, 12], [2, 10]], 'ending_value': 22, 'cogs': 5}]], [['increment layer', {'begin': [[10, 5], [4, 6]], 'purchases': [[6, 7], [8, 11]], 'ending_qty': 19}, {'layers': [[10, 50], [4, 24], [5, 35]], 'ending_value': 109, 'cogs': 95}], ['liquidation', {'begin': [[10, 5], [4, 6]], 'purchases': [[6, 7]], 'ending_qty': 11}, {'layers': [[10, 50], [1, 6]], 'ending_value': 56, 'cogs': 60}], ['deep liquidation', {'begin': [[3, 2], [3, 4], [3, 6]], 'purchases': [[2, 8]], 'ending_qty': 2}, {'layers': [[2, 4]], 'ending_value': 4, 'cogs': 48}], ['over available', {'begin': [[2, 3]], 'purchases': [[3, 4]], 'ending_qty': 7}, {'error': 'invalid ending quantity'}], ['negative ending', {'begin': [[2, 3]], 'purchases': [[3, 4]], 'ending_qty': -2}, {'error': 'invalid ending quantity'}], ['count of minus one', {'begin': [[4, 3]], 'purchases': [[3, 4]], 'ending_qty': -1}, {'error': 'invalid ending quantity'}], ['all sold', {'begin': [[5, 3]], 'purchases': [[5, 4]], 'ending_qty': 0}, {'layers': [], 'ending_value': 0, 'cogs': 35}], ['exact base', {'begin': [[4, 10]], 'purchases': [[2, 11], [2, 12]], 'ending_qty': 4}, {'layers': [[4, 40]], 'ending_value': 40, 'cogs': 46}], ['uses both pools', {'begin': [[6, 2]], 'purchases': [[3, 5]], 'ending_qty': 7}, {'layers': [[6, 12], [1, 5]], 'ending_value': 17, 'cogs': 10}]], [['increment layer', {'begin': [[10, 5], [4, 6]], 'purchases': [[6, 7], [8, 12]], 'ending_qty': 17}, {'layers': [[10, 50], [4, 24], [3, 21]], 'ending_value': 95, 'cogs': 117}], ['liquidation', {'begin': [[10, 5], [4, 6]], 'purchases': [[6, 7]], 'ending_qty': 10}, {'layers': [[10, 50]], 'ending_value': 50, 'cogs': 66}], ['deep liquidation', {'begin': [[3, 2], [3, 4], [3, 6]], 'purchases': [[2, 8]], 'ending_qty': 3}, {'layers': [[3, 6]], 'ending_value': 6, 'cogs': 46}], ['over available', {'begin': [[2, 3]], 'purchases': [[3, 4]], 'ending_qty': 8}, {'error': 'invalid ending quantity'}], ['negative ending', {'begin': [[2, 3]], 'purchases': [[3, 4]], 'ending_qty': -3}, {'error': 'invalid ending quantity'}], ['count of minus one', {'begin': [[5, 3]], 'purchases': [[3, 4]], 'ending_qty': -1}, {'error': 'invalid ending quantity'}], ['all sold', {'begin': [[5, 3]], 'purchases': [[5, 4]], 'ending_qty': 0}, {'layers': [], 'ending_value': 0, 'cogs': 35}], ['exact base', {'begin': [[4, 10]], 'purchases': [[3, 11], [2, 12]], 'ending_qty': 4}, {'layers': [[4, 40]], 'ending_value': 40, 'cogs': 57}], ['uses both pools', {'begin': [[6, 2]], 'purchases': [[3, 5]], 'ending_qty': 8}, {'layers': [[6, 12], [2, 10]], 'ending_value': 22, 'cogs': 5}]], [['increment layer', {'begin': [[10, 5], [4, 6]], 'purchases': [[6, 7], [8, 13]], 'ending_qty': 18}, {'layers': [[10, 50], [4, 24], [4, 28]], 'ending_value': 102, 'cogs': 118}], ['liquidation', {'begin': [[10, 5], [4, 6]], 'purchases': [[6, 7]], 'ending_qty': 11}, {'layers': [[10, 50], [1, 6]], 'ending_value': 56, 'cogs': 60}], ['deep liquidation', {'begin': [[3, 2], [3, 4], [3, 6]], 'purchases': [[2, 8]], 'ending_qty': 4}, {'layers': [[3, 6], [1, 4]], 'ending_value': 10, 'cogs': 42}], ['over available', {'begin': [[2, 3]], 'purchases': [[3, 4]], 'ending_qty': 9}, {'error': 'invalid ending quantity'}], ['negative ending', {'begin': [[2, 3]], 'purchases': [[3, 4]], 'ending_qty': -4}, {'error': 'invalid ending quantity'}], ['count of minus one', {'begin': [[6, 3]], 'purchases': [[3, 4]], 'ending_qty': -1}, {'error': 'invalid ending quantity'}], ['all sold', {'begin': [[5, 3]], 'purchases': [[5, 4]], 'ending_qty': 0}, {'layers': [], 'ending_value': 0, 'cogs': 35}], ['exact base', {'begin': [[4, 10]], 'purchases': [[4, 11], [2, 12]], 'ending_qty': 4}, {'layers': [[4, 40]], 'ending_value': 40, 'cogs': 68}], ['uses both pools', {'begin': [[6, 2]], 'purchases': [[3, 5]], 'ending_qty': 7}, {'layers': [[6, 12], [1, 5]], 'ending_value': 17, 'cogs': 10}]], [['increment layer', {'begin': [[10, 5], [4, 6]], 'purchases': [[6, 7], [8, 14]], 'ending_qty': 19}, {'layers': [[10, 50], [4, 24], [5, 35]], 'ending_value': 109, 'cogs': 119}], ['liquidation', {'begin': [[10, 5], [4, 6]], 'purchases': [[6, 7]], 'ending_qty': 10}, {'layers': [[10, 50]], 'ending_value': 50, 'cogs': 66}], ['deep liquidation', {'begin': [[3, 2], [3, 4], [3, 6]], 'purchases': [[2, 8]], 'ending_qty': 5}, {'layers': [[3, 6], [2, 8]], 'ending_value': 14, 'cogs': 38}], ['over available', {'begin': [[2, 3]], 'purchases': [[3, 4]], 'ending_qty': 10}, {'error': 'invalid ending quantity'}], ['negative ending', {'begin': [[2, 3]], 'purchases': [[3, 4]], 'ending_qty': -5}, {'error': 'invalid ending quantity'}], ['count of minus one', {'begin': [[7, 3]], 'purchases': [[3, 4]], 'ending_qty': -1}, {'error': 'invalid ending quantity'}], ['all sold', {'begin': [[5, 3]], 'purchases': [[5, 4]], 'ending_qty': 0}, {'layers': [], 'ending_value': 0, 'cogs': 35}], ['exact base', {'begin': [[4, 10]], 'purchases': [[5, 11], [2, 12]], 'ending_qty': 4}, {'layers': [[4, 40]], 'ending_value': 40, 'cogs': 79}], ['uses both pools', {'begin': [[6, 2]], 'purchases': [[3, 5]], 'ending_qty': 8}, {'layers': [[6, 12], [2, 10]], 'ending_value': 22, 'cogs': 5}]]]\nfor label, args, expected in fixtures[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":"2e13bd7cf794af70bdbe261afd0e2ffed0a691e45860c45d9f00fd303e5af70d","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    begin = [list(l) for l in x['begin']]\n    purchases = x['purchases']\n    end_q = x['ending_qty']\n    base_q = sum(l[0] for l in begin)\n    buy_q = sum(p[0] for p in purchases)\n    avail = buy_q\n    if end_q < 0 or end_q > avail:\n        return {'error': 'invalid ending quantity'}\n    layers = []\n    if end_q >= base_q:\n        layers = [[q, q * c] for q, c in begin]\n        inc = end_q - base_q\n        new_q = 0\n        new_v = 0\n        for q, c in purchases:\n            if inc == 0:\n                break\n            take = min(inc, q)\n            new_q += take\n            new_v += take * c\n            inc -= take\n        if new_q > 0:\n            layers.append([new_q, new_v])\n    else:\n        rem = end_q\n        for bq, bc in begin:\n            take = min(rem, bq)\n            if take > 0:\n                layers.append([take, take * bc])\n            rem -= take\n    begin_value = sum(q * c for q, c in begin)\n    buy_value = sum(q * c for q, c in purchases)\n    ending_value = sum(v for q, v in layers)\n    return {'layers': layers, 'ending_value': ending_value, 'cogs': begin_value + buy_value - ending_value}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['increment layer', {'begin': [[10, 5], [4, 6]], 'purchases': [[6, 7], [8, 10]], 'ending_qty': 18}, {'layers': [[10, 50], [4, 24], [4, 28]], 'ending_value': 102, 'cogs': 94}], ['liquidation', {'begin': [[10, 5], [4, 6]], 'purchases': [[6, 7]], 'ending_qty': 10}, {'layers': [[10, 50]], 'ending_value': 50, 'cogs': 66}], ['deep liquidation', {'begin': [[3, 2], [3, 4], [3, 6]], 'purchases': [[2, 8]], 'ending_qty': 1}, {'layers': [[1, 2]], 'ending_value': 2, 'cogs': 50}], ['over available', {'begin': [[2, 3]], 'purchases': [[3, 4]], 'ending_qty': 6}, {'error': 'invalid ending quantity'}], ['negative ending', {'begin': [[2, 3]], 'purchases': [[3, 4]], 'ending_qty': -1}, {'error': 'invalid ending quantity'}], ['count of minus one', {'begin': [[3, 3]], 'purchases': [[3, 4]], 'ending_qty': -1}, {'error': 'invalid ending quantity'}], ['all sold', {'begin': [[5, 3]], 'purchases': [[5, 4]], 'ending_qty': 0}, {'layers': [], 'ending_value': 0, 'cogs': 35}], ['exact base', {'begin': [[4, 10]], 'purchases': [[1, 11], [2, 12]], 'ending_qty': 4}, {'layers': [[4, 40]], 'ending_value': 40, 'cogs': 35}], ['uses both pools', {'begin': [[6, 2]], 'purchases': [[3, 5]], 'ending_qty': 8}, {'layers': [[6, 12], [2, 10]], 'ending_value': 22, 'cogs': 5}]], [['increment layer', {'begin': [[10, 5], [4, 6]], 'purchases': [[6, 7], [8, 11]], 'ending_qty': 19}, {'layers': [[10, 50], [4, 24], [5, 35]], 'ending_value': 109, 'cogs': 95}], ['liquidation', {'begin': [[10, 5], [4, 6]], 'purchases': [[6, 7]], 'ending_qty': 11}, {'layers': [[10, 50], [1, 6]], 'ending_value': 56, 'cogs': 60}], ['deep liquidation', {'begin': [[3, 2], [3, 4], [3, 6]], 'purchases': [[2, 8]], 'ending_qty': 2}, {'layers': [[2, 4]], 'ending_value': 4, 'cogs': 48}], ['over available', {'begin': [[2, 3]], 'purchases': [[3, 4]], 'ending_qty': 7}, {'error': 'invalid ending quantity'}], ['negative ending', {'begin': [[2, 3]], 'purchases': [[3, 4]], 'ending_qty': -2}, {'error': 'invalid ending quantity'}], ['count of minus one', {'begin': [[4, 3]], 'purchases': [[3, 4]], 'ending_qty': -1}, {'error': 'invalid ending quantity'}], ['all sold', {'begin': [[5, 3]], 'purchases': [[5, 4]], 'ending_qty': 0}, {'layers': [], 'ending_value': 0, 'cogs': 35}], ['exact base', {'begin': [[4, 10]], 'purchases': [[2, 11], [2, 12]], 'ending_qty': 4}, {'layers': [[4, 40]], 'ending_value': 40, 'cogs': 46}], ['uses both pools', {'begin': [[6, 2]], 'purchases': [[3, 5]], 'ending_qty': 7}, {'layers': [[6, 12], [1, 5]], 'ending_value': 17, 'cogs': 10}]], [['increment layer', {'begin': [[10, 5], [4, 6]], 'purchases': [[6, 7], [8, 12]], 'ending_qty': 17}, {'layers': [[10, 50], [4, 24], [3, 21]], 'ending_value': 95, 'cogs': 117}], ['liquidation', {'begin': [[10, 5], [4, 6]], 'purchases': [[6, 7]], 'ending_qty': 10}, {'layers': [[10, 50]], 'ending_value': 50, 'cogs': 66}], ['deep liquidation', {'begin': [[3, 2], [3, 4], [3, 6]], 'purchases': [[2, 8]], 'ending_qty': 3}, {'layers': [[3, 6]], 'ending_value': 6, 'cogs': 46}], ['over available', {'begin': [[2, 3]], 'purchases': [[3, 4]], 'ending_qty': 8}, {'error': 'invalid ending quantity'}], ['negative ending', {'begin': [[2, 3]], 'purchases': [[3, 4]], 'ending_qty': -3}, {'error': 'invalid ending quantity'}], ['count of minus one', {'begin': [[5, 3]], 'purchases': [[3, 4]], 'ending_qty': -1}, {'error': 'invalid ending quantity'}], ['all sold', {'begin': [[5, 3]], 'purchases': [[5, 4]], 'ending_qty': 0}, {'layers': [], 'ending_value': 0, 'cogs': 35}], ['exact base', {'begin': [[4, 10]], 'purchases': [[3, 11], [2, 12]], 'ending_qty': 4}, {'layers': [[4, 40]], 'ending_value': 40, 'cogs': 57}], ['uses both pools', {'begin': [[6, 2]], 'purchases': [[3, 5]], 'ending_qty': 8}, {'layers': [[6, 12], [2, 10]], 'ending_value': 22, 'cogs': 5}]], [['increment layer', {'begin': [[10, 5], [4, 6]], 'purchases': [[6, 7], [8, 13]], 'ending_qty': 18}, {'layers': [[10, 50], [4, 24], [4, 28]], 'ending_value': 102, 'cogs': 118}], ['liquidation', {'begin': [[10, 5], [4, 6]], 'purchases': [[6, 7]], 'ending_qty': 11}, {'layers': [[10, 50], [1, 6]], 'ending_value': 56, 'cogs': 60}], ['deep liquidation', {'begin': [[3, 2], [3, 4], [3, 6]], 'purchases': [[2, 8]], 'ending_qty': 4}, {'layers': [[3, 6], [1, 4]], 'ending_value': 10, 'cogs': 42}], ['over available', {'begin': [[2, 3]], 'purchases': [[3, 4]], 'ending_qty': 9}, {'error': 'invalid ending quantity'}], ['negative ending', {'begin': [[2, 3]], 'purchases': [[3, 4]], 'ending_qty': -4}, {'error': 'invalid ending quantity'}], ['count of minus one', {'begin': [[6, 3]], 'purchases': [[3, 4]], 'ending_qty': -1}, {'error': 'invalid ending quantity'}], ['all sold', {'begin': [[5, 3]], 'purchases': [[5, 4]], 'ending_qty': 0}, {'layers': [], 'ending_value': 0, 'cogs': 35}], ['exact base', {'begin': [[4, 10]], 'purchases': [[4, 11], [2, 12]], 'ending_qty': 4}, {'layers': [[4, 40]], 'ending_value': 40, 'cogs': 68}], ['uses both pools', {'begin': [[6, 2]], 'purchases': [[3, 5]], 'ending_qty': 7}, {'layers': [[6, 12], [1, 5]], 'ending_value': 17, 'cogs': 10}]], [['increment layer', {'begin': [[10, 5], [4, 6]], 'purchases': [[6, 7], [8, 14]], 'ending_qty': 19}, {'layers': [[10, 50], [4, 24], [5, 35]], 'ending_value': 109, 'cogs': 119}], ['liquidation', {'begin': [[10, 5], [4, 6]], 'purchases': [[6, 7]], 'ending_qty': 10}, {'layers': [[10, 50]], 'ending_value': 50, 'cogs': 66}], ['deep liquidation', {'begin': [[3, 2], [3, 4], [3, 6]], 'purchases': [[2, 8]], 'ending_qty': 5}, {'layers': [[3, 6], [2, 8]], 'ending_value': 14, 'cogs': 38}], ['over available', {'begin': [[2, 3]], 'purchases': [[3, 4]], 'ending_qty': 10}, {'error': 'invalid ending quantity'}], ['negative ending', {'begin': [[2, 3]], 'purchases': [[3, 4]], 'ending_qty': -5}, {'error': 'invalid ending quantity'}], ['count of minus one', {'begin': [[7, 3]], 'purchases': [[3, 4]], 'ending_qty': -1}, {'error': 'invalid ending quantity'}], ['all sold', {'begin': [[5, 3]], 'purchases': [[5, 4]], 'ending_qty': 0}, {'layers': [], 'ending_value': 0, 'cogs': 35}], ['exact base', {'begin': [[4, 10]], 'purchases': [[5, 11], [2, 12]], 'ending_qty': 4}, {'layers': [[4, 40]], 'ending_value': 40, 'cogs': 79}], ['uses both pools', {'begin': [[6, 2]], 'purchases': [[3, 5]], 'ending_qty': 8}, {'layers': [[6, 12], [2, 10]], 'ending_value': 22, 'cogs': 5}]]]\nfor label, args, expected in fixtures[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":"753d2fa549b9c1d1aca63217f8ff7a06b4efada3172f68c9f789f2d437876e47","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    begin = [list(l) for l in x['begin']]\n    purchases = x['purchases']\n    end_q = x['ending_qty']\n    base_q = sum(l[0] for l in begin)\n    buy_q = sum(p[0] for p in purchases)\n    avail = base_q + buy_q\n    if end_q < 0 or end_q > avail:\n        return {'error': 'invalid ending quantity'}\n    layers = []\n    if end_q >= base_q:\n        layers = [[q, q * c] for q, c in begin]\n        inc = end_q - base_q\n        new_q = 0\n        new_v = 0\n        for q, c in purchases:\n            if inc == 0:\n                break\n            take = min(inc, q)\n            new_q += take\n            new_v += take * c\n            inc -= take\n        if new_q > 0:\n            layers.append([new_q, new_v])\n    else:\n        rem = end_q\n        for bq, bc in begin:\n            take = min(rem, bq)\n            if take > 0:\n                layers.append([take, take * bc])\n            rem -= take\n    begin_value = sum(q * c for q, c in begin)\n    buy_value = sum(q * c for q, c in purchases)\n    ending_value = sum(v for q, v in layers)\n    return {'layers': layers, 'ending_value': ending_value, 'cogs': begin_value + buy_value - ending_value}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['increment layer', {'begin': [[10, 5], [4, 6]], 'purchases': [[6, 7], [8, 10]], 'ending_qty': 18}, {'layers': [[10, 50], [4, 24], [4, 28]], 'ending_value': 102, 'cogs': 94}], ['liquidation', {'begin': [[10, 5], [4, 6]], 'purchases': [[6, 7]], 'ending_qty': 10}, {'layers': [[10, 50]], 'ending_value': 50, 'cogs': 66}], ['deep liquidation', {'begin': [[3, 2], [3, 4], [3, 6]], 'purchases': [[2, 8]], 'ending_qty': 1}, {'layers': [[1, 2]], 'ending_value': 2, 'cogs': 50}], ['over available', {'begin': [[2, 3]], 'purchases': [[3, 4]], 'ending_qty': 6}, {'error': 'invalid ending quantity'}], ['negative ending', {'begin': [[2, 3]], 'purchases': [[3, 4]], 'ending_qty': -1}, {'error': 'invalid ending quantity'}], ['count of minus one', {'begin': [[3, 3]], 'purchases': [[3, 4]], 'ending_qty': -1}, {'error': 'invalid ending quantity'}], ['all sold', {'begin': [[5, 3]], 'purchases': [[5, 4]], 'ending_qty': 0}, {'layers': [], 'ending_value': 0, 'cogs': 35}], ['exact base', {'begin': [[4, 10]], 'purchases': [[1, 11], [2, 12]], 'ending_qty': 4}, {'layers': [[4, 40]], 'ending_value': 40, 'cogs': 35}], ['uses both pools', {'begin': [[6, 2]], 'purchases': [[3, 5]], 'ending_qty': 8}, {'layers': [[6, 12], [2, 10]], 'ending_value': 22, 'cogs': 5}]], [['increment layer', {'begin': [[10, 5], [4, 6]], 'purchases': [[6, 7], [8, 11]], 'ending_qty': 19}, {'layers': [[10, 50], [4, 24], [5, 35]], 'ending_value': 109, 'cogs': 95}], ['liquidation', {'begin': [[10, 5], [4, 6]], 'purchases': [[6, 7]], 'ending_qty': 11}, {'layers': [[10, 50], [1, 6]], 'ending_value': 56, 'cogs': 60}], ['deep liquidation', {'begin': [[3, 2], [3, 4], [3, 6]], 'purchases': [[2, 8]], 'ending_qty': 2}, {'layers': [[2, 4]], 'ending_value': 4, 'cogs': 48}], ['over available', {'begin': [[2, 3]], 'purchases': [[3, 4]], 'ending_qty': 7}, {'error': 'invalid ending quantity'}], ['negative ending', {'begin': [[2, 3]], 'purchases': [[3, 4]], 'ending_qty': -2}, {'error': 'invalid ending quantity'}], ['count of minus one', {'begin': [[4, 3]], 'purchases': [[3, 4]], 'ending_qty': -1}, {'error': 'invalid ending quantity'}], ['all sold', {'begin': [[5, 3]], 'purchases': [[5, 4]], 'ending_qty': 0}, {'layers': [], 'ending_value': 0, 'cogs': 35}], ['exact base', {'begin': [[4, 10]], 'purchases': [[2, 11], [2, 12]], 'ending_qty': 4}, {'layers': [[4, 40]], 'ending_value': 40, 'cogs': 46}], ['uses both pools', {'begin': [[6, 2]], 'purchases': [[3, 5]], 'ending_qty': 7}, {'layers': [[6, 12], [1, 5]], 'ending_value': 17, 'cogs': 10}]], [['increment layer', {'begin': [[10, 5], [4, 6]], 'purchases': [[6, 7], [8, 12]], 'ending_qty': 17}, {'layers': [[10, 50], [4, 24], [3, 21]], 'ending_value': 95, 'cogs': 117}], ['liquidation', {'begin': [[10, 5], [4, 6]], 'purchases': [[6, 7]], 'ending_qty': 10}, {'layers': [[10, 50]], 'ending_value': 50, 'cogs': 66}], ['deep liquidation', {'begin': [[3, 2], [3, 4], [3, 6]], 'purchases': [[2, 8]], 'ending_qty': 3}, {'layers': [[3, 6]], 'ending_value': 6, 'cogs': 46}], ['over available', {'begin': [[2, 3]], 'purchases': [[3, 4]], 'ending_qty': 8}, {'error': 'invalid ending quantity'}], ['negative ending', {'begin': [[2, 3]], 'purchases': [[3, 4]], 'ending_qty': -3}, {'error': 'invalid ending quantity'}], ['count of minus one', {'begin': [[5, 3]], 'purchases': [[3, 4]], 'ending_qty': -1}, {'error': 'invalid ending quantity'}], ['all sold', {'begin': [[5, 3]], 'purchases': [[5, 4]], 'ending_qty': 0}, {'layers': [], 'ending_value': 0, 'cogs': 35}], ['exact base', {'begin': [[4, 10]], 'purchases': [[3, 11], [2, 12]], 'ending_qty': 4}, {'layers': [[4, 40]], 'ending_value': 40, 'cogs': 57}], ['uses both pools', {'begin': [[6, 2]], 'purchases': [[3, 5]], 'ending_qty': 8}, {'layers': [[6, 12], [2, 10]], 'ending_value': 22, 'cogs': 5}]], [['increment layer', {'begin': [[10, 5], [4, 6]], 'purchases': [[6, 7], [8, 13]], 'ending_qty': 18}, {'layers': [[10, 50], [4, 24], [4, 28]], 'ending_value': 102, 'cogs': 118}], ['liquidation', {'begin': [[10, 5], [4, 6]], 'purchases': [[6, 7]], 'ending_qty': 11}, {'layers': [[10, 50], [1, 6]], 'ending_value': 56, 'cogs': 60}], ['deep liquidation', {'begin': [[3, 2], [3, 4], [3, 6]], 'purchases': [[2, 8]], 'ending_qty': 4}, {'layers': [[3, 6], [1, 4]], 'ending_value': 10, 'cogs': 42}], ['over available', {'begin': [[2, 3]], 'purchases': [[3, 4]], 'ending_qty': 9}, {'error': 'invalid ending quantity'}], ['negative ending', {'begin': [[2, 3]], 'purchases': [[3, 4]], 'ending_qty': -4}, {'error': 'invalid ending quantity'}], ['count of minus one', {'begin': [[6, 3]], 'purchases': [[3, 4]], 'ending_qty': -1}, {'error': 'invalid ending quantity'}], ['all sold', {'begin': [[5, 3]], 'purchases': [[5, 4]], 'ending_qty': 0}, {'layers': [], 'ending_value': 0, 'cogs': 35}], ['exact base', {'begin': [[4, 10]], 'purchases': [[4, 11], [2, 12]], 'ending_qty': 4}, {'layers': [[4, 40]], 'ending_value': 40, 'cogs': 68}], ['uses both pools', {'begin': [[6, 2]], 'purchases': [[3, 5]], 'ending_qty': 7}, {'layers': [[6, 12], [1, 5]], 'ending_value': 17, 'cogs': 10}]], [['increment layer', {'begin': [[10, 5], [4, 6]], 'purchases': [[6, 7], [8, 14]], 'ending_qty': 19}, {'layers': [[10, 50], [4, 24], [5, 35]], 'ending_value': 109, 'cogs': 119}], ['liquidation', {'begin': [[10, 5], [4, 6]], 'purchases': [[6, 7]], 'ending_qty': 10}, {'layers': [[10, 50]], 'ending_value': 50, 'cogs': 66}], ['deep liquidation', {'begin': [[3, 2], [3, 4], [3, 6]], 'purchases': [[2, 8]], 'ending_qty': 5}, {'layers': [[3, 6], [2, 8]], 'ending_value': 14, 'cogs': 38}], ['over available', {'begin': [[2, 3]], 'purchases': [[3, 4]], 'ending_qty': 10}, {'error': 'invalid ending quantity'}], ['negative ending', {'begin': [[2, 3]], 'purchases': [[3, 4]], 'ending_qty': -5}, {'error': 'invalid ending quantity'}], ['count of minus one', {'begin': [[7, 3]], 'purchases': [[3, 4]], 'ending_qty': -1}, {'error': 'invalid ending quantity'}], ['all sold', {'begin': [[5, 3]], 'purchases': [[5, 4]], 'ending_qty': 0}, {'layers': [], 'ending_value': 0, 'cogs': 35}], ['exact base', {'begin': [[4, 10]], 'purchases': [[5, 11], [2, 12]], 'ending_qty': 4}, {'layers': [[4, 40]], 'ending_value': 40, 'cogs': 79}], ['uses both pools', {'begin': [[6, 2]], 'purchases': [[3, 5]], 'ending_qty': 8}, {'layers': [[6, 12], [2, 10]], 'ending_value': 22, 'cogs': 5}]]]\nfor label, args, expected in fixtures[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":"Stipulated bounded teaching model with explicit toy rules; not an accounting-standard implementation. 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-inventory-cost-layering-periodic-lifo-increment-available-quantity-bound","generated_at":"2026-09-29T14:46:40.429054+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Inventory valuation and cost-of-goods decisions depend on this rule.","repair":"Available quantity is beginning units plus purchased units.","root_cause":"Available quantity is computed from purchases only, omitting beginning inventory.","sha256":"f8cdbe1b3b5b1e581a627090e60f5cf22f6b3aa63a5ab0ea100564b82a99c631","title":"Periodic LIFO year-end layering: available quantity bound · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":42.023,"exit_code":1,"observations":[{"actual":{"error":"invalid ending quantity"},"check":"increment layer","expected":{"cogs":94,"ending_value":102,"layers":[[10,50],[4,24],[4,28]]},"passed":false},{"actual":{"cogs":66,"ending_value":50,"layers":[[10,50]]},"check":"liquidation","expected":{"cogs":66,"ending_value":50,"layers":[[10,50]]},"passed":true},{"actual":{"cogs":50,"ending_value":2,"layers":[[1,2]]},"check":"deep liquidation","expected":{"cogs":50,"ending_value":2,"layers":[[1,2]]},"passed":true},{"actual":{"error":"invalid ending quantity"},"check":"over available","expected":{"error":"invalid ending quantity"},"passed":true},{"actual":{"error":"invalid ending quantity"},"check":"negative ending","expected":{"error":"invalid ending quantity"},"passed":true},{"actual":{"error":"invalid ending quantity"},"check":"count of minus one","expected":{"error":"invalid ending quantity"},"passed":true},{"actual":{"cogs":35,"ending_value":0,"layers":[]},"check":"all sold","expected":{"cogs":35,"ending_value":0,"layers":[]},"passed":true},{"actual":{"cogs":35,"ending_value":40,"layers":[[4,40]]},"check":"exact base","expected":{"cogs":35,"ending_value":40,"layers":[[4,40]]},"passed":true},{"actual":{"error":"invalid ending quantity"},"check":"uses both pools","expected":{"cogs":5,"ending_value":22,"layers":[[6,12],[2,10]]},"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"increment layer\", \"actual\": {\"error\": \"invalid ending quantity\"}, \"expected\": {\"layers\": [[10, 50], [4, 24], [4, 28]], \"ending_value\": 102, \"cogs\": 94}, \"passed\": false}, {\"check\": \"liquidation\", \"actual\": {\"layers\": [[10, 50]], \"ending_value\": 50, \"cogs\": 66}, \"expected\": {\"layers\": [[10, 50]], \"ending_value\": 50, \"cogs\": 66}, \"passed\": true}, {\"check\": \"deep liquidation\", \"actual\": {\"layers\": [[1, 2]], \"ending_value\": 2, \"cogs\": 50}, \"expected\": {\"layers\": [[1, 2]], \"ending_value\": 2, \"cogs\": 50}, \"passed\": true}, {\"check\": \"over available\", \"actual\": {\"error\": \"invalid ending quantity\"}, \"expected\": {\"error\": \"invalid ending quantity\"}, \"passed\": true}, {\"check\": \"negative ending\", \"actual\": {\"error\": \"invalid ending quantity\"}, \"expected\": {\"error\": \"invalid ending quantity\"}, \"passed\": true}, {\"check\": \"count of minus one\", \"actual\": {\"error\": \"invalid ending quantity\"}, \"expected\": {\"error\": \"invalid ending quantity\"}, \"passed\": true}, {\"check\": \"all sold\", \"actual\": {\"layers\": [], \"ending_value\": 0, \"cogs\": 35}, \"expected\": {\"layers\": [], \"ending_value\": 0, \"cogs\": 35}, \"passed\": true}, {\"check\": \"exact base\", \"actual\": {\"layers\": [[4, 40]], \"ending_value\": 40, \"cogs\": 35}, \"expected\": {\"layers\": [[4, 40]], \"ending_value\": 40, \"cogs\": 35}, \"passed\": true}, {\"check\": \"uses both pools\", \"actual\": {\"error\": \"invalid ending quantity\"}, \"expected\": {\"layers\": [[6, 12], [2, 10]], \"ending_value\": 22, \"cogs\": 5}, \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":39.756,"exit_code":1,"observations":[{"actual":{"error":"invalid ending quantity"},"check":"increment layer","expected":{"cogs":94,"ending_value":102,"layers":[[10,50],[4,24],[4,28]]},"passed":false},{"actual":{"error":"invalid ending quantity"},"check":"liquidation","expected":{"cogs":66,"ending_value":50,"layers":[[10,50]]},"passed":false},{"actual":{"cogs":50,"ending_value":2,"layers":[[1,2]]},"check":"deep liquidation","expected":{"cogs":50,"ending_value":2,"layers":[[1,2]]},"passed":true},{"actual":{"error":"invalid ending quantity"},"check":"over available","expected":{"error":"invalid ending quantity"},"passed":true},{"actual":{"error":"invalid ending quantity"},"check":"negative ending","expected":{"error":"invalid ending quantity"},"passed":true},{"actual":{"error":"invalid ending quantity"},"check":"count of minus one","expected":{"error":"invalid ending quantity"},"passed":true},{"actual":{"cogs":35,"ending_value":0,"layers":[]},"check":"all sold","expected":{"cogs":35,"ending_value":0,"layers":[]},"passed":true},{"actual":{"error":"invalid ending quantity"},"check":"exact base","expected":{"cogs":35,"ending_value":40,"layers":[[4,40]]},"passed":false},{"actual":{"error":"invalid ending quantity"},"check":"uses both pools","expected":{"cogs":5,"ending_value":22,"layers":[[6,12],[2,10]]},"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"increment layer\", \"actual\": {\"error\": \"invalid ending quantity\"}, \"expected\": {\"layers\": [[10, 50], [4, 24], [4, 28]], \"ending_value\": 102, \"cogs\": 94}, \"passed\": false}, {\"check\": \"liquidation\", \"actual\": {\"error\": \"invalid ending quantity\"}, \"expected\": {\"layers\": [[10, 50]], \"ending_value\": 50, \"cogs\": 66}, \"passed\": false}, {\"check\": \"deep liquidation\", \"actual\": {\"layers\": [[1, 2]], \"ending_value\": 2, \"cogs\": 50}, \"expected\": {\"layers\": [[1, 2]], \"ending_value\": 2, \"cogs\": 50}, \"passed\": true}, {\"check\": \"over available\", \"actual\": {\"error\": \"invalid ending quantity\"}, \"expected\": {\"error\": \"invalid ending quantity\"}, \"passed\": true}, {\"check\": \"negative ending\", \"actual\": {\"error\": \"invalid ending quantity\"}, \"expected\": {\"error\": \"invalid ending quantity\"}, \"passed\": true}, {\"check\": \"count of minus one\", \"actual\": {\"error\": \"invalid ending quantity\"}, \"expected\": {\"error\": \"invalid ending quantity\"}, \"passed\": true}, {\"check\": \"all sold\", \"actual\": {\"layers\": [], \"ending_value\": 0, \"cogs\": 35}, \"expected\": {\"layers\": [], \"ending_value\": 0, \"cogs\": 35}, \"passed\": true}, {\"check\": \"exact base\", \"actual\": {\"error\": \"invalid ending quantity\"}, \"expected\": {\"layers\": [[4, 40]], \"ending_value\": 40, \"cogs\": 35}, \"passed\": false}, {\"check\": \"uses both pools\", \"actual\": {\"error\": \"invalid ending quantity\"}, \"expected\": {\"layers\": [[6, 12], [2, 10]], \"ending_value\": 22, \"cogs\": 5}, \"passed\": false}], \"passed\": false}\n"},"fixed":{"elapsed_ms":45.045,"exit_code":0,"observations":[{"actual":{"cogs":94,"ending_value":102,"layers":[[10,50],[4,24],[4,28]]},"check":"increment layer","expected":{"cogs":94,"ending_value":102,"layers":[[10,50],[4,24],[4,28]]},"passed":true},{"actual":{"cogs":66,"ending_value":50,"layers":[[10,50]]},"check":"liquidation","expected":{"cogs":66,"ending_value":50,"layers":[[10,50]]},"passed":true},{"actual":{"cogs":50,"ending_value":2,"layers":[[1,2]]},"check":"deep liquidation","expected":{"cogs":50,"ending_value":2,"layers":[[1,2]]},"passed":true},{"actual":{"error":"invalid ending quantity"},"check":"over available","expected":{"error":"invalid ending quantity"},"passed":true},{"actual":{"error":"invalid ending quantity"},"check":"negative ending","expected":{"error":"invalid ending quantity"},"passed":true},{"actual":{"error":"invalid ending quantity"},"check":"count of minus one","expected":{"error":"invalid ending quantity"},"passed":true},{"actual":{"cogs":35,"ending_value":0,"layers":[]},"check":"all sold","expected":{"cogs":35,"ending_value":0,"layers":[]},"passed":true},{"actual":{"cogs":35,"ending_value":40,"layers":[[4,40]]},"check":"exact base","expected":{"cogs":35,"ending_value":40,"layers":[[4,40]]},"passed":true},{"actual":{"cogs":5,"ending_value":22,"layers":[[6,12],[2,10]]},"check":"uses both pools","expected":{"cogs":5,"ending_value":22,"layers":[[6,12],[2,10]]},"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"increment layer\", \"actual\": {\"layers\": [[10, 50], [4, 24], [4, 28]], \"ending_value\": 102, \"cogs\": 94}, \"expected\": {\"layers\": [[10, 50], [4, 24], [4, 28]], \"ending_value\": 102, \"cogs\": 94}, \"passed\": true}, {\"check\": \"liquidation\", \"actual\": {\"layers\": [[10, 50]], \"ending_value\": 50, \"cogs\": 66}, \"expected\": {\"layers\": [[10, 50]], \"ending_value\": 50, \"cogs\": 66}, \"passed\": true}, {\"check\": \"deep liquidation\", \"actual\": {\"layers\": [[1, 2]], \"ending_value\": 2, \"cogs\": 50}, \"expected\": {\"layers\": [[1, 2]], \"ending_value\": 2, \"cogs\": 50}, \"passed\": true}, {\"check\": \"over available\", \"actual\": {\"error\": \"invalid ending quantity\"}, \"expected\": {\"error\": \"invalid ending quantity\"}, \"passed\": true}, {\"check\": \"negative ending\", \"actual\": {\"error\": \"invalid ending quantity\"}, \"expected\": {\"error\": \"invalid ending quantity\"}, \"passed\": true}, {\"check\": \"count of minus one\", \"actual\": {\"error\": \"invalid ending quantity\"}, \"expected\": {\"error\": \"invalid ending quantity\"}, \"passed\": true}, {\"check\": \"all sold\", \"actual\": {\"layers\": [], \"ending_value\": 0, \"cogs\": 35}, \"expected\": {\"layers\": [], \"ending_value\": 0, \"cogs\": 35}, \"passed\": true}, {\"check\": \"exact base\", \"actual\": {\"layers\": [[4, 40]], \"ending_value\": 40, \"cogs\": 35}, \"expected\": {\"layers\": [[4, 40]], \"ending_value\": 40, \"cogs\": 35}, \"passed\": true}, {\"check\": \"uses both pools\", \"actual\": {\"layers\": [[6, 12], [2, 10]], \"ending_value\": 22, \"cogs\": 5}, \"expected\": {\"layers\": [[6, 12], [2, 10]], \"ending_value\": 22, \"cogs\": 5}, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}