FAILURE MAP
← Case archive

FA-60126 / Inventory cost layering / Open access

FIFO costing with customer returns: recreated layer position · case 01

Units restored to an exhausted receipt layer are issued after newer receipts.

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

ROOT CAUSE

A recreated layer is appended at the end without restoring receipt-sequence order.

VERIFIED REPAIR

Re-sort layers by receipt sequence after recreating one.

Unsuccessful approach: Re-sorting layers by unit cost instead of receipt sequence reorders stock whenever prices fell.

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 = -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]])
            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]]}], ['restore with falling prices', {'events': [['recv', 2, 10], ['recv', 3, 5], ['sale', 's1', 3], ['return', 's1', 3], ['sale', 's2', 1]]}, {'results': [1, 2, 25, 25, 10], 'layers': [[1, 1, 10], [2, 3, 5]]}]], [['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]]}], ['restore with falling prices', {'events': [['recv', 2, 11], ['recv', 3, 5], ['sale', 's1', 3], ['return', 's1', 3], ['sale', 's2', 1]]}, {'results': [1, 2, 27, 27, 11], 'layers': [[1, 1, 11], [2, 3, 5]]}]], [['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]]}], ['restore with falling prices', {'events': [['recv', 2, 12], ['recv', 3, 5], ['sale', 's1', 3], ['return', 's1', 3], ['sale', 's2', 1]]}, {'results': [1, 2, 29, 29, 12], 'layers': [[1, 1, 12], [2, 3, 5]]}]], [['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]]}], ['restore with falling prices', {'events': [['recv', 2, 13], ['recv', 3, 5], ['sale', 's1', 3], ['return', 's1', 3], ['sale', 's2', 1]]}, {'results': [1, 2, 31, 31, 13], 'layers': [[1, 1, 13], [2, 3, 5]]}]], [['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]]}], ['restore with falling prices', {'events': [['recv', 2, 14], ['recv', 3, 5], ['sale', 's1', 3], ['return', 's1', 3], ['sale', 's2', 1]]}, {'results': [1, 2, 33, 33, 14], 'layers': [[1, 1, 14], [2, 3, 5]]}]]]
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': [[2, 2, 30], [1, 2, 20]], 'results': [1, 2, 100, 100]}{'layers': [[1, 2, 20], [2, 2, 30]], 'results': [1, 2, 100, 100]}Failed
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, 1, 9], [3, 1, 9], [1, 2, 5]], 'results': [1, 2, 3, 19, 19, 18]}{'layers': [[2, 3, 9], [3, 1, 9]], 'results': [1, 2, 3, 19, 19, 10]}Failed
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
restore with falling prices{'layers': [[2, 2, 5], [1, 2, 10]], 'results': [1, 2, 25, 25, 5]}{'layers': [[1, 1, 10], [2, 3, 5]], 'results': [1, 2, 25, 25, 10]}Failed

SHA-256 / db3cfd76e31e8939f3a3adcc9cb91cfddd38553d31045684a1d77fce4e3abe63

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 = -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[2])
            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]]}], ['restore with falling prices', {'events': [['recv', 2, 10], ['recv', 3, 5], ['sale', 's1', 3], ['return', 's1', 3], ['sale', 's2', 1]]}, {'results': [1, 2, 25, 25, 10], 'layers': [[1, 1, 10], [2, 3, 5]]}]], [['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]]}], ['restore with falling prices', {'events': [['recv', 2, 11], ['recv', 3, 5], ['sale', 's1', 3], ['return', 's1', 3], ['sale', 's2', 1]]}, {'results': [1, 2, 27, 27, 11], 'layers': [[1, 1, 11], [2, 3, 5]]}]], [['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]]}], ['restore with falling prices', {'events': [['recv', 2, 12], ['recv', 3, 5], ['sale', 's1', 3], ['return', 's1', 3], ['sale', 's2', 1]]}, {'results': [1, 2, 29, 29, 12], 'layers': [[1, 1, 12], [2, 3, 5]]}]], [['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]]}], ['restore with falling prices', {'events': [['recv', 2, 13], ['recv', 3, 5], ['sale', 's1', 3], ['return', 's1', 3], ['sale', 's2', 1]]}, {'results': [1, 2, 31, 31, 13], 'layers': [[1, 1, 13], [2, 3, 5]]}]], [['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]]}], ['restore with falling prices', {'events': [['recv', 2, 14], ['recv', 3, 5], ['sale', 's1', 3], ['return', 's1', 3], ['sale', 's2', 1]]}, {'results': [1, 2, 33, 33, 14], 'layers': [[1, 1, 14], [2, 3, 5]]}]]]
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
restore with falling prices{'layers': [[2, 2, 5], [1, 2, 10]], 'results': [1, 2, 25, 25, 5]}{'layers': [[1, 1, 10], [2, 3, 5]], 'results': [1, 2, 25, 25, 10]}Failed

SHA-256 / c0d544b391906104e7c8d7f5264f62bc87fa1e25393f8f9eadf678a10c85f4fa

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]]}], ['restore with falling prices', {'events': [['recv', 2, 10], ['recv', 3, 5], ['sale', 's1', 3], ['return', 's1', 3], ['sale', 's2', 1]]}, {'results': [1, 2, 25, 25, 10], 'layers': [[1, 1, 10], [2, 3, 5]]}]], [['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]]}], ['restore with falling prices', {'events': [['recv', 2, 11], ['recv', 3, 5], ['sale', 's1', 3], ['return', 's1', 3], ['sale', 's2', 1]]}, {'results': [1, 2, 27, 27, 11], 'layers': [[1, 1, 11], [2, 3, 5]]}]], [['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]]}], ['restore with falling prices', {'events': [['recv', 2, 12], ['recv', 3, 5], ['sale', 's1', 3], ['return', 's1', 3], ['sale', 's2', 1]]}, {'results': [1, 2, 29, 29, 12], 'layers': [[1, 1, 12], [2, 3, 5]]}]], [['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]]}], ['restore with falling prices', {'events': [['recv', 2, 13], ['recv', 3, 5], ['sale', 's1', 3], ['return', 's1', 3], ['sale', 's2', 1]]}, {'results': [1, 2, 31, 31, 13], 'layers': [[1, 1, 13], [2, 3, 5]]}]], [['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]]}], ['restore with falling prices', {'events': [['recv', 2, 14], ['recv', 3, 5], ['sale', 's1', 3], ['return', 's1', 3], ['sale', 's2', 1]]}, {'results': [1, 2, 33, 33, 14], 'layers': [[1, 1, 14], [2, 3, 5]]}]]]
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
restore with falling prices{'layers': [[1, 1, 10], [2, 3, 5]], 'results': [1, 2, 25, 25, 10]}{'layers': [[1, 1, 10], [2, 3, 5]], 'results': [1, 2, 25, 25, 10]}Passed

SHA-256 / 962612a1ad47a643a512add897e3c7f812dc8b709214350725e90f7d30e4d7d9

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.762001+00:00.

Case digest / ac72f6304c936664c57e62fde4de155dc71207ad073d2f82092948e8ab86fac4