FAILURE MAP
← Case archive

FA-58086 / Double-entry ledger accounting / Open access

FIFO perpetual inventory journal: consumption order · case 01

Cost of goods sold uses the newest purchase prices.

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

ROOT CAUSE

Sales consume the newest layer first (LIFO) instead of the oldest.

VERIFIED REPAIR

Consume and remove layers from the front of the list.

Unsuccessful approach: Consuming the cheapest layer first matches FIFO only while purchase prices keep rising.

Case contract

x = [['buy', qty, unit_cost] | ['sell', qty, unit_price] | ['purchase_return', qty, unit_cost]]. Layers are kept oldest first; a buy at the same cost as the newest layer merges into it. A sale consumes layers oldest first (COGS) and records revenue; a sale exceeding on-hand quantity is rejected whole. A purchase return removes qty from the newest layer at that cost holding at least qty, else it is rejected. Emptied layers are removed. Return {'cogs', 'revenue', 'inventory': sum qty*cost, 'layers', 'rejected': event indexes}.

Why this case matters

Ledger software must keep debits equal to credits and apply normal-balance, period and cutoff rules exactly; small sign or boundary slips silently misstate financial statements.

1 / The failure

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(x):
    layers = []
    cogs = revenue = 0
    short = []
    for i, ev in enumerate(x):
        if ev[0] == 'buy':
            if layers and layers[-1][1] == ev[2]:
                layers[-1][0] += ev[1]
            else:
                layers.append([ev[1], ev[2]])
        elif ev[0] == 'sell':
            qty = ev[1]
            if qty > sum(l[0] for l in layers):
                short.append(i)
                continue
            revenue += qty * ev[2]
            while qty:
                head = layers[-1]
                take = min(qty, head[0])
                cogs += take * head[1]
                head[0] -= take
                qty -= take
                if head[0] == 0:
                    layers.pop()
        elif ev[0] == 'purchase_return':
            match = [l for l in layers if l[1] == ev[2] and l[0] >= ev[1]]
            if not match:
                short.append(i)
                continue
            match[-1][0] -= ev[1]
            if match[-1][0] == 0:
                layers.remove(match[-1])
    inventory = sum(q * c for q, c in layers)
    return {'cogs': cogs, 'revenue': revenue, 'inventory': inventory, 'layers': layers, 'rejected': short}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: consumption order', [['buy', 5, 120], ['sell', 6, 200], ['sell', 3, 200], ['buy', 1, 100], ['buy', 5, 120], ['buy', 5, 100], ['sell', 6, 200], ['sell', 12, 250]], {'cogs': 1060, 'revenue': 1800, 'inventory': 740, 'layers': [[2, 120], [5, 100]], 'rejected': [1, 7]}], ['control 1', [['sell', 3, 250], ['buy', 2, 120], ['purchase_return', 1, 100], ['buy', 5, 100], ['buy', 2, 120]], {'cogs': 0, 'revenue': 0, 'inventory': 980, 'layers': [[2, 120], [5, 100], [2, 120]], 'rejected': [0, 2]}], ['control 2', [['buy', 5, 150], ['sell', 3, 250], ['sell', 2, 250], ['buy', 10, 100], ['buy', 10, 120], ['purchase_return', 2, 100], ['purchase_return', 5, 100], ['buy', 10, 150], ['buy', 2, 120], ['purchase_return', 5, 100]], {'cogs': 750, 'revenue': 1250, 'inventory': 3240, 'layers': [[3, 100], [10, 120], [10, 150], [2, 120]], 'rejected': [9]}], ['control 3', [['buy', 1, 120], ['sell', 12, 200], ['sell', 2, 250], ['sell', 2, 250]], {'cogs': 0, 'revenue': 0, 'inventory': 120, 'layers': [[1, 120]], 'rejected': [1, 2, 3]}], ['control 4', [['buy', 5, 100], ['sell', 3, 250], ['sell', 12, 200]], {'cogs': 300, 'revenue': 750, 'inventory': 200, 'layers': [[2, 100]], 'rejected': [2]}], ['control 5', [['buy', 10, 120], ['purchase_return', 1, 100], ['sell', 1, 200], ['purchase_return', 2, 100], ['sell', 2, 200], ['purchase_return', 1, 120], ['buy', 10, 120], ['buy', 5, 120]], {'cogs': 360, 'revenue': 600, 'inventory': 2520, 'layers': [[21, 120]], 'rejected': [1, 3]}], ['control 6', [['sell', 12, 250], ['sell', 12, 200], ['buy', 5, 100], ['sell', 12, 250], ['sell', 12, 200], ['purchase_return', 1, 100], ['sell', 3, 250]], {'cogs': 300, 'revenue': 750, 'inventory': 100, 'layers': [[1, 100]], 'rejected': [0, 1, 3, 4]}]], [['regression: consumption order', [['buy', 10, 150], ['sell', 3, 250], ['sell', 12, 200], ['buy', 5, 120], ['sell', 3, 200], ['buy', 1, 100], ['sell', 1, 250], ['buy', 2, 100], ['sell', 12, 200], ['buy', 10, 100]], {'cogs': 1050, 'revenue': 1600, 'inventory': 2350, 'layers': [[3, 150], [5, 120], [13, 100]], 'rejected': [2, 8]}], ['control 1', [['sell', 12, 200], ['sell', 6, 250], ['sell', 6, 200]], {'cogs': 0, 'revenue': 0, 'inventory': 0, 'layers': [], 'rejected': [0, 1, 2]}], ['control 2', [['buy', 10, 100], ['sell', 12, 250], ['sell', 2, 250], ['sell', 12, 200], ['sell', 6, 200], ['buy', 1, 150], ['buy', 2, 120]], {'cogs': 800, 'revenue': 1700, 'inventory': 590, 'layers': [[2, 100], [1, 150], [2, 120]], 'rejected': [1, 3]}], ['control 3', [['purchase_return', 2, 100], ['sell', 12, 250], ['buy', 10, 100], ['buy', 1, 100], ['sell', 6, 200]], {'cogs': 600, 'revenue': 1200, 'inventory': 500, 'layers': [[5, 100]], 'rejected': [0, 1]}], ['control 4', [['sell', 12, 200], ['buy', 10, 100], ['buy', 2, 120]], {'cogs': 0, 'revenue': 0, 'inventory': 1240, 'layers': [[10, 100], [2, 120]], 'rejected': [0]}], ['control 5', [['purchase_return', 5, 100], ['sell', 2, 200], ['purchase_return', 5, 120]], {'cogs': 0, 'revenue': 0, 'inventory': 0, 'layers': [], 'rejected': [0, 1, 2]}], ['control 6', [['purchase_return', 2, 120], ['sell', 1, 250], ['purchase_return', 1, 120], ['purchase_return', 1, 120], ['buy', 10, 120]], {'cogs': 0, 'revenue': 0, 'inventory': 1200, 'layers': [[10, 120]], 'rejected': [0, 1, 2, 3]}]], [['regression: consumption order', [['purchase_return', 1, 100], ['buy', 2, 150], ['sell', 6, 200], ['sell', 2, 250], ['buy', 5, 120], ['buy', 5, 150], ['sell', 1, 250], ['purchase_return', 2, 100]], {'cogs': 420, 'revenue': 750, 'inventory': 1230, 'layers': [[4, 120], [5, 150]], 'rejected': [0, 2, 7]}], ['regression: consumption order, partial-repair probe', [['buy', 2, 120], ['purchase_return', 1, 150], ['buy', 1, 100], ['buy', 5, 100], ['sell', 3, 200]], {'cogs': 340, 'revenue': 600, 'inventory': 500, 'layers': [[5, 100]], 'rejected': [1]}], ['control 1', [['purchase_return', 5, 100], ['sell', 2, 250], ['buy', 2, 100], ['buy', 1, 120]], {'cogs': 0, 'revenue': 0, 'inventory': 320, 'layers': [[2, 100], [1, 120]], 'rejected': [0, 1]}], ['control 2', [['sell', 1, 250], ['buy', 5, 100], ['buy', 10, 100], ['sell', 2, 250], ['buy', 2, 100], ['buy', 10, 100], ['sell', 6, 200], ['buy', 1, 120], ['buy', 10, 150], ['buy', 10, 150]], {'cogs': 800, 'revenue': 1700, 'inventory': 5020, 'layers': [[19, 100], [1, 120], [20, 150]], 'rejected': [0]}], ['control 3', [['purchase_return', 1, 100], ['sell', 1, 200], ['sell', 1, 250], ['sell', 3, 200], ['sell', 6, 200], ['buy', 10, 120], ['buy', 2, 150], ['buy', 2, 100], ['purchase_return', 2, 150]], {'cogs': 0, 'revenue': 0, 'inventory': 1400, 'layers': [[10, 120], [2, 100]], 'rejected': [0, 1, 2, 3, 4]}], ['control 4', [['buy', 1, 100], ['purchase_return', 5, 100], ['sell', 3, 200], ['buy', 1, 150], ['buy', 1, 150], ['sell', 3, 200], ['buy', 2, 120], ['buy', 10, 120]], {'cogs': 400, 'revenue': 600, 'inventory': 1440, 'layers': [[12, 120]], 'rejected': [1, 2]}], ['control 5', [['sell', 6, 200], ['sell', 12, 200], ['sell', 2, 200], ['sell', 2, 200], ['buy', 2, 100], ['purchase_return', 1, 120], ['buy', 2, 150], ['sell', 2, 200], ['sell', 2, 200], ['sell', 2, 200]], {'cogs': 500, 'revenue': 800, 'inventory': 0, 'layers': [], 'rejected': [0, 1, 2, 3, 5, 9]}]], [['regression: consumption order', [['sell', 1, 250], ['sell', 3, 200], ['purchase_return', 1, 100], ['buy', 2, 120], ['buy', 5, 150], ['sell', 3, 200], ['sell', 1, 200], ['sell', 6, 250], ['buy', 2, 120]], {'cogs': 540, 'revenue': 800, 'inventory': 690, 'layers': [[3, 150], [2, 120]], 'rejected': [0, 1, 2, 7]}], ['regression: consumption order, partial-repair probe', [['buy', 2, 150], ['buy', 10, 120], ['sell', 1, 200], ['purchase_return', 5, 100], ['buy', 1, 100], ['buy', 2, 150], ['buy', 1, 100], ['buy', 5, 100], ['sell', 3, 200]], {'cogs': 540, 'revenue': 800, 'inventory': 1960, 'layers': [[8, 120], [1, 100], [2, 150], [6, 100]], 'rejected': [3]}], ['control 1', [['buy', 1, 100], ['purchase_return', 2, 150], ['purchase_return', 1, 120], ['purchase_return', 2, 100], ['buy', 5, 100], ['buy', 10, 100], ['buy', 1, 150], ['buy', 1, 120]], {'cogs': 0, 'revenue': 0, 'inventory': 1870, 'layers': [[16, 100], [1, 150], [1, 120]], 'rejected': [1, 2, 3]}], ['control 2', [['sell', 3, 250], ['purchase_return', 1, 150], ['purchase_return', 2, 120], ['sell', 6, 200], ['purchase_return', 2, 100]], {'cogs': 0, 'revenue': 0, 'inventory': 0, 'layers': [], 'rejected': [0, 1, 2, 3, 4]}], ['control 3', [['sell', 6, 250], ['sell', 2, 250], ['sell', 3, 250], ['sell', 12, 250], ['sell', 12, 250], ['sell', 3, 250], ['buy', 1, 100], ['buy', 5, 120], ['buy', 5, 150], ['buy', 2, 120]], {'cogs': 0, 'revenue': 0, 'inventory': 1690, 'layers': [[1, 100], [5, 120], [5, 150], [2, 120]], 'rejected': [0, 1, 2, 3, 4, 5]}], ['control 4', [['sell', 6, 200], ['purchase_return', 1, 150], ['buy', 5, 120]], {'cogs': 0, 'revenue': 0, 'inventory': 600, 'layers': [[5, 120]], 'rejected': [0, 1]}], ['control 5', [['sell', 3, 200], ['purchase_return', 5, 150], ['buy', 10, 100], ['sell', 1, 200], ['buy', 5, 120], ['buy', 5, 120], ['buy', 2, 150]], {'cogs': 100, 'revenue': 200, 'inventory': 2400, 'layers': [[9, 100], [10, 120], [2, 150]], 'rejected': [0, 1]}]], [['regression: consumption order', [['buy', 10, 100], ['buy', 10, 150], ['purchase_return', 5, 100], ['sell', 6, 200], ['sell', 3, 200], ['sell', 2, 200]], {'cogs': 1400, 'revenue': 2200, 'inventory': 600, 'layers': [[4, 150]], 'rejected': []}], ['regression: consumption order, partial-repair probe', [['buy', 5, 100], ['sell', 2, 200], ['sell', 3, 250], ['buy', 5, 120], ['buy', 10, 150], ['buy', 10, 100], ['sell', 2, 200], ['purchase_return', 2, 100], ['purchase_return', 1, 100]], {'cogs': 740, 'revenue': 1550, 'inventory': 2560, 'layers': [[3, 120], [10, 150], [7, 100]], 'rejected': []}], ['control 1', [['purchase_return', 2, 100], ['sell', 1, 200], ['buy', 5, 100], ['buy', 5, 100], ['purchase_return', 1, 150], ['sell', 2, 250], ['buy', 1, 100], ['sell', 1, 200]], {'cogs': 300, 'revenue': 700, 'inventory': 800, 'layers': [[8, 100]], 'rejected': [0, 1, 4]}], ['control 2', [['purchase_return', 1, 100], ['buy', 1, 100], ['sell', 3, 200], ['buy', 10, 100], ['buy', 5, 100], ['sell', 2, 200], ['purchase_return', 2, 150]], {'cogs': 200, 'revenue': 400, 'inventory': 1400, 'layers': [[14, 100]], 'rejected': [0, 2, 6]}], ['control 3', [['buy', 10, 120], ['buy', 1, 120], ['purchase_return', 2, 150], ['sell', 2, 250], ['buy', 1, 100]], {'cogs': 240, 'revenue': 500, 'inventory': 1180, 'layers': [[9, 120], [1, 100]], 'rejected': [2]}], ['control 4', [['sell', 6, 250], ['purchase_return', 2, 100], ['sell', 12, 250], ['sell', 3, 200]], {'cogs': 0, 'revenue': 0, 'inventory': 0, 'layers': [], 'rejected': [0, 1, 2, 3]}], ['control 5', [['sell', 6, 250], ['sell', 3, 250], ['sell', 12, 200], ['sell', 1, 250], ['sell', 3, 250], ['purchase_return', 5, 150], ['sell', 6, 200]], {'cogs': 0, 'revenue': 0, 'inventory': 0, 'layers': [], 'rejected': [0, 1, 2, 3, 4, 5, 6]}]]]
