FA-59901 / Inventory cost layering / Open access
Moving average perpetual costing: average denominator · case 01
After a receipt the new average is far too high because the pooled cost is divided by the receipt quantity only.
ROOT CAUSE
The weighted average divides the pooled value by the received units instead of total units on hand after receipt.
VERIFIED REPAIR
Divide pooled value by (on-hand + received) units.
Unsuccessful approach: Dividing by the pre-receipt on-hand units breaks when stock was empty and still misweights otherwise.
Case 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}.
Why this case matters
Inventory valuation and cost-of-goods decisions depend on this rule.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
onhand = x['onhand']
avg = x['avg']
cogs = []
for ev in x['events']:
if ev[0] == 'recv':
q, c = ev[1], ev[2]
total = onhand * avg + q * c
units = onhand + q
avg = (2 * total + q) // (2 * q)
onhand = units
else:
q = ev[1]
if q > onhand:
cogs.append('short')
continue
cogs.append(q * avg)
onhand -= q
return {'cogs': cogs, 'onhand': onhand, 'avg': avg}
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['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}]]]
for label, args, expected in fixtures[N-1]:
check(label, solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| receipt reprices | {'avg': 231, 'cogs': [1155], 'onhand': 15} | {'avg': 116, 'cogs': [580], 'onhand': 15} | Failed |
| uneven rounding | {'avg': 20, 'cogs': [40, 20], 'onhand': 4} | {'avg': 11, 'cogs': [22, 11], 'onhand': 4} | Failed |
| zero then receipt | {'avg': 71, 'cogs': [100, 71], 'onhand': 2} | {'avg': 71, 'cogs': [100, 71], 'onhand': 2} | Passed |
| short issue | {'avg': 50, 'cogs': ['short'], 'onhand': 2} | {'avg': 50, 'cogs': ['short'], 'onhand': 2} | Passed |
| many receipts | {'avg': 74, 'cogs': [222], 'onhand': 1} | {'avg': 14, 'cogs': [42], 'onhand': 1} | Failed |
| half cent | {'avg': 5, 'cogs': [5], 'onhand': 1} | {'avg': 3, 'cogs': [3], 'onhand': 1} | Failed |
| issue all | {'avg': 51, 'cogs': [408], 'onhand': 0} | {'avg': 26, 'cogs': [208], 'onhand': 0} | Failed |
SHA-256 / 8074976509c29ed31738282d8b94aac7c659fd67fb8f9c6033390004164a490d
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
onhand = x['onhand']
avg = x['avg']
cogs = []
for ev in x['events']:
if ev[0] == 'recv':
q, c = ev[1], ev[2]
total = onhand * avg + q * c
units = onhand + q
avg = (2 * total + max(onhand, 1)) // (2 * max(onhand, 1))
onhand = units
else:
q = ev[1]
if q > onhand:
cogs.append('short')
continue
cogs.append(q * avg)
onhand -= q
return {'cogs': cogs, 'onhand': onhand, 'avg': avg}
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['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}]]]
for label, args, expected in fixtures[N-1]:
check(label, solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| receipt reprices | {'avg': 231, 'cogs': [1155], 'onhand': 15} | {'avg': 116, 'cogs': [580], 'onhand': 15} | Failed |
| uneven rounding | {'avg': 26, 'cogs': [52, 26], 'onhand': 4} | {'avg': 11, 'cogs': [22, 11], 'onhand': 4} | Failed |
| zero then receipt | {'avg': 213, 'cogs': [100, 213], 'onhand': 2} | {'avg': 71, 'cogs': [100, 71], 'onhand': 2} | Failed |
| short issue | {'avg': 50, 'cogs': ['short'], 'onhand': 2} | {'avg': 50, 'cogs': ['short'], 'onhand': 2} | Passed |
| many receipts | {'avg': 43, 'cogs': [129], 'onhand': 1} | {'avg': 14, 'cogs': [42], 'onhand': 1} | Failed |
| half cent | {'avg': 5, 'cogs': [5], 'onhand': 1} | {'avg': 3, 'cogs': [3], 'onhand': 1} | Failed |
| issue all | {'avg': 51, 'cogs': [408], 'onhand': 0} | {'avg': 26, 'cogs': [208], 'onhand': 0} | Failed |
SHA-256 / 692621b25c8aea27771c25c16f249852cde613d5377f9a4bcebcb45e213d2150
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
onhand = x['onhand']
avg = x['avg']
cogs = []
for ev in x['events']:
if ev[0] == 'recv':
q, c = ev[1], ev[2]
total = onhand * avg + q * c
units = onhand + q
avg = (2 * total + units) // (2 * units)
onhand = units
else:
q = ev[1]
if q > onhand:
cogs.append('short')
continue
cogs.append(q * avg)
onhand -= q
return {'cogs': cogs, 'onhand': onhand, 'avg': avg}
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['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}]]]
for label, args, expected in fixtures[N-1]:
check(label, solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| receipt reprices | {'avg': 116, 'cogs': [580], 'onhand': 15} | {'avg': 116, 'cogs': [580], 'onhand': 15} | Passed |
| uneven rounding | {'avg': 11, 'cogs': [22, 11], 'onhand': 4} | {'avg': 11, 'cogs': [22, 11], 'onhand': 4} | Passed |
| zero then receipt | {'avg': 71, 'cogs': [100, 71], 'onhand': 2} | {'avg': 71, 'cogs': [100, 71], 'onhand': 2} | Passed |
| short issue | {'avg': 50, 'cogs': ['short'], 'onhand': 2} | {'avg': 50, 'cogs': ['short'], 'onhand': 2} | Passed |
| many receipts | {'avg': 14, 'cogs': [42], 'onhand': 1} | {'avg': 14, 'cogs': [42], 'onhand': 1} | Passed |
| half cent | {'avg': 3, 'cogs': [3], 'onhand': 1} | {'avg': 3, 'cogs': [3], 'onhand': 1} | Passed |
| issue all | {'avg': 26, 'cogs': [208], 'onhand': 0} | {'avg': 26, 'cogs': [208], 'onhand': 0} | Passed |
SHA-256 / 5d4a931234748314056837c197ef866c2920d3ed74598c622f949d8064f651ab
Verification & scope
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.
Observations recorded using Python 3.12.14 at 2026-09-29T14:46:40.670158+00:00.
Case digest / edb220533bb5f8875a3eb8c5321ef886ec38f7877d7bf6e06d945035e9851fda