FAILURE MAP
← Case archive

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.

Verified by executionVariant 1 · 8 checks per implementationDownload source bundle ↓JSON ↗

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 fixtureActualExpectedOutcome
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 fixtureActualExpectedOutcome
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 fixtureActualExpectedOutcome
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