for label, args, expected in fixtures[N-1]:
    try:
        actual = solve(args)
    except Exception as exc:
        actual = 'raised ' + type(exc).__name__
    check(label, actual, 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
regression: consumption order{'cogs': 980, 'inventory': 820, 'layers': [[2, 120], [1, 100], [4, 120]], 'rejected': [1, 7], 'revenue': 1800}{'cogs': 1060, 'inventory': 740, 'layers': [[2, 120], [5, 100]], 'rejected': [1, 7], 'revenue': 1800}Failed
control 1{'cogs': 0, 'inventory': 980, 'layers': [[2, 120], [5, 100], [2, 120]], 'rejected': [0, 2], 'revenue': 0}{'cogs': 0, 'inventory': 980, 'layers': [[2, 120], [5, 100], [2, 120]], 'rejected': [0, 2], 'revenue': 0}Passed
control 2{'cogs': 750, 'inventory': 3240, 'layers': [[3, 100], [10, 120], [10, 150], [2, 120]], 'rejected': [9], 'revenue': 1250}{'cogs': 750, 'inventory': 3240, 'layers': [[3, 100], [10, 120], [10, 150], [2, 120]], 'rejected': [9], 'revenue': 1250}Passed
control 3{'cogs': 0, 'inventory': 120, 'layers': [[1, 120]], 'rejected': [1, 2, 3], 'revenue': 0}{'cogs': 0, 'inventory': 120, 'layers': [[1, 120]], 'rejected': [1, 2, 3], 'revenue': 0}Passed
control 4{'cogs': 300, 'inventory': 200, 'layers': [[2, 100]], 'rejected': [2], 'revenue': 750}{'cogs': 300, 'inventory': 200, 'layers': [[2, 100]], 'rejected': [2], 'revenue': 750}Passed
control 5{'cogs': 360, 'inventory': 2520, 'layers': [[21, 120]], 'rejected': [1, 3], 'revenue': 600}{'cogs': 360, 'inventory': 2520, 'layers': [[21, 120]], 'rejected': [1, 3], 'revenue': 600}Passed
control 6{'cogs': 300, 'inventory': 100, 'layers': [[1, 100]], 'rejected': [0, 1, 3, 4], 'revenue': 750}{'cogs': 300, 'inventory': 100, 'layers': [[1, 100]], 'rejected': [0, 1, 3, 4], 'revenue': 750}Passed

SHA-256 / 55b9dc8c7c2bbbe28d12494c54b47e43a66c3b7ce0976483569ca3db9f6088f0

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(x):
    layers = []
    cogs = revenue = 0
    short = []
    for i, ev in enumerate(x):
        if ev[0] == 'buy':
            if layers and layers[-1][1] == ev[2]:
                layers[-1][0] += ev[1]
            else:
                layers.append([ev[1], ev[2]])
        elif ev[0] == 'sell':
            qty = ev[1]
            if qty > sum(l[0] for l in layers):
                short.append(i)
                continue
            revenue += qty * ev[2]
            while qty:
                head = min(layers, key=lambda l: l[1])
                take = min(qty, head[0])
                cogs += take * head[1]
                head[0] -= take
                qty -= take
                if head[0] == 0:
                    layers.remove(head)
        elif ev[0] == 'purchase_return':
            match = [l for l in layers if l[1] == ev[2] and l[0] >= ev[1]]
            if not match:
                short.append(i)
                continue
            match[-1][0] -= ev[1]
            if match[-1][0] == 0:
                layers.remove(match[-1])
    inventory = sum(q * c for q, c in layers)
    return {'cogs': cogs, 'revenue': revenue, 'inventory': inventory, 'layers': layers, 'rejected': short}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: consumption order', [['buy', 5, 120], ['sell', 6, 200], ['sell', 3, 200], ['buy', 1, 100], ['buy', 5, 120], ['buy', 5, 100], ['sell', 6, 200], ['sell', 12, 250]], {'cogs': 1060, 'revenue': 1800, 'inventory': 740, 'layers': [[2, 120], [5, 100]], 'rejected': [1, 7]}], ['control 1', [['sell', 3, 250], ['buy', 2, 120], ['purchase_return', 1, 100], ['buy', 5, 100], ['buy', 2, 120]], {'cogs': 0, 'revenue': 0, 'inventory': 980, 'layers': [[2, 120], [5, 100], [2, 120]], 'rejected': [0, 2]}], ['control 2', [['buy', 5, 150], ['sell', 3, 250], ['sell', 2, 250], ['buy', 10, 100], ['buy', 10, 120], ['purchase_return', 2, 100], ['purchase_return', 5, 100], ['buy', 10, 150], ['buy', 2, 120], ['purchase_return', 5, 100]], {'cogs': 750, 'revenue': 1250, 'inventory': 3240, 'layers': [[3, 100], [10, 120], [10, 150], [2, 120]], 'rejected': [9]}], ['control 3', [['buy', 1, 120], ['sell', 12, 200], ['sell', 2, 250], ['sell', 2, 250]], {'cogs': 0, 'revenue': 0, 'inventory': 120, 'layers': [[1, 120]], 'rejected': [1, 2, 3]}], ['control 4', [['buy', 5, 100], ['sell', 3, 250], ['sell', 12, 200]], {'cogs': 300, 'revenue': 750, 'inventory': 200, 'layers': [[2, 100]], 'rejected': [2]}], ['control 5', [['buy', 10, 120], ['purchase_return', 1, 100], ['sell', 1, 200], ['purchase_return', 2, 100], ['sell', 2, 200], ['purchase_return', 1, 120], ['buy', 10, 120], ['buy', 5, 120]], {'cogs': 360, 'revenue': 600, 'inventory': 2520, 'layers': [[21, 120]], 'rejected': [1, 3]}], ['control 6', [['sell', 12, 250], ['sell', 12, 200], ['buy', 5, 100], ['sell', 12, 250], ['sell', 12, 200], ['purchase_return', 1, 100], ['sell', 3, 250]], {'cogs': 300, 'revenue': 750, 'inventory': 100, 'layers': [[1, 100]], 'rejected': [0, 1, 3, 4]}]], [['regression: consumption order', [['buy', 10, 150], ['sell', 3, 250], ['sell', 12, 200], ['buy', 5, 120], ['sell', 3, 200], ['buy', 1, 100], ['sell', 1, 250], ['buy', 2, 100], ['sell', 12, 200], ['buy', 10, 100]], {'cogs': 1050, 'revenue': 1600, 'inventory': 2350, 'layers': [[3, 150], [5, 120], [13, 100]], 'rejected': [2, 8]}], ['control 1', [['sell', 12, 200], ['sell', 6, 250], ['sell', 6, 200]], {'cogs': 0, 'revenue': 0, 'inventory': 0, 'layers': [], 'rejected': [0, 1, 2]}], ['control 2', [['buy', 10, 100], ['sell', 12, 250], ['sell', 2, 250], ['sell', 12, 200], ['sell', 6, 200], ['buy', 1, 150], ['buy', 2, 120]], {'cogs': 800, 'revenue': 1700, 'inventory': 590, 'layers': [[2, 100], [1, 150], [2, 120]], 'rejected': [1, 3]}], ['control 3', [['purchase_return', 2, 100], ['sell', 12, 250], ['buy', 10, 100], ['buy', 1, 100], ['sell', 6, 200]], {'cogs': 600, 'revenue': 1200, 'inventory': 500, 'layers': [[5, 100]], 'rejected': [0, 1]}], ['control 4', [['sell', 12, 200], ['buy', 10, 100], ['buy', 2, 120]], {'cogs': 0, 'revenue': 0, 'inventory': 1240, 'layers': [[10, 100], [2, 120]], 'rejected': [0]}], ['control 5', [['purchase_return', 5, 100], ['sell', 2, 200], ['purchase_return', 5, 120]], {'cogs': 0, 'revenue': 0, 'inventory': 0, 'layers': [], 'rejected': [0, 1, 2]}], ['control 6', [['purchase_return', 2, 120], ['sell', 1, 250], ['purchase_return', 1, 120], ['purchase_return', 1, 120], ['buy', 10, 120]], {'cogs': 0, 'revenue': 0, 'inventory': 1200, 'layers': [[10, 120]], 'rejected': [0, 1, 2, 3]}]], [['regression: consumption order', [['purchase_return', 1, 100], ['buy', 2, 150], ['sell', 6, 200], ['sell', 2, 250], ['buy', 5, 120], ['buy', 5, 150], ['sell', 1, 250], ['purchase_return', 2, 100]], {'cogs': 420, 'revenue': 750, 'inventory': 1230, 'layers': [[4, 120], [5, 150]], 'rejected': [0, 2, 7]}], ['regression: consumption order, partial-repair probe', [['buy', 2, 120], ['purchase_return', 1, 150], ['buy', 1, 100], ['buy', 5, 100], ['sell', 3, 200]], {'cogs': 340, 'revenue': 600, 'inventory': 500, 'layers': [[5, 100]], 'rejected': [1]}], ['control 1', [['purchase_return', 5, 100], ['sell', 2, 250], ['buy', 2, 100], ['buy', 1, 120]], {'cogs': 0, 'revenue': 0, 'inventory': 320, 'layers': [[2, 100], [1, 120]], 'rejected': [0, 1]}], ['control 2', [['sell', 1, 250], ['buy', 5, 100], ['buy', 10, 100], ['sell', 2, 250], ['buy', 2, 100], ['buy', 10, 100], ['sell', 6, 200], ['buy', 1, 120], ['buy', 10, 150], ['buy', 10, 150]], {'cogs': 800, 'revenue': 1700, 'inventory': 5020, 'layers': [[19, 100], [1, 120], [20, 150]], 'rejected': [0]}], ['control 3', [['purchase_return', 1, 100], ['sell', 1, 200], ['sell', 1, 250], ['sell', 3, 200], ['sell', 6, 200], ['buy', 10, 120], ['buy', 2, 150], ['buy', 2, 100], ['purchase_return', 2, 150]], {'cogs': 0, 'revenue': 0, 'inventory': 1400, 'layers': [[10, 120], [2, 100]], 'rejected': [0, 1, 2, 3, 4]}], ['control 4', [['buy', 1, 100], ['purchase_return', 5, 100], ['sell', 3, 200], ['buy', 1, 150], ['buy', 1, 150], ['sell', 3, 200], ['buy', 2, 120], ['buy', 10, 120]], {'cogs': 400, 'revenue': 600, 'inventory': 1440, 'layers': [[12, 120]], 'rejected': [1, 2]}], ['control 5', [['sell', 6, 200], ['sell', 12, 200], ['sell', 2, 200], ['sell', 2, 200], ['buy', 2, 100], ['purchase_return', 1, 120], ['buy', 2, 150], ['sell', 2, 200], ['sell', 2, 200], ['sell', 2, 200]], {'cogs': 500, 'revenue': 800, 'inventory': 0, 'layers': [], 'rejected': [0, 1, 2, 3, 5, 9]}]], [['regression: consumption order', [['sell', 1, 250], ['sell', 3, 200], ['purchase_return', 1, 100], ['buy', 2, 120], ['buy', 5, 150], ['sell', 3, 200], ['sell', 1, 200], ['sell', 6, 250], ['buy', 2, 120]], {'cogs': 540, 'revenue': 800, 'inventory': 690, 'layers': [[3, 150], [2, 120]], 'rejected': [0, 1, 2, 7]}], ['regression: consumption order, partial-repair probe', [['buy', 2, 150], ['buy', 10, 120], ['sell', 1, 200], ['purchase_return', 5, 100], ['buy', 1, 100], ['buy', 2, 150], ['buy', 1, 100], ['buy', 5, 100], ['sell', 3, 200]], {'cogs': 540, 'revenue': 800, 'inventory': 1960, 'layers': [[8, 120], [1, 100], [2, 150], [6, 100]], 'rejected': [3]}], ['control 1', [['buy', 1, 100], ['purchase_return', 2, 150], ['purchase_return', 1, 120], ['purchase_return', 2, 100], ['buy', 5, 100], ['buy', 10, 100], ['buy', 1, 150], ['buy', 1, 120]], {'cogs': 0, 'revenue': 0, 'inventory': 1870, 'layers': [[16, 100], [1, 150], [1, 120]], 'rejected': [1, 2, 3]}], ['control 2', [['sell', 3, 250], ['purchase_return', 1, 150], ['purchase_return', 2, 120], ['sell', 6, 200], ['purchase_return', 2, 100]], {'cogs': 0, 'revenue': 0, 'inventory': 0, 'layers': [], 'rejected': [0, 1, 2, 3, 4]}], ['control 3', [['sell', 6, 250], ['sell', 2, 250], ['sell', 3, 250], ['sell', 12, 250], ['sell', 12, 250], ['sell', 3, 250], ['buy', 1, 100], ['buy', 5, 120], ['buy', 5, 150], ['buy', 2, 120]], {'cogs': 0, 'revenue': 0, 'inventory': 1690, 'layers': [[1, 100], [5, 120], [5, 150], [2, 120]], 'rejected': [0, 1, 2, 3, 4, 5]}], ['control 4', [['sell', 6, 200], ['purchase_return', 1, 150], ['buy', 5, 120]], {'cogs': 0, 'revenue': 0, 'inventory': 600, 'layers': [[5, 120]], 'rejected': [0, 1]}], ['control 5', [['sell', 3, 200], ['purchase_return', 5, 150], ['buy', 10, 100], ['sell', 1, 200], ['buy', 5, 120], ['buy', 5, 120], ['buy', 2, 150]], {'cogs': 100, 'revenue': 200, 'inventory': 2400, 'layers': [[9, 100], [10, 120], [2, 150]], 'rejected': [0, 1]}]], [['regression: consumption order', [['buy', 10, 100], ['buy', 10, 150], ['purchase_return', 5, 100], ['sell', 6, 200], ['sell', 3, 200], ['sell', 2, 200]], {'cogs': 1400, 'revenue': 2200, 'inventory': 600, 'layers': [[4, 150]], 'rejected': []}], ['regression: consumption order, partial-repair probe', [['buy', 5, 100], ['sell', 2, 200], ['sell', 3, 250], ['buy', 5, 120], ['buy', 10, 150], ['buy', 10, 100], ['sell', 2, 200], ['purchase_return', 2, 100], ['purchase_return', 1, 100]], {'cogs': 740, 'revenue': 1550, 'inventory': 2560, 'layers': [[3, 120], [10, 150], [7, 100]], 'rejected': []}], ['control 1', [['purchase_return', 2, 100], ['sell', 1, 200], ['buy', 5, 100], ['buy', 5, 100], ['purchase_return', 1, 150], ['sell', 2, 250], ['buy', 1, 100], ['sell', 1, 200]], {'cogs': 300, 'revenue': 700, 'inventory': 800, 'layers': [[8, 100]], 'rejected': [0, 1, 4]}], ['control 2', [['purchase_return', 1, 100], ['buy', 1, 100], ['sell', 3, 200], ['buy', 10, 100], ['buy', 5, 100], ['sell', 2, 200], ['purchase_return', 2, 150]], {'cogs': 200, 'revenue': 400, 'inventory': 1400, 'layers': [[14, 100]], 'rejected': [0, 2, 6]}], ['control 3', [['buy', 10, 120], ['buy', 1, 120], ['purchase_return', 2, 150], ['sell', 2, 250], ['buy', 1, 100]], {'cogs': 240, 'revenue': 500, 'inventory': 1180, 'layers': [[9, 120], [1, 100]], 'rejected': [2]}], ['control 4', [['sell', 6, 250], ['purchase_return', 2, 100], ['sell', 12, 250], ['sell', 3, 200]], {'cogs': 0, 'revenue': 0, 'inventory': 0, 'layers': [], 'rejected': [0, 1, 2, 3]}], ['control 5', [['sell', 6, 250], ['sell', 3, 250], ['sell', 12, 200], ['sell', 1, 250], ['sell', 3, 250], ['purchase_return', 5, 150], ['sell', 6, 200]], {'cogs': 0, 'revenue': 0, 'inventory': 0, 'layers': [], 'rejected': [0, 1, 2, 3, 4, 5, 6]}]]]
for label, args, expected in fixtures[N-1]:
    try:
        actual = solve(args)
    except Exception as exc:
        actual = 'raised ' + type(exc).__name__
    check(label, actual, 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
regression: consumption order{'cogs': 960, 'inventory': 840, 'layers': [[2, 120], [5, 120]], 'rejected': [1, 7], 'revenue': 1800}{'cogs': 1060, 'inventory': 740, 'layers': [[2, 120], [5, 100]], 'rejected': [1, 7], 'revenue': 1800}Failed
control 1{'cogs': 0, 'inventory': 980, 'layers': [[2, 120], [5, 100], [2, 120]], 'rejected': [0, 2], 'revenue': 0}{'cogs': 0, 'inventory': 980, 'layers': [[2, 120], [5, 100], [2, 120]], 'rejected': [0, 2], 'revenue': 0}Passed
control 2{'cogs': 750, 'inventory': 3240, 'layers': [[3, 100], [10, 120], [10, 150], [2, 120]], 'rejected': [9], 'revenue': 1250}{'cogs': 750, 'inventory': 3240, 'layers': [[3, 100], [10, 120], [10, 150], [2, 120]], 'rejected': [9], 'revenue': 1250}Passed
control 3{'cogs': 0, 'inventory': 120, 'layers': [[1, 120]], 'rejected': [1, 2, 3], 'revenue': 0}{'cogs': 0, 'inventory': 120, 'layers': [[1, 120]], 'rejected': [1, 2, 3], 'revenue': 0}Passed
control 4{'cogs': 300, 'inventory': 200, 'layers': [[2, 100]], 'rejected': [2], 'revenue': 750}{'cogs': 300, 'inventory': 200, 'layers': [[2, 100]], 'rejected': [2], 'revenue': 750}Passed
control 5{'cogs': 360, 'inventory': 2520, 'layers': [[21, 120]], 'rejected': [1, 3], 'revenue': 600}{'cogs': 360, 'inventory': 2520, 'layers': [[21, 120]], 'rejected': [1, 3], 'revenue': 600}Passed
control 6{'cogs': 300, 'inventory': 100, 'layers': [[1, 100]], 'rejected': [0, 1, 3, 4], 'revenue': 750}{'cogs': 300, 'inventory': 100, 'layers': [[1, 100]], 'rejected': [0, 1, 3, 4], 'revenue': 750}Passed

SHA-256 / 8611a4ffe0bf9da27b75e32ae1df0033f42458ab86c4d13902bb271dee560fd3

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(x):
    layers = []
    cogs = revenue = 0
    short = []
    for i, ev in enumerate(x):
        if ev[0] == 'buy':
            if layers and layers[-1][1] == ev[2]:
                layers[-1][0] += ev[1]
            else:
                layers.append([ev[1], ev[2]])
        elif ev[0] == 'sell':
            qty = ev[1]
            if qty > sum(l[0] for l in layers):
                short.append(i)
                continue
            revenue += qty * ev[2]
            while qty:
                head = layers[0]
                take = min(qty, head[0])
                cogs += take * head[1]
                head[0] -= take
                qty -= take
                if head[0] == 0:
                    layers.pop(0)
        elif ev[0] == 'purchase_return':
            match = [l for l in layers if l[1] == ev[2] and l[0] >= ev[1]]
            if not match:
                short.append(i)
                continue
            match[-1][0] -= ev[1]
            if match[-1][0] == 0:
                layers.remove(match[-1])
    inventory = sum(q * c for q, c in layers)
    return {'cogs': cogs, 'revenue': revenue, 'inventory': inventory, 'layers': layers, 'rejected': short}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: consumption order', [['buy', 5, 120], ['sell', 6, 200], ['sell', 3, 200], ['buy', 1, 100], ['buy', 5, 120], ['buy', 5, 100], ['sell', 6, 200], ['sell', 12, 250]], {'cogs': 1060, 'revenue': 1800, 'inventory': 740, 'layers': [[2, 120], [5, 100]], 'rejected': [1, 7]}], ['control 1', [['sell', 3, 250], ['buy', 2, 120], ['purchase_return', 1, 100], ['buy', 5, 100], ['buy', 2, 120]], {'cogs': 0, 'revenue': 0, 'inventory': 980, 'layers': [[2, 120], [5, 100], [2, 120]], 'rejected': [0, 2]}], ['control 2', [['buy', 5, 150], ['sell', 3, 250], ['sell', 2, 250], ['buy', 10, 100], ['buy', 10, 120], ['purchase_return', 2, 100], ['purchase_return', 5, 100], ['buy', 10, 150], ['buy', 2, 120], ['purchase_return', 5, 100]], {'cogs': 750, 'revenue': 1250, 'inventory': 3240, 'layers': [[3, 100], [10, 120], [10, 150], [2, 120]], 'rejected': [9]}], ['control 3', [['buy', 1, 120], ['sell', 12, 200], ['sell', 2, 250], ['sell', 2, 250]], {'cogs': 0, 'revenue': 0, 'inventory': 120, 'layers': [[1, 120]], 'rejected': [1, 2, 3]}], ['control 4', [['buy', 5, 100], ['sell', 3, 250], ['sell', 12, 200]], {'cogs': 300, 'revenue': 750, 'inventory': 200, 'layers': [[2, 100]], 'rejected': [2]}], ['control 5', [['buy', 10, 120], ['purchase_return', 1, 100], ['sell', 1, 200], ['purchase_return', 2, 100], ['sell', 2, 200], ['purchase_return', 1, 120], ['buy', 10, 120], ['buy', 5, 120]], {'cogs': 360, 'revenue': 600, 'inventory': 2520, 'layers': [[21, 120]], 'rejected': [1, 3]}], ['control 6', [['sell', 12, 250], ['sell', 12, 200], ['buy', 5, 100], ['sell', 12, 250], ['sell', 12, 200], ['purchase_return', 1, 100], ['sell', 3, 250]], {'cogs': 300, 'revenue': 750, 'inventory': 100, 'layers': [[1, 100]], 'rejected': [0, 1, 3, 4]}]], [['regression: consumption order', [['buy', 10, 150], ['sell', 3, 250], ['sell', 12, 200], ['buy', 5, 120], ['sell', 3, 200], ['buy', 1, 100], ['sell', 1, 250], ['buy', 2, 100], ['sell', 12, 200], ['buy', 10, 100]], {'cogs': 1050, 'revenue': 1600, 'inventory': 2350, 'layers': [[3, 150], [5, 120], [13, 100]], 'rejected': [2, 8]}], ['control 1', [['sell', 12, 200], ['sell', 6, 250], ['sell', 6, 200]], {'cogs': 0, 'revenue': 0, 'inventory': 0, 'layers': [], 'rejected': [0, 1, 2]}], ['control 2', [['buy', 10, 100], ['sell', 12, 250], ['sell', 2, 250], ['sell', 12, 200], ['sell', 6, 200], ['buy', 1, 150], ['buy', 2, 120]], {'cogs': 800, 'revenue': 1700, 'inventory': 590, 'layers': [[2, 100], [1, 150], [2, 120]], 'rejected': [1, 3]}], ['control 3', [['purchase_return', 2, 100], ['sell', 12, 250], ['buy', 10, 100], ['buy', 1, 100], ['sell', 6, 200]], {'cogs': 600, 'revenue': 1200, 'inventory': 500, 'layers': [[5, 100]], 'rejected': [0, 1]}], ['control 4', [['sell', 12, 200], ['buy', 10, 100], ['buy', 2, 120]], {'cogs': 0, 'revenue': 0, 'inventory': 1240, 'layers': [[10, 100], [2, 120]], 'rejected': [0]}], ['control 5', [['purchase_return', 5, 100], ['sell', 2, 200], ['purchase_return', 5, 120]], {'cogs': 0, 'revenue': 0, 'inventory': 0, 'layers': [], 'rejected': [0, 1, 2]}], ['control 6', [['purchase_return', 2, 120], ['sell', 1, 250], ['purchase_return', 1, 120], ['purchase_return', 1, 120], ['buy', 10, 120]], {'cogs': 0, 'revenue': 0, 'inventory': 1200, 'layers': [[10, 120]], 'rejected': [0, 1, 2, 3]}]], [['regression: consumption order', [['purchase_return', 1, 100], ['buy', 2, 150], ['sell', 6, 200], ['sell', 2, 250], ['buy', 5, 120], ['buy', 5, 150], ['sell', 1, 250], ['purchase_return', 2, 100]], {'cogs': 420, 'revenue': 750, 'inventory': 1230, 'layers': [[4, 120], [5, 150]], 'rejected': [0, 2, 7]}], ['regression: consumption order, partial-repair probe', [['buy', 2, 120], ['purchase_return', 1, 150], ['buy', 1, 100], ['buy', 5, 100], ['sell', 3, 200]], {'cogs': 340, 'revenue': 600, 'inventory': 500, 'layers': [[5, 100]], 'rejected': [1]}], ['control 1', [['purchase_return', 5, 100], ['sell', 2, 250], ['buy', 2, 100], ['buy', 1, 120]], {'cogs': 0, 'revenue': 0, 'inventory': 320, 'layers': [[2, 100], [1, 120]], 'rejected': [0, 1]}], ['control 2', [['sell', 1, 250], ['buy', 5, 100], ['buy', 10, 100], ['sell', 2, 250], ['buy', 2, 100], ['buy', 10, 100], ['sell', 6, 200], ['buy', 1, 120], ['buy', 10, 150], ['buy', 10, 150]], {'cogs': 800, 'revenue': 1700, 'inventory': 5020, 'layers': [[19, 100], [1, 120], [20, 150]], 'rejected': [0]}], ['control 3', [['purchase_return', 1, 100], ['sell', 1, 200], ['sell', 1, 250], ['sell', 3, 200], ['sell', 6, 200], ['buy', 10, 120], ['buy', 2, 150], ['buy', 2, 100], ['purchase_return', 2, 150]], {'cogs': 0, 'revenue': 0, 'inventory': 1400, 'layers': [[10, 120], [2, 100]], 'rejected': [0, 1, 2, 3, 4]}], ['control 4', [['buy', 1, 100], ['purchase_return', 5, 100], ['sell', 3, 200], ['buy', 1, 150], ['buy', 1, 150], ['sell', 3, 200], ['buy', 2, 120], ['buy', 10, 120]], {'cogs': 400, 'revenue': 600, 'inventory': 1440, 'layers': [[12, 120]], 'rejected': [1, 2]}], ['control 5', [['sell', 6, 200], ['sell', 12, 200], ['sell', 2, 200], ['sell', 2, 200], ['buy', 2, 100], ['purchase_return', 1, 120], ['buy', 2, 150], ['sell', 2, 200], ['sell', 2, 200], ['sell', 2, 200]], {'cogs': 500, 'revenue': 800, 'inventory': 0, 'layers': [], 'rejected': [0, 1, 2, 3, 5, 9]}]], [['regression: consumption order', [['sell', 1, 250], ['sell', 3, 200], ['purchase_return', 1, 100], ['buy', 2, 120], ['buy', 5, 150], ['sell', 3, 200], ['sell', 1, 200], ['sell', 6, 250], ['buy', 2, 120]], {'cogs': 540, 'revenue': 800, 'inventory': 690, 'layers': [[3, 150], [2, 120]], 'rejected': [0, 1, 2, 7]}], ['regression: consumption order, partial-repair probe', [['buy', 2, 150], ['buy', 10, 120], ['sell', 1, 200], ['purchase_return', 5, 100], ['buy', 1, 100], ['buy', 2, 150], ['buy', 1, 100], ['buy', 5, 100], ['sell', 3, 200]], {'cogs': 540, 'revenue': 800, 'inventory': 1960, 'layers': [[8, 120], [1, 100], [2, 150], [6, 100]], 'rejected': [3]}], ['control 1', [['buy', 1, 100], ['purchase_return', 2, 150], ['purchase_return', 1, 120], ['purchase_return', 2, 100], ['buy', 5, 100], ['buy', 10, 100], ['buy', 1, 150], ['buy', 1, 120]], {'cogs': 0, 'revenue': 0, 'inventory': 1870, 'layers': [[16, 100], [1, 150], [1, 120]], 'rejected': [1, 2, 3]}], ['control 2', [['sell', 3, 250], ['purchase_return', 1, 150], ['purchase_return', 2, 120], ['sell', 6, 200], ['purchase_return', 2, 100]], {'cogs': 0, 'revenue': 0, 'inventory': 0, 'layers': [], 'rejected': [0, 1, 2, 3, 4]}], ['control 3', [['sell', 6, 250], ['sell', 2, 250], ['sell', 3, 250], ['sell', 12, 250], ['sell', 12, 250], ['sell', 3, 250], ['buy', 1, 100], ['buy', 5, 120], ['buy', 5, 150], ['buy', 2, 120]], {'cogs': 0, 'revenue': 0, 'inventory': 1690, 'layers': [[1, 100], [5, 120], [5, 150], [2, 120]], 'rejected': [0, 1, 2, 3, 4, 5]}], ['control 4', [['sell', 6, 200], ['purchase_return', 1, 150], ['buy', 5, 120]], {'cogs': 0, 'revenue': 0, 'inventory': 600, 'layers': [[5, 120]], 'rejected': [0, 1]}], ['control 5', [['sell', 3, 200], ['purchase_return', 5, 150], ['buy', 10, 100], ['sell', 1, 200], ['buy', 5, 120], ['buy', 5, 120], ['buy', 2, 150]], {'cogs': 100, 'revenue': 200, 'inventory': 2400, 'layers': [[9, 100], [10, 120], [2, 150]], 'rejected': [0, 1]}]], [['regression: consumption order', [['buy', 10, 100], ['buy', 10, 150], ['purchase_return', 5, 100], ['sell', 6, 200], ['sell', 3, 200], ['sell', 2, 200]], {'cogs': 1400, 'revenue': 2200, 'inventory': 600, 'layers': [[4, 150]], 'rejected': []}], ['regression: consumption order, partial-repair probe', [['buy', 5, 100], ['sell', 2, 200], ['sell', 3, 250], ['buy', 5, 120], ['buy', 10, 150], ['buy', 10, 100], ['sell', 2, 200], ['purchase_return', 2, 100], ['purchase_return', 1, 100]], {'cogs': 740, 'revenue': 1550, 'inventory': 2560, 'layers': [[3, 120], [10, 150], [7, 100]], 'rejected': []}], ['control 1', [['purchase_return', 2, 100], ['sell', 1, 200], ['buy', 5, 100], ['buy', 5, 100], ['purchase_return', 1, 150], ['sell', 2, 250], ['buy', 1, 100], ['sell', 1, 200]], {'cogs': 300, 'revenue': 700, 'inventory': 800, 'layers': [[8, 100]], 'rejected': [0, 1, 4]}], ['control 2', [['purchase_return', 1, 100], ['buy', 1, 100], ['sell', 3, 200], ['buy', 10, 100], ['buy', 5, 100], ['sell', 2, 200], ['purchase_return', 2, 150]], {'cogs': 200, 'revenue': 400, 'inventory': 1400, 'layers': [[14, 100]], 'rejected': [0, 2, 6]}], ['control 3', [['buy', 10, 120], ['buy', 1, 120], ['purchase_return', 2, 150], ['sell', 2, 250], ['buy', 1, 100]], {'cogs': 240, 'revenue': 500, 'inventory': 1180, 'layers': [[9, 120], [1, 100]], 'rejected': [2]}], ['control 4', [['sell', 6, 250], ['purchase_return', 2, 100], ['sell', 12, 250], ['sell', 3, 200]], {'cogs': 0, 'revenue': 0, 'inventory': 0, 'layers': [], 'rejected': [0, 1, 2, 3]}], ['control 5', [['sell', 6, 250], ['sell', 3, 250], ['sell', 12, 200], ['sell', 1, 250], ['sell', 3, 250], ['purchase_return', 5, 150], ['sell', 6, 200]], {'cogs': 0, 'revenue': 0, 'inventory': 0, 'layers': [], 'rejected': [0, 1, 2, 3, 4, 5, 6]}]]]
for label, args, expected in fixtures[N-1]:
    try:
        actual = solve(args)
    except Exception as exc:
        actual = 'raised ' + type(exc).__name__
    check(label, actual, 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
regression: consumption order{'cogs': 1060, 'inventory': 740, 'layers': [[2, 120], [5, 100]], 'rejected': [1, 7], 'revenue': 1800}{'cogs': 1060, 'inventory': 740, 'layers': [[2, 120], [5, 100]], 'rejected': [1, 7], 'revenue': 1800}Passed
control 1{'cogs': 0, 'inventory': 980, 'layers': [[2, 120], [5, 100], [2, 120]], 'rejected': [0, 2], 'revenue': 0}{'cogs': 0, 'inventory': 980, 'layers': [[2, 120], [5, 100], [2, 120]], 'rejected': [0, 2], 'revenue': 0}Passed
control 2{'cogs': 750, 'inventory': 3240, 'layers': [[3, 100], [10, 120], [10, 150], [2, 120]], 'rejected': [9], 'revenue': 1250}{'cogs': 750, 'inventory': 3240, 'layers': [[3, 100], [10, 120], [10, 150], [2, 120]], 'rejected': [9], 'revenue': 1250}Passed
control 3{'cogs': 0, 'inventory': 120, 'layers': [[1, 120]], 'rejected': [1, 2, 3], 'revenue': 0}{'cogs': 0, 'inventory': 120, 'layers': [[1, 120]], 'rejected': [1, 2, 3], 'revenue': 0}Passed
control 4{'cogs': 300, 'inventory': 200, 'layers': [[2, 100]], 'rejected': [2], 'revenue': 750}{'cogs': 300, 'inventory': 200, 'layers': [[2, 100]], 'rejected': [2], 'revenue': 750}Passed
control 5{'cogs': 360, 'inventory': 2520, 'layers': [[21, 120]], 'rejected': [1, 3], 'revenue': 600}{'cogs': 360, 'inventory': 2520, 'layers': [[21, 120]], 'rejected': [1, 3], 'revenue': 600}Passed
control 6{'cogs': 300, 'inventory': 100, 'layers': [[1, 100]], 'rejected': [0, 1, 3, 4], 'revenue': 750}{'cogs': 300, 'inventory': 100, 'layers': [[1, 100]], 'rejected': [0, 1, 3, 4], 'revenue': 750}Passed

SHA-256 / 3945b1cf8d13495fba280a4bf4bff27eed677e4b0bd8f214131d355b0db80746

Verification & scope

A deterministic bounded teaching model with stipulated toy bookkeeping rules stated in the contract; amounts are integer cents; it makes no claim of conformance to any accounting standard or product. 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:23.370549+00:00.

Case digest / f598eebe370ed454868c94c733e13f3ac52e2ff8a5385d83dd6928abe459a000