FA-60116 / Inventory cost layering / Open access
FIFO costing with customer returns: restock piece order · case 01
A partial return is credited at the oldest layer cost of the sale instead of the units most recently shipped.
ROOT CAUSE
Returned units are matched to the first-consumed piece of the sale.
VERIFIED REPAIR
Unwind the sale from its last-consumed piece first.
Unsuccessful approach: Matching the most expensive piece first coincides only when later layers cost more.
Case contract
Events: ["recv",qty,cost] opens a layer with the next receipt sequence; ["sale",id,qty] consumes FIFO and records the pieces taken; ["return",id,qty] restocks units at the cost they left with, last-consumed piece first, into the layer with the same receipt sequence (recreated in sequence order if gone). Returns above the unreturned quantity of that sale are "rejected"; sales above stock are "short". Return {results, layers:[[seq,qty,cost]]}.
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):
layers = []
seq = 0
sold = {}
out = []
for ev in x['events']:
if ev[0] == 'recv':
seq += 1
layers.append([seq, ev[1], ev[2]])
out.append(seq)
elif ev[0] == 'sale':
q = ev[2]
if q > sum(l[1] for l in layers):
out.append('short')
continue
took = []
cost = 0
while q > 0:
l = layers[0]
t = min(q, l[1])
took.append([l[0], t, l[2]])
cost += t * l[2]
l[1] -= t
q -= t
if l[1] == 0:
layers.pop(0)
sold[ev[1]] = took
out.append(cost)
else:
took = sold.get(ev[1], [])
q = ev[2]
if q > sum(t[1] for t in took):
out.append('rejected')
continue
credit = 0
while q > 0:
j = 0
t = took[j]
r = min(q, t[1])
credit += r * t[2]
t[1] -= r
q -= r
if t[1] == 0:
took.pop(j)
match = [l for l in layers if l[0] == t[0]]
if match:
match[0][1] += r
else:
layers.append([t[0], r, t[2]])
layers.sort(key=lambda l: l[0])
out.append(credit)
return {'results': out, 'layers': layers}
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['return last consumed', {'events': [['recv', 3, 10], ['recv', 5, 14], ['sale', 's1', 5], ['return', 's1', 2]]}, {'results': [1, 2, 58, 28], 'layers': [[2, 5, 14]]}], ['full return', {'events': [['recv', 2, 20], ['recv', 2, 30], ['sale', 's1', 4], ['return', 's1', 4]]}, {'results': [1, 2, 100, 100], 'layers': [[1, 2, 20], [2, 2, 30]]}], ['over return', {'events': [['recv', 4, 7], ['sale', 's1', 2], ['return', 's1', 1], ['return', 's1', 2]]}, {'results': [1, 14, 7, 'rejected'], 'layers': [[1, 3, 7]]}], ['restore into existing', {'events': [['recv', 4, 11], ['sale', 's1', 1], ['return', 's1', 1], ['sale', 's2', 4]]}, {'results': [1, 11, 11, 44], 'layers': []}], ['restore gone layer', {'events': [['recv', 2, 5], ['recv', 3, 9], ['recv', 1, 9], ['sale', 's1', 3], ['return', 's1', 3], ['sale', 's2', 2]]}, {'results': [1, 2, 3, 19, 19, 10], 'layers': [[2, 3, 9], [3, 1, 9]]}], ['unknown sale', {'events': [['recv', 2, 5], ['return', 'zz', 1]]}, {'results': [1, 'rejected'], 'layers': [[1, 2, 5]]}], ['short sale', {'events': [['recv', 1, 5], ['sale', 's1', 3]]}, {'results': [1, 'short'], 'layers': [[1, 1, 5]]}], ['falling prices', {'events': [['recv', 2, 50], ['recv', 3, 21], ['sale', 's1', 4], ['return', 's1', 1]]}, {'results': [1, 2, 142, 21], 'layers': [[2, 2, 21]]}]], [['return last consumed', {'events': [['recv', 3, 10], ['recv', 5, 14], ['sale', 's1', 5], ['return', 's1', 1]]}, {'results': [1, 2, 58, 14], 'layers': [[2, 4, 14]]}], ['full return', {'events': [['recv', 2, 20], ['recv', 2, 30], ['sale', 's1', 4], ['return', 's1', 4]]}, {'results': [1, 2, 100, 100], 'layers': [[1, 2, 20], [2, 2, 30]]}], ['over return', {'events': [['recv', 4, 7], ['sale', 's1', 2], ['return', 's1', 1], ['return', 's1', 2]]}, {'results': [1, 14, 7, 'rejected'], 'layers': [[1, 3, 7]]}], ['restore into existing', {'events': [['recv', 4, 11], ['sale', 's1', 1], ['return', 's1', 1], ['sale', 's2', 4]]}, {'results': [1, 11, 11, 44], 'layers': []}], ['restore gone layer', {'events': [['recv', 2, 5], ['recv', 3, 10], ['recv', 1, 9], ['sale', 's1', 3], ['return', 's1', 3], ['sale', 's2', 2]]}, {'results': [1, 2, 3, 20, 20, 10], 'layers': [[2, 3, 10], [3, 1, 9]]}], ['unknown sale', {'events': [['recv', 2, 5], ['return', 'zz', 1]]}, {'results': [1, 'rejected'], 'layers': [[1, 2, 5]]}], ['short sale', {'events': [['recv', 1, 5], ['sale', 's1', 4]]}, {'results': [1, 'short'], 'layers': [[1, 1, 5]]}], ['falling prices', {'events': [['recv', 2, 50], ['recv', 3, 22], ['sale', 's1', 4], ['return', 's1', 1]]}, {'results': [1, 2, 144, 22], 'layers': [[2, 2, 22]]}]], [['return last consumed', {'events': [['recv', 3, 10], ['recv', 5, 14], ['sale', 's1', 5], ['return', 's1', 2]]}, {'results': [1, 2, 58, 28], 'layers': [[2, 5, 14]]}], ['full return', {'events': [['recv', 2, 20], ['recv', 2, 30], ['sale', 's1', 4], ['return', 's1', 4]]}, {'results': [1, 2, 100, 100], 'layers': [[1, 2, 20], [2, 2, 30]]}], ['over return', {'events': [['recv', 4, 7], ['sale', 's1', 2], ['return', 's1', 1], ['return', 's1', 2]]}, {'results': [1, 14, 7, 'rejected'], 'layers': [[1, 3, 7]]}], ['restore into existing', {'events': [['recv', 4, 11], ['sale', 's1', 1], ['return', 's1', 1], ['sale', 's2', 4]]}, {'results': [1, 11, 11, 44], 'layers': []}], ['restore gone layer', {'events': [['recv', 2, 5], ['recv', 3, 11], ['recv', 1, 9], ['sale', 's1', 3], ['return', 's1', 3], ['sale', 's2', 2]]}, {'results': [1, 2, 3, 21, 21, 10], 'layers': [[2, 3, 11], [3, 1, 9]]}], ['unknown sale', {'events': [['recv', 2, 5], ['return', 'zz', 1]]}, {'results': [1, 'rejected'], 'layers': [[1, 2, 5]]}], ['short sale', {'events': [['recv', 1, 5], ['sale', 's1', 5]]}, {'results': [1, 'short'], 'layers': [[1, 1, 5]]}], ['falling prices', {'events': [['recv', 2, 50], ['recv', 3, 23], ['sale', 's1', 4], ['return', 's1', 1]]}, {'results': [1, 2, 146, 23], 'layers': [[2, 2, 23]]}]], [['return last consumed', {'events': [['recv', 3, 10], ['recv', 5, 14], ['sale', 's1', 5], ['return', 's1', 1]]}, {'results': [1, 2, 58, 14], 'layers': [[2, 4, 14]]}], ['full return', {'events': [['recv', 2, 20], ['recv', 2, 30], ['sale', 's1', 4], ['return', 's1', 4]]}, {'results': [1, 2, 100, 100], 'layers': [[1, 2, 20], [2, 2, 30]]}], ['over return', {'events': [['recv', 4, 7], ['sale', 's1', 2], ['return', 's1', 1], ['return', 's1', 2]]}, {'results': [1, 14, 7, 'rejected'], 'layers': [[1, 3, 7]]}], ['restore into existing', {'events': [['recv', 4, 11], ['sale', 's1', 1], ['return', 's1', 1], ['sale', 's2', 4]]}, {'results': [1, 11, 11, 44], 'layers': []}], ['restore gone layer', {'events': [['recv', 2, 5], ['recv', 3, 12], ['recv', 1, 9], ['sale', 's1', 3], ['return', 's1', 3], ['sale', 's2', 2]]}, {'results': [1, 2, 3, 22, 22, 10], 'layers': [[2, 3, 12], [3, 1, 9]]}], ['unknown sale', {'events': [['recv', 2, 5], ['return', 'zz', 1]]}, {'results': [1, 'rejected'], 'layers': [[1, 2, 5]]}], ['short sale', {'events': [['recv', 1, 5], ['sale', 's1', 6]]}, {'results': [1, 'short'], 'layers': [[1, 1, 5]]}], ['falling prices', {'events': [['recv', 2, 50], ['recv', 3, 24], ['sale', 's1', 4], ['return', 's1', 1]]}, {'results': [1, 2, 148, 24], 'layers': [[2, 2, 24]]}]], [['return last consumed', {'events': [['recv', 3, 10], ['recv', 5, 14], ['sale', 's1', 5], ['return', 's1', 2]]}, {'results': [1, 2, 58, 28], 'layers': [[2, 5, 14]]}], ['full return', {'events': [['recv', 2, 20], ['recv', 2, 30], ['sale', 's1', 4], ['return', 's1', 4]]}, {'results': [1, 2, 100, 100], 'layers': [[1, 2, 20], [2, 2, 30]]}], ['over return', {'events': [['recv', 4, 7], ['sale', 's1', 2], ['return', 's1', 1], ['return', 's1', 2]]}, {'results': [1, 14, 7, 'rejected'], 'layers': [[1, 3, 7]]}], ['restore into existing', {'events': [['recv', 4, 11], ['sale', 's1', 1], ['return', 's1', 1], ['sale', 's2', 4]]}, {'results': [1, 11, 11, 44], 'layers': []}], ['restore gone layer', {'events': [['recv', 2, 5], ['recv', 3, 13], ['recv', 1, 9], ['sale', 's1', 3], ['return', 's1', 3], ['sale', 's2', 2]]}, {'results': [1, 2, 3, 23, 23, 10], 'layers': [[2, 3, 13], [3, 1, 9]]}], ['unknown sale', {'events': [['recv', 2, 5], ['return', 'zz', 1]]}, {'results': [1, 'rejected'], 'layers': [[1, 2, 5]]}], ['short sale', {'events': [['recv', 1, 5], ['sale', 's1', 7]]}, {'results': [1, 'short'], 'layers': [[1, 1, 5]]}], ['falling prices', {'events': [['recv', 2, 50], ['recv', 3, 25], ['sale', 's1', 4], ['return', 's1', 1]]}, {'results': [1, 2, 150, 25], 'layers': [[2, 2, 25]]}]]]
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 |
|---|---|---|---|
| return last consumed | {'layers': [[1, 2, 10], [2, 3, 14]], 'results': [1, 2, 58, 20]} | {'layers': [[2, 5, 14]], 'results': [1, 2, 58, 28]} | Failed |
| full return | {'layers': [[1, 2, 20], [2, 2, 30]], 'results': [1, 2, 100, 100]} | {'layers': [[1, 2, 20], [2, 2, 30]], 'results': [1, 2, 100, 100]} | Passed |
| over return | {'layers': [[1, 3, 7]], 'results': [1, 14, 7, 'rejected']} | {'layers': [[1, 3, 7]], 'results': [1, 14, 7, 'rejected']} | Passed |
| restore into existing | {'layers': [], 'results': [1, 11, 11, 44]} | {'layers': [], 'results': [1, 11, 11, 44]} | Passed |
| restore gone layer | {'layers': [[2, 3, 9], [3, 1, 9]], 'results': [1, 2, 3, 19, 19, 10]} | {'layers': [[2, 3, 9], [3, 1, 9]], 'results': [1, 2, 3, 19, 19, 10]} | Passed |
| unknown sale | {'layers': [[1, 2, 5]], 'results': [1, 'rejected']} | {'layers': [[1, 2, 5]], 'results': [1, 'rejected']} | Passed |
| short sale | {'layers': [[1, 1, 5]], 'results': [1, 'short']} | {'layers': [[1, 1, 5]], 'results': [1, 'short']} | Passed |
| falling prices | {'layers': [[1, 1, 50], [2, 1, 21]], 'results': [1, 2, 142, 50]} | {'layers': [[2, 2, 21]], 'results': [1, 2, 142, 21]} | Failed |
SHA-256 / 65687a8d78def7ebf349fe97bcbe8ae2303c0c2ecf92d36771ec03bad8c498b3
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
layers = []
seq = 0
sold = {}
out = []
for ev in x['events']:
if ev[0] == 'recv':
seq += 1
layers.append([seq, ev[1], ev[2]])
out.append(seq)
elif ev[0] == 'sale':
q = ev[2]
if q > sum(l[1] for l in layers):
out.append('short')
continue
took = []
cost = 0
while q > 0:
l = layers[0]
t = min(q, l[1])
took.append([l[0], t, l[2]])
cost += t * l[2]
l[1] -= t
q -= t
if l[1] == 0:
layers.pop(0)
sold[ev[1]] = took
out.append(cost)
else:
took = sold.get(ev[1], [])
q = ev[2]
if q > sum(t[1] for t in took):
out.append('rejected')
continue
credit = 0
while q > 0:
j = max(range(len(took)), key=lambda i: took[i][2])
t = took[j]
r = min(q, t[1])
credit += r * t[2]
t[1] -= r
q -= r
if t[1] == 0:
took.pop(j)
match = [l for l in layers if l[0] == t[0]]
if match:
match[0][1] += r
else:
layers.append([t[0], r, t[2]])
layers.sort(key=lambda l: l[0])
out.append(credit)
return {'results': out, 'layers': layers}
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['return last consumed', {'events': [['recv', 3, 10], ['recv', 5, 14], ['sale', 's1', 5], ['return', 's1', 2]]}, {'results': [1, 2, 58, 28], 'layers': [[2, 5, 14]]}], ['full return', {'events': [['recv', 2, 20], ['recv', 2, 30], ['sale', 's1', 4], ['return', 's1', 4]]}, {'results': [1, 2, 100, 100], 'layers': [[1, 2, 20], [2, 2, 30]]}], ['over return', {'events': [['recv', 4, 7], ['sale', 's1', 2], ['return', 's1', 1], ['return', 's1', 2]]}, {'results': [1, 14, 7, 'rejected'], 'layers': [[1, 3, 7]]}], ['restore into existing', {'events': [['recv', 4, 11], ['sale', 's1', 1], ['return', 's1', 1], ['sale', 's2', 4]]}, {'results': [1, 11, 11, 44], 'layers': []}], ['restore gone layer', {'events': [['recv', 2, 5], ['recv', 3, 9], ['recv', 1, 9], ['sale', 's1', 3], ['return', 's1', 3], ['sale', 's2', 2]]}, {'results': [1, 2, 3, 19, 19, 10], 'layers': [[2, 3, 9], [3, 1, 9]]}], ['unknown sale', {'events': [['recv', 2, 5], ['return', 'zz', 1]]}, {'results': [1, 'rejected'], 'layers': [[1, 2, 5]]}], ['short sale', {'events': [['recv', 1, 5], ['sale', 's1', 3]]}, {'results': [1, 'short'], 'layers': [[1, 1, 5]]}], ['falling prices', {'events': [['recv', 2, 50], ['recv', 3, 21], ['sale', 's1', 4], ['return', 's1', 1]]}, {'results': [1, 2, 142, 21], 'layers': [[2, 2, 21]]}]], [['return last consumed', {'events': [['recv', 3, 10], ['recv', 5, 14], ['sale', 's1', 5], ['return', 's1', 1]]}, {'results': [1, 2, 58, 14], 'layers': [[2, 4, 14]]}], ['full return', {'events': [['recv', 2, 20], ['recv', 2, 30], ['sale', 's1', 4], ['return', 's1', 4]]}, {'results': [1, 2, 100, 100], 'layers': [[1, 2, 20], [2, 2, 30]]}], ['over return', {'events': [['recv', 4, 7], ['sale', 's1', 2], ['return', 's1', 1], ['return', 's1', 2]]}, {'results': [1, 14, 7, 'rejected'], 'layers': [[1, 3, 7]]}], ['restore into existing', {'events': [['recv', 4, 11], ['sale', 's1', 1], ['return', 's1', 1], ['sale', 's2', 4]]}, {'results': [1, 11, 11, 44], 'layers': []}], ['restore gone layer', {'events': [['recv', 2, 5], ['recv', 3, 10], ['recv', 1, 9], ['sale', 's1', 3], ['return', 's1', 3], ['sale', 's2', 2]]}, {'results': [1, 2, 3, 20, 20, 10], 'layers': [[2, 3, 10], [3, 1, 9]]}], ['unknown sale', {'events': [['recv', 2, 5], ['return', 'zz', 1]]}, {'results': [1, 'rejected'], 'layers': [[1, 2, 5]]}], ['short sale', {'events': [['recv', 1, 5], ['sale', 's1', 4]]}, {'results': [1, 'short'], 'layers': [[1, 1, 5]]}], ['falling prices', {'events': [['recv', 2, 50], ['recv', 3, 22], ['sale', 's1', 4], ['return', 's1', 1]]}, {'results': [1, 2, 144, 22], 'layers': [[2, 2, 22]]}]], [['return last consumed', {'events': [['recv', 3, 10], ['recv', 5, 14], ['sale', 's1', 5], ['return', 's1', 2]]}, {'results': [1, 2, 58, 28], 'layers': [[2, 5, 14]]}], ['full return', {'events': [['recv', 2, 20], ['recv', 2, 30], ['sale', 's1', 4], ['return', 's1', 4]]}, {'results': [1, 2, 100, 100], 'layers': [[1, 2, 20], [2, 2, 30]]}], ['over return', {'events': [['recv', 4, 7], ['sale', 's1', 2], ['return', 's1', 1], ['return', 's1', 2]]}, {'results': [1, 14, 7, 'rejected'], 'layers': [[1, 3, 7]]}], ['restore into existing', {'events': [['recv', 4, 11], ['sale', 's1', 1], ['return', 's1', 1], ['sale', 's2', 4]]}, {'results': [1, 11, 11, 44], 'layers': []}], ['restore gone layer', {'events': [['recv', 2, 5], ['recv', 3, 11], ['recv', 1, 9], ['sale', 's1', 3], ['return', 's1', 3], ['sale', 's2', 2]]}, {'results': [1, 2, 3, 21, 21, 10], 'layers': [[2, 3, 11], [3, 1, 9]]}], ['unknown sale', {'events': [['recv', 2, 5], ['return', 'zz', 1]]}, {'results': [1, 'rejected'], 'layers': [[1, 2, 5]]}], ['short sale', {'events': [['recv', 1, 5], ['sale', 's1', 5]]}, {'results': [1, 'short'], 'layers': [[1, 1, 5]]}], ['falling prices', {'events': [['recv', 2, 50], ['recv', 3, 23], ['sale', 's1', 4], ['return', 's1', 1]]}, {'results': [1, 2, 146, 23], 'layers': [[2, 2, 23]]}]], [['return last consumed', {'events': [['recv', 3, 10], ['recv', 5, 14], ['sale', 's1', 5], ['return', 's1', 1]]}, {'results': [1, 2, 58, 14], 'layers': [[2, 4, 14]]}], ['full return', {'events': [['recv', 2, 20], ['recv', 2, 30], ['sale', 's1', 4], ['return', 's1', 4]]}, {'results': [1, 2, 100, 100], 'layers': [[1, 2, 20], [2, 2, 30]]}], ['over return', {'events': [['recv', 4, 7], ['sale', 's1', 2], ['return', 's1', 1], ['return', 's1', 2]]}, {'results': [1, 14, 7, 'rejected'], 'layers': [[1, 3, 7]]}], ['restore into existing', {'events': [['recv', 4, 11], ['sale', 's1', 1], ['return', 's1', 1], ['sale', 's2', 4]]}, {'results': [1, 11, 11, 44], 'layers': []}], ['restore gone layer', {'events': [['recv', 2, 5], ['recv', 3, 12], ['recv', 1, 9], ['sale', 's1', 3], ['return', 's1', 3], ['sale', 's2', 2]]}, {'results': [1, 2, 3, 22, 22, 10], 'layers': [[2, 3, 12], [3, 1, 9]]}], ['unknown sale', {'events': [['recv', 2, 5], ['return', 'zz', 1]]}, {'results': [1, 'rejected'], 'layers': [[1, 2, 5]]}], ['short sale', {'events': [['recv', 1, 5], ['sale', 's1', 6]]}, {'results': [1, 'short'], 'layers': [[1, 1, 5]]}], ['falling prices', {'events': [['recv', 2, 50], ['recv', 3, 24], ['sale', 's1', 4], ['return', 's1', 1]]}, {'results': [1, 2, 148, 24], 'layers': [[2, 2, 24]]}]], [['return last consumed', {'events': [['recv', 3, 10], ['recv', 5, 14], ['sale', 's1', 5], ['return', 's1', 2]]}, {'results': [1, 2, 58, 28], 'layers': [[2, 5, 14]]}], ['full return', {'events': [['recv', 2, 20], ['recv', 2, 30], ['sale', 's1', 4], ['return', 's1', 4]]}, {'results': [1, 2, 100, 100], 'layers': [[1, 2, 20], [2, 2, 30]]}], ['over return', {'events': [['recv', 4, 7], ['sale', 's1', 2], ['return', 's1', 1], ['return', 's1', 2]]}, {'results': [1, 14, 7, 'rejected'], 'layers': [[1, 3, 7]]}], ['restore into existing', {'events': [['recv', 4, 11], ['sale', 's1', 1], ['return', 's1', 1], ['sale', 's2', 4]]}, {'results': [1, 11, 11, 44], 'layers': []}], ['restore gone layer', {'events': [['recv', 2, 5], ['recv', 3, 13], ['recv', 1, 9], ['sale', 's1', 3], ['return', 's1', 3], ['sale', 's2', 2]]}, {'results': [1, 2, 3, 23, 23, 10], 'layers': [[2, 3, 13], [3, 1, 9]]}], ['unknown sale', {'events': [['recv', 2, 5], ['return', 'zz', 1]]}, {'results': [1, 'rejected'], 'layers': [[1, 2, 5]]}], ['short sale', {'events': [['recv', 1, 5], ['sale', 's1', 7]]}, {'results': [1, 'short'], 'layers': [[1, 1, 5]]}], ['falling prices', {'events': [['recv', 2, 50], ['recv', 3, 25], ['sale', 's1', 4], ['return', 's1', 1]]}, {'results': [1, 2, 150, 25], 'layers': [[2, 2, 25]]}]]]
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 |
|---|---|---|---|
| return last consumed | {'layers': [[2, 5, 14]], 'results': [1, 2, 58, 28]} | {'layers': [[2, 5, 14]], 'results': [1, 2, 58, 28]} | Passed |
| full return | {'layers': [[1, 2, 20], [2, 2, 30]], 'results': [1, 2, 100, 100]} | {'layers': [[1, 2, 20], [2, 2, 30]], 'results': [1, 2, 100, 100]} | Passed |
| over return | {'layers': [[1, 3, 7]], 'results': [1, 14, 7, 'rejected']} | {'layers': [[1, 3, 7]], 'results': [1, 14, 7, 'rejected']} | Passed |
| restore into existing | {'layers': [], 'results': [1, 11, 11, 44]} | {'layers': [], 'results': [1, 11, 11, 44]} | Passed |
| restore gone layer | {'layers': [[2, 3, 9], [3, 1, 9]], 'results': [1, 2, 3, 19, 19, 10]} | {'layers': [[2, 3, 9], [3, 1, 9]], 'results': [1, 2, 3, 19, 19, 10]} | Passed |
| unknown sale | {'layers': [[1, 2, 5]], 'results': [1, 'rejected']} | {'layers': [[1, 2, 5]], 'results': [1, 'rejected']} | Passed |
| short sale | {'layers': [[1, 1, 5]], 'results': [1, 'short']} | {'layers': [[1, 1, 5]], 'results': [1, 'short']} | Passed |
| falling prices | {'layers': [[1, 1, 50], [2, 1, 21]], 'results': [1, 2, 142, 50]} | {'layers': [[2, 2, 21]], 'results': [1, 2, 142, 21]} | Failed |
SHA-256 / e3a578071db5f5a4dc3112ee82735ae0928e23bbae28c52ea17cad13e17d1ed7
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
layers = []
seq = 0
sold = {}
out = []
for ev in x['events']:
if ev[0] == 'recv':
seq += 1
layers.append([seq, ev[1], ev[2]])
out.append(seq)
elif ev[0] == 'sale':
q = ev[2]
if q > sum(l[1] for l in layers):
out.append('short')
continue
took = []
cost = 0
while q > 0:
l = layers[0]
t = min(q, l[1])
took.append([l[0], t, l[2]])
cost += t * l[2]
l[1] -= t
q -= t
if l[1] == 0:
layers.pop(0)
sold[ev[1]] = took
out.append(cost)
else:
took = sold.get(ev[1], [])
q = ev[2]
if q > sum(t[1] for t in took):
out.append('rejected')
continue
credit = 0
while q > 0:
j = -1
t = took[j]
r = min(q, t[1])
credit += r * t[2]
t[1] -= r
q -= r
if t[1] == 0:
took.pop(j)
match = [l for l in layers if l[0] == t[0]]
if match:
match[0][1] += r
else:
layers.append([t[0], r, t[2]])
layers.sort(key=lambda l: l[0])
out.append(credit)
return {'results': out, 'layers': layers}
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['return last consumed', {'events': [['recv', 3, 10], ['recv', 5, 14], ['sale', 's1', 5], ['return', 's1', 2]]}, {'results': [1, 2, 58, 28], 'layers': [[2, 5, 14]]}], ['full return', {'events': [['recv', 2, 20], ['recv', 2, 30], ['sale', 's1', 4], ['return', 's1', 4]]}, {'results': [1, 2, 100, 100], 'layers': [[1, 2, 20], [2, 2, 30]]}], ['over return', {'events': [['recv', 4, 7], ['sale', 's1', 2], ['return', 's1', 1], ['return', 's1', 2]]}, {'results': [1, 14, 7, 'rejected'], 'layers': [[1, 3, 7]]}], ['restore into existing', {'events': [['recv', 4, 11], ['sale', 's1', 1], ['return', 's1', 1], ['sale', 's2', 4]]}, {'results': [1, 11, 11, 44], 'layers': []}], ['restore gone layer', {'events': [['recv', 2, 5], ['recv', 3, 9], ['recv', 1, 9], ['sale', 's1', 3], ['return', 's1', 3], ['sale', 's2', 2]]}, {'results': [1, 2, 3, 19, 19, 10], 'layers': [[2, 3, 9], [3, 1, 9]]}], ['unknown sale', {'events': [['recv', 2, 5], ['return', 'zz', 1]]}, {'results': [1, 'rejected'], 'layers': [[1, 2, 5]]}], ['short sale', {'events': [['recv', 1, 5], ['sale', 's1', 3]]}, {'results': [1, 'short'], 'layers': [[1, 1, 5]]}], ['falling prices', {'events': [['recv', 2, 50], ['recv', 3, 21], ['sale', 's1', 4], ['return', 's1', 1]]}, {'results': [1, 2, 142, 21], 'layers': [[2, 2, 21]]}]], [['return last consumed', {'events': [['recv', 3, 10], ['recv', 5, 14], ['sale', 's1', 5], ['return', 's1', 1]]}, {'results': [1, 2, 58, 14], 'layers': [[2, 4, 14]]}], ['full return', {'events': [['recv', 2, 20], ['recv', 2, 30], ['sale', 's1', 4], ['return', 's1', 4]]}, {'results': [1, 2, 100, 100], 'layers': [[1, 2, 20], [2, 2, 30]]}], ['over return', {'events': [['recv', 4, 7], ['sale', 's1', 2], ['return', 's1', 1], ['return', 's1', 2]]}, {'results': [1, 14, 7, 'rejected'], 'layers': [[1, 3, 7]]}], ['restore into existing', {'events': [['recv', 4, 11], ['sale', 's1', 1], ['return', 's1', 1], ['sale', 's2', 4]]}, {'results': [1, 11, 11, 44], 'layers': []}], ['restore gone layer', {'events': [['recv', 2, 5], ['recv', 3, 10], ['recv', 1, 9], ['sale', 's1', 3], ['return', 's1', 3], ['sale', 's2', 2]]}, {'results': [1, 2, 3, 20, 20, 10], 'layers': [[2, 3, 10], [3, 1, 9]]}], ['unknown sale', {'events': [['recv', 2, 5], ['return', 'zz', 1]]}, {'results': [1, 'rejected'], 'layers': [[1, 2, 5]]}], ['short sale', {'events': [['recv', 1, 5], ['sale', 's1', 4]]}, {'results': [1, 'short'], 'layers': [[1, 1, 5]]}], ['falling prices', {'events': [['recv', 2, 50], ['recv', 3, 22], ['sale', 's1', 4], ['return', 's1', 1]]}, {'results': [1, 2, 144, 22], 'layers': [[2, 2, 22]]}]], [['return last consumed', {'events': [['recv', 3, 10], ['recv', 5, 14], ['sale', 's1', 5], ['return', 's1', 2]]}, {'results': [1, 2, 58, 28], 'layers': [[2, 5, 14]]}], ['full return', {'events': [['recv', 2, 20], ['recv', 2, 30], ['sale', 's1', 4], ['return', 's1', 4]]}, {'results': [1, 2, 100, 100], 'layers': [[1, 2, 20], [2, 2, 30]]}], ['over return', {'events': [['recv', 4, 7], ['sale', 's1', 2], ['return', 's1', 1], ['return', 's1', 2]]}, {'results': [1, 14, 7, 'rejected'], 'layers': [[1, 3, 7]]}], ['restore into existing', {'events': [['recv', 4, 11], ['sale', 's1', 1], ['return', 's1', 1], ['sale', 's2', 4]]}, {'results': [1, 11, 11, 44], 'layers': []}], ['restore gone layer', {'events': [['recv', 2, 5], ['recv', 3, 11], ['recv', 1, 9], ['sale', 's1', 3], ['return', 's1', 3], ['sale', 's2', 2]]}, {'results': [1, 2, 3, 21, 21, 10], 'layers': [[2, 3, 11], [3, 1, 9]]}], ['unknown sale', {'events': [['recv', 2, 5], ['return', 'zz', 1]]}, {'results': [1, 'rejected'], 'layers': [[1, 2, 5]]}], ['short sale', {'events': [['recv', 1, 5], ['sale', 's1', 5]]}, {'results': [1, 'short'], 'layers': [[1, 1, 5]]}], ['falling prices', {'events': [['recv', 2, 50], ['recv', 3, 23], ['sale', 's1', 4], ['return', 's1', 1]]}, {'results': [1, 2, 146, 23], 'layers': [[2, 2, 23]]}]], [['return last consumed', {'events': [['recv', 3, 10], ['recv', 5, 14], ['sale', 's1', 5], ['return', 's1', 1]]}, {'results': [1, 2, 58, 14], 'layers': [[2, 4, 14]]}], ['full return', {'events': [['recv', 2, 20], ['recv', 2, 30], ['sale', 's1', 4], ['return', 's1', 4]]}, {'results': [1, 2, 100, 100], 'layers': [[1, 2, 20], [2, 2, 30]]}], ['over return', {'events': [['recv', 4, 7], ['sale', 's1', 2], ['return', 's1', 1], ['return', 's1', 2]]}, {'results': [1, 14, 7, 'rejected'], 'layers': [[1, 3, 7]]}], ['restore into existing', {'events': [['recv', 4, 11], ['sale', 's1', 1], ['return', 's1', 1], ['sale', 's2', 4]]}, {'results': [1, 11, 11, 44], 'layers': []}], ['restore gone layer', {'events': [['recv', 2, 5], ['recv', 3, 12], ['recv', 1, 9], ['sale', 's1', 3], ['return', 's1', 3], ['sale', 's2', 2]]}, {'results': [1, 2, 3, 22, 22, 10], 'layers': [[2, 3, 12], [3, 1, 9]]}], ['unknown sale', {'events': [['recv', 2, 5], ['return', 'zz', 1]]}, {'results': [1, 'rejected'], 'layers': [[1, 2, 5]]}], ['short sale', {'events': [['recv', 1, 5], ['sale', 's1', 6]]}, {'results': [1, 'short'], 'layers': [[1, 1, 5]]}], ['falling prices', {'events': [['recv', 2, 50], ['recv', 3, 24], ['sale', 's1', 4], ['return', 's1', 1]]}, {'results': [1, 2, 148, 24], 'layers': [[2, 2, 24]]}]], [['return last consumed', {'events': [['recv', 3, 10], ['recv', 5, 14], ['sale', 's1', 5], ['return', 's1', 2]]}, {'results': [1, 2, 58, 28], 'layers': [[2, 5, 14]]}], ['full return', {'events': [['recv', 2, 20], ['recv', 2, 30], ['sale', 's1', 4], ['return', 's1', 4]]}, {'results': [1, 2, 100, 100], 'layers': [[1, 2, 20], [2, 2, 30]]}], ['over return', {'events': [['recv', 4, 7], ['sale', 's1', 2], ['return', 's1', 1], ['return', 's1', 2]]}, {'results': [1, 14, 7, 'rejected'], 'layers': [[1, 3, 7]]}], ['restore into existing', {'events': [['recv', 4, 11], ['sale', 's1', 1], ['return', 's1', 1], ['sale', 's2', 4]]}, {'results': [1, 11, 11, 44], 'layers': []}], ['restore gone layer', {'events': [['recv', 2, 5], ['recv', 3, 13], ['recv', 1, 9], ['sale', 's1', 3], ['return', 's1', 3], ['sale', 's2', 2]]}, {'results': [1, 2, 3, 23, 23, 10], 'layers': [[2, 3, 13], [3, 1, 9]]}], ['unknown sale', {'events': [['recv', 2, 5], ['return', 'zz', 1]]}, {'results': [1, 'rejected'], 'layers': [[1, 2, 5]]}], ['short sale', {'events': [['recv', 1, 5], ['sale', 's1', 7]]}, {'results': [1, 'short'], 'layers': [[1, 1, 5]]}], ['falling prices', {'events': [['recv', 2, 50], ['recv', 3, 25], ['sale', 's1', 4], ['return', 's1', 1]]}, {'results': [1, 2, 150, 25], 'layers': [[2, 2, 25]]}]]]
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 |
|---|---|---|---|
| return last consumed | {'layers': [[2, 5, 14]], 'results': [1, 2, 58, 28]} | {'layers': [[2, 5, 14]], 'results': [1, 2, 58, 28]} | Passed |
| full return | {'layers': [[1, 2, 20], [2, 2, 30]], 'results': [1, 2, 100, 100]} | {'layers': [[1, 2, 20], [2, 2, 30]], 'results': [1, 2, 100, 100]} | Passed |
| over return | {'layers': [[1, 3, 7]], 'results': [1, 14, 7, 'rejected']} | {'layers': [[1, 3, 7]], 'results': [1, 14, 7, 'rejected']} | Passed |
| restore into existing | {'layers': [], 'results': [1, 11, 11, 44]} | {'layers': [], 'results': [1, 11, 11, 44]} | Passed |
| restore gone layer | {'layers': [[2, 3, 9], [3, 1, 9]], 'results': [1, 2, 3, 19, 19, 10]} | {'layers': [[2, 3, 9], [3, 1, 9]], 'results': [1, 2, 3, 19, 19, 10]} | Passed |
| unknown sale | {'layers': [[1, 2, 5]], 'results': [1, 'rejected']} | {'layers': [[1, 2, 5]], 'results': [1, 'rejected']} | Passed |
| short sale | {'layers': [[1, 1, 5]], 'results': [1, 'short']} | {'layers': [[1, 1, 5]], 'results': [1, 'short']} | Passed |
| falling prices | {'layers': [[2, 2, 21]], 'results': [1, 2, 142, 21]} | {'layers': [[2, 2, 21]], 'results': [1, 2, 142, 21]} | Passed |
SHA-256 / c226ac2513b6bcaffb26c8272c563086ebe102ddfc0c153430d80d17eadac0f3
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:42.677551+00:00.
Case digest / df10ab914e5e35aa6cfea4c3aa29d4d6f7a595ed4fbc538062a0af8e803f0447