FA-58076 / Double-entry ledger accounting / Open access
Account running balance report: report end inclusivity · case 01
Entries dated on the report end day are missing from the report.
ROOT CAUSE
The report window treats the to day as exclusive.
VERIFIED REPAIR
Include lines dated from..to inclusive.
Unsuccessful approach: Moving the exclusive bound to the from day drops first-day lines instead.
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 = 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: report end inclusivity', {'normal': 'D', 'opening': 1000, 'lines': [[1, 8, 'D', 125], [8, 1, 'D', 125], [2, 10, 'D', 125], [7, 10, 'D', 50], [6, 5, 'C', 300], [3, 12, 'D', 300], [5, 12, 'C', 125], [4, 1, 'C', 125]], 'from': 6, 'to': 8}, {'opening': 700, 'rows': [[1, 8, 825]], 'closing': 825}], ['regression: report end inclusivity, partial-repair probe', {'normal': 'D', 'opening': 1000, 'lines': [[4, 5, 'C', 300], [2, 1, 'C', 300], [1, 3, 'C', 50], [3, 12, 'C', 125], [5, 5, 'D', 50]], 'from': 3, 'to': 10}, {'opening': 700, 'rows': [[1, 3, 650], [4, 5, 350], [5, 5, 400]], 'closing': 400}], ['control 1', {'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 2', {'normal': 'C', 'opening': 0, 'lines': [[5, 12, 'C', 125], [3, 5, 'C', 10], [4, 1, 'D', 50], [8, 5, 'C', 125], [1, 10, 'C', 10], [6, 1, 'C', 10], [7, 8, 'C', 125], [2, 3, 'C', 10]], 'from': 6, 'to': 6}, {'opening': 105, 'rows': [], 'closing': 105}], ['control 3', {'normal': 'D', 'opening': 250, 'lines': [[1, 8, 'D', 50], [2, 3, 'D', 125], [3, 10, 'C', 125]], 'from': 1, 'to': 1}, {'opening': 250, 'rows': [], 'closing': 250}], ['control 4', {'normal': 'D', 'opening': 1000, 'lines': [[4, 3, 'D', 10], [3, 3, 'D', 125], [1, 3, 'C', 10], [2, 5, 'D', 125], [5, 12, 'C', 10]], 'from': 5, 'to': 7}, {'opening': 1125, 'rows': [[2, 5, 1250]], 'closing': 1250}], ['control 5', {'normal': 'C', 'opening': 1000, 'lines': [[7, 12, 'D', 50], [6, 3, 'D', 50], [3, 12, 'C', 50], [1, 3, 'C', 10], [5, 10, 'D', 125], [8, 10, 'D', 300], [4, 10, 'C', 50], [2, 3, 'D', 10]], 'from': 6, 'to': 8}, {'opening': 950, 'rows': [], 'closing': 950}]], [['regression: report end inclusivity', {'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: report end inclusivity, 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': [[3, 5, 'D', 125], [5, 3, 'D', 50], [2, 1, 'C', 125], [4, 8, 'D', 125], [1, 5, 'C', 10]], 'from': 5, 'to': 7}, {'opening': -75, 'rows': [[1, 5, -85], [3, 5, 40]], 'closing': 40}], ['control 2', {'normal': 'D', 'opening': 0, 'lines': [[6, 3, 'C', 50], [7, 1, 'C', 50], [1, 3, 'C', 300], [5, 12, 'D', 50], [4, 5, 'C', 300], [3, 12, 'D', 10], [2, 1, 'D', 50]], 'from': 5, 'to': 10}, {'opening': -350, 'rows': [[4, 5, -650]], 'closing': -650}], ['control 3', {'normal': 'C', 'opening': 250, 'lines': [[1, 8, 'D', 300], [2, 3, 'D', 10], [3, 3, 'D', 10], [4, 12, 'C', 300], [5, 12, 'D', 10]], 'from': 1, 'to': 1}, {'opening': 250, 'rows': [], 'closing': 250}], ['control 4', {'normal': 'D', 'opening': 250, 'lines': [[6, 8, 'C', 300], [4, 1, 'C', 50], [1, 8, 'D', 300], [5, 1, 'D', 50], [2, 3, 'D', 300], [3, 5, 'C', 125]], 'from': 5, 'to': 7}, {'opening': 550, 'rows': [[3, 5, 425]], 'closing': 425}], ['control 5', {'normal': 'C', 'opening': 250, 'lines': [[2, 3, 'D', 300], [3, 5, 'C', 10], [1, 5, 'D', 125]], 'from': 3, 'to': 10}, {'opening': 250, 'rows': [[2, 3, -50], [1, 5, -175], [3, 5, -165]], 'closing': -165}]], [['regression: report end inclusivity', {'normal': 'D', 'opening': 1000, 'lines': [[2, 8, 'C', 125], [1, 8, 'D', 50], [3, 5, 'D', 125]], 'from': 3, 'to': 5}, {'opening': 1000, 'rows': [[3, 5, 1125]], 'closing': 1125}], ['regression: report end inclusivity, partial-repair probe', {'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}], ['control 1', {'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 2', {'normal': 'D', 'opening': 0, 'lines': [[3, 5, 'C', 10], [1, 10, 'D', 125], [5, 5, 'C', 300], [2, 8, 'C', 50], [4, 5, 'D', 10]], 'from': 6, 'to': 11}, {'opening': -300, 'rows': [[2, 8, -350], [1, 10, -225]], 'closing': -225}], ['control 3', {'normal': 'D', 'opening': 250, 'lines': [[6, 8, 'D', 10], [3, 1, 'D', 300], [1, 8, 'D', 50], [2, 10, 'C', 10], [5, 5, 'C', 10], [4, 5, 'D', 125]], 'from': 1, 'to': 3}, {'opening': 250, 'rows': [[3, 1, 550]], 'closing': 550}], ['control 4', {'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 5', {'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}]], [['regression: report end inclusivity', {'normal': 'D', 'opening': 1000, 'lines': [[7, 8, 'C', 125], [5, 12, 'C', 10], [6, 5, 'D', 10], [4, 10, 'D', 10], [3, 8, 'C', 10], [2, 8, 'D', 50], [1, 5, 'D', 10]], 'from': 3, 'to': 5}, {'opening': 1000, 'rows': [[1, 5, 1010], [6, 5, 1020]], 'closing': 1020}], ['regression: report end inclusivity, partial-repair probe', {'normal': 'C', 'opening': 1000, 'lines': [[5, 5, 'C', 300], [3, 1, 'D', 10], [2, 10, 'D', 10], [4, 5, 'C', 300], [1, 5, 'C', 10]], 'from': 1, 'to': 3}, {'opening': 1000, 'rows': [[3, 1, 990]], 'closing': 990}], ['control 1', {'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 2', {'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 3', {'normal': 'C', 'opening': 1000, 'lines': [[2, 12, 'C', 50], [1, 3, 'C', 125], [3, 1, 'D', 10], [4, 5, 'D', 50]], 'from': 6, 'to': 11}, {'opening': 1065, 'rows': [], 'closing': 1065}], ['control 4', {'normal': 'C', 'opening': 1000, 'lines': [[6, 5, 'C', 10], [4, 10, 'C', 300], [3, 1, 'C', 300], [1, 5, 'D', 300], [7, 3, 'D', 10], [2, 5, 'D', 300], [8, 10, 'C', 10], [5, 8, 'C', 10]], 'from': 1, 'to': 6}, {'opening': 1000, 'rows': [[3, 1, 1300], [7, 3, 1290], [1, 5, 990], [2, 5, 690], [6, 5, 700]], 'closing': 700}], ['control 5', {'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}]], [['regression: report end inclusivity', {'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}], ['control 1', {'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 2', {'normal': 'C', 'opening': 1000, 'lines': [[2, 8, 'C', 300], [3, 5, 'D', 300], [4, 8, 'C', 50], [5, 1, 'C', 300], [1, 5, 'C', 10]], 'from': 6, 'to': 11}, {'opening': 1010, 'rows': [[2, 8, 1310], [4, 8, 1360]], 'closing': 1360}], ['control 3', {'normal': 'D', 'opening': 1000, 'lines': [[1, 1, 'D', 300], [2, 1, 'D', 50], [3, 8, 'C', 10]], 'from': 5, 'to': 10}, {'opening': 1350, 'rows': [[3, 8, 1340]], 'closing': 1340}], ['control 4', {'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 5', {'normal': 'D', 'opening': 1000, 'lines': [[6, 8, 'D', 50], [1, 12, 'C', 300], [3, 5, 'D', 125], [2, 3, 'C', 50], [5, 5, 'D', 10], [4, 3, 'C', 125]], 'from': 3, 'to': 10}, {'opening': 1000, 'rows': [[2, 3, 950], [4, 3, 825], [3, 5, 950], [5, 5, 960], [6, 8, 1010]], 'closing': 1010}], ['control 6', {'normal': 'C', 'opening': 1000, 'lines': [[2, 5, 'C', 50], [1, 1, 'C', 125], [3, 8, 'C', 300]], 'from': 5, 'to': 7}, {'opening': 1125, 'rows': [[2, 5, 1175]], 'closing': 1175}]]]
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: report end inclusivity | {'closing': 700, 'opening': 700, 'rows': []} | {'closing': 825, 'opening': 700, 'rows': [[1, 8, 825]]} | Failed |
| regression: report end inclusivity, partial-repair probe | {'closing': 400, 'opening': 700, 'rows': [[1, 3, 650], [4, 5, 350], [5, 5, 400]]} | {'closing': 400, 'opening': 700, 'rows': [[1, 3, 650], [4, 5, 350], [5, 5, 400]]} | Passed |
| control 1 | {'closing': 60, 'opening': 60, 'rows': []} | {'closing': 60, 'opening': 60, 'rows': []} | Passed |
| control 2 | {'closing': 105, 'opening': 105, 'rows': []} | {'closing': 105, 'opening': 105, 'rows': []} | Passed |
| control 3 | {'closing': 250, 'opening': 250, 'rows': []} | {'closing': 250, 'opening': 250, 'rows': []} | Passed |
| control 4 | {'closing': 1250, 'opening': 1125, 'rows': [[2, 5, 1250]]} | {'closing': 1250, 'opening': 1125, 'rows': [[2, 5, 1250]]} | Passed |
| control 5 | {'closing': 950, 'opening': 950, 'rows': []} | {'closing': 950, 'opening': 950, 'rows': []} | Passed |
SHA-256 / 11efa43be1d8bf8842611db44b2e5aa6dfd0768e6a0d670fb795b6b3e4bead30
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 = 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: report end inclusivity', {'normal': 'D', 'opening': 1000, 'lines': [[1, 8, 'D', 125], [8, 1, 'D', 125], [2, 10, 'D', 125], [7, 10, 'D', 50], [6, 5, 'C', 300], [3, 12, 'D', 300], [5, 12, 'C', 125], [4, 1, 'C', 125]], 'from': 6, 'to': 8}, {'opening': 700, 'rows': [[1, 8, 825]], 'closing': 825}], ['regression: report end inclusivity, partial-repair probe', {'normal': 'D', 'opening': 1000, 'lines': [[4, 5, 'C', 300], [2, 1, 'C', 300], [1, 3, 'C', 50], [3, 12, 'C', 125], [5, 5, 'D', 50]], 'from': 3, 'to': 10}, {'opening': 700, 'rows': [[1, 3, 650], [4, 5, 350], [5, 5, 400]], 'closing': 400}], ['control 1', {'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 2', {'normal': 'C', 'opening': 0, 'lines': [[5, 12, 'C', 125], [3, 5, 'C', 10], [4, 1, 'D', 50], [8, 5, 'C', 125], [1, 10, 'C', 10], [6, 1, 'C', 10], [7, 8, 'C', 125], [2, 3, 'C', 10]], 'from': 6, 'to': 6}, {'opening': 105, 'rows': [], 'closing': 105}], ['control 3', {'normal': 'D', 'opening': 250, 'lines': [[1, 8, 'D', 50], [2, 3, 'D', 125], [3, 10, 'C', 125]], 'from': 1, 'to': 1}, {'opening': 250, 'rows': [], 'closing': 250}], ['control 4', {'normal': 'D', 'opening': 1000, 'lines': [[4, 3, 'D', 10], [3, 3, 'D', 125], [1, 3, 'C', 10], [2, 5, 'D', 125], [5, 12, 'C', 10]], 'from': 5, 'to': 7}, {'opening': 1125, 'rows': [[2, 5, 1250]], 'closing': 1250}], ['control 5', {'normal': 'C', 'opening': 1000, 'lines': [[7, 12, 'D', 50], [6, 3, 'D', 50], [3, 12, 'C', 50], [1, 3, 'C', 10], [5, 10, 'D', 125], [8, 10, 'D', 300], [4, 10, 'C', 50], [2, 3, 'D', 10]], 'from': 6, 'to': 8}, {'opening': 950, 'rows': [], 'closing': 950}]], [['regression: report end inclusivity', {'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: report end inclusivity, 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': [[3, 5, 'D', 125], [5, 3, 'D', 50], [2, 1, 'C', 125], [4, 8, 'D', 125], [1, 5, 'C', 10]], 'from': 5, 'to': 7}, {'opening': -75, 'rows': [[1, 5, -85], [3, 5, 40]], 'closing': 40}], ['control 2', {'normal': 'D', 'opening': 0, 'lines': [[6, 3, 'C', 50], [7, 1, 'C', 50], [1, 3, 'C', 300], [5, 12, 'D', 50], [4, 5, 'C', 300], [3, 12, 'D', 10], [2, 1, 'D', 50]], 'from': 5, 'to': 10}, {'opening': -350, 'rows': [[4, 5, -650]], 'closing': -650}], ['control 3', {'normal': 'C', 'opening': 250, 'lines': [[1, 8, 'D', 300], [2, 3, 'D', 10], [3, 3, 'D', 10], [4, 12, 'C', 300], [5, 12, 'D', 10]], 'from': 1, 'to': 1}, {'opening': 250, 'rows': [], 'closing': 250}], ['control 4', {'normal': 'D', 'opening': 250, 'lines': [[6, 8, 'C', 300], [4, 1, 'C', 50], [1, 8, 'D', 300], [5, 1, 'D', 50], [2, 3, 'D', 300], [3, 5, 'C', 125]], 'from': 5, 'to': 7}, {'opening': 550, 'rows': [[3, 5, 425]], 'closing': 425}], ['control 5', {'normal': 'C', 'opening': 250, 'lines': [[2, 3, 'D', 300], [3, 5, 'C', 10], [1, 5, 'D', 125]], 'from': 3, 'to': 10}, {'opening': 250, 'rows': [[2, 3, -50], [1, 5, -175], [3, 5, -165]], 'closing': -165}]], [['regression: report end inclusivity', {'normal': 'D', 'opening': 1000, 'lines': [[2, 8, 'C', 125], [1, 8, 'D', 50], [3, 5, 'D', 125]], 'from': 3, 'to': 5}, {'opening': 1000, 'rows': [[3, 5, 1125]], 'closing': 1125}], ['regression: report end inclusivity, partial-repair probe', {'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}], ['control 1', {'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 2', {'normal': 'D', 'opening': 0, 'lines': [[3, 5, 'C', 10], [1, 10, 'D', 125], [5, 5, 'C', 300], [2, 8, 'C', 50], [4, 5, 'D', 10]], 'from': 6, 'to': 11}, {'opening': -300, 'rows': [[2, 8, -350], [1, 10, -225]], 'closing': -225}], ['control 3', {'normal': 'D', 'opening': 250, 'lines': [[6, 8, 'D', 10], [3, 1, 'D', 300], [1, 8, 'D', 50], [2, 10, 'C', 10], [5, 5, 'C', 10], [4, 5, 'D', 125]], 'from': 1, 'to': 3}, {'opening': 250, 'rows': [[3, 1, 550]], 'closing': 550}], ['control 4', {'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 5', {'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}]], [['regression: report end inclusivity', {'normal': 'D', 'opening': 1000, 'lines': [[7, 8, 'C', 125], [5, 12, 'C', 10], [6, 5, 'D', 10], [4, 10, 'D', 10], [3, 8, 'C', 10], [2, 8, 'D', 50], [1, 5, 'D', 10]], 'from': 3, 'to': 5}, {'opening': 1000, 'rows': [[1, 5, 1010], [6, 5, 1020]], 'closing': 1020}], ['regression: report end inclusivity, partial-repair probe', {'normal': 'C', 'opening': 1000, 'lines': [[5, 5, 'C', 300], [3, 1, 'D', 10], [2, 10, 'D', 10], [4, 5, 'C', 300], [1, 5, 'C', 10]], 'from': 1, 'to': 3}, {'opening': 1000, 'rows': [[3, 1, 990]], 'closing': 990}], ['control 1', {'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 2', {'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 3', {'normal': 'C', 'opening': 1000, 'lines': [[2, 12, 'C', 50], [1, 3, 'C', 125], [3, 1, 'D', 10], [4, 5, 'D', 50]], 'from': 6, 'to': 11}, {'opening': 1065, 'rows': [], 'closing': 1065}], ['control 4', {'normal': 'C', 'opening': 1000, 'lines': [[6, 5, 'C', 10], [4, 10, 'C', 300], [3, 1, 'C', 300], [1, 5, 'D', 300], [7, 3, 'D', 10], [2, 5, 'D', 300], [8, 10, 'C', 10], [5, 8, 'C', 10]], 'from': 1, 'to': 6}, {'opening': 1000, 'rows': [[3, 1, 1300], [7, 3, 1290], [1, 5, 990], [2, 5, 690], [6, 5, 700]], 'closing': 700}], ['control 5', {'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}]], [['regression: report end inclusivity', {'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}], ['control 1', {'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 2', {'normal': 'C', 'opening': 1000, 'lines': [[2, 8, 'C', 300], [3, 5, 'D', 300], [4, 8, 'C', 50], [5, 1, 'C', 300], [1, 5, 'C', 10]], 'from': 6, 'to': 11}, {'opening': 1010, 'rows': [[2, 8, 1310], [4, 8, 1360]], 'closing': 1360}], ['control 3', {'normal': 'D', 'opening': 1000, 'lines': [[1, 1, 'D', 300], [2, 1, 'D', 50], [3, 8, 'C', 10]], 'from': 5, 'to': 10}, {'opening': 1350, 'rows': [[3, 8, 1340]], 'closing': 1340}], ['control 4', {'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 5', {'normal': 'D', 'opening': 1000, 'lines': [[6, 8, 'D', 50], [1, 12, 'C', 300], [3, 5, 'D', 125], [2, 3, 'C', 50], [5, 5, 'D', 10], [4, 3, 'C', 125]], 'from': 3, 'to': 10}, {'opening': 1000, 'rows': [[2, 3, 950], [4, 3, 825], [3, 5, 950], [5, 5, 960], [6, 8, 1010]], 'closing': 1010}], ['control 6', {'normal': 'C', 'opening': 1000, 'lines': [[2, 5, 'C', 50], [1, 1, 'C', 125], [3, 8, 'C', 300]], 'from': 5, 'to': 7}, {'opening': 1125, 'rows': [[2, 5, 1175]], 'closing': 1175}]]]
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: report end inclusivity | {'closing': 825, 'opening': 700, 'rows': [[1, 8, 825]]} | {'closing': 825, 'opening': 700, 'rows': [[1, 8, 825]]} | Passed |
| regression: report end inclusivity, partial-repair probe | {'closing': 450, 'opening': 700, 'rows': [[4, 5, 400], [5, 5, 450]]} | {'closing': 400, 'opening': 700, 'rows': [[1, 3, 650], [4, 5, 350], [5, 5, 400]]} | Failed |
| control 1 | {'closing': 60, 'opening': 60, 'rows': []} | {'closing': 60, 'opening': 60, 'rows': []} | Passed |
| control 2 | {'closing': 105, 'opening': 105, 'rows': []} | {'closing': 105, 'opening': 105, 'rows': []} | Passed |
| control 3 | {'closing': 250, 'opening': 250, 'rows': []} | {'closing': 250, 'opening': 250, 'rows': []} | Passed |
| control 4 | {'closing': 1125, 'opening': 1125, 'rows': []} | {'closing': 1250, 'opening': 1125, 'rows': [[2, 5, 1250]]} | Failed |
| control 5 | {'closing': 950, 'opening': 950, 'rows': []} | {'closing': 950, 'opening': 950, 'rows': []} | Passed |
SHA-256 / 2fac8420a5f933a73d3bdee78c07741d170c4690ab56f52ea9a779ffe8c3dcc0
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: report end inclusivity', {'normal': 'D', 'opening': 1000, 'lines': [[1, 8, 'D', 125], [8, 1, 'D', 125], [2, 10, 'D', 125], [7, 10, 'D', 50], [6, 5, 'C', 300], [3, 12, 'D', 300], [5, 12, 'C', 125], [4, 1, 'C', 125]], 'from': 6, 'to': 8}, {'opening': 700, 'rows': [[1, 8, 825]], 'closing': 825}], ['regression: report end inclusivity, partial-repair probe', {'normal': 'D', 'opening': 1000, 'lines': [[4, 5, 'C', 300], [2, 1, 'C', 300], [1, 3, 'C', 50], [3, 12, 'C', 125], [5, 5, 'D', 50]], 'from': 3, 'to': 10}, {'opening': 700, 'rows': [[1, 3, 650], [4, 5, 350], [5, 5, 400]], 'closing': 400}], ['control 1', {'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 2', {'normal': 'C', 'opening': 0, 'lines': [[5, 12, 'C', 125], [3, 5, 'C', 10], [4, 1, 'D', 50], [8, 5, 'C', 125], [1, 10, 'C', 10], [6, 1, 'C', 10], [7, 8, 'C', 125], [2, 3, 'C', 10]], 'from': 6, 'to': 6}, {'opening': 105, 'rows': [], 'closing': 105}], ['control 3', {'normal': 'D', 'opening': 250, 'lines': [[1, 8, 'D', 50], [2, 3, 'D', 125], [3, 10, 'C', 125]], 'from': 1, 'to': 1}, {'opening': 250, 'rows': [], 'closing': 250}], ['control 4', {'normal': 'D', 'opening': 1000, 'lines': [[4, 3, 'D', 10], [3, 3, 'D', 125], [1, 3, 'C', 10], [2, 5, 'D', 125], [5, 12, 'C', 10]], 'from': 5, 'to': 7}, {'opening': 1125, 'rows': [[2, 5, 1250]], 'closing': 1250}], ['control 5', {'normal': 'C', 'opening': 1000, 'lines': [[7, 12, 'D', 50], [6, 3, 'D', 50], [3, 12, 'C', 50], [1, 3, 'C', 10], [5, 10, 'D', 125], [8, 10, 'D', 300], [4, 10, 'C', 50], [2, 3, 'D', 10]], 'from': 6, 'to': 8}, {'opening': 950, 'rows': [], 'closing': 950}]], [['regression: report end inclusivity', {'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: report end inclusivity, 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': [[3, 5, 'D', 125], [5, 3, 'D', 50], [2, 1, 'C', 125], [4, 8, 'D', 125], [1, 5, 'C', 10]], 'from': 5, 'to': 7}, {'opening': -75, 'rows': [[1, 5, -85], [3, 5, 40]], 'closing': 40}], ['control 2', {'normal': 'D', 'opening': 0, 'lines': [[6, 3, 'C', 50], [7, 1, 'C', 50], [1, 3, 'C', 300], [5, 12, 'D', 50], [4, 5, 'C', 300], [3, 12, 'D', 10], [2, 1, 'D', 50]], 'from': 5, 'to': 10}, {'opening': -350, 'rows': [[4, 5, -650]], 'closing': -650}], ['control 3', {'normal': 'C', 'opening': 250, 'lines': [[1, 8, 'D', 300], [2, 3, 'D', 10], [3, 3, 'D', 10], [4, 12, 'C', 300], [5, 12, 'D', 10]], 'from': 1, 'to': 1}, {'opening': 250, 'rows': [], 'closing': 250}], ['control 4', {'normal': 'D', 'opening': 250, 'lines': [[6, 8, 'C', 300], [4, 1, 'C', 50], [1, 8, 'D', 300], [5, 1, 'D', 50], [2, 3, 'D', 300], [3, 5, 'C', 125]], 'from': 5, 'to': 7}, {'opening': 550, 'rows': [[3, 5, 425]], 'closing': 425}], ['control 5', {'normal': 'C', 'opening': 250, 'lines': [[2, 3, 'D', 300], [3, 5, 'C', 10], [1, 5, 'D', 125]], 'from': 3, 'to': 10}, {'opening': 250, 'rows': [[2, 3, -50], [1, 5, -175], [3, 5, -165]], 'closing': -165}]], [['regression: report end inclusivity', {'normal': 'D', 'opening': 1000, 'lines': [[2, 8, 'C', 125], [1, 8, 'D', 50], [3, 5, 'D', 125]], 'from': 3, 'to': 5}, {'opening': 1000, 'rows': [[3, 5, 1125]], 'closing': 1125}], ['regression: report end inclusivity, partial-repair probe', {'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}], ['control 1', {'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 2', {'normal': 'D', 'opening': 0, 'lines': [[3, 5, 'C', 10], [1, 10, 'D', 125], [5, 5, 'C', 300], [2, 8, 'C', 50], [4, 5, 'D', 10]], 'from': 6, 'to': 11}, {'opening': -300, 'rows': [[2, 8, -350], [1, 10, -225]], 'closing': -225}], ['control 3', {'normal': 'D', 'opening': 250, 'lines': [[6, 8, 'D', 10], [3, 1, 'D', 300], [1, 8, 'D', 50], [2, 10, 'C', 10], [5, 5, 'C', 10], [4, 5, 'D', 125]], 'from': 1, 'to': 3}, {'opening': 250, 'rows': [[3, 1, 550]], 'closing': 550}], ['control 4', {'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 5', {'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}]], [['regression: report end inclusivity', {'normal': 'D', 'opening': 1000, 'lines': [[7, 8, 'C', 125], [5, 12, 'C', 10], [6, 5, 'D', 10], [4, 10, 'D', 10], [3, 8, 'C', 10], [2, 8, 'D', 50], [1, 5, 'D', 10]], 'from': 3, 'to': 5}, {'opening': 1000, 'rows': [[1, 5, 1010], [6, 5, 1020]], 'closing': 1020}], ['regression: report end inclusivity, partial-repair probe', {'normal': 'C', 'opening': 1000, 'lines': [[5, 5, 'C', 300], [3, 1, 'D', 10], [2, 10, 'D', 10], [4, 5, 'C', 300], [1, 5, 'C', 10]], 'from': 1, 'to': 3}, {'opening': 1000, 'rows': [[3, 1, 990]], 'closing': 990}], ['control 1', {'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 2', {'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 3', {'normal': 'C', 'opening': 1000, 'lines': [[2, 12, 'C', 50], [1, 3, 'C', 125], [3, 1, 'D', 10], [4, 5, 'D', 50]], 'from': 6, 'to': 11}, {'opening': 1065, 'rows': [], 'closing': 1065}], ['control 4', {'normal': 'C', 'opening': 1000, 'lines': [[6, 5, 'C', 10], [4, 10, 'C', 300], [3, 1, 'C', 300], [1, 5, 'D', 300], [7, 3, 'D', 10], [2, 5, 'D', 300], [8, 10, 'C', 10], [5, 8, 'C', 10]], 'from': 1, 'to': 6}, {'opening': 1000, 'rows': [[3, 1, 1300], [7, 3, 1290], [1, 5, 990], [2, 5, 690], [6, 5, 700]], 'closing': 700}], ['control 5', {'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}]], [['regression: report end inclusivity', {'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}], ['control 1', {'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 2', {'normal': 'C', 'opening': 1000, 'lines': [[2, 8, 'C', 300], [3, 5, 'D', 300], [4, 8, 'C', 50], [5, 1, 'C', 300], [1, 5, 'C', 10]], 'from': 6, 'to': 11}, {'opening': 1010, 'rows': [[2, 8, 1310], [4, 8, 1360]], 'closing': 1360}], ['control 3', {'normal': 'D', 'opening': 1000, 'lines': [[1, 1, 'D', 300], [2, 1, 'D', 50], [3, 8, 'C', 10]], 'from': 5, 'to': 10}, {'opening': 1350, 'rows': [[3, 8, 1340]], 'closing': 1340}], ['control 4', {'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 5', {'normal': 'D', 'opening': 1000, 'lines': [[6, 8, 'D', 50], [1, 12, 'C', 300], [3, 5, 'D', 125], [2, 3, 'C', 50], [5, 5, 'D', 10], [4, 3, 'C', 125]], 'from': 3, 'to': 10}, {'opening': 1000, 'rows': [[2, 3, 950], [4, 3, 825], [3, 5, 950], [5, 5, 960], [6, 8, 1010]], 'closing': 1010}], ['control 6', {'normal': 'C', 'opening': 1000, 'lines': [[2, 5, 'C', 50], [1, 1, 'C', 125], [3, 8, 'C', 300]], 'from': 5, 'to': 7}, {'opening': 1125, 'rows': [[2, 5, 1175]], 'closing': 1175}]]]
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: report end inclusivity | {'closing': 825, 'opening': 700, 'rows': [[1, 8, 825]]} | {'closing': 825, 'opening': 700, 'rows': [[1, 8, 825]]} | Passed |
| regression: report end inclusivity, partial-repair probe | {'closing': 400, 'opening': 700, 'rows': [[1, 3, 650], [4, 5, 350], [5, 5, 400]]} | {'closing': 400, 'opening': 700, 'rows': [[1, 3, 650], [4, 5, 350], [5, 5, 400]]} | Passed |
| control 1 | {'closing': 60, 'opening': 60, 'rows': []} | {'closing': 60, 'opening': 60, 'rows': []} | Passed |
| control 2 | {'closing': 105, 'opening': 105, 'rows': []} | {'closing': 105, 'opening': 105, 'rows': []} | Passed |
| control 3 | {'closing': 250, 'opening': 250, 'rows': []} | {'closing': 250, 'opening': 250, 'rows': []} | Passed |
| control 4 | {'closing': 1250, 'opening': 1125, 'rows': [[2, 5, 1250]]} | {'closing': 1250, 'opening': 1125, 'rows': [[2, 5, 1250]]} | Passed |
| control 5 | {'closing': 950, 'opening': 950, 'rows': []} | {'closing': 950, 'opening': 950, 'rows': []} | Passed |
SHA-256 / 903ebd45ff2b6a7719947f70bc4ea75bef2f8984244b1673a2e4f2effecbb6b4
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.322404+00:00.
Case digest / 68e529bd1b170ec7211d82b9024c1f085fd84f1a0a24d8f53de1ef2928958687