FAILURE MAP
← Case archive

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

Account running balance report: running balance seed · case 01

Running balances in the report start from zero.

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

ROOT CAUSE

The running balance is not seeded with the report opening.

VERIFIED REPAIR

Start the running balance at the computed report opening.

Unsuccessful approach: Seeding with the stored opening ignores activity dated before the report window.

Case contract

x = {'normal': 'D'|'C', 'opening': balance before all lines, 'lines': [[seq, day, side, amount]], 'from': day, 'to': day}. Balances are signed positive on the normal side. The report opening is the opening plus every line dated before 'from'. Lines dated from..to inclusive are listed in (day, seq) order with the running balance after each; closing is the last running balance (the report opening if none). Return {'opening', 'rows': [[seq, day, running]], 'closing'}.

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):
    sign = {'D': 1, 'C': -1} if x['normal'] == 'D' else {'D': -1, 'C': 1}
    lines = sorted(x['lines'], key=lambda l: (l[1], l[0]))
    opening = x['opening'] + sum(sign[s] * a for q, d, s, a in lines if d < x['from'])
    bal = 0
    rows = []
    for seq, date, side, amt in lines:
        if x['from'] <= date <= x['to']:
            bal += sign[side] * amt
            rows.append([seq, date, bal])
    return {'opening': opening, 'rows': rows, 'closing': bal}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: running balance seed', {'normal': 'C', 'opening': 0, 'lines': [[3, 5, 'C', 50], [6, 1, 'C', 10], [5, 10, 'C', 50], [4, 12, 'D', 300], [8, 5, 'D', 125], [2, 5, 'C', 125], [7, 12, 'D', 125], [1, 12, 'C', 50]], 'from': 6, 'to': 6}, {'opening': 60, 'rows': [], 'closing': 60}], ['control 1', {'normal': 'C', 'opening': 0, 'lines': [[1, 1, 'D', 10], [3, 12, 'D', 50], [2, 5, 'D', 300]], 'from': 1, 'to': 8}, {'opening': 0, 'rows': [[1, 1, -10], [2, 5, -310]], 'closing': -310}], ['control 2', {'normal': 'C', 'opening': 0, 'lines': [[4, 1, 'D', 125], [7, 12, 'C', 50], [6, 10, 'C', 125], [3, 5, 'D', 300], [1, 10, 'C', 50], [2, 5, 'C', 50], [5, 1, 'D', 50]], 'from': 1, 'to': 3}, {'opening': 0, 'rows': [[4, 1, -125], [5, 1, -175]], 'closing': -175}], ['control 3', {'normal': 'D', 'opening': 0, 'lines': [[5, 5, 'D', 300], [6, 12, 'C', 125], [4, 3, 'D', 300], [8, 5, 'D', 300], [3, 3, 'D', 50], [7, 1, 'C', 300], [2, 5, 'C', 125], [1, 5, 'D', 300]], 'from': 1, 'to': 3}, {'opening': 0, 'rows': [[7, 1, -300], [3, 3, -250], [4, 3, 50]], 'closing': 50}], ['control 4', {'normal': 'D', 'opening': 0, 'lines': [[1, 10, 'C', 50], [4, 5, 'D', 300], [3, 5, 'D', 300], [2, 3, 'C', 10]], 'from': 1, 'to': 8}, {'opening': 0, 'rows': [[2, 3, -10], [3, 5, 290], [4, 5, 590]], 'closing': 590}], ['control 5', {'normal': 'C', 'opening': 0, 'lines': [[4, 5, 'C', 50], [1, 5, 'D', 300], [2, 8, 'C', 125], [3, 3, 'C', 50], [5, 3, 'C', 125]], 'from': 1, 'to': 1}, {'opening': 0, 'rows': [], 'closing': 0}], ['control 6', {'normal': 'C', 'opening': 0, 'lines': [[2, 5, 'D', 125], [5, 3, 'C', 125], [6, 12, 'D', 125], [4, 8, 'C', 300], [3, 8, 'C', 10], [1, 3, 'C', 300]], 'from': 3, 'to': 8}, {'opening': 0, 'rows': [[1, 3, 300], [5, 3, 425], [2, 5, 300], [3, 8, 310], [4, 8, 610]], 'closing': 610}]], [['regression: running balance seed', {'normal': 'C', 'opening': 250, 'lines': [[4, 8, 'C', 50], [1, 10, 'C', 50], [2, 12, 'D', 125], [6, 10, 'D', 125], [5, 5, 'D', 10], [3, 12, 'D', 50]], 'from': 3, 'to': 8}, {'opening': 250, 'rows': [[5, 5, 240], [4, 8, 290]], 'closing': 290}], ['regression: running balance seed, partial-repair probe', {'normal': 'D', 'opening': 1000, 'lines': [[2, 5, 'C', 300], [3, 3, 'D', 125], [4, 8, 'C', 50], [1, 5, 'C', 125], [5, 3, 'C', 300]], 'from': 5, 'to': 10}, {'opening': 825, 'rows': [[1, 5, 700], [2, 5, 400], [4, 8, 350]], 'closing': 350}], ['control 1', {'normal': 'D', 'opening': 0, 'lines': [[2, 12, 'D', 300], [5, 8, 'C', 50], [6, 12, 'C', 125], [3, 3, 'D', 10], [4, 5, 'C', 10], [1, 5, 'D', 10], [7, 8, 'C', 10]], 'from': 3, 'to': 3}, {'opening': 0, 'rows': [[3, 3, 10]], 'closing': 10}], ['control 2', {'normal': 'C', 'opening': 0, 'lines': [[6, 8, 'C', 50], [4, 12, 'C', 125], [3, 10, 'D', 300], [1, 10, 'C', 300], [5, 12, 'D', 50], [2, 8, 'C', 50]], 'from': 1, 'to': 8}, {'opening': 0, 'rows': [[2, 8, 50], [6, 8, 100]], 'closing': 100}], ['control 3', {'normal': 'C', 'opening': 0, 'lines': [[2, 1, 'C', 50], [3, 1, 'C', 10], [1, 12, 'D', 50]], 'from': 1, 'to': 1}, {'opening': 0, 'rows': [[2, 1, 50], [3, 1, 60]], 'closing': 60}], ['control 4', {'normal': 'C', 'opening': 0, 'lines': [[3, 8, 'C', 125], [1, 5, 'D', 300], [2, 10, 'C', 300]], 'from': 5, 'to': 5}, {'opening': 0, 'rows': [[1, 5, -300]], 'closing': -300}], ['control 5', {'normal': 'D', 'opening': 0, 'lines': [[1, 5, 'D', 300], [5, 5, 'D', 125], [3, 3, 'D', 50], [4, 12, 'C', 50], [2, 5, 'D', 300], [6, 5, 'D', 125]], 'from': 1, 'to': 3}, {'opening': 0, 'rows': [[3, 3, 50]], 'closing': 50}]], [['regression: running balance seed', {'normal': 'C', 'opening': 250, 'lines': [[2, 12, 'C', 50], [1, 8, 'C', 125], [3, 5, 'D', 125]], 'from': 5, 'to': 7}, {'opening': 250, 'rows': [[3, 5, 125]], 'closing': 125}], ['regression: running balance seed, partial-repair probe', {'normal': 'C', 'opening': 0, 'lines': [[3, 1, 'D', 10], [2, 5, 'D', 125], [1, 1, 'D', 10], [5, 5, 'D', 300], [4, 3, 'C', 125]], 'from': 3, 'to': 8}, {'opening': -20, 'rows': [[4, 3, 105], [2, 5, -20], [5, 5, -320]], 'closing': -320}], ['control 1', {'normal': 'C', 'opening': 0, 'lines': [[1, 8, 'D', 125], [3, 10, 'C', 300], [2, 3, 'C', 300]], 'from': 3, 'to': 5}, {'opening': 0, 'rows': [[2, 3, 300]], 'closing': 300}], ['control 2', {'normal': 'C', 'opening': 0, 'lines': [[3, 3, 'D', 300], [2, 8, 'C', 300], [1, 5, 'C', 50]], 'from': 3, 'to': 10}, {'opening': 0, 'rows': [[3, 3, -300], [1, 5, -250], [2, 8, 50]], 'closing': 50}], ['control 3', {'normal': 'D', 'opening': 0, 'lines': [[4, 8, 'D', 50], [1, 10, 'C', 50], [5, 3, 'C', 300], [2, 8, 'D', 10], [3, 10, 'C', 300], [6, 8, 'D', 125]], 'from': 3, 'to': 8}, {'opening': 0, 'rows': [[5, 3, -300], [2, 8, -290], [4, 8, -240], [6, 8, -115]], 'closing': -115}], ['control 4', {'normal': 'D', 'opening': 0, 'lines': [[2, 3, 'D', 50], [3, 12, 'D', 300], [1, 3, 'C', 50]], 'from': 6, 'to': 11}, {'opening': 0, 'rows': [], 'closing': 0}], ['control 5', {'normal': 'D', 'opening': 0, 'lines': [[2, 3, 'C', 300], [1, 5, 'D', 10], [3, 5, 'D', 125]], 'from': 1, 'to': 6}, {'opening': 0, 'rows': [[2, 3, -300], [1, 5, -290], [3, 5, -165]], 'closing': -165}]], [['regression: running balance seed', {'normal': 'C', 'opening': 250, 'lines': [[2, 3, 'D', 10], [3, 5, 'D', 50], [4, 8, 'D', 10], [1, 5, 'D', 300]], 'from': 6, 'to': 6}, {'opening': -110, 'rows': [], 'closing': -110}], ['control 1', {'normal': 'C', 'opening': 0, 'lines': [[1, 5, 'D', 300], [4, 8, 'C', 300], [3, 12, 'C', 50], [2, 10, 'C', 125]], 'from': 1, 'to': 6}, {'opening': 0, 'rows': [[1, 5, -300]], 'closing': -300}], ['control 2', {'normal': 'D', 'opening': 0, 'lines': [[1, 8, 'D', 50], [2, 12, 'C', 50], [4, 1, 'D', 50], [5, 1, 'C', 50], [3, 10, 'D', 125]], 'from': 6, 'to': 8}, {'opening': 0, 'rows': [[1, 8, 50]], 'closing': 50}], ['control 3', {'normal': 'C', 'opening': 0, 'lines': [[3, 5, 'C', 300], [1, 12, 'D', 125], [2, 8, 'C', 300]], 'from': 5, 'to': 10}, {'opening': 0, 'rows': [[3, 5, 300], [2, 8, 600]], 'closing': 600}], ['control 4', {'normal': 'C', 'opening': 0, 'lines': [[2, 5, 'C', 10], [3, 5, 'D', 50], [1, 3, 'C', 125]], 'from': 3, 'to': 5}, {'opening': 0, 'rows': [[1, 3, 125], [2, 5, 135], [3, 5, 85]], 'closing': 85}], ['control 5', {'normal': 'D', 'opening': 0, 'lines': [[4, 1, 'D', 300], [3, 5, 'D', 50], [2, 12, 'D', 300], [5, 5, 'C', 300], [7, 5, 'C', 10], [6, 8, 'C', 125], [8, 1, 'C', 300], [1, 1, 'D', 300]], 'from': 1, 'to': 8}, {'opening': 0, 'rows': [[1, 1, 300], [4, 1, 600], [8, 1, 300], [3, 5, 350], [5, 5, 50], [7, 5, 40], [6, 8, -85]], 'closing': -85}], ['control 6', {'normal': 'D', 'opening': 0, 'lines': [[3, 12, 'C', 125], [2, 5, 'D', 125], [1, 10, 'D', 50]], 'from': 5, 'to': 7}, {'opening': 0, 'rows': [[2, 5, 125]], 'closing': 125}]], [['regression: running balance seed', {'normal': 'C', 'opening': 250, 'lines': [[3, 5, 'C', 300], [5, 5, 'C', 50], [4, 5, 'C', 300], [2, 10, 'D', 300], [1, 12, 'D', 300]], 'from': 5, 'to': 5}, {'opening': 250, 'rows': [[3, 5, 550], [4, 5, 850], [5, 5, 900]], 'closing': 900}], ['regression: running balance seed, partial-repair probe', {'normal': 'C', 'opening': 0, 'lines': [[3, 8, 'C', 300], [1, 1, 'C', 10], [2, 12, 'C', 125]], 'from': 3, 'to': 3}, {'opening': 10, 'rows': [], 'closing': 10}], ['control 1', {'normal': 'D', 'opening': 0, 'lines': [[3, 10, 'C', 300], [1, 12, 'C', 125], [2, 12, 'C', 300]], 'from': 6, 'to': 11}, {'opening': 0, 'rows': [[3, 10, -300]], 'closing': -300}], ['control 2', {'normal': 'D', 'opening': 0, 'lines': [[5, 10, 'C', 300], [2, 3, 'C', 300], [1, 3, 'C', 125], [4, 5, 'C', 50], [3, 5, 'C', 300]], 'from': 1, 'to': 3}, {'opening': 0, 'rows': [[1, 3, -125], [2, 3, -425]], 'closing': -425}], ['control 3', {'normal': 'C', 'opening': 0, 'lines': [[5, 1, 'C', 300], [2, 8, 'D', 300], [4, 5, 'C', 10], [3, 1, 'D', 10], [7, 5, 'D', 300], [6, 10, 'C', 125], [8, 5, 'D', 300], [1, 5, 'C', 125]], 'from': 1, 'to': 1}, {'opening': 0, 'rows': [[3, 1, -10], [5, 1, 290]], 'closing': 290}], ['control 4', {'normal': 'C', 'opening': 0, 'lines': [[5, 3, 'D', 50], [1, 3, 'C', 50], [6, 1, 'D', 50], [4, 10, 'C', 10], [2, 5, 'C', 50], [7, 10, 'D', 10], [3, 8, 'C', 125]], 'from': 6, 'to': 6}, {'opening': 0, 'rows': [], 'closing': 0}], ['control 5', {'normal': 'D', 'opening': 0, 'lines': [[1, 5, 'C', 10], [7, 12, 'D', 50], [3, 8, 'D', 300], [5, 5, 'D', 300], [2, 10, 'D', 125], [4, 10, 'C', 50], [6, 12, 'D', 10]], 'from': 5, 'to': 5}, {'opening': 0, 'rows': [[1, 5, -10], [5, 5, 290]], 'closing': 290}]]]
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: running balance seed{'closing': 0, 'opening': 60, 'rows': []}{'closing': 60, 'opening': 60, 'rows': []}Failed
control 1{'closing': -310, 'opening': 0, 'rows': [[1, 1, -10], [2, 5, -310]]}{'closing': -310, 'opening': 0, 'rows': [[1, 1, -10], [2, 5, -310]]}Passed
control 2{'closing': -175, 'opening': 0, 'rows': [[4, 1, -125], [5, 1, -175]]}{'closing': -175, 'opening': 0, 'rows': [[4, 1, -125], [5, 1, -175]]}Passed
control 3{'closing': 50, 'opening': 0, 'rows': [[7, 1, -300], [3, 3, -250], [4, 3, 50]]}{'closing': 50, 'opening': 0, 'rows': [[7, 1, -300], [3, 3, -250], [4, 3, 50]]}Passed
control 4{'closing': 590, 'opening': 0, 'rows': [[2, 3, -10], [3, 5, 290], [4, 5, 590]]}{'closing': 590, 'opening': 0, 'rows': [[2, 3, -10], [3, 5, 290], [4, 5, 590]]}Passed
control 5{'closing': 0, 'opening': 0, 'rows': []}{'closing': 0, 'opening': 0, 'rows': []}Passed
control 6{'closing': 610, 'opening': 0, 'rows': [[1, 3, 300], [5, 3, 425], [2, 5, 300], [3, 8, 310], [4, 8, 610]]}{'closing': 610, 'opening': 0, 'rows': [[1, 3, 300], [5, 3, 425], [2, 5, 300], [3, 8, 310], [4, 8, 610]]}Passed

