FAILURE MAP
← Case archive

FA-59881 / Inventory cost layering / Open access

Periodic LIFO year-end layering: available quantity bound · case 01

An impossible ending count larger than purchases alone is rejected, even though beginning units make it valid.

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

ROOT CAUSE

Available quantity is computed from purchases only, omitting beginning inventory.

VERIFIED REPAIR

Available quantity is beginning units plus purchased units.

Unsuccessful approach: Using beginning units alone rejects any count that relies on purchases.

Case contract

Input {begin:[[qty,unit]] oldest first, purchases:[[qty,unit]] chronological, ending_qty}. Ending inventory keeps the oldest units: if ending_qty covers the base, all base layers stay and one increment layer is priced at the EARLIEST purchases of the year; otherwise the newest base layers are liquidated. ending_qty outside [0, available] returns {"error"}. Return {layers:[[qty,value]], ending_value, cogs}.

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):
    begin = [list(l) for l in x['begin']]
    purchases = x['purchases']
    end_q = x['ending_qty']
    base_q = sum(l[0] for l in begin)
    buy_q = sum(p[0] for p in purchases)
    avail = buy_q
    if end_q < 0 or end_q > avail:
        return {'error': 'invalid ending quantity'}
    layers = []
    if end_q >= base_q:
        layers = [[q, q * c] for q, c in begin]
        inc = end_q - base_q
        new_q = 0
        new_v = 0
        for q, c in purchases:
            if inc == 0:
                break
            take = min(inc, q)
            new_q += take
            new_v += take * c
            inc -= take
        if new_q > 0:
            layers.append([new_q, new_v])
    else:
        rem = end_q
        for bq, bc in begin:
            take = min(rem, bq)
            if take > 0:
                layers.append([take, take * bc])
            rem -= take
    begin_value = sum(q * c for q, c in begin)
    buy_value = sum(q * c for q, c in purchases)
    ending_value = sum(v for q, v in layers)
    return {'layers': layers, 'ending_value': ending_value, 'cogs': begin_value + buy_value - ending_value}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['increment layer', {'begin': [[10, 5], [4, 6]], 'purchases': [[6, 7], [8, 10]], 'ending_qty': 18}, {'layers': [[10, 50], [4, 24], [4, 28]], 'ending_value': 102, 'cogs': 94}], ['liquidation', {'begin': [[10, 5], [4, 6]], 'purchases': [[6, 7]], 'ending_qty': 10}, {'layers': [[10, 50]], 'ending_value': 50, 'cogs': 66}], ['deep liquidation', {'begin': [[3, 2], [3, 4], [3, 6]], 'purchases': [[2, 8]], 'ending_qty': 1}, {'layers': [[1, 2]], 'ending_value': 2, 'cogs': 50}], ['over available', {'begin': [[2, 3]], 'purchases': [[3, 4]], 'ending_qty': 6}, {'error': 'invalid ending quantity'}], ['negative ending', {'begin': [[2, 3]], 'purchases': [[3, 4]], 'ending_qty': -1}, {'error': 'invalid ending quantity'}], ['count of minus one', {'begin': [[3, 3]], 'purchases': [[3, 4]], 'ending_qty': -1}, {'error': 'invalid ending quantity'}], ['all sold', {'begin': [[5, 3]], 'purchases': [[5, 4]], 'ending_qty': 0}, {'layers': [], 'ending_value': 0, 'cogs': 35}], ['exact base', {'begin': [[4, 10]], 'purchases': [[1, 11], [2, 12]], 'ending_qty': 4}, {'layers': [[4, 40]], 'ending_value': 40, 'cogs': 35}], ['uses both pools', {'begin': [[6, 2]], 'purchases': [[3, 5]], 'ending_qty': 8}, {'layers': [[6, 12], [2, 10]], 'ending_value': 22, 'cogs': 5}]], [['increment layer', {'begin': [[10, 5], [4, 6]], 'purchases': [[6, 7], [8, 11]], 'ending_qty': 19}, {'layers': [[10, 50], [4, 24], [5, 35]], 'ending_value': 109, 'cogs': 95}], ['liquidation', {'begin': [[10, 5], [4, 6]], 'purchases': [[6, 7]], 'ending_qty': 11}, {'layers': [[10, 50], [1, 6]], 'ending_value': 56, 'cogs': 60}], ['deep liquidation', {'begin': [[3, 2], [3, 4], [3, 6]], 'purchases': [[2, 8]], 'ending_qty': 2}, {'layers': [[2, 4]], 'ending_value': 4, 'cogs': 48}], ['over available', {'begin': [[2, 3]], 'purchases': [[3, 4]], 'ending_qty': 7}, {'error': 'invalid ending quantity'}], ['negative ending', {'begin': [[2, 3]], 'purchases': [[3, 4]], 'ending_qty': -2}, {'error': 'invalid ending quantity'}], ['count of minus one', {'begin': [[4, 3]], 'purchases': [[3, 4]], 'ending_qty': -1}, {'error': 'invalid ending quantity'}], ['all sold', {'begin': [[5, 3]], 'purchases': [[5, 4]], 'ending_qty': 0}, {'layers': [], 'ending_value': 0, 'cogs': 35}], ['exact base', {'begin': [[4, 10]], 'purchases': [[2, 11], [2, 12]], 'ending_qty': 4}, {'layers': [[4, 40]], 'ending_value': 40, 'cogs': 46}], ['uses both pools', {'begin': [[6, 2]], 'purchases': [[3, 5]], 'ending_qty': 7}, {'layers': [[6, 12], [1, 5]], 'ending_value': 17, 'cogs': 10}]], [['increment layer', {'begin': [[10, 5], [4, 6]], 'purchases': [[6, 7], [8, 12]], 'ending_qty': 17}, {'layers': [[10, 50], [4, 24], [3, 21]], 'ending_value': 95, 'cogs': 117}], ['liquidation', {'begin': [[10, 5], [4, 6]], 'purchases': [[6, 7]], 'ending_qty': 10}, {'layers': [[10, 50]], 'ending_value': 50, 'cogs': 66}], ['deep liquidation', {'begin': [[3, 2], [3, 4], [3, 6]], 'purchases': [[2, 8]], 'ending_qty': 3}, {'layers': [[3, 6]], 'ending_value': 6, 'cogs': 46}], ['over available', {'begin': [[2, 3]], 'purchases': [[3, 4]], 'ending_qty': 8}, {'error': 'invalid ending quantity'}], ['negative ending', {'begin': [[2, 3]], 'purchases': [[3, 4]], 'ending_qty': -3}, {'error': 'invalid ending quantity'}], ['count of minus one', {'begin': [[5, 3]], 'purchases': [[3, 4]], 'ending_qty': -1}, {'error': 'invalid ending quantity'}], ['all sold', {'begin': [[5, 3]], 'purchases': [[5, 4]], 'ending_qty': 0}, {'layers': [], 'ending_value': 0, 'cogs': 35}], ['exact base', {'begin': [[4, 10]], 'purchases': [[3, 11], [2, 12]], 'ending_qty': 4}, {'layers': [[4, 40]], 'ending_value': 40, 'cogs': 57}], ['uses both pools', {'begin': [[6, 2]], 'purchases': [[3, 5]], 'ending_qty': 8}, {'layers': [[6, 12], [2, 10]], 'ending_value': 22, 'cogs': 5}]], [['increment layer', {'begin': [[10, 5], [4, 6]], 'purchases': [[6, 7], [8, 13]], 'ending_qty': 18}, {'layers': [[10, 50], [4, 24], [4, 28]], 'ending_value': 102, 'cogs': 118}], ['liquidation', {'begin': [[10, 5], [4, 6]], 'purchases': [[6, 7]], 'ending_qty': 11}, {'layers': [[10, 50], [1, 6]], 'ending_value': 56, 'cogs': 60}], ['deep liquidation', {'begin': [[3, 2], [3, 4], [3, 6]], 'purchases': [[2, 8]], 'ending_qty': 4}, {'layers': [[3, 6], [1, 4]], 'ending_value': 10, 'cogs': 42}], ['over available', {'begin': [[2, 3]], 'purchases': [[3, 4]], 'ending_qty': 9}, {'error': 'invalid ending quantity'}], ['negative ending', {'begin': [[2, 3]], 'purchases': [[3, 4]], 'ending_qty': -4}, {'error': 'invalid ending quantity'}], ['count of minus one', {'begin': [[6, 3]], 'purchases': [[3, 4]], 'ending_qty': -1}, {'error': 'invalid ending quantity'}], ['all sold', {'begin': [[5, 3]], 'purchases': [[5, 4]], 'ending_qty': 0}, {'layers': [], 'ending_value': 0, 'cogs': 35}], ['exact base', {'begin': [[4, 10]], 'purchases': [[4, 11], [2, 12]], 'ending_qty': 4}, {'layers': [[4, 40]], 'ending_value': 40, 'cogs': 68}], ['uses both pools', {'begin': [[6, 2]], 'purchases': [[3, 5]], 'ending_qty': 7}, {'layers': [[6, 12], [1, 5]], 'ending_value': 17, 'cogs': 10}]], [['increment layer', {'begin': [[10, 5], [4, 6]], 'purchases': [[6, 7], [8, 14]], 'ending_qty': 19}, {'layers': [[10, 50], [4, 24], [5, 35]], 'ending_value': 109, 'cogs': 119}], ['liquidation', {'begin': [[10, 5], [4, 6]], 'purchases': [[6, 7]], 'ending_qty': 10}, {'layers': [[10, 50]], 'ending_value': 50, 'cogs': 66}], ['deep liquidation', {'begin': [[3, 2], [3, 4], [3, 6]], 'purchases': [[2, 8]], 'ending_qty': 5}, {'layers': [[3, 6], [2, 8]], 'ending_value': 14, 'cogs': 38}], ['over available', {'begin': [[2, 3]], 'purchases': [[3, 4]], 'ending_qty': 10}, {'error': 'invalid ending quantity'}], ['negative ending', {'begin': [[2, 3]], 'purchases': [[3, 4]], 'ending_qty': -5}, {'error': 'invalid ending quantity'}], ['count of minus one', {'begin': [[7, 3]], 'purchases': [[3, 4]], 'ending_qty': -1}, {'error': 'invalid ending quantity'}], ['all sold', {'begin': [[5, 3]], 'purchases': [[5, 4]], 'ending_qty': 0}, {'layers': [], 'ending_value': 0, 'cogs': 35}], ['exact base', {'begin': [[4, 10]], 'purchases': [[5, 11], [2, 12]], 'ending_qty': 4}, {'layers': [[4, 40]], 'ending_value': 40, 'cogs': 79}], ['uses both pools', {'begin': [[6, 2]], 'purchases': [[3, 5]], 'ending_qty': 8}, {'layers': [[6, 12], [2, 10]], 'ending_value': 22, 'cogs': 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
increment layer{'error': 'invalid ending quantity'}{'cogs': 94, 'ending_value': 102, 'layers': [[10, 50], [4, 24], [4, 28]]}Failed
liquidation{'error': 'invalid ending quantity'}{'cogs': 66, 'ending_value': 50, 'layers': [[10, 50]]}Failed
deep liquidation{'cogs': 50, 'ending_value': 2, 'layers': [[1, 2]]}{'cogs': 50, 'ending_value': 2, 'layers': [[1, 2]]}Passed
over available{'error': 'invalid ending quantity'}{'error': 'invalid ending quantity'}Passed
negative ending{'error': 'invalid ending quantity'}{'error': 'invalid ending quantity'}Passed
count of minus one{'error': 'invalid ending quantity'}{'error': 'invalid ending quantity'}Passed
all sold{'cogs': 35, 'ending_value': 0, 'layers': []}{'cogs': 35, 'ending_value': 0, 'layers': []}Passed
exact base{'error': 'invalid ending quantity'}{'cogs': 35, 'ending_value': 40, 'layers': [[4, 40]]}Failed
uses both pools{'error': 'invalid ending quantity'}{'cogs': 5, 'ending_value': 22, 'layers': [[6, 12], [2, 10]]}Failed

SHA-256 / 2e13bd7cf794af70bdbe261afd0e2ffed0a691e45860c45d9f00fd303e5af70d

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(x):
    begin = [list(l) for l in x['begin']]
    purchases = x['purchases']
    end_q = x['ending_qty']
    base_q = sum(l[0] for l in begin)
    buy_q = sum(p[0] for p in purchases)
    avail = base_q
    if end_q < 0 or end_q > avail:
        return {'error': 'invalid ending quantity'}
    layers = []
    if end_q >= base_q:
        layers = [[q, q * c] for q, c in begin]
        inc = end_q - base_q
        new_q = 0
        new_v = 0
        for q, c in purchases:
            if inc == 0:
                break
            take = min(inc, q)
            new_q += take
            new_v += take * c
            inc -= take
        if new_q > 0:
            layers.append([new_q, new_v])
    else:
        rem = end_q
        for bq, bc in begin:
            take = min(rem, bq)
            if take > 0:
                layers.append([take, take * bc])
            rem -= take
    begin_value = sum(q * c for q, c in begin)
    buy_value = sum(q * c for q, c in purchases)
    ending_value = sum(v for q, v in layers)
    return {'layers': layers, 'ending_value': ending_value, 'cogs': begin_value + buy_value - ending_value}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['increment layer', {'begin': [[10, 5], [4, 6]], 'purchases': [[6, 7], [8, 10]], 'ending_qty': 18}, {'layers': [[10, 50], [4, 24], [4, 28]], 'ending_value': 102, 'cogs': 94}], ['liquidation', {'begin': [[10, 5], [4, 6]], 'purchases': [[6, 7]], 'ending_qty': 10}, {'layers': [[10, 50]], 'ending_value': 50, 'cogs': 66}], ['deep liquidation', {'begin': [[3, 2], [3, 4], [3, 6]], 'purchases': [[2, 8]], 'ending_qty': 1}, {'layers': [[1, 2]], 'ending_value': 2, 'cogs': 50}], ['over available', {'begin': [[2, 3]], 'purchases': [[3, 4]], 'ending_qty': 6}, {'error': 'invalid ending quantity'}], ['negative ending', {'begin': [[2, 3]], 'purchases': [[3, 4]], 'ending_qty': -1}, {'error': 'invalid ending quantity'}], ['count of minus one', {'begin': [[3, 3]], 'purchases': [[3, 4]], 'ending_qty': -1}, {'error': 'invalid ending quantity'}], ['all sold', {'begin': [[5, 3]], 'purchases': [[5, 4]], 'ending_qty': 0}, {'layers': [], 'ending_value': 0, 'cogs': 35}], ['exact base', {'begin': [[4, 10]], 'purchases': [[1, 11], [2, 12]], 'ending_qty': 4}, {'layers': [[4, 40]], 'ending_value': 40, 'cogs': 35}], ['uses both pools', {'begin': [[6, 2]], 'purchases': [[3, 5]], 'ending_qty': 8}, {'layers': [[6, 12], [2, 10]], 'ending_value': 22, 'cogs': 5}]], [['increment layer', {'begin': [[10, 5], [4, 6]], 'purchases': [[6, 7], [8, 11]], 'ending_qty': 19}, {'layers': [[10, 50], [4, 24], [5, 35]], 'ending_value': 109, 'cogs': 95}], ['liquidation', {'begin': [[10, 5], [4, 6]], 'purchases': [[6, 7]], 'ending_qty': 11}, {'layers': [[10, 50], [1, 6]], 'ending_value': 56, 'cogs': 60}], ['deep liquidation', {'begin': [[3, 2], [3, 4], [3, 6]], 'purchases': [[2, 8]], 'ending_qty': 2}, {'layers': [[2, 4]], 'ending_value': 4, 'cogs': 48}], ['over available', {'begin': [[2, 3]], 'purchases': [[3, 4]], 'ending_qty': 7}, {'error': 'invalid ending quantity'}], ['negative ending', {'begin': [[2, 3]], 'purchases': [[3, 4]], 'ending_qty': -2}, {'error': 'invalid ending quantity'}], ['count of minus one', {'begin': [[4, 3]], 'purchases': [[3, 4]], 'ending_qty': -1}, {'error': 'invalid ending quantity'}], ['all sold', {'begin': [[5, 3]], 'purchases': [[5, 4]], 'ending_qty': 0}, {'layers': [], 'ending_value': 0, 'cogs': 35}], ['exact base', {'begin': [[4, 10]], 'purchases': [[2, 11], [2, 12]], 'ending_qty': 4}, {'layers': [[4, 40]], 'ending_value': 40, 'cogs': 46}], ['uses both pools', {'begin': [[6, 2]], 'purchases': [[3, 5]], 'ending_qty': 7}, {'layers': [[6, 12], [1, 5]], 'ending_value': 17, 'cogs': 10}]], [['increment layer', {'begin': [[10, 5], [4, 6]], 'purchases': [[6, 7], [8, 12]], 'ending_qty': 17}, {'layers': [[10, 50], [4, 24], [3, 21]], 'ending_value': 95, 'cogs': 117}], ['liquidation', {'begin': [[10, 5], [4, 6]], 'purchases': [[6, 7]], 'ending_qty': 10}, {'layers': [[10, 50]], 'ending_value': 50, 'cogs': 66}], ['deep liquidation', {'begin': [[3, 2], [3, 4], [3, 6]], 'purchases': [[2, 8]], 'ending_qty': 3}, {'layers': [[3, 6]], 'ending_value': 6, 'cogs': 46}], ['over available', {'begin': [[2, 3]], 'purchases': [[3, 4]], 'ending_qty': 8}, {'error': 'invalid ending quantity'}], ['negative ending', {'begin': [[2, 3]], 'purchases': [[3, 4]], 'ending_qty': -3}, {'error': 'invalid ending quantity'}], ['count of minus one', {'begin': [[5, 3]], 'purchases': [[3, 4]], 'ending_qty': -1}, {'error': 'invalid ending quantity'}], ['all sold', {'begin': [[5, 3]], 'purchases': [[5, 4]], 'ending_qty': 0}, {'layers': [], 'ending_value': 0, 'cogs': 35}], ['exact base', {'begin': [[4, 10]], 'purchases': [[3, 11], [2, 12]], 'ending_qty': 4}, {'layers': [[4, 40]], 'ending_value': 40, 'cogs': 57}], ['uses both pools', {'begin': [[6, 2]], 'purchases': [[3, 5]], 'ending_qty': 8}, {'layers': [[6, 12], [2, 10]], 'ending_value': 22, 'cogs': 5}]], [['increment layer', {'begin': [[10, 5], [4, 6]], 'purchases': [[6, 7], [8, 13]], 'ending_qty': 18}, {'layers': [[10, 50], [4, 24], [4, 28]], 'ending_value': 102, 'cogs': 118}], ['liquidation', {'begin': [[10, 5], [4, 6]], 'purchases': [[6, 7]], 'ending_qty': 11}, {'layers': [[10, 50], [1, 6]], 'ending_value': 56, 'cogs': 60}], ['deep liquidation', {'begin': [[3, 2], [3, 4], [3, 6]], 'purchases': [[2, 8]], 'ending_qty': 4}, {'layers': [[3, 6], [1, 4]], 'ending_value': 10, 'cogs': 42}], ['over available', {'begin': [[2, 3]], 'purchases': [[3, 4]], 'ending_qty': 9}, {'error': 'invalid ending quantity'}], ['negative ending', {'begin': [[2, 3]], 'purchases': [[3, 4]], 'ending_qty': -4}, {'error': 'invalid ending quantity'}], ['count of minus one', {'begin': [[6, 3]], 'purchases': [[3, 4]], 'ending_qty': -1}, {'error': 'invalid ending quantity'}], ['all sold', {'begin': [[5, 3]], 'purchases': [[5, 4]], 'ending_qty': 0}, {'layers': [], 'ending_value': 0, 'cogs': 35}], ['exact base', {'begin': [[4, 10]], 'purchases': [[4, 11], [2, 12]], 'ending_qty': 4}, {'layers': [[4, 40]], 'ending_value': 40, 'cogs': 68}], ['uses both pools', {'begin': [[6, 2]], 'purchases': [[3, 5]], 'ending_qty': 7}, {'layers': [[6, 12], [1, 5]], 'ending_value': 17, 'cogs': 10}]], [['increment layer', {'begin': [[10, 5], [4, 6]], 'purchases': [[6, 7], [8, 14]], 'ending_qty': 19}, {'layers': [[10, 50], [4, 24], [5, 35]], 'ending_value': 109, 'cogs': 119}], ['liquidation', {'begin': [[10, 5], [4, 6]], 'purchases': [[6, 7]], 'ending_qty': 10}, {'layers': [[10, 50]], 'ending_value': 50, 'cogs': 66}], ['deep liquidation', {'begin': [[3, 2], [3, 4], [3, 6]], 'purchases': [[2, 8]], 'ending_qty': 5}, {'layers': [[3, 6], [2, 8]], 'ending_value': 14, 'cogs': 38}], ['over available', {'begin': [[2, 3]], 'purchases': [[3, 4]], 'ending_qty': 10}, {'error': 'invalid ending quantity'}], ['negative ending', {'begin': [[2, 3]], 'purchases': [[3, 4]], 'ending_qty': -5}, {'error': 'invalid ending quantity'}], ['count of minus one', {'begin': [[7, 3]], 'purchases': [[3, 4]], 'ending_qty': -1}, {'error': 'invalid ending quantity'}], ['all sold', {'begin': [[5, 3]], 'purchases': [[5, 4]], 'ending_qty': 0}, {'layers': [], 'ending_value': 0, 'cogs': 35}], ['exact base', {'begin': [[4, 10]], 'purchases': [[5, 11], [2, 12]], 'ending_qty': 4}, {'layers': [[4, 40]], 'ending_value': 40, 'cogs': 79}], ['uses both pools', {'begin': [[6, 2]], 'purchases': [[3, 5]], 'ending_qty': 8}, {'layers': [[6, 12], [2, 10]], 'ending_value': 22, 'cogs': 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
increment layer{'error': 'invalid ending quantity'}{'cogs': 94, 'ending_value': 102, 'layers': [[10, 50], [4, 24], [4, 28]]}Failed
liquidation{'cogs': 66, 'ending_value': 50, 'layers': [[10, 50]]}{'cogs': 66, 'ending_value': 50, 'layers': [[10, 50]]}Passed
deep liquidation{'cogs': 50, 'ending_value': 2, 'layers': [[1, 2]]}{'cogs': 50, 'ending_value': 2, 'layers': [[1, 2]]}Passed
over available{'error': 'invalid ending quantity'}{'error': 'invalid ending quantity'}Passed
negative ending{'error': 'invalid ending quantity'}{'error': 'invalid ending quantity'}Passed
count of minus one{'error': 'invalid ending quantity'}{'error': 'invalid ending quantity'}Passed
all sold{'cogs': 35, 'ending_value': 0, 'layers': []}{'cogs': 35, 'ending_value': 0, 'layers': []}Passed
exact base{'cogs': 35, 'ending_value': 40, 'layers': [[4, 40]]}{'cogs': 35, 'ending_value': 40, 'layers': [[4, 40]]}Passed
uses both pools{'error': 'invalid ending quantity'}{'cogs': 5, 'ending_value': 22, 'layers': [[6, 12], [2, 10]]}Failed

SHA-256 / b2e4e4626111d002b07aa78a4b102bcdbf2970c72006e29bef9b11eaad6a461e

3 / The verified repair

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

N = 1
observations = []
def solve(x):
    begin = [list(l) for l in x['begin']]
    purchases = x['purchases']
    end_q = x['ending_qty']
    base_q = sum(l[0] for l in begin)
    buy_q = sum(p[0] for p in purchases)
    avail = base_q + buy_q
    if end_q < 0 or end_q > avail:
        return {'error': 'invalid ending quantity'}
    layers = []
    if end_q >= base_q:
        layers = [[q, q * c] for q, c in begin]
        inc = end_q - base_q
        new_q = 0
        new_v = 0
        for q, c in purchases:
            if inc == 0:
                break
            take = min(inc, q)
            new_q += take
            new_v += take * c
            inc -= take
        if new_q > 0:
            layers.append([new_q, new_v])
    else:
        rem = end_q
        for bq, bc in begin:
            take = min(rem, bq)
            if take > 0:
                layers.append([take, take * bc])
            rem -= take
    begin_value = sum(q * c for q, c in begin)
    buy_value = sum(q * c for q, c in purchases)
    ending_value = sum(v for q, v in layers)
    return {'layers': layers, 'ending_value': ending_value, 'cogs': begin_value + buy_value - ending_value}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['increment layer', {'begin': [[10, 5], [4, 6]], 'purchases': [[6, 7], [8, 10]], 'ending_qty': 18}, {'layers': [[10, 50], [4, 24], [4, 28]], 'ending_value': 102, 'cogs': 94}], ['liquidation', {'begin': [[10, 5], [4, 6]], 'purchases': [[6, 7]], 'ending_qty': 10}, {'layers': [[10, 50]], 'ending_value': 50, 'cogs': 66}], ['deep liquidation', {'begin': [[3, 2], [3, 4], [3, 6]], 'purchases': [[2, 8]], 'ending_qty': 1}, {'layers': [[1, 2]], 'ending_value': 2, 'cogs': 50}], ['over available', {'begin': [[2, 3]], 'purchases': [[3, 4]], 'ending_qty': 6}, {'error': 'invalid ending quantity'}], ['negative ending', {'begin': [[2, 3]], 'purchases': [[3, 4]], 'ending_qty': -1}, {'error': 'invalid ending quantity'}], ['count of minus one', {'begin': [[3, 3]], 'purchases': [[3, 4]], 'ending_qty': -1}, {'error': 'invalid ending quantity'}], ['all sold', {'begin': [[5, 3]], 'purchases': [[5, 4]], 'ending_qty': 0}, {'layers': [], 'ending_value': 0, 'cogs': 35}], ['exact base', {'begin': [[4, 10]], 'purchases': [[1, 11], [2, 12]], 'ending_qty': 4}, {'layers': [[4, 40]], 'ending_value': 40, 'cogs': 35}], ['uses both pools', {'begin': [[6, 2]], 'purchases': [[3, 5]], 'ending_qty': 8}, {'layers': [[6, 12], [2, 10]], 'ending_value': 22, 'cogs': 5}]], [['increment layer', {'begin': [[10, 5], [4, 6]], 'purchases': [[6, 7], [8, 11]], 'ending_qty': 19}, {'layers': [[10, 50], [4, 24], [5, 35]], 'ending_value': 109, 'cogs': 95}], ['liquidation', {'begin': [[10, 5], [4, 6]], 'purchases': [[6, 7]], 'ending_qty': 11}, {'layers': [[10, 50], [1, 6]], 'ending_value': 56, 'cogs': 60}], ['deep liquidation', {'begin': [[3, 2], [3, 4], [3, 6]], 'purchases': [[2, 8]], 'ending_qty': 2}, {'layers': [[2, 4]], 'ending_value': 4, 'cogs': 48}], ['over available', {'begin': [[2, 3]], 'purchases': [[3, 4]], 'ending_qty': 7}, {'error': 'invalid ending quantity'}], ['negative ending', {'begin': [[2, 3]], 'purchases': [[3, 4]], 'ending_qty': -2}, {'error': 'invalid ending quantity'}], ['count of minus one', {'begin': [[4, 3]], 'purchases': [[3, 4]], 'ending_qty': -1}, {'error': 'invalid ending quantity'}], ['all sold', {'begin': [[5, 3]], 'purchases': [[5, 4]], 'ending_qty': 0}, {'layers': [], 'ending_value': 0, 'cogs': 35}], ['exact base', {'begin': [[4, 10]], 'purchases': [[2, 11], [2, 12]], 'ending_qty': 4}, {'layers': [[4, 40]], 'ending_value': 40, 'cogs': 46}], ['uses both pools', {'begin': [[6, 2]], 'purchases': [[3, 5]], 'ending_qty': 7}, {'layers': [[6, 12], [1, 5]], 'ending_value': 17, 'cogs': 10}]], [['increment layer', {'begin': [[10, 5], [4, 6]], 'purchases': [[6, 7], [8, 12]], 'ending_qty': 17}, {'layers': [[10, 50], [4, 24], [3, 21]], 'ending_value': 95, 'cogs': 117}], ['liquidation', {'begin': [[10, 5], [4, 6]], 'purchases': [[6, 7]], 'ending_qty': 10}, {'layers': [[10, 50]], 'ending_value': 50, 'cogs': 66}], ['deep liquidation', {'begin': [[3, 2], [3, 4], [3, 6]], 'purchases': [[2, 8]], 'ending_qty': 3}, {'layers': [[3, 6]], 'ending_value': 6, 'cogs': 46}], ['over available', {'begin': [[2, 3]], 'purchases': [[3, 4]], 'ending_qty': 8}, {'error': 'invalid ending quantity'}], ['negative ending', {'begin': [[2, 3]], 'purchases': [[3, 4]], 'ending_qty': -3}, {'error': 'invalid ending quantity'}], ['count of minus one', {'begin': [[5, 3]], 'purchases': [[3, 4]], 'ending_qty': -1}, {'error': 'invalid ending quantity'}], ['all sold', {'begin': [[5, 3]], 'purchases': [[5, 4]], 'ending_qty': 0}, {'layers': [], 'ending_value': 0, 'cogs': 35}], ['exact base', {'begin': [[4, 10]], 'purchases': [[3, 11], [2, 12]], 'ending_qty': 4}, {'layers': [[4, 40]], 'ending_value': 40, 'cogs': 57}], ['uses both pools', {'begin': [[6, 2]], 'purchases': [[3, 5]], 'ending_qty': 8}, {'layers': [[6, 12], [2, 10]], 'ending_value': 22, 'cogs': 5}]], [['increment layer', {'begin': [[10, 5], [4, 6]], 'purchases': [[6, 7], [8, 13]], 'ending_qty': 18}, {'layers': [[10, 50], [4, 24], [4, 28]], 'ending_value': 102, 'cogs': 118}], ['liquidation', {'begin': [[10, 5], [4, 6]], 'purchases': [[6, 7]], 'ending_qty': 11}, {'layers': [[10, 50], [1, 6]], 'ending_value': 56, 'cogs': 60}], ['deep liquidation', {'begin': [[3, 2], [3, 4], [3, 6]], 'purchases': [[2, 8]], 'ending_qty': 4}, {'layers': [[3, 6], [1, 4]], 'ending_value': 10, 'cogs': 42}], ['over available', {'begin': [[2, 3]], 'purchases': [[3, 4]], 'ending_qty': 9}, {'error': 'invalid ending quantity'}], ['negative ending', {'begin': [[2, 3]], 'purchases': [[3, 4]], 'ending_qty': -4}, {'error': 'invalid ending quantity'}], ['count of minus one', {'begin': [[6, 3]], 'purchases': [[3, 4]], 'ending_qty': -1}, {'error': 'invalid ending quantity'}], ['all sold', {'begin': [[5, 3]], 'purchases': [[5, 4]], 'ending_qty': 0}, {'layers': [], 'ending_value': 0, 'cogs': 35}], ['exact base', {'begin': [[4, 10]], 'purchases': [[4, 11], [2, 12]], 'ending_qty': 4}, {'layers': [[4, 40]], 'ending_value': 40, 'cogs': 68}], ['uses both pools', {'begin': [[6, 2]], 'purchases': [[3, 5]], 'ending_qty': 7}, {'layers': [[6, 12], [1, 5]], 'ending_value': 17, 'cogs': 10}]], [['increment layer', {'begin': [[10, 5], [4, 6]], 'purchases': [[6, 7], [8, 14]], 'ending_qty': 19}, {'layers': [[10, 50], [4, 24], [5, 35]], 'ending_value': 109, 'cogs': 119}], ['liquidation', {'begin': [[10, 5], [4, 6]], 'purchases': [[6, 7]], 'ending_qty': 10}, {'layers': [[10, 50]], 'ending_value': 50, 'cogs': 66}], ['deep liquidation', {'begin': [[3, 2], [3, 4], [3, 6]], 'purchases': [[2, 8]], 'ending_qty': 5}, {'layers': [[3, 6], [2, 8]], 'ending_value': 14, 'cogs': 38}], ['over available', {'begin': [[2, 3]], 'purchases': [[3, 4]], 'ending_qty': 10}, {'error': 'invalid ending quantity'}], ['negative ending', {'begin': [[2, 3]], 'purchases': [[3, 4]], 'ending_qty': -5}, {'error': 'invalid ending quantity'}], ['count of minus one', {'begin': [[7, 3]], 'purchases': [[3, 4]], 'ending_qty': -1}, {'error': 'invalid ending quantity'}], ['all sold', {'begin': [[5, 3]], 'purchases': [[5, 4]], 'ending_qty': 0}, {'layers': [], 'ending_value': 0, 'cogs': 35}], ['exact base', {'begin': [[4, 10]], 'purchases': [[5, 11], [2, 12]], 'ending_qty': 4}, {'layers': [[4, 40]], 'ending_value': 40, 'cogs': 79}], ['uses both pools', {'begin': [[6, 2]], 'purchases': [[3, 5]], 'ending_qty': 8}, {'layers': [[6, 12], [2, 10]], 'ending_value': 22, 'cogs': 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
increment layer{'cogs': 94, 'ending_value': 102, 'layers': [[10, 50], [4, 24], [4, 28]]}{'cogs': 94, 'ending_value': 102, 'layers': [[10, 50], [4, 24], [4, 28]]}Passed
liquidation{'cogs': 66, 'ending_value': 50, 'layers': [[10, 50]]}{'cogs': 66, 'ending_value': 50, 'layers': [[10, 50]]}Passed
deep liquidation{'cogs': 50, 'ending_value': 2, 'layers': [[1, 2]]}{'cogs': 50, 'ending_value': 2, 'layers': [[1, 2]]}Passed
over available{'error': 'invalid ending quantity'}{'error': 'invalid ending quantity'}Passed
negative ending{'error': 'invalid ending quantity'}{'error': 'invalid ending quantity'}Passed
count of minus one{'error': 'invalid ending quantity'}{'error': 'invalid ending quantity'}Passed
all sold{'cogs': 35, 'ending_value': 0, 'layers': []}{'cogs': 35, 'ending_value': 0, 'layers': []}Passed
exact base{'cogs': 35, 'ending_value': 40, 'layers': [[4, 40]]}{'cogs': 35, 'ending_value': 40, 'layers': [[4, 40]]}Passed
uses both pools{'cogs': 5, 'ending_value': 22, 'layers': [[6, 12], [2, 10]]}{'cogs': 5, 'ending_value': 22, 'layers': [[6, 12], [2, 10]]}Passed

SHA-256 / 753d2fa549b9c1d1aca63217f8ff7a06b4efada3172f68c9f789f2d437876e47

Verification & scope

Stipulated bounded teaching model with explicit toy rules; not an accounting-standard implementation. This reproducer isolates one failure mechanism. Results cover the supplied fixtures. Variants within a family share a test contract and should remain grouped when constructing evaluation splits. Related mechanisms with a shared evaluation_group must also remain together; these controlled models are not independent production incidents.

Observations recorded using Python 3.12.14 at 2026-09-29T14:46:40.429054+00:00.

Case digest / f8cdbe1b3b5b1e581a627090e60f5cf22f6b3aa63a5ab0ea100564b82a99c631