FAILURE MAP
← Case archive

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.

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

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 fixtureActualExpectedOutcome
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 fixtureActualExpectedOutcome
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 fixtureActualExpectedOutcome
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