{"abstract":"After a receipt the new average is far too high because the pooled cost is divided by the receipt quantity only.","category":"Inventory cost layering","checks":7,"contract":"Input {onhand, avg (cents, integer), events}. On receipt the average becomes round-half-up((onhand*avg + qty*cost)/(onhand+qty)) to whole cents; an issue is costed at qty*avg with the current average and never changes it; an issue exceeding on-hand returns \"short\". When on-hand reaches zero the average is kept as the last value (not reset). Return {cogs, onhand, avg}.","evaluation_group":"w2-inventory-cost-layering-moving-average","failed_approach":"Dividing by the pre-receipt on-hand units breaks when stock was empty and still misweights otherwise.","family":"w2-inventory-cost-layering-moving-average-average-denominator","id":"FA-59901","implementations":{"attempt":{"sha256":"692621b25c8aea27771c25c16f249852cde613d5377f9a4bcebcb45e213d2150","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    onhand = x['onhand']\n    avg = x['avg']\n    cogs = []\n    for ev in x['events']:\n        if ev[0] == 'recv':\n            q, c = ev[1], ev[2]\n            total = onhand * avg + q * c\n            units = onhand + q\n            avg = (2 * total + max(onhand, 1)) // (2 * max(onhand, 1))\n            onhand = units\n        else:\n            q = ev[1]\n            if q > onhand:\n                cogs.append('short')\n                continue\n            cogs.append(q * avg)\n            onhand -= q\n    return {'cogs': cogs, 'onhand': onhand, 'avg': avg}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['receipt reprices', {'onhand': 10, 'avg': 100, 'events': [['recv', 10, 131], ['issue', 5]]}, {'cogs': [580], 'onhand': 15, 'avg': 116}], ['uneven rounding', {'onhand': 3, 'avg': 10, 'events': [['recv', 4, 12], ['issue', 2], ['issue', 1]]}, {'cogs': [22, 11], 'onhand': 4, 'avg': 11}], ['zero then receipt', {'onhand': 2, 'avg': 50, 'events': [['issue', 2], ['recv', 3, 71], ['issue', 1]]}, {'cogs': [100, 71], 'onhand': 2, 'avg': 71}], ['short issue', {'onhand': 2, 'avg': 50, 'events': [['issue', 4]]}, {'cogs': ['short'], 'onhand': 2, 'avg': 50}], ['many receipts', {'onhand': 0, 'avg': 0, 'events': [['recv', 1, 10], ['recv', 2, 13], ['recv', 1, 20], ['issue', 3]]}, {'cogs': [42], 'onhand': 1, 'avg': 14}], ['half cent', {'onhand': 1, 'avg': 1, 'events': [['recv', 1, 4], ['issue', 1]]}, {'cogs': [3], 'onhand': 1, 'avg': 3}], ['issue all', {'onhand': 4, 'avg': 25, 'events': [['recv', 4, 26], ['issue', 8]]}, {'cogs': [208], 'onhand': 0, 'avg': 26}]], [['receipt reprices', {'onhand': 10, 'avg': 100, 'events': [['recv', 10, 132], ['issue', 5]]}, {'cogs': [580], 'onhand': 15, 'avg': 116}], ['uneven rounding', {'onhand': 3, 'avg': 10, 'events': [['recv', 4, 13], ['issue', 2], ['issue', 1]]}, {'cogs': [24, 12], 'onhand': 4, 'avg': 12}], ['zero then receipt', {'onhand': 2, 'avg': 50, 'events': [['issue', 2], ['recv', 3, 72], ['issue', 1]]}, {'cogs': [100, 72], 'onhand': 2, 'avg': 72}], ['short issue', {'onhand': 2, 'avg': 50, 'events': [['issue', 5]]}, {'cogs': ['short'], 'onhand': 2, 'avg': 50}], ['many receipts', {'onhand': 0, 'avg': 0, 'events': [['recv', 1, 10], ['recv', 2, 13], ['recv', 2, 20], ['issue', 3]]}, {'cogs': [45], 'onhand': 2, 'avg': 15}], ['half cent', {'onhand': 1, 'avg': 1, 'events': [['recv', 1, 6], ['issue', 1]]}, {'cogs': [4], 'onhand': 1, 'avg': 4}], ['issue all', {'onhand': 4, 'avg': 25, 'events': [['recv', 4, 26], ['issue', 8]]}, {'cogs': [208], 'onhand': 0, 'avg': 26}]], [['receipt reprices', {'onhand': 10, 'avg': 100, 'events': [['recv', 10, 133], ['issue', 5]]}, {'cogs': [585], 'onhand': 15, 'avg': 117}], ['uneven rounding', {'onhand': 3, 'avg': 10, 'events': [['recv', 4, 14], ['issue', 2], ['issue', 1]]}, {'cogs': [24, 12], 'onhand': 4, 'avg': 12}], ['zero then receipt', {'onhand': 2, 'avg': 50, 'events': [['issue', 2], ['recv', 3, 73], ['issue', 1]]}, {'cogs': [100, 73], 'onhand': 2, 'avg': 73}], ['short issue', {'onhand': 2, 'avg': 50, 'events': [['issue', 6]]}, {'cogs': ['short'], 'onhand': 2, 'avg': 50}], ['many receipts', {'onhand': 0, 'avg': 0, 'events': [['recv', 1, 10], ['recv', 2, 13], ['recv', 3, 20], ['issue', 3]]}, {'cogs': [48], 'onhand': 3, 'avg': 16}], ['half cent', {'onhand': 1, 'avg': 1, 'events': [['recv', 1, 8], ['issue', 1]]}, {'cogs': [5], 'onhand': 1, 'avg': 5}], ['issue all', {'onhand': 4, 'avg': 25, 'events': [['recv', 4, 26], ['issue', 8]]}, {'cogs': [208], 'onhand': 0, 'avg': 26}]], [['receipt reprices', {'onhand': 10, 'avg': 100, 'events': [['recv', 10, 134], ['issue', 5]]}, {'cogs': [585], 'onhand': 15, 'avg': 117}], ['uneven rounding', {'onhand': 3, 'avg': 10, 'events': [['recv', 4, 15], ['issue', 2], ['issue', 1]]}, {'cogs': [26, 13], 'onhand': 4, 'avg': 13}], ['zero then receipt', {'onhand': 2, 'avg': 50, 'events': [['issue', 2], ['recv', 3, 74], ['issue', 1]]}, {'cogs': [100, 74], 'onhand': 2, 'avg': 74}], ['short issue', {'onhand': 2, 'avg': 50, 'events': [['issue', 7]]}, {'cogs': ['short'], 'onhand': 2, 'avg': 50}], ['many receipts', {'onhand': 0, 'avg': 0, 'events': [['recv', 1, 10], ['recv', 2, 13], ['recv', 4, 20], ['issue', 3]]}, {'cogs': [51], 'onhand': 4, 'avg': 17}], ['half cent', {'onhand': 1, 'avg': 1, 'events': [['recv', 1, 10], ['issue', 1]]}, {'cogs': [6], 'onhand': 1, 'avg': 6}], ['issue all', {'onhand': 4, 'avg': 25, 'events': [['recv', 4, 26], ['issue', 8]]}, {'cogs': [208], 'onhand': 0, 'avg': 26}]], [['receipt reprices', {'onhand': 10, 'avg': 100, 'events': [['recv', 10, 135], ['issue', 5]]}, {'cogs': [590], 'onhand': 15, 'avg': 118}], ['uneven rounding', {'onhand': 3, 'avg': 10, 'events': [['recv', 4, 16], ['issue', 2], ['issue', 1]]}, {'cogs': [26, 13], 'onhand': 4, 'avg': 13}], ['zero then receipt', {'onhand': 2, 'avg': 50, 'events': [['issue', 2], ['recv', 3, 75], ['issue', 1]]}, {'cogs': [100, 75], 'onhand': 2, 'avg': 75}], ['short issue', {'onhand': 2, 'avg': 50, 'events': [['issue', 8]]}, {'cogs': ['short'], 'onhand': 2, 'avg': 50}], ['many receipts', {'onhand': 0, 'avg': 0, 'events': [['recv', 1, 10], ['recv', 2, 13], ['recv', 5, 20], ['issue', 3]]}, {'cogs': [51], 'onhand': 5, 'avg': 17}], ['half cent', {'onhand': 1, 'avg': 1, 'events': [['recv', 1, 12], ['issue', 1]]}, {'cogs': [7], 'onhand': 1, 'avg': 7}], ['issue all', {'onhand': 4, 'avg': 25, 'events': [['recv', 4, 26], ['issue', 8]]}, {'cogs': [208], 'onhand': 0, 'avg': 26}]]]\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":"8074976509c29ed31738282d8b94aac7c659fd67fb8f9c6033390004164a490d","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    onhand = x['onhand']\n    avg = x['avg']\n    cogs = []\n    for ev in x['events']:\n        if ev[0] == 'recv':\n            q, c = ev[1], ev[2]\n            total = onhand * avg + q * c\n            units = onhand + q\n            avg = (2 * total + q) // (2 * q)\n            onhand = units\n        else:\n            q = ev[1]\n            if q > onhand:\n                cogs.append('short')\n                continue\n            cogs.append(q * avg)\n            onhand -= q\n    return {'cogs': cogs, 'onhand': onhand, 'avg': avg}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['receipt reprices', {'onhand': 10, 'avg': 100, 'events': [['recv', 10, 131], ['issue', 5]]}, {'cogs': [580], 'onhand': 15, 'avg': 116}], ['uneven rounding', {'onhand': 3, 'avg': 10, 'events': [['recv', 4, 12], ['issue', 2], ['issue', 1]]}, {'cogs': [22, 11], 'onhand': 4, 'avg': 11}], ['zero then receipt', {'onhand': 2, 'avg': 50, 'events': [['issue', 2], ['recv', 3, 71], ['issue', 1]]}, {'cogs': [100, 71], 'onhand': 2, 'avg': 71}], ['short issue', {'onhand': 2, 'avg': 50, 'events': [['issue', 4]]}, {'cogs': ['short'], 'onhand': 2, 'avg': 50}], ['many receipts', {'onhand': 0, 'avg': 0, 'events': [['recv', 1, 10], ['recv', 2, 13], ['recv', 1, 20], ['issue', 3]]}, {'cogs': [42], 'onhand': 1, 'avg': 14}], ['half cent', {'onhand': 1, 'avg': 1, 'events': [['recv', 1, 4], ['issue', 1]]}, {'cogs': [3], 'onhand': 1, 'avg': 3}], ['issue all', {'onhand': 4, 'avg': 25, 'events': [['recv', 4, 26], ['issue', 8]]}, {'cogs': [208], 'onhand': 0, 'avg': 26}]], [['receipt reprices', {'onhand': 10, 'avg': 100, 'events': [['recv', 10, 132], ['issue', 5]]}, {'cogs': [580], 'onhand': 15, 'avg': 116}], ['uneven rounding', {'onhand': 3, 'avg': 10, 'events': [['recv', 4, 13], ['issue', 2], ['issue', 1]]}, {'cogs': [24, 12], 'onhand': 4, 'avg': 12}], ['zero then receipt', {'onhand': 2, 'avg': 50, 'events': [['issue', 2], ['recv', 3, 72], ['issue', 1]]}, {'cogs': [100, 72], 'onhand': 2, 'avg': 72}], ['short issue', {'onhand': 2, 'avg': 50, 'events': [['issue', 5]]}, {'cogs': ['short'], 'onhand': 2, 'avg': 50}], ['many receipts', {'onhand': 0, 'avg': 0, 'events': [['recv', 1, 10], ['recv', 2, 13], ['recv', 2, 20], ['issue', 3]]}, {'cogs': [45], 'onhand': 2, 'avg': 15}], ['half cent', {'onhand': 1, 'avg': 1, 'events': [['recv', 1, 6], ['issue', 1]]}, {'cogs': [4], 'onhand': 1, 'avg': 4}], ['issue all', {'onhand': 4, 'avg': 25, 'events': [['recv', 4, 26], ['issue', 8]]}, {'cogs': [208], 'onhand': 0, 'avg': 26}]], [['receipt reprices', {'onhand': 10, 'avg': 100, 'events': [['recv', 10, 133], ['issue', 5]]}, {'cogs': [585], 'onhand': 15, 'avg': 117}], ['uneven rounding', {'onhand': 3, 'avg': 10, 'events': [['recv', 4, 14], ['issue', 2], ['issue', 1]]}, {'cogs': [24, 12], 'onhand': 4, 'avg': 12}], ['zero then receipt', {'onhand': 2, 'avg': 50, 'events': [['issue', 2], ['recv', 3, 73], ['issue', 1]]}, {'cogs': [100, 73], 'onhand': 2, 'avg': 73}], ['short issue', {'onhand': 2, 'avg': 50, 'events': [['issue', 6]]}, {'cogs': ['short'], 'onhand': 2, 'avg': 50}], ['many receipts', {'onhand': 0, 'avg': 0, 'events': [['recv', 1, 10], ['recv', 2, 13], ['recv', 3, 20], ['issue', 3]]}, {'cogs': [48], 'onhand': 3, 'avg': 16}], ['half cent', {'onhand': 1, 'avg': 1, 'events': [['recv', 1, 8], ['issue', 1]]}, {'cogs': [5], 'onhand': 1, 'avg': 5}], ['issue all', {'onhand': 4, 'avg': 25, 'events': [['recv', 4, 26], ['issue', 8]]}, {'cogs': [208], 'onhand': 0, 'avg': 26}]], [['receipt reprices', {'onhand': 10, 'avg': 100, 'events': [['recv', 10, 134], ['issue', 5]]}, {'cogs': [585], 'onhand': 15, 'avg': 117}], ['uneven rounding', {'onhand': 3, 'avg': 10, 'events': [['recv', 4, 15], ['issue', 2], ['issue', 1]]}, {'cogs': [26, 13], 'onhand': 4, 'avg': 13}], ['zero then receipt', {'onhand': 2, 'avg': 50, 'events': [['issue', 2], ['recv', 3, 74], ['issue', 1]]}, {'cogs': [100, 74], 'onhand': 2, 'avg': 74}], ['short issue', {'onhand': 2, 'avg': 50, 'events': [['issue', 7]]}, {'cogs': ['short'], 'onhand': 2, 'avg': 50}], ['many receipts', {'onhand': 0, 'avg': 0, 'events': [['recv', 1, 10], ['recv', 2, 13], ['recv', 4, 20], ['issue', 3]]}, {'cogs': [51], 'onhand': 4, 'avg': 17}], ['half cent', {'onhand': 1, 'avg': 1, 'events': [['recv', 1, 10], ['issue', 1]]}, {'cogs': [6], 'onhand': 1, 'avg': 6}], ['issue all', {'onhand': 4, 'avg': 25, 'events': [['recv', 4, 26], ['issue', 8]]}, {'cogs': [208], 'onhand': 0, 'avg': 26}]], [['receipt reprices', {'onhand': 10, 'avg': 100, 'events': [['recv', 10, 135], ['issue', 5]]}, {'cogs': [590], 'onhand': 15, 'avg': 118}], ['uneven rounding', {'onhand': 3, 'avg': 10, 'events': [['recv', 4, 16], ['issue', 2], ['issue', 1]]}, {'cogs': [26, 13], 'onhand': 4, 'avg': 13}], ['zero then receipt', {'onhand': 2, 'avg': 50, 'events': [['issue', 2], ['recv', 3, 75], ['issue', 1]]}, {'cogs': [100, 75], 'onhand': 2, 'avg': 75}], ['short issue', {'onhand': 2, 'avg': 50, 'events': [['issue', 8]]}, {'cogs': ['short'], 'onhand': 2, 'avg': 50}], ['many receipts', {'onhand': 0, 'avg': 0, 'events': [['recv', 1, 10], ['recv', 2, 13], ['recv', 5, 20], ['issue', 3]]}, {'cogs': [51], 'onhand': 5, 'avg': 17}], ['half cent', {'onhand': 1, 'avg': 1, 'events': [['recv', 1, 12], ['issue', 1]]}, {'cogs': [7], 'onhand': 1, 'avg': 7}], ['issue all', {'onhand': 4, 'avg': 25, 'events': [['recv', 4, 26], ['issue', 8]]}, {'cogs': [208], 'onhand': 0, 'avg': 26}]]]\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":"5d4a931234748314056837c197ef866c2920d3ed74598c622f949d8064f651ab","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    onhand = x['onhand']\n    avg = x['avg']\n    cogs = []\n    for ev in x['events']:\n        if ev[0] == 'recv':\n            q, c = ev[1], ev[2]\n            total = onhand * avg + q * c\n            units = onhand + q\n            avg = (2 * total + units) // (2 * units)\n            onhand = units\n        else:\n            q = ev[1]\n            if q > onhand:\n                cogs.append('short')\n                continue\n            cogs.append(q * avg)\n            onhand -= q\n    return {'cogs': cogs, 'onhand': onhand, 'avg': avg}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['receipt reprices', {'onhand': 10, 'avg': 100, 'events': [['recv', 10, 131], ['issue', 5]]}, {'cogs': [580], 'onhand': 15, 'avg': 116}], ['uneven rounding', {'onhand': 3, 'avg': 10, 'events': [['recv', 4, 12], ['issue', 2], ['issue', 1]]}, {'cogs': [22, 11], 'onhand': 4, 'avg': 11}], ['zero then receipt', {'onhand': 2, 'avg': 50, 'events': [['issue', 2], ['recv', 3, 71], ['issue', 1]]}, {'cogs': [100, 71], 'onhand': 2, 'avg': 71}], ['short issue', {'onhand': 2, 'avg': 50, 'events': [['issue', 4]]}, {'cogs': ['short'], 'onhand': 2, 'avg': 50}], ['many receipts', {'onhand': 0, 'avg': 0, 'events': [['recv', 1, 10], ['recv', 2, 13], ['recv', 1, 20], ['issue', 3]]}, {'cogs': [42], 'onhand': 1, 'avg': 14}], ['half cent', {'onhand': 1, 'avg': 1, 'events': [['recv', 1, 4], ['issue', 1]]}, {'cogs': [3], 'onhand': 1, 'avg': 3}], ['issue all', {'onhand': 4, 'avg': 25, 'events': [['recv', 4, 26], ['issue', 8]]}, {'cogs': [208], 'onhand': 0, 'avg': 26}]], [['receipt reprices', {'onhand': 10, 'avg': 100, 'events': [['recv', 10, 132], ['issue', 5]]}, {'cogs': [580], 'onhand': 15, 'avg': 116}], ['uneven rounding', {'onhand': 3, 'avg': 10, 'events': [['recv', 4, 13], ['issue', 2], ['issue', 1]]}, {'cogs': [24, 12], 'onhand': 4, 'avg': 12}], ['zero then receipt', {'onhand': 2, 'avg': 50, 'events': [['issue', 2], ['recv', 3, 72], ['issue', 1]]}, {'cogs': [100, 72], 'onhand': 2, 'avg': 72}], ['short issue', {'onhand': 2, 'avg': 50, 'events': [['issue', 5]]}, {'cogs': ['short'], 'onhand': 2, 'avg': 50}], ['many receipts', {'onhand': 0, 'avg': 0, 'events': [['recv', 1, 10], ['recv', 2, 13], ['recv', 2, 20], ['issue', 3]]}, {'cogs': [45], 'onhand': 2, 'avg': 15}], ['half cent', {'onhand': 1, 'avg': 1, 'events': [['recv', 1, 6], ['issue', 1]]}, {'cogs': [4], 'onhand': 1, 'avg': 4}], ['issue all', {'onhand': 4, 'avg': 25, 'events': [['recv', 4, 26], ['issue', 8]]}, {'cogs': [208], 'onhand': 0, 'avg': 26}]], [['receipt reprices', {'onhand': 10, 'avg': 100, 'events': [['recv', 10, 133], ['issue', 5]]}, {'cogs': [585], 'onhand': 15, 'avg': 117}], ['uneven rounding', {'onhand': 3, 'avg': 10, 'events': [['recv', 4, 14], ['issue', 2], ['issue', 1]]}, {'cogs': [24, 12], 'onhand': 4, 'avg': 12}], ['zero then receipt', {'onhand': 2, 'avg': 50, 'events': [['issue', 2], ['recv', 3, 73], ['issue', 1]]}, {'cogs': [100, 73], 'onhand': 2, 'avg': 73}], ['short issue', {'onhand': 2, 'avg': 50, 'events': [['issue', 6]]}, {'cogs': ['short'], 'onhand': 2, 'avg': 50}], ['many receipts', {'onhand': 0, 'avg': 0, 'events': [['recv', 1, 10], ['recv', 2, 13], ['recv', 3, 20], ['issue', 3]]}, {'cogs': [48], 'onhand': 3, 'avg': 16}], ['half cent', {'onhand': 1, 'avg': 1, 'events': [['recv', 1, 8], ['issue', 1]]}, {'cogs': [5], 'onhand': 1, 'avg': 5}], ['issue all', {'onhand': 4, 'avg': 25, 'events': [['recv', 4, 26], ['issue', 8]]}, {'cogs': [208], 'onhand': 0, 'avg': 26}]], [['receipt reprices', {'onhand': 10, 'avg': 100, 'events': [['recv', 10, 134], ['issue', 5]]}, {'cogs': [585], 'onhand': 15, 'avg': 117}], ['uneven rounding', {'onhand': 3, 'avg': 10, 'events': [['recv', 4, 15], ['issue', 2], ['issue', 1]]}, {'cogs': [26, 13], 'onhand': 4, 'avg': 13}], ['zero then receipt', {'onhand': 2, 'avg': 50, 'events': [['issue', 2], ['recv', 3, 74], ['issue', 1]]}, {'cogs': [100, 74], 'onhand': 2, 'avg': 74}], ['short issue', {'onhand': 2, 'avg': 50, 'events': [['issue', 7]]}, {'cogs': ['short'], 'onhand': 2, 'avg': 50}], ['many receipts', {'onhand': 0, 'avg': 0, 'events': [['recv', 1, 10], ['recv', 2, 13], ['recv', 4, 20], ['issue', 3]]}, {'cogs': [51], 'onhand': 4, 'avg': 17}], ['half cent', {'onhand': 1, 'avg': 1, 'events': [['recv', 1, 10], ['issue', 1]]}, {'cogs': [6], 'onhand': 1, 'avg': 6}], ['issue all', {'onhand': 4, 'avg': 25, 'events': [['recv', 4, 26], ['issue', 8]]}, {'cogs': [208], 'onhand': 0, 'avg': 26}]], [['receipt reprices', {'onhand': 10, 'avg': 100, 'events': [['recv', 10, 135], ['issue', 5]]}, {'cogs': [590], 'onhand': 15, 'avg': 118}], ['uneven rounding', {'onhand': 3, 'avg': 10, 'events': [['recv', 4, 16], ['issue', 2], ['issue', 1]]}, {'cogs': [26, 13], 'onhand': 4, 'avg': 13}], ['zero then receipt', {'onhand': 2, 'avg': 50, 'events': [['issue', 2], ['recv', 3, 75], ['issue', 1]]}, {'cogs': [100, 75], 'onhand': 2, 'avg': 75}], ['short issue', {'onhand': 2, 'avg': 50, 'events': [['issue', 8]]}, {'cogs': ['short'], 'onhand': 2, 'avg': 50}], ['many receipts', {'onhand': 0, 'avg': 0, 'events': [['recv', 1, 10], ['recv', 2, 13], ['recv', 5, 20], ['issue', 3]]}, {'cogs': [51], 'onhand': 5, 'avg': 17}], ['half cent', {'onhand': 1, 'avg': 1, 'events': [['recv', 1, 12], ['issue', 1]]}, {'cogs': [7], 'onhand': 1, 'avg': 7}], ['issue all', {'onhand': 4, 'avg': 25, 'events': [['recv', 4, 26], ['issue', 8]]}, {'cogs': [208], 'onhand': 0, 'avg': 26}]]]\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-moving-average-average-denominator","generated_at":"2026-09-29T14:46:40.670158+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":"Divide pooled value by (on-hand + received) units.","root_cause":"The weighted average divides the pooled value by the received units instead of total units on hand after receipt.","sha256":"edb220533bb5f8875a3eb8c5321ef886ec38f7877d7bf6e06d945035e9851fda","title":"Moving average perpetual costing: average denominator · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":42.051,"exit_code":1,"observations":[{"actual":{"avg":231,"cogs":[1155],"onhand":15},"check":"receipt reprices","expected":{"avg":116,"cogs":[580],"onhand":15},"passed":false},{"actual":{"avg":26,"cogs":[52,26],"onhand":4},"check":"uneven rounding","expected":{"avg":11,"cogs":[22,11],"onhand":4},"passed":false},{"actual":{"avg":213,"cogs":[100,213],"onhand":2},"check":"zero then receipt","expected":{"avg":71,"cogs":[100,71],"onhand":2},"passed":false},{"actual":{"avg":50,"cogs":["short"],"onhand":2},"check":"short issue","expected":{"avg":50,"cogs":["short"],"onhand":2},"passed":true},{"actual":{"avg":43,"cogs":[129],"onhand":1},"check":"many receipts","expected":{"avg":14,"cogs":[42],"onhand":1},"passed":false},{"actual":{"avg":5,"cogs":[5],"onhand":1},"check":"half cent","expected":{"avg":3,"cogs":[3],"onhand":1},"passed":false},{"actual":{"avg":51,"cogs":[408],"onhand":0},"check":"issue all","expected":{"avg":26,"cogs":[208],"onhand":0},"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"receipt reprices\", \"actual\": {\"cogs\": [1155], \"onhand\": 15, \"avg\": 231}, \"expected\": {\"cogs\": [580], \"onhand\": 15, \"avg\": 116}, \"passed\": false}, {\"check\": \"uneven rounding\", \"actual\": {\"cogs\": [52, 26], \"onhand\": 4, \"avg\": 26}, \"expected\": {\"cogs\": [22, 11], \"onhand\": 4, \"avg\": 11}, \"passed\": false}, {\"check\": \"zero then receipt\", \"actual\": {\"cogs\": [100, 213], \"onhand\": 2, \"avg\": 213}, \"expected\": {\"cogs\": [100, 71], \"onhand\": 2, \"avg\": 71}, \"passed\": false}, {\"check\": \"short issue\", \"actual\": {\"cogs\": [\"short\"], \"onhand\": 2, \"avg\": 50}, \"expected\": {\"cogs\": [\"short\"], \"onhand\": 2, \"avg\": 50}, \"passed\": true}, {\"check\": \"many receipts\", \"actual\": {\"cogs\": [129], \"onhand\": 1, \"avg\": 43}, \"expected\": {\"cogs\": [42], \"onhand\": 1, \"avg\": 14}, \"passed\": false}, {\"check\": \"half cent\", \"actual\": {\"cogs\": [5], \"onhand\": 1, \"avg\": 5}, \"expected\": {\"cogs\": [3], \"onhand\": 1, \"avg\": 3}, \"passed\": false}, {\"check\": \"issue all\", \"actual\": {\"cogs\": [408], \"onhand\": 0, \"avg\": 51}, \"expected\": {\"cogs\": [208], \"onhand\": 0, \"avg\": 26}, \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":39.959,"exit_code":1,"observations":[{"actual":{"avg":231,"cogs":[1155],"onhand":15},"check":"receipt reprices","expected":{"avg":116,"cogs":[580],"onhand":15},"passed":false},{"actual":{"avg":20,"cogs":[40,20],"onhand":4},"check":"uneven rounding","expected":{"avg":11,"cogs":[22,11],"onhand":4},"passed":false},{"actual":{"avg":71,"cogs":[100,71],"onhand":2},"check":"zero then receipt","expected":{"avg":71,"cogs":[100,71],"onhand":2},"passed":true},{"actual":{"avg":50,"cogs":["short"],"onhand":2},"check":"short issue","expected":{"avg":50,"cogs":["short"],"onhand":2},"passed":true},{"actual":{"avg":74,"cogs":[222],"onhand":1},"check":"many receipts","expected":{"avg":14,"cogs":[42],"onhand":1},"passed":false},{"actual":{"avg":5,"cogs":[5],"onhand":1},"check":"half cent","expected":{"avg":3,"cogs":[3],"onhand":1},"passed":false},{"actual":{"avg":51,"cogs":[408],"onhand":0},"check":"issue all","expected":{"avg":26,"cogs":[208],"onhand":0},"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"receipt reprices\", \"actual\": {\"cogs\": [1155], \"onhand\": 15, \"avg\": 231}, \"expected\": {\"cogs\": [580], \"onhand\": 15, \"avg\": 116}, \"passed\": false}, {\"check\": \"uneven rounding\", \"actual\": {\"cogs\": [40, 20], \"onhand\": 4, \"avg\": 20}, \"expected\": {\"cogs\": [22, 11], \"onhand\": 4, \"avg\": 11}, \"passed\": false}, {\"check\": \"zero then receipt\", \"actual\": {\"cogs\": [100, 71], \"onhand\": 2, \"avg\": 71}, \"expected\": {\"cogs\": [100, 71], \"onhand\": 2, \"avg\": 71}, \"passed\": true}, {\"check\": \"short issue\", \"actual\": {\"cogs\": [\"short\"], \"onhand\": 2, \"avg\": 50}, \"expected\": {\"cogs\": [\"short\"], \"onhand\": 2, \"avg\": 50}, \"passed\": true}, {\"check\": \"many receipts\", \"actual\": {\"cogs\": [222], \"onhand\": 1, \"avg\": 74}, \"expected\": {\"cogs\": [42], \"onhand\": 1, \"avg\": 14}, \"passed\": false}, {\"check\": \"half cent\", \"actual\": {\"cogs\": [5], \"onhand\": 1, \"avg\": 5}, \"expected\": {\"cogs\": [3], \"onhand\": 1, \"avg\": 3}, \"passed\": false}, {\"check\": \"issue all\", \"actual\": {\"cogs\": [408], \"onhand\": 0, \"avg\": 51}, \"expected\": {\"cogs\": [208], \"onhand\": 0, \"avg\": 26}, \"passed\": false}], \"passed\": false}\n"},"fixed":{"elapsed_ms":42.279,"exit_code":0,"observations":[{"actual":{"avg":116,"cogs":[580],"onhand":15},"check":"receipt reprices","expected":{"avg":116,"cogs":[580],"onhand":15},"passed":true},{"actual":{"avg":11,"cogs":[22,11],"onhand":4},"check":"uneven rounding","expected":{"avg":11,"cogs":[22,11],"onhand":4},"passed":true},{"actual":{"avg":71,"cogs":[100,71],"onhand":2},"check":"zero then receipt","expected":{"avg":71,"cogs":[100,71],"onhand":2},"passed":true},{"actual":{"avg":50,"cogs":["short"],"onhand":2},"check":"short issue","expected":{"avg":50,"cogs":["short"],"onhand":2},"passed":true},{"actual":{"avg":14,"cogs":[42],"onhand":1},"check":"many receipts","expected":{"avg":14,"cogs":[42],"onhand":1},"passed":true},{"actual":{"avg":3,"cogs":[3],"onhand":1},"check":"half cent","expected":{"avg":3,"cogs":[3],"onhand":1},"passed":true},{"actual":{"avg":26,"cogs":[208],"onhand":0},"check":"issue all","expected":{"avg":26,"cogs":[208],"onhand":0},"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"receipt reprices\", \"actual\": {\"cogs\": [580], \"onhand\": 15, \"avg\": 116}, \"expected\": {\"cogs\": [580], \"onhand\": 15, \"avg\": 116}, \"passed\": true}, {\"check\": \"uneven rounding\", \"actual\": {\"cogs\": [22, 11], \"onhand\": 4, \"avg\": 11}, \"expected\": {\"cogs\": [22, 11], \"onhand\": 4, \"avg\": 11}, \"passed\": true}, {\"check\": \"zero then receipt\", \"actual\": {\"cogs\": [100, 71], \"onhand\": 2, \"avg\": 71}, \"expected\": {\"cogs\": [100, 71], \"onhand\": 2, \"avg\": 71}, \"passed\": true}, {\"check\": \"short issue\", \"actual\": {\"cogs\": [\"short\"], \"onhand\": 2, \"avg\": 50}, \"expected\": {\"cogs\": [\"short\"], \"onhand\": 2, \"avg\": 50}, \"passed\": true}, {\"check\": \"many receipts\", \"actual\": {\"cogs\": [42], \"onhand\": 1, \"avg\": 14}, \"expected\": {\"cogs\": [42], \"onhand\": 1, \"avg\": 14}, \"passed\": true}, {\"check\": \"half cent\", \"actual\": {\"cogs\": [3], \"onhand\": 1, \"avg\": 3}, \"expected\": {\"cogs\": [3], \"onhand\": 1, \"avg\": 3}, \"passed\": true}, {\"check\": \"issue all\", \"actual\": {\"cogs\": [208], \"onhand\": 0, \"avg\": 26}, \"expected\": {\"cogs\": [208], \"onhand\": 0, \"avg\": 26}, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}