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.
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| 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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| 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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| 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