SHA-256 / b5fb713b89c7222985c4839b8deccb75b7624d94ce0c042db4effdc6e2472149

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(x):
    sign = {'D': 1, 'C': -1} if x['normal'] == 'D' else {'D': -1, 'C': 1}
    lines = sorted(x['lines'], key=lambda l: (l[1], l[0]))
    opening = x['opening'] + sum(sign[s] * a for q, d, s, a in lines if d < x['from'])
    bal = x['opening']
    rows = []
    for seq, date, side, amt in lines:
        if x['from'] <= date <= x['to']:
            bal += sign[side] * amt
            rows.append([seq, date, bal])
    return {'opening': opening, 'rows': rows, 'closing': bal}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: running balance seed', {'normal': 'C', 'opening': 0, 'lines': [[3, 5, 'C', 50], [6, 1, 'C', 10], [5, 10, 'C', 50], [4, 12, 'D', 300], [8, 5, 'D', 125], [2, 5, 'C', 125], [7, 12, 'D', 125], [1, 12, 'C', 50]], 'from': 6, 'to': 6}, {'opening': 60, 'rows': [], 'closing': 60}], ['control 1', {'normal': 'C', 'opening': 0, 'lines': [[1, 1, 'D', 10], [3, 12, 'D', 50], [2, 5, 'D', 300]], 'from': 1, 'to': 8}, {'opening': 0, 'rows': [[1, 1, -10], [2, 5, -310]], 'closing': -310}], ['control 2', {'normal': 'C', 'opening': 0, 'lines': [[4, 1, 'D', 125], [7, 12, 'C', 50], [6, 10, 'C', 125], [3, 5, 'D', 300], [1, 10, 'C', 50], [2, 5, 'C', 50], [5, 1, 'D', 50]], 'from': 1, 'to': 3}, {'opening': 0, 'rows': [[4, 1, -125], [5, 1, -175]], 'closing': -175}], ['control 3', {'normal': 'D', 'opening': 0, 'lines': [[5, 5, 'D', 300], [6, 12, 'C', 125], [4, 3, 'D', 300], [8, 5, 'D', 300], [3, 3, 'D', 50], [7, 1, 'C', 300], [2, 5, 'C', 125], [1, 5, 'D', 300]], 'from': 1, 'to': 3}, {'opening': 0, 'rows': [[7, 1, -300], [3, 3, -250], [4, 3, 50]], 'closing': 50}], ['control 4', {'normal': 'D', 'opening': 0, 'lines': [[1, 10, 'C', 50], [4, 5, 'D', 300], [3, 5, 'D', 300], [2, 3, 'C', 10]], 'from': 1, 'to': 8}, {'opening': 0, 'rows': [[2, 3, -10], [3, 5, 290], [4, 5, 590]], 'closing': 590}], ['control 5', {'normal': 'C', 'opening': 0, 'lines': [[4, 5, 'C', 50], [1, 5, 'D', 300], [2, 8, 'C', 125], [3, 3, 'C', 50], [5, 3, 'C', 125]], 'from': 1, 'to': 1}, {'opening': 0, 'rows': [], 'closing': 0}], ['control 6', {'normal': 'C', 'opening': 0, 'lines': [[2, 5, 'D', 125], [5, 3, 'C', 125], [6, 12, 'D', 125], [4, 8, 'C', 300], [3, 8, 'C', 10], [1, 3, 'C', 300]], 'from': 3, 'to': 8}, {'opening': 0, 'rows': [[1, 3, 300], [5, 3, 425], [2, 5, 300], [3, 8, 310], [4, 8, 610]], 'closing': 610}]], [['regression: running balance seed', {'normal': 'C', 'opening': 250, 'lines': [[4, 8, 'C', 50], [1, 10, 'C', 50], [2, 12, 'D', 125], [6, 10, 'D', 125], [5, 5, 'D', 10], [3, 12, 'D', 50]], 'from': 3, 'to': 8}, {'opening': 250, 'rows': [[5, 5, 240], [4, 8, 290]], 'closing': 290}], ['regression: running balance seed, partial-repair probe', {'normal': 'D', 'opening': 1000, 'lines': [[2, 5, 'C', 300], [3, 3, 'D', 125], [4, 8, 'C', 50], [1, 5, 'C', 125], [5, 3, 'C', 300]], 'from': 5, 'to': 10}, {'opening': 825, 'rows': [[1, 5, 700], [2, 5, 400], [4, 8, 350]], 'closing': 350}], ['control 1', {'normal': 'D', 'opening': 0, 'lines': [[2, 12, 'D', 300], [5, 8, 'C', 50], [6, 12, 'C', 125], [3, 3, 'D', 10], [4, 5, 'C', 10], [1, 5, 'D', 10], [7, 8, 'C', 10]], 'from': 3, 'to': 3}, {'opening': 0, 'rows': [[3, 3, 10]], 'closing': 10}], ['control 2', {'normal': 'C', 'opening': 0, 'lines': [[6, 8, 'C', 50], [4, 12, 'C', 125], [3, 10, 'D', 300], [1, 10, 'C', 300], [5, 12, 'D', 50], [2, 8, 'C', 50]], 'from': 1, 'to': 8}, {'opening': 0, 'rows': [[2, 8, 50], [6, 8, 100]], 'closing': 100}], ['control 3', {'normal': 'C', 'opening': 0, 'lines': [[2, 1, 'C', 50], [3, 1, 'C', 10], [1, 12, 'D', 50]], 'from': 1, 'to': 1}, {'opening': 0, 'rows': [[2, 1, 50], [3, 1, 60]], 'closing': 60}], ['control 4', {'normal': 'C', 'opening': 0, 'lines': [[3, 8, 'C', 125], [1, 5, 'D', 300], [2, 10, 'C', 300]], 'from': 5, 'to': 5}, {'opening': 0, 'rows': [[1, 5, -300]], 'closing': -300}], ['control 5', {'normal': 'D', 'opening': 0, 'lines': [[1, 5, 'D', 300], [5, 5, 'D', 125], [3, 3, 'D', 50], [4, 12, 'C', 50], [2, 5, 'D', 300], [6, 5, 'D', 125]], 'from': 1, 'to': 3}, {'opening': 0, 'rows': [[3, 3, 50]], 'closing': 50}]], [['regression: running balance seed', {'normal': 'C', 'opening': 250, 'lines': [[2, 12, 'C', 50], [1, 8, 'C', 125], [3, 5, 'D', 125]], 'from': 5, 'to': 7}, {'opening': 250, 'rows': [[3, 5, 125]], 'closing': 125}], ['regression: running balance seed, partial-repair probe', {'normal': 'C', 'opening': 0, 'lines': [[3, 1, 'D', 10], [2, 5, 'D', 125], [1, 1, 'D', 10], [5, 5, 'D', 300], [4, 3, 'C', 125]], 'from': 3, 'to': 8}, {'opening': -20, 'rows': [[4, 3, 105], [2, 5, -20], [5, 5, -320]], 'closing': -320}], ['control 1', {'normal': 'C', 'opening': 0, 'lines': [[1, 8, 'D', 125], [3, 10, 'C', 300], [2, 3, 'C', 300]], 'from': 3, 'to': 5}, {'opening': 0, 'rows': [[2, 3, 300]], 'closing': 300}], ['control 2', {'normal': 'C', 'opening': 0, 'lines': [[3, 3, 'D', 300], [2, 8, 'C', 300], [1, 5, 'C', 50]], 'from': 3, 'to': 10}, {'opening': 0, 'rows': [[3, 3, -300], [1, 5, -250], [2, 8, 50]], 'closing': 50}], ['control 3', {'normal': 'D', 'opening': 0, 'lines': [[4, 8, 'D', 50], [1, 10, 'C', 50], [5, 3, 'C', 300], [2, 8, 'D', 10], [3, 10, 'C', 300], [6, 8, 'D', 125]], 'from': 3, 'to': 8}, {'opening': 0, 'rows': [[5, 3, -300], [2, 8, -290], [4, 8, -240], [6, 8, -115]], 'closing': -115}], ['control 4', {'normal': 'D', 'opening': 0, 'lines': [[2, 3, 'D', 50], [3, 12, 'D', 300], [1, 3, 'C', 50]], 'from': 6, 'to': 11}, {'opening': 0, 'rows': [], 'closing': 0}], ['control 5', {'normal': 'D', 'opening': 0, 'lines': [[2, 3, 'C', 300], [1, 5, 'D', 10], [3, 5, 'D', 125]], 'from': 1, 'to': 6}, {'opening': 0, 'rows': [[2, 3, -300], [1, 5, -290], [3, 5, -165]], 'closing': -165}]], [['regression: running balance seed', {'normal': 'C', 'opening': 250, 'lines': [[2, 3, 'D', 10], [3, 5, 'D', 50], [4, 8, 'D', 10], [1, 5, 'D', 300]], 'from': 6, 'to': 6}, {'opening': -110, 'rows': [], 'closing': -110}], ['control 1', {'normal': 'C', 'opening': 0, 'lines': [[1, 5, 'D', 300], [4, 8, 'C', 300], [3, 12, 'C', 50], [2, 10, 'C', 125]], 'from': 1, 'to': 6}, {'opening': 0, 'rows': [[1, 5, -300]], 'closing': -300}], ['control 2', {'normal': 'D', 'opening': 0, 'lines': [[1, 8, 'D', 50], [2, 12, 'C', 50], [4, 1, 'D', 50], [5, 1, 'C', 50], [3, 10, 'D', 125]], 'from': 6, 'to': 8}, {'opening': 0, 'rows': [[1, 8, 50]], 'closing': 50}], ['control 3', {'normal': 'C', 'opening': 0, 'lines': [[3, 5, 'C', 300], [1, 12, 'D', 125], [2, 8, 'C', 300]], 'from': 5, 'to': 10}, {'opening': 0, 'rows': [[3, 5, 300], [2, 8, 600]], 'closing': 600}], ['control 4', {'normal': 'C', 'opening': 0, 'lines': [[2, 5, 'C', 10], [3, 5, 'D', 50], [1, 3, 'C', 125]], 'from': 3, 'to': 5}, {'opening': 0, 'rows': [[1, 3, 125], [2, 5, 135], [3, 5, 85]], 'closing': 85}], ['control 5', {'normal': 'D', 'opening': 0, 'lines': [[4, 1, 'D', 300], [3, 5, 'D', 50], [2, 12, 'D', 300], [5, 5, 'C', 300], [7, 5, 'C', 10], [6, 8, 'C', 125], [8, 1, 'C', 300], [1, 1, 'D', 300]], 'from': 1, 'to': 8}, {'opening': 0, 'rows': [[1, 1, 300], [4, 1, 600], [8, 1, 300], [3, 5, 350], [5, 5, 50], [7, 5, 40], [6, 8, -85]], 'closing': -85}], ['control 6', {'normal': 'D', 'opening': 0, 'lines': [[3, 12, 'C', 125], [2, 5, 'D', 125], [1, 10, 'D', 50]], 'from': 5, 'to': 7}, {'opening': 0, 'rows': [[2, 5, 125]], 'closing': 125}]], [['regression: running balance seed', {'normal': 'C', 'opening': 250, 'lines': [[3, 5, 'C', 300], [5, 5, 'C', 50], [4, 5, 'C', 300], [2, 10, 'D', 300], [1, 12, 'D', 300]], 'from': 5, 'to': 5}, {'opening': 250, 'rows': [[3, 5, 550], [4, 5, 850], [5, 5, 900]], 'closing': 900}], ['regression: running balance seed, partial-repair probe', {'normal': 'C', 'opening': 0, 'lines': [[3, 8, 'C', 300], [1, 1, 'C', 10], [2, 12, 'C', 125]], 'from': 3, 'to': 3}, {'opening': 10, 'rows': [], 'closing': 10}], ['control 1', {'normal': 'D', 'opening': 0, 'lines': [[3, 10, 'C', 300], [1, 12, 'C', 125], [2, 12, 'C', 300]], 'from': 6, 'to': 11}, {'opening': 0, 'rows': [[3, 10, -300]], 'closing': -300}], ['control 2', {'normal': 'D', 'opening': 0, 'lines': [[5, 10, 'C', 300], [2, 3, 'C', 300], [1, 3, 'C', 125], [4, 5, 'C', 50], [3, 5, 'C', 300]], 'from': 1, 'to': 3}, {'opening': 0, 'rows': [[1, 3, -125], [2, 3, -425]], 'closing': -425}], ['control 3', {'normal': 'C', 'opening': 0, 'lines': [[5, 1, 'C', 300], [2, 8, 'D', 300], [4, 5, 'C', 10], [3, 1, 'D', 10], [7, 5, 'D', 300], [6, 10, 'C', 125], [8, 5, 'D', 300], [1, 5, 'C', 125]], 'from': 1, 'to': 1}, {'opening': 0, 'rows': [[3, 1, -10], [5, 1, 290]], 'closing': 290}], ['control 4', {'normal': 'C', 'opening': 0, 'lines': [[5, 3, 'D', 50], [1, 3, 'C', 50], [6, 1, 'D', 50], [4, 10, 'C', 10], [2, 5, 'C', 50], [7, 10, 'D', 10], [3, 8, 'C', 125]], 'from': 6, 'to': 6}, {'opening': 0, 'rows': [], 'closing': 0}], ['control 5', {'normal': 'D', 'opening': 0, 'lines': [[1, 5, 'C', 10], [7, 12, 'D', 50], [3, 8, 'D', 300], [5, 5, 'D', 300], [2, 10, 'D', 125], [4, 10, 'C', 50], [6, 12, 'D', 10]], 'from': 5, 'to': 5}, {'opening': 0, 'rows': [[1, 5, -10], [5, 5, 290]], 'closing': 290}]]]
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: running balance seed{'closing': 0, 'opening': 60, 'rows': []}{'closing': 60, 'opening': 60, 'rows': []}Failed
control 1{'closing': -310, 'opening': 0, 'rows': [[1, 1, -10], [2, 5, -310]]}{'closing': -310, 'opening': 0, 'rows': [[1, 1, -10], [2, 5, -310]]}Passed
control 2{'closing': -175, 'opening': 0, 'rows': [[4, 1, -125], [5, 1, -175]]}{'closing': -175, 'opening': 0, 'rows': [[4, 1, -125], [5, 1, -175]]}Passed
control 3{'closing': 50, 'opening': 0, 'rows': [[7, 1, -300], [3, 3, -250], [4, 3, 50]]}{'closing': 50, 'opening': 0, 'rows': [[7, 1, -300], [3, 3, -250], [4, 3, 50]]}Passed
control 4{'closing': 590, 'opening': 0, 'rows': [[2, 3, -10], [3, 5, 290], [4, 5, 590]]}{'closing': 590, 'opening': 0, 'rows': [[2, 3, -10], [3, 5, 290], [4, 5, 590]]}Passed
control 5{'closing': 0, 'opening': 0, 'rows': []}{'closing': 0, 'opening': 0, 'rows': []}Passed
control 6{'closing': 610, 'opening': 0, 'rows': [[1, 3, 300], [5, 3, 425], [2, 5, 300], [3, 8, 310], [4, 8, 610]]}{'closing': 610, 'opening': 0, 'rows': [[1, 3, 300], [5, 3, 425], [2, 5, 300], [3, 8, 310], [4, 8, 610]]}Passed

SHA-256 / 1bbb0873e9682fe6baf276451bd569d7844a8cb5fe385e4de1190b7dff25845a

3 / The verified repair

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

N = 1
observations = []
def solve(x):
    sign = {'D': 1, 'C': -1} if x['normal'] == 'D' else {'D': -1, 'C': 1}
    lines = sorted(x['lines'], key=lambda l: (l[1], l[0]))
    opening = x['opening'] + sum(sign[s] * a for q, d, s, a in lines if d < x['from'])
    bal = opening
    rows = []
    for seq, date, side, amt in lines:
        if x['from'] <= date <= x['to']:
            bal += sign[side] * amt
            rows.append([seq, date, bal])
    return {'opening': opening, 'rows': rows, 'closing': bal}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: running balance seed', {'normal': 'C', 'opening': 0, 'lines': [[3, 5, 'C', 50], [6, 1, 'C', 10], [5, 10, 'C', 50], [4, 12, 'D', 300], [8, 5, 'D', 125], [2, 5, 'C', 125], [7, 12, 'D', 125], [1, 12, 'C', 50]], 'from': 6, 'to': 6}, {'opening': 60, 'rows': [], 'closing': 60}], ['control 1', {'normal': 'C', 'opening': 0, 'lines': [[1, 1, 'D', 10], [3, 12, 'D', 50], [2, 5, 'D', 300]], 'from': 1, 'to': 8}, {'opening': 0, 'rows': [[1, 1, -10], [2, 5, -310]], 'closing': -310}], ['control 2', {'normal': 'C', 'opening': 0, 'lines': [[4, 1, 'D', 125], [7, 12, 'C', 50], [6, 10, 'C', 125], [3, 5, 'D', 300], [1, 10, 'C', 50], [2, 5, 'C', 50], [5, 1, 'D', 50]], 'from': 1, 'to': 3}, {'opening': 0, 'rows': [[4, 1, -125], [5, 1, -175]], 'closing': -175}], ['control 3', {'normal': 'D', 'opening': 0, 'lines': [[5, 5, 'D', 300], [6, 12, 'C', 125], [4, 3, 'D', 300], [8, 5, 'D', 300], [3, 3, 'D', 50], [7, 1, 'C', 300], [2, 5, 'C', 125], [1, 5, 'D', 300]], 'from': 1, 'to': 3}, {'opening': 0, 'rows': [[7, 1, -300], [3, 3, -250], [4, 3, 50]], 'closing': 50}], ['control 4', {'normal': 'D', 'opening': 0, 'lines': [[1, 10, 'C', 50], [4, 5, 'D', 300], [3, 5, 'D', 300], [2, 3, 'C', 10]], 'from': 1, 'to': 8}, {'opening': 0, 'rows': [[2, 3, -10], [3, 5, 290], [4, 5, 590]], 'closing': 590}], ['control 5', {'normal': 'C', 'opening': 0, 'lines': [[4, 5, 'C', 50], [1, 5, 'D', 300], [2, 8, 'C', 125], [3, 3, 'C', 50], [5, 3, 'C', 125]], 'from': 1, 'to': 1}, {'opening': 0, 'rows': [], 'closing': 0}], ['control 6', {'normal': 'C', 'opening': 0, 'lines': [[2, 5, 'D', 125], [5, 3, 'C', 125], [6, 12, 'D', 125], [4, 8, 'C', 300], [3, 8, 'C', 10], [1, 3, 'C', 300]], 'from': 3, 'to': 8}, {'opening': 0, 'rows': [[1, 3, 300], [5, 3, 425], [2, 5, 300], [3, 8, 310], [4, 8, 610]], 'closing': 610}]], [['regression: running balance seed', {'normal': 'C', 'opening': 250, 'lines': [[4, 8, 'C', 50], [1, 10, 'C', 50], [2, 12, 'D', 125], [6, 10, 'D', 125], [5, 5, 'D', 10], [3, 12, 'D', 50]], 'from': 3, 'to': 8}, {'opening': 250, 'rows': [[5, 5, 240], [4, 8, 290]], 'closing': 290}], ['regression: running balance seed, partial-repair probe', {'normal': 'D', 'opening': 1000, 'lines': [[2, 5, 'C', 300], [3, 3, 'D', 125], [4, 8, 'C', 50], [1, 5, 'C', 125], [5, 3, 'C', 300]], 'from': 5, 'to': 10}, {'opening': 825, 'rows': [[1, 5, 700], [2, 5, 400], [4, 8, 350]], 'closing': 350}], ['control 1', {'normal': 'D', 'opening': 0, 'lines': [[2, 12, 'D', 300], [5, 8, 'C', 50], [6, 12, 'C', 125], [3, 3, 'D', 10], [4, 5, 'C', 10], [1, 5, 'D', 10], [7, 8, 'C', 10]], 'from': 3, 'to': 3}, {'opening': 0, 'rows': [[3, 3, 10]], 'closing': 10}], ['control 2', {'normal': 'C', 'opening': 0, 'lines': [[6, 8, 'C', 50], [4, 12, 'C', 125], [3, 10, 'D', 300], [1, 10, 'C', 300], [5, 12, 'D', 50], [2, 8, 'C', 50]], 'from': 1, 'to': 8}, {'opening': 0, 'rows': [[2, 8, 50], [6, 8, 100]], 'closing': 100}], ['control 3', {'normal': 'C', 'opening': 0, 'lines': [[2, 1, 'C', 50], [3, 1, 'C', 10], [1, 12, 'D', 50]], 'from': 1, 'to': 1}, {'opening': 0, 'rows': [[2, 1, 50], [3, 1, 60]], 'closing': 60}], ['control 4', {'normal': 'C', 'opening': 0, 'lines': [[3, 8, 'C', 125], [1, 5, 'D', 300], [2, 10, 'C', 300]], 'from': 5, 'to': 5}, {'opening': 0, 'rows': [[1, 5, -300]], 'closing': -300}], ['control 5', {'normal': 'D', 'opening': 0, 'lines': [[1, 5, 'D', 300], [5, 5, 'D', 125], [3, 3, 'D', 50], [4, 12, 'C', 50], [2, 5, 'D', 300], [6, 5, 'D', 125]], 'from': 1, 'to': 3}, {'opening': 0, 'rows': [[3, 3, 50]], 'closing': 50}]], [['regression: running balance seed', {'normal': 'C', 'opening': 250, 'lines': [[2, 12, 'C', 50], [1, 8, 'C', 125], [3, 5, 'D', 125]], 'from': 5, 'to': 7}, {'opening': 250, 'rows': [[3, 5, 125]], 'closing': 125}], ['regression: running balance seed, partial-repair probe', {'normal': 'C', 'opening': 0, 'lines': [[3, 1, 'D', 10], [2, 5, 'D', 125], [1, 1, 'D', 10], [5, 5, 'D', 300], [4, 3, 'C', 125]], 'from': 3, 'to': 8}, {'opening': -20, 'rows': [[4, 3, 105], [2, 5, -20], [5, 5, -320]], 'closing': -320}], ['control 1', {'normal': 'C', 'opening': 0, 'lines': [[1, 8, 'D', 125], [3, 10, 'C', 300], [2, 3, 'C', 300]], 'from': 3, 'to': 5}, {'opening': 0, 'rows': [[2, 3, 300]], 'closing': 300}], ['control 2', {'normal': 'C', 'opening': 0, 'lines': [[3, 3, 'D', 300], [2, 8, 'C', 300], [1, 5, 'C', 50]], 'from': 3, 'to': 10}, {'opening': 0, 'rows': [[3, 3, -300], [1, 5, -250], [2, 8, 50]], 'closing': 50}], ['control 3', {'normal': 'D', 'opening': 0, 'lines': [[4, 8, 'D', 50], [1, 10, 'C', 50], [5, 3, 'C', 300], [2, 8, 'D', 10], [3, 10, 'C', 300], [6, 8, 'D', 125]], 'from': 3, 'to': 8}, {'opening': 0, 'rows': [[5, 3, -300], [2, 8, -290], [4, 8, -240], [6, 8, -115]], 'closing': -115}], ['control 4', {'normal': 'D', 'opening': 0, 'lines': [[2, 3, 'D', 50], [3, 12, 'D', 300], [1, 3, 'C', 50]], 'from': 6, 'to': 11}, {'opening': 0, 'rows': [], 'closing': 0}], ['control 5', {'normal': 'D', 'opening': 0, 'lines': [[2, 3, 'C', 300], [1, 5, 'D', 10], [3, 5, 'D', 125]], 'from': 1, 'to': 6}, {'opening': 0, 'rows': [[2, 3, -300], [1, 5, -290], [3, 5, -165]], 'closing': -165}]], [['regression: running balance seed', {'normal': 'C', 'opening': 250, 'lines': [[2, 3, 'D', 10], [3, 5, 'D', 50], [4, 8, 'D', 10], [1, 5, 'D', 300]], 'from': 6, 'to': 6}, {'opening': -110, 'rows': [], 'closing': -110}], ['control 1', {'normal': 'C', 'opening': 0, 'lines': [[1, 5, 'D', 300], [4, 8, 'C', 300], [3, 12, 'C', 50], [2, 10, 'C', 125]], 'from': 1, 'to': 6}, {'opening': 0, 'rows': [[1, 5, -300]], 'closing': -300}], ['control 2', {'normal': 'D', 'opening': 0, 'lines': [[1, 8, 'D', 50], [2, 12, 'C', 50], [4, 1, 'D', 50], [5, 1, 'C', 50], [3, 10, 'D', 125]], 'from': 6, 'to': 8}, {'opening': 0, 'rows': [[1, 8, 50]], 'closing': 50}], ['control 3', {'normal': 'C', 'opening': 0, 'lines': [[3, 5, 'C', 300], [1, 12, 'D', 125], [2, 8, 'C', 300]], 'from': 5, 'to': 10}, {'opening': 0, 'rows': [[3, 5, 300], [2, 8, 600]], 'closing': 600}], ['control 4', {'normal': 'C', 'opening': 0, 'lines': [[2, 5, 'C', 10], [3, 5, 'D', 50], [1, 3, 'C', 125]], 'from': 3, 'to': 5}, {'opening': 0, 'rows': [[1, 3, 125], [2, 5, 135], [3, 5, 85]], 'closing': 85}], ['control 5', {'normal': 'D', 'opening': 0, 'lines': [[4, 1, 'D', 300], [3, 5, 'D', 50], [2, 12, 'D', 300], [5, 5, 'C', 300], [7, 5, 'C', 10], [6, 8, 'C', 125], [8, 1, 'C', 300], [1, 1, 'D', 300]], 'from': 1, 'to': 8}, {'opening': 0, 'rows': [[1, 1, 300], [4, 1, 600], [8, 1, 300], [3, 5, 350], [5, 5, 50], [7, 5, 40], [6, 8, -85]], 'closing': -85}], ['control 6', {'normal': 'D', 'opening': 0, 'lines': [[3, 12, 'C', 125], [2, 5, 'D', 125], [1, 10, 'D', 50]], 'from': 5, 'to': 7}, {'opening': 0, 'rows': [[2, 5, 125]], 'closing': 125}]], [['regression: running balance seed', {'normal': 'C', 'opening': 250, 'lines': [[3, 5, 'C', 300], [5, 5, 'C', 50], [4, 5, 'C', 300], [2, 10, 'D', 300], [1, 12, 'D', 300]], 'from': 5, 'to': 5}, {'opening': 250, 'rows': [[3, 5, 550], [4, 5, 850], [5, 5, 900]], 'closing': 900}], ['regression: running balance seed, partial-repair probe', {'normal': 'C', 'opening': 0, 'lines': [[3, 8, 'C', 300], [1, 1, 'C', 10], [2, 12, 'C', 125]], 'from': 3, 'to': 3}, {'opening': 10, 'rows': [], 'closing': 10}], ['control 1', {'normal': 'D', 'opening': 0, 'lines': [[3, 10, 'C', 300], [1, 12, 'C', 125], [2, 12, 'C', 300]], 'from': 6, 'to': 11}, {'opening': 0, 'rows': [[3, 10, -300]], 'closing': -300}], ['control 2', {'normal': 'D', 'opening': 0, 'lines': [[5, 10, 'C', 300], [2, 3, 'C', 300], [1, 3, 'C', 125], [4, 5, 'C', 50], [3, 5, 'C', 300]], 'from': 1, 'to': 3}, {'opening': 0, 'rows': [[1, 3, -125], [2, 3, -425]], 'closing': -425}], ['control 3', {'normal': 'C', 'opening': 0, 'lines': [[5, 1, 'C', 300], [2, 8, 'D', 300], [4, 5, 'C', 10], [3, 1, 'D', 10], [7, 5, 'D', 300], [6, 10, 'C', 125], [8, 5, 'D', 300], [1, 5, 'C', 125]], 'from': 1, 'to': 1}, {'opening': 0, 'rows': [[3, 1, -10], [5, 1, 290]], 'closing': 290}], ['control 4', {'normal': 'C', 'opening': 0, 'lines': [[5, 3, 'D', 50], [1, 3, 'C', 50], [6, 1, 'D', 50], [4, 10, 'C', 10], [2, 5, 'C', 50], [7, 10, 'D', 10], [3, 8, 'C', 125]], 'from': 6, 'to': 6}, {'opening': 0, 'rows': [], 'closing': 0}], ['control 5', {'normal': 'D', 'opening': 0, 'lines': [[1, 5, 'C', 10], [7, 12, 'D', 50], [3, 8, 'D', 300], [5, 5, 'D', 300], [2, 10, 'D', 125], [4, 10, 'C', 50], [6, 12, 'D', 10]], 'from': 5, 'to': 5}, {'opening': 0, 'rows': [[1, 5, -10], [5, 5, 290]], 'closing': 290}]]]
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: running balance seed{'closing': 60, 'opening': 60, 'rows': []}{'closing': 60, 'opening': 60, 'rows': []}Passed
control 1{'closing': -310, 'opening': 0, 'rows': [[1, 1, -10], [2, 5, -310]]}{'closing': -310, 'opening': 0, 'rows': [[1, 1, -10], [2, 5, -310]]}Passed
control 2{'closing': -175, 'opening': 0, 'rows': [[4, 1, -125], [5, 1, -175]]}{'closing': -175, 'opening': 0, 'rows': [[4, 1, -125], [5, 1, -175]]}Passed
control 3{'closing': 50, 'opening': 0, 'rows': [[7, 1, -300], [3, 3, -250], [4, 3, 50]]}{'closing': 50, 'opening': 0, 'rows': [[7, 1, -300], [3, 3, -250], [4, 3, 50]]}Passed
control 4{'closing': 590, 'opening': 0, 'rows': [[2, 3, -10], [3, 5, 290], [4, 5, 590]]}{'closing': 590, 'opening': 0, 'rows': [[2, 3, -10], [3, 5, 290], [4, 5, 590]]}Passed
control 5{'closing': 0, 'opening': 0, 'rows': []}{'closing': 0, 'opening': 0, 'rows': []}Passed
control 6{'closing': 610, 'opening': 0, 'rows': [[1, 3, 300], [5, 3, 425], [2, 5, 300], [3, 8, 310], [4, 8, 610]]}{'closing': 610, 'opening': 0, 'rows': [[1, 3, 300], [5, 3, 425], [2, 5, 300], [3, 8, 310], [4, 8, 610]]}Passed

SHA-256 / 450f463a86fc45e277a8225dc83dd3f8114225ec60334eb67accbaa129f34b9a

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

Case digest / 48ab71ca1e3de9a08bb3681a50d662f01e9c9d77ae8bbebb81fa39780e83e17c