FAILURE MAP
← Case archive

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

Posting period lock: soft close adjusting gate · case 01

Routine entries post into a soft-closed period.

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

ROOT CAUSE

Soft-closed periods accept every entry instead of only adjusting entries.

VERIFIED REPAIR

Open a soft period only for adjusting entries.

Unsuccessful approach: Inverting the flag admits routine entries and blocks the adjusting ones.

Case contract

x = {'periods': [[start_day, end_day, 'open'|'soft'|'closed']] (non-overlapping, any order), 'policy': 'reject'|'roll', 'entries': [[id, day, adjusting]]}. The period containing the day (start and end inclusive) is found; none gives [id, None, 'no_period']. Soft periods accept adjusting entries only. Open acceptance gives [id, day, 'posted']. Otherwise under 'roll' the entry posts on the start day of the earliest later open period ([id, start, 'rolled']) and with none, or under 'reject', gives [id, None, 'closed'].

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):
    periods = sorted(x['periods'])
    out = []
    for eid, date, adjusting in x['entries']:
        found = None
        for p in periods:
            if p[0] <= date <= p[1]:
                found = p
                break
        if found is None:
            out.append([eid, None, 'no_period'])
            continue
        status = found[2]
        if status == 'soft':
            status = 'open'
        if status == 'open':
            out.append([eid, date, 'posted'])
        elif x['policy'] == 'roll':
            nxt = [p for p in periods if p[0] > found[1] and p[2] == 'open']
            if nxt:
                out.append([eid, nxt[0][0], 'rolled'])
            else:
                out.append([eid, None, 'closed'])
        else:
            out.append([eid, None, 'closed'])
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: soft close adjusting gate', {'periods': [[122, 151, 'soft'], [92, 121, 'soft'], [31, 60, 'closed'], [1, 30, 'soft'], [61, 91, 'open']], 'policy': 'reject', 'entries': [['E0', 151, False], ['E1', 125, False], ['E2', 121, False]]}, [['E0', None, 'closed'], ['E1', None, 'closed'], ['E2', None, 'closed']]], ['control 1', {'periods': [[31, 60, 'closed'], [61, 90, 'closed'], [1, 30, 'closed'], [91, 121, 'closed']], 'policy': 'roll', 'entries': [['E0', 63, False], ['E1', 121, False], ['E2', 94, True], ['E3', 1, False], ['E4', 34, False], ['E5', 61, True]]}, [['E0', None, 'closed'], ['E1', None, 'closed'], ['E2', None, 'closed'], ['E3', None, 'closed'], ['E4', None, 'closed'], ['E5', None, 'closed']]], ['control 2', {'periods': [[29, 58, 'open'], [1, 28, 'open']], 'policy': 'roll', 'entries': [['E0', 29, True], ['E1', 58, True], ['E2', 58, False], ['E3', 29, True]]}, [['E0', 29, 'posted'], ['E1', 58, 'posted'], ['E2', 58, 'posted'], ['E3', 29, 'posted']]], ['control 3', {'periods': [[61, 91, 'open'], [31, 60, 'closed'], [92, 121, 'open'], [1, 30, 'open']], 'policy': 'reject', 'entries': [['E0', 4, False], ['E1', 64, False], ['E2', 92, True], ['E3', 63, False]]}, [['E0', 4, 'posted'], ['E1', 64, 'posted'], ['E2', 92, 'posted'], ['E3', 63, 'posted']]], ['control 4', {'periods': [[95, 122, 'closed'], [1, 31, 'open'], [67, 94, 'closed'], [32, 61, 'closed']], 'policy': 'roll', 'entries': [['E0', 62, False], ['E1', 95, False], ['E2', 123, False], ['E3', 61, False], ['E4', 122, False], ['E5', 32, False]]}, [['E0', None, 'no_period'], ['E1', None, 'closed'], ['E2', None, 'no_period'], ['E3', None, 'closed'], ['E4', None, 'closed'], ['E5', None, 'closed']]], ['control 5', {'periods': [[59, 88, 'closed'], [31, 58, 'open'], [1, 30, 'open']], 'policy': 'reject', 'entries': [['E0', 34, False], ['E1', 89, False], ['E2', 30, True], ['E3', 61, False], ['E4', 31, False], ['E5', 59, False]]}, [['E0', 34, 'posted'], ['E1', None, 'no_period'], ['E2', 30, 'posted'], ['E3', None, 'closed'], ['E4', 31, 'posted'], ['E5', None, 'closed']]], ['control 6', {'periods': [[1, 28, 'open'], [34, 61, 'open']], 'policy': 'roll', 'entries': [['E0', 29, True], ['E1', 31, True], ['E2', 31, False], ['E3', 64, True], ['E4', 31, True], ['E5', 62, False]]}, [['E0', None, 'no_period'], ['E1', None, 'no_period'], ['E2', None, 'no_period'], ['E3', None, 'no_period'], ['E4', None, 'no_period'], ['E5', None, 'no_period']]]], [['regression: soft close adjusting gate', {'periods': [[93, 120, 'closed'], [121, 148, 'soft'], [63, 92, 'soft'], [1, 31, 'soft'], [32, 62, 'open']], 'policy': 'roll', 'entries': [['E0', 149, True], ['E1', 63, True], ['E2', 148, True], ['E3', 4, False]]}, [['E0', None, 'no_period'], ['E1', 63, 'posted'], ['E2', 148, 'posted'], ['E3', 32, 'rolled']]], ['control 1', {'periods': [[1, 31, 'closed'], [60, 90, 'soft'], [32, 59, 'closed']], 'policy': 'roll', 'entries': [['E0', 60, True], ['E1', 62, True], ['E2', 1, True], ['E3', 31, False], ['E4', 62, True]]}, [['E0', 60, 'posted'], ['E1', 62, 'posted'], ['E2', None, 'closed'], ['E3', None, 'closed'], ['E4', 62, 'posted']]], ['control 2', {'periods': [[29, 59, 'closed'], [1, 28, 'closed'], [65, 94, 'open']], 'policy': 'reject', 'entries': [['E0', 68, False], ['E1', 97, False], ['E2', 95, True], ['E3', 68, False], ['E4', 28, False], ['E5', 28, False]]}, [['E0', 68, 'posted'], ['E1', None, 'no_period'], ['E2', None, 'no_period'], ['E3', 68, 'posted'], ['E4', None, 'closed'], ['E5', None, 'closed']]], ['control 3', {'periods': [[62, 89, 'open'], [1, 31, 'soft'], [32, 61, 'closed'], [90, 117, 'closed']], 'policy': 'reject', 'entries': [['E0', 62, False], ['E1', 117, False], ['E2', 93, False], ['E3', 65, False]]}, [['E0', 62, 'posted'], ['E1', None, 'closed'], ['E2', None, 'closed'], ['E3', 65, 'posted']]], ['control 4', {'periods': [[29, 59, 'open'], [1, 28, 'closed'], [60, 90, 'closed']], 'policy': 'roll', 'entries': [['E0', 31, False], ['E1', 62, True], ['E2', 29, False], ['E3', 93, False], ['E4', 59, False], ['E5', 60, True]]}, [['E0', 31, 'posted'], ['E1', None, 'closed'], ['E2', 29, 'posted'], ['E3', None, 'no_period'], ['E4', 59, 'posted'], ['E5', None, 'closed']]], ['control 5', {'periods': [[65, 92, 'open'], [34, 64, 'closed'], [1, 28, 'closed']], 'policy': 'reject', 'entries': [['E0', 67, False], ['E1', 1, False], ['E2', 64, True], ['E3', 68, False]]}, [['E0', 67, 'posted'], ['E1', None, 'closed'], ['E2', None, 'closed'], ['E3', 68, 'posted']]], ['control 6', {'periods': [[1, 28, 'closed'], [60, 89, 'closed'], [29, 59, 'closed'], [95, 125, 'closed']], 'policy': 'roll', 'entries': [['E0', 60, True], ['E1', 90, True], ['E2', 92, False]]}, [['E0', None, 'closed'], ['E1', None, 'no_period'], ['E2', None, 'no_period']]]], [['regression: soft close adjusting gate', {'periods': [[1, 30, 'soft'], [31, 60, 'soft']], 'policy': 'roll', 'entries': [['E0', 30, False], ['E1', 31, False], ['E2', 31, True], ['E3', 30, False]]}, [['E0', None, 'closed'], ['E1', None, 'closed'], ['E2', 31, 'posted'], ['E3', None, 'closed']]], ['control 1', {'periods': [[1, 28, 'closed'], [29, 59, 'closed']], 'policy': 'roll', 'entries': [['E0', 29, True], ['E1', 31, False], ['E2', 1, False]]}, [['E0', None, 'closed'], ['E1', None, 'closed'], ['E2', None, 'closed']]], ['control 2', {'periods': [[65, 92, 'open'], [1, 28, 'closed'], [34, 64, 'soft']], 'policy': 'roll', 'entries': [['E0', 65, False], ['E1', 65, False], ['E2', 92, False]]}, [['E0', 65, 'posted'], ['E1', 65, 'posted'], ['E2', 92, 'posted']]], ['control 3', {'periods': [[63, 90, 'open'], [1, 31, 'closed'], [32, 62, 'closed']], 'policy': 'roll', 'entries': [['E0', 63, True], ['E1', 65, True], ['E2', 63, True], ['E3', 1, False]]}, [['E0', 63, 'posted'], ['E1', 65, 'posted'], ['E2', 63, 'posted'], ['E3', 63, 'rolled']]], ['control 4', {'periods': [[1, 28, 'open'], [93, 122, 'closed'], [29, 59, 'soft'], [60, 87, 'open']], 'policy': 'roll', 'entries': [['E0', 93, True], ['E1', 122, True], ['E2', 87, False]]}, [['E0', None, 'closed'], ['E1', None, 'closed'], ['E2', 87, 'posted']]], ['control 5', {'periods': [[65, 92, 'closed'], [37, 64, 'soft'], [121, 150, 'open'], [1, 31, 'open'], [93, 120, 'soft']], 'policy': 'reject', 'entries': [['E0', 34, False], ['E1', 150, False], ['E2', 64, True]]}, [['E0', None, 'no_period'], ['E1', 150, 'posted'], ['E2', 64, 'posted']]], ['control 6', {'periods': [[62, 92, 'soft'], [1, 28, 'closed'], [34, 61, 'closed'], [93, 123, 'closed']], 'policy': 'reject', 'entries': [['E0', 93, True], ['E1', 93, False], ['E2', 4, True]]}, [['E0', None, 'closed'], ['E1', None, 'closed'], ['E2', None, 'closed']]]], [['regression: soft close adjusting gate', {'periods': [[37, 66, 'soft'], [1, 31, 'closed']], 'policy': 'roll', 'entries': [['E0', 37, False], ['E1', 67, True], ['E2', 69, False]]}, [['E0', None, 'closed'], ['E1', None, 'no_period'], ['E2', None, 'no_period']]], ['control 1', {'periods': [[29, 58, 'closed'], [1, 28, 'open']], 'policy': 'roll', 'entries': [['E0', 61, False], ['E1', 1, False], ['E2', 58, True]]}, [['E0', None, 'no_period'], ['E1', 1, 'posted'], ['E2', None, 'closed']]], ['control 2', {'periods': [[59, 86, 'open'], [29, 58, 'closed'], [1, 28, 'closed']], 'policy': 'roll', 'entries': [['E0', 59, False], ['E1', 87, False], ['E2', 87, False], ['E3', 61, False]]}, [['E0', 59, 'posted'], ['E1', None, 'no_period'], ['E2', None, 'no_period'], ['E3', 61, 'posted']]], ['control 3', {'periods': [[1, 31, 'soft'], [32, 59, 'open']], 'policy': 'reject', 'entries': [['E0', 60, True], ['E1', 32, False], ['E2', 62, False]]}, [['E0', None, 'no_period'], ['E1', 32, 'posted'], ['E2', None, 'no_period']]], ['control 4', {'periods': [[34, 61, 'soft'], [62, 92, 'open'], [1, 28, 'soft'], [93, 123, 'open']], 'policy': 'roll', 'entries': [['E0', 28, True], ['E1', 65, True], ['E2', 29, False], ['E3', 65, False], ['E4', 93, True]]}, [['E0', 28, 'posted'], ['E1', 65, 'posted'], ['E2', None, 'no_period'], ['E3', 65, 'posted'], ['E4', 93, 'posted']]], ['control 5', {'periods': [[63, 92, 'closed'], [1, 31, 'closed'], [98, 125, 'open'], [32, 62, 'soft']], 'policy': 'roll', 'entries': [['E0', 32, True], ['E1', 63, False], ['E2', 93, False]]}, [['E0', 32, 'posted'], ['E1', 98, 'rolled'], ['E2', None, 'no_period']]], ['control 6', {'periods': [[59, 86, 'closed'], [1, 30, 'closed'], [31, 58, 'closed']], 'policy': 'reject', 'entries': [['E0', 33, False], ['E1', 86, False], ['E2', 31, True], ['E3', 89, False]]}, [['E0', None, 'closed'], ['E1', None, 'closed'], ['E2', None, 'closed'], ['E3', None, 'no_period']]]], [['regression: soft close adjusting gate', {'periods': [[1, 28, 'closed'], [29, 59, 'closed'], [60, 89, 'soft']], 'policy': 'roll', 'entries': [['E0', 63, False], ['E1', 32, True], ['E2', 63, True]]}, [['E0', None, 'closed'], ['E1', None, 'closed'], ['E2', 63, 'posted']]], ['control 1', {'periods': [[34, 61, 'closed'], [1, 28, 'soft'], [67, 94, 'open'], [95, 122, 'open']], 'policy': 'roll', 'entries': [['E0', 95, True], ['E1', 37, False], ['E2', 94, False]]}, [['E0', 95, 'posted'], ['E1', 67, 'rolled'], ['E2', 94, 'posted']]], ['control 2', {'periods': [[93, 123, 'closed'], [1, 31, 'open'], [62, 92, 'closed'], [32, 61, 'closed']], 'policy': 'reject', 'entries': [['E0', 123, False], ['E1', 95, True], ['E2', 32, True], ['E3', 1, False], ['E4', 124, False]]}, [['E0', None, 'closed'], ['E1', None, 'closed'], ['E2', None, 'closed'], ['E3', 1, 'posted'], ['E4', None, 'no_period']]], ['control 3', {'periods': [[73, 100, 'open'], [1, 31, 'closed'], [37, 67, 'open'], [129, 159, 'open'], [101, 128, 'soft']], 'policy': 'reject', 'entries': [['E0', 129, False], ['E1', 40, True], ['E2', 132, True], ['E3', 73, False], ['E4', 132, False], ['E5', 34, False]]}, [['E0', 129, 'posted'], ['E1', 40, 'posted'], ['E2', 132, 'posted'], ['E3', 73, 'posted'], ['E4', 132, 'posted'], ['E5', None, 'no_period']]], ['control 4', {'periods': [[1, 28, 'open'], [29, 56, 'closed']], 'policy': 'roll', 'entries': [['E0', 29, True], ['E1', 57, False], ['E2', 4, False], ['E3', 29, True]]}, [['E0', None, 'closed'], ['E1', None, 'no_period'], ['E2', 4, 'posted'], ['E3', None, 'closed']]], ['control 5', {'periods': [[98, 125, 'closed'], [63, 92, 'open'], [32, 62, 'closed'], [126, 155, 'open'], [1, 31, 'open']], 'policy': 'reject', 'entries': [['E0', 34, False], ['E1', 126, False], ['E2', 32, False]]}, [['E0', None, 'closed'], ['E1', 126, 'posted'], ['E2', None, 'closed']]], ['control 6', {'periods': [[1, 30, 'closed'], [36, 63, 'open']], 'policy': 'roll', 'entries': [['E0', 31, True], ['E1', 30, True], ['E2', 33, False]]}, [['E0', None, 'no_period'], ['E1', 36, 'rolled'], ['E2', None, 'no_period']]]]]
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: soft close adjusting gate[['E0', 151, 'posted'], ['E1', 125, 'posted'], ['E2', 121, 'posted']][['E0', None, 'closed'], ['E1', None, 'closed'], ['E2', None, 'closed']]Failed
control 1[['E0', None, 'closed'], ['E1', None, 'closed'], ['E2', None, 'closed'], ['E3', None, 'closed'], ['E4', None, 'closed'], ['E5', None, 'closed']][['E0', None, 'closed'], ['E1', None, 'closed'], ['E2', None, 'closed'], ['E3', None, 'closed'], ['E4', None, 'closed'], ['E5', None, 'closed']]Passed
control 2[['E0', 29, 'posted'], ['E1', 58, 'posted'], ['E2', 58, 'posted'], ['E3', 29, 'posted']][['E0', 29, 'posted'], ['E1', 58, 'posted'], ['E2', 58, 'posted'], ['E3', 29, 'posted']]Passed
control 3[['E0', 4, 'posted'], ['E1', 64, 'posted'], ['E2', 92, 'posted'], ['E3', 63, 'posted']][['E0', 4, 'posted'], ['E1', 64, 'posted'], ['E2', 92, 'posted'], ['E3', 63, 'posted']]Passed
control 4[['E0', None, 'no_period'], ['E1', None, 'closed'], ['E2', None, 'no_period'], ['E3', None, 'closed'], ['E4', None, 'closed'], ['E5', None, 'closed']][['E0', None, 'no_period'], ['E1', None, 'closed'], ['E2', None, 'no_period'], ['E3', None, 'closed'], ['E4', None, 'closed'], ['E5', None, 'closed']]Passed
control 5[['E0', 34, 'posted'], ['E1', None, 'no_period'], ['E2', 30, 'posted'], ['E3', None, 'closed'], ['E4', 31, 'posted'], ['E5', None, 'closed']][['E0', 34, 'posted'], ['E1', None, 'no_period'], ['E2', 30, 'posted'], ['E3', None, 'closed'], ['E4', 31, 'posted'], ['E5', None, 'closed']]Passed
control 6[['E0', None, 'no_period'], ['E1', None, 'no_period'], ['E2', None, 'no_period'], ['E3', None, 'no_period'], ['E4', None, 'no_period'], ['E5', None, 'no_period']][['E0', None, 'no_period'], ['E1', None, 'no_period'], ['E2', None, 'no_period'], ['E3', None, 'no_period'], ['E4', None, 'no_period'], ['E5', None, 'no_period']]Passed

SHA-256 / 4754e391a0dab0ea0d74c701c877ed40c5d1caf0ae1855645ce6cd6d997b6242

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(x):
    periods = sorted(x['periods'])
    out = []
    for eid, date, adjusting in x['entries']:
        found = None
        for p in periods:
            if p[0] <= date <= p[1]:
                found = p
                break
        if found is None:
            out.append([eid, None, 'no_period'])
            continue
        status = found[2]
        if status == 'soft' and not adjusting:
            status = 'open'
        if status == 'open':
            out.append([eid, date, 'posted'])
        elif x['policy'] == 'roll':
            nxt = [p for p in periods if p[0] > found[1] and p[2] == 'open']
            if nxt:
                out.append([eid, nxt[0][0], 'rolled'])
            else:
                out.append([eid, None, 'closed'])
        else:
            out.append([eid, None, 'closed'])
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: soft close adjusting gate', {'periods': [[122, 151, 'soft'], [92, 121, 'soft'], [31, 60, 'closed'], [1, 30, 'soft'], [61, 91, 'open']], 'policy': 'reject', 'entries': [['E0', 151, False], ['E1', 125, False], ['E2', 121, False]]}, [['E0', None, 'closed'], ['E1', None, 'closed'], ['E2', None, 'closed']]], ['control 1', {'periods': [[31, 60, 'closed'], [61, 90, 'closed'], [1, 30, 'closed'], [91, 121, 'closed']], 'policy': 'roll', 'entries': [['E0', 63, False], ['E1', 121, False], ['E2', 94, True], ['E3', 1, False], ['E4', 34, False], ['E5', 61, True]]}, [['E0', None, 'closed'], ['E1', None, 'closed'], ['E2', None, 'closed'], ['E3', None, 'closed'], ['E4', None, 'closed'], ['E5', None, 'closed']]], ['control 2', {'periods': [[29, 58, 'open'], [1, 28, 'open']], 'policy': 'roll', 'entries': [['E0', 29, True], ['E1', 58, True], ['E2', 58, False], ['E3', 29, True]]}, [['E0', 29, 'posted'], ['E1', 58, 'posted'], ['E2', 58, 'posted'], ['E3', 29, 'posted']]], ['control 3', {'periods': [[61, 91, 'open'], [31, 60, 'closed'], [92, 121, 'open'], [1, 30, 'open']], 'policy': 'reject', 'entries': [['E0', 4, False], ['E1', 64, False], ['E2', 92, True], ['E3', 63, False]]}, [['E0', 4, 'posted'], ['E1', 64, 'posted'], ['E2', 92, 'posted'], ['E3', 63, 'posted']]], ['control 4', {'periods': [[95, 122, 'closed'], [1, 31, 'open'], [67, 94, 'closed'], [32, 61, 'closed']], 'policy': 'roll', 'entries': [['E0', 62, False], ['E1', 95, False], ['E2', 123, False], ['E3', 61, False], ['E4', 122, False], ['E5', 32, False]]}, [['E0', None, 'no_period'], ['E1', None, 'closed'], ['E2', None, 'no_period'], ['E3', None, 'closed'], ['E4', None, 'closed'], ['E5', None, 'closed']]], ['control 5', {'periods': [[59, 88, 'closed'], [31, 58, 'open'], [1, 30, 'open']], 'policy': 'reject', 'entries': [['E0', 34, False], ['E1', 89, False], ['E2', 30, True], ['E3', 61, False], ['E4', 31, False], ['E5', 59, False]]}, [['E0', 34, 'posted'], ['E1', None, 'no_period'], ['E2', 30, 'posted'], ['E3', None, 'closed'], ['E4', 31, 'posted'], ['E5', None, 'closed']]], ['control 6', {'periods': [[1, 28, 'open'], [34, 61, 'open']], 'policy': 'roll', 'entries': [['E0', 29, True], ['E1', 31, True], ['E2', 31, False], ['E3', 64, True], ['E4', 31, True], ['E5', 62, False]]}, [['E0', None, 'no_period'], ['E1', None, 'no_period'], ['E2', None, 'no_period'], ['E3', None, 'no_period'], ['E4', None, 'no_period'], ['E5', None, 'no_period']]]], [['regression: soft close adjusting gate', {'periods': [[93, 120, 'closed'], [121, 148, 'soft'], [63, 92, 'soft'], [1, 31, 'soft'], [32, 62, 'open']], 'policy': 'roll', 'entries': [['E0', 149, True], ['E1', 63, True], ['E2', 148, True], ['E3', 4, False]]}, [['E0', None, 'no_period'], ['E1', 63, 'posted'], ['E2', 148, 'posted'], ['E3', 32, 'rolled']]], ['control 1', {'periods': [[1, 31, 'closed'], [60, 90, 'soft'], [32, 59, 'closed']], 'policy': 'roll', 'entries': [['E0', 60, True], ['E1', 62, True], ['E2', 1, True], ['E3', 31, False], ['E4', 62, True]]}, [['E0', 60, 'posted'], ['E1', 62, 'posted'], ['E2', None, 'closed'], ['E3', None, 'closed'], ['E4', 62, 'posted']]], ['control 2', {'periods': [[29, 59, 'closed'], [1, 28, 'closed'], [65, 94, 'open']], 'policy': 'reject', 'entries': [['E0', 68, False], ['E1', 97, False], ['E2', 95, True], ['E3', 68, False], ['E4', 28, False], ['E5', 28, False]]}, [['E0', 68, 'posted'], ['E1', None, 'no_period'], ['E2', None, 'no_period'], ['E3', 68, 'posted'], ['E4', None, 'closed'], ['E5', None, 'closed']]], ['control 3', {'periods': [[62, 89, 'open'], [1, 31, 'soft'], [32, 61, 'closed'], [90, 117, 'closed']], 'policy': 'reject', 'entries': [['E0', 62, False], ['E1', 117, False], ['E2', 93, False], ['E3', 65, False]]}, [['E0', 62, 'posted'], ['E1', None, 'closed'], ['E2', None, 'closed'], ['E3', 65, 'posted']]], ['control 4', {'periods': [[29, 59, 'open'], [1, 28, 'closed'], [60, 90, 'closed']], 'policy': 'roll', 'entries': [['E0', 31, False], ['E1', 62, True], ['E2', 29, False], ['E3', 93, False], ['E4', 59, False], ['E5', 60, True]]}, [['E0', 31, 'posted'], ['E1', None, 'closed'], ['E2', 29, 'posted'], ['E3', None, 'no_period'], ['E4', 59, 'posted'], ['E5', None, 'closed']]], ['control 5', {'periods': [[65, 92, 'open'], [34, 64, 'closed'], [1, 28, 'closed']], 'policy': 'reject', 'entries': [['E0', 67, False], ['E1', 1, False], ['E2', 64, True], ['E3', 68, False]]}, [['E0', 67, 'posted'], ['E1', None, 'closed'], ['E2', None, 'closed'], ['E3', 68, 'posted']]], ['control 6', {'periods': [[1, 28, 'closed'], [60, 89, 'closed'], [29, 59, 'closed'], [95, 125, 'closed']], 'policy': 'roll', 'entries': [['E0', 60, True], ['E1', 90, True], ['E2', 92, False]]}, [['E0', None, 'closed'], ['E1', None, 'no_period'], ['E2', None, 'no_period']]]], [['regression: soft close adjusting gate', {'periods': [[1, 30, 'soft'], [31, 60, 'soft']], 'policy': 'roll', 'entries': [['E0', 30, False], ['E1', 31, False], ['E2', 31, True], ['E3', 30, False]]}, [['E0', None, 'closed'], ['E1', None, 'closed'], ['E2', 31, 'posted'], ['E3', None, 'closed']]], ['control 1', {'periods': [[1, 28, 'closed'], [29, 59, 'closed']], 'policy': 'roll', 'entries': [['E0', 29, True], ['E1', 31, False], ['E2', 1, False]]}, [['E0', None, 'closed'], ['E1', None, 'closed'], ['E2', None, 'closed']]], ['control 2', {'periods': [[65, 92, 'open'], [1, 28, 'closed'], [34, 64, 'soft']], 'policy': 'roll', 'entries': [['E0', 65, False], ['E1', 65, False], ['E2', 92, False]]}, [['E0', 65, 'posted'], ['E1', 65, 'posted'], ['E2', 92, 'posted']]], ['control 3', {'periods': [[63, 90, 'open'], [1, 31, 'closed'], [32, 62, 'closed']], 'policy': 'roll', 'entries': [['E0', 63, True], ['E1', 65, True], ['E2', 63, True], ['E3', 1, False]]}, [['E0', 63, 'posted'], ['E1', 65, 'posted'], ['E2', 63, 'posted'], ['E3', 63, 'rolled']]], ['control 4', {'periods': [[1, 28, 'open'], [93, 122, 'closed'], [29, 59, 'soft'], [60, 87, 'open']], 'policy': 'roll', 'entries': [['E0', 93, True], ['E1', 122, True], ['E2', 87, False]]}, [['E0', None, 'closed'], ['E1', None, 'closed'], ['E2', 87, 'posted']]], ['control 5', {'periods': [[65, 92, 'closed'], [37, 64, 'soft'], [121, 150, 'open'], [1, 31, 'open'], [93, 120, 'soft']], 'policy': 'reject', 'entries': [['E0', 34, False], ['E1', 150, False], ['E2', 64, True]]}, [['E0', None, 'no_period'], ['E1', 150, 'posted'], ['E2', 64, 'posted']]], ['control 6', {'periods': [[62, 92, 'soft'], [1, 28, 'closed'], [34, 61, 'closed'], [93, 123, 'closed']], 'policy': 'reject', 'entries': [['E0', 93, True], ['E1', 93, False], ['E2', 4, True]]}, [['E0', None, 'closed'], ['E1', None, 'closed'], ['E2', None, 'closed']]]], [['regression: soft close adjusting gate', {'periods': [[37, 66, 'soft'], [1, 31, 'closed']], 'policy': 'roll', 'entries': [['E0', 37, False], ['E1', 67, True], ['E2', 69, False]]}, [['E0', None, 'closed'], ['E1', None, 'no_period'], ['E2', None, 'no_period']]], ['control 1', {'periods': [[29, 58, 'closed'], [1, 28, 'open']], 'policy': 'roll', 'entries': [['E0', 61, False], ['E1', 1, False], ['E2', 58, True]]}, [['E0', None, 'no_period'], ['E1', 1, 'posted'], ['E2', None, 'closed']]], ['control 2', {'periods': [[59, 86, 'open'], [29, 58, 'closed'], [1, 28, 'closed']], 'policy': 'roll', 'entries': [['E0', 59, False], ['E1', 87, False], ['E2', 87, False], ['E3', 61, False]]}, [['E0', 59, 'posted'], ['E1', None, 'no_period'], ['E2', None, 'no_period'], ['E3', 61, 'posted']]], ['control 3', {'periods': [[1, 31, 'soft'], [32, 59, 'open']], 'policy': 'reject', 'entries': [['E0', 60, True], ['E1', 32, False], ['E2', 62, False]]}, [['E0', None, 'no_period'], ['E1', 32, 'posted'], ['E2', None, 'no_period']]], ['control 4', {'periods': [[34, 61, 'soft'], [62, 92, 'open'], [1, 28, 'soft'], [93, 123, 'open']], 'policy': 'roll', 'entries': [['E0', 28, True], ['E1', 65, True], ['E2', 29, False], ['E3', 65, False], ['E4', 93, True]]}, [['E0', 28, 'posted'], ['E1', 65, 'posted'], ['E2', None, 'no_period'], ['E3', 65, 'posted'], ['E4', 93, 'posted']]], ['control 5', {'periods': [[63, 92, 'closed'], [1, 31, 'closed'], [98, 125, 'open'], [32, 62, 'soft']], 'policy': 'roll', 'entries': [['E0', 32, True], ['E1', 63, False], ['E2', 93, False]]}, [['E0', 32, 'posted'], ['E1', 98, 'rolled'], ['E2', None, 'no_period']]], ['control 6', {'periods': [[59, 86, 'closed'], [1, 30, 'closed'], [31, 58, 'closed']], 'policy': 'reject', 'entries': [['E0', 33, False], ['E1', 86, False], ['E2', 31, True], ['E3', 89, False]]}, [['E0', None, 'closed'], ['E1', None, 'closed'], ['E2', None, 'closed'], ['E3', None, 'no_period']]]], [['regression: soft close adjusting gate', {'periods': [[1, 28, 'closed'], [29, 59, 'closed'], [60, 89, 'soft']], 'policy': 'roll', 'entries': [['E0', 63, False], ['E1', 32, True], ['E2', 63, True]]}, [['E0', None, 'closed'], ['E1', None, 'closed'], ['E2', 63, 'posted']]], ['control 1', {'periods': [[34, 61, 'closed'], [1, 28, 'soft'], [67, 94, 'open'], [95, 122, 'open']], 'policy': 'roll', 'entries': [['E0', 95, True], ['E1', 37, False], ['E2', 94, False]]}, [['E0', 95, 'posted'], ['E1', 67, 'rolled'], ['E2', 94, 'posted']]], ['control 2', {'periods': [[93, 123, 'closed'], [1, 31, 'open'], [62, 92, 'closed'], [32, 61, 'closed']], 'policy': 'reject', 'entries': [['E0', 123, False], ['E1', 95, True], ['E2', 32, True], ['E3', 1, False], ['E4', 124, False]]}, [['E0', None, 'closed'], ['E1', None, 'closed'], ['E2', None, 'closed'], ['E3', 1, 'posted'], ['E4', None, 'no_period']]], ['control 3', {'periods': [[73, 100, 'open'], [1, 31, 'closed'], [37, 67, 'open'], [129, 159, 'open'], [101, 128, 'soft']], 'policy': 'reject', 'entries': [['E0', 129, False], ['E1', 40, True], ['E2', 132, True], ['E3', 73, False], ['E4', 132, False], ['E5', 34, False]]}, [['E0', 129, 'posted'], ['E1', 40, 'posted'], ['E2', 132, 'posted'], ['E3', 73, 'posted'], ['E4', 132, 'posted'], ['E5', None, 'no_period']]], ['control 4', {'periods': [[1, 28, 'open'], [29, 56, 'closed']], 'policy': 'roll', 'entries': [['E0', 29, True], ['E1', 57, False], ['E2', 4, False], ['E3', 29, True]]}, [['E0', None, 'closed'], ['E1', None, 'no_period'], ['E2', 4, 'posted'], ['E3', None, 'closed']]], ['control 5', {'periods': [[98, 125, 'closed'], [63, 92, 'open'], [32, 62, 'closed'], [126, 155, 'open'], [1, 31, 'open']], 'policy': 'reject', 'entries': [['E0', 34, False], ['E1', 126, False], ['E2', 32, False]]}, [['E0', None, 'closed'], ['E1', 126, 'posted'], ['E2', None, 'closed']]], ['control 6', {'periods': [[1, 30, 'closed'], [36, 63, 'open']], 'policy': 'roll', 'entries': [['E0', 31, True], ['E1', 30, True], ['E2', 33, False]]}, [['E0', None, 'no_period'], ['E1', 36, 'rolled'], ['E2', None, 'no_period']]]]]
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: soft close adjusting gate[['E0', 151, 'posted'], ['E1', 125, 'posted'], ['E2', 121, 'posted']][['E0', None, 'closed'], ['E1', None, 'closed'], ['E2', None, 'closed']]Failed
control 1[['E0', None, 'closed'], ['E1', None, 'closed'], ['E2', None, 'closed'], ['E3', None, 'closed'], ['E4', None, 'closed'], ['E5', None, 'closed']][['E0', None, 'closed'], ['E1', None, 'closed'], ['E2', None, 'closed'], ['E3', None, 'closed'], ['E4', None, 'closed'], ['E5', None, 'closed']]Passed
control 2[['E0', 29, 'posted'], ['E1', 58, 'posted'], ['E2', 58, 'posted'], ['E3', 29, 'posted']][['E0', 29, 'posted'], ['E1', 58, 'posted'], ['E2', 58, 'posted'], ['E3', 29, 'posted']]Passed
control 3[['E0', 4, 'posted'], ['E1', 64, 'posted'], ['E2', 92, 'posted'], ['E3', 63, 'posted']][['E0', 4, 'posted'], ['E1', 64, 'posted'], ['E2', 92, 'posted'], ['E3', 63, 'posted']]Passed
control 4[['E0', None, 'no_period'], ['E1', None, 'closed'], ['E2', None, 'no_period'], ['E3', None, 'closed'], ['E4', None, 'closed'], ['E5', None, 'closed']][['E0', None, 'no_period'], ['E1', None, 'closed'], ['E2', None, 'no_period'], ['E3', None, 'closed'], ['E4', None, 'closed'], ['E5', None, 'closed']]Passed
control 5[['E0', 34, 'posted'], ['E1', None, 'no_period'], ['E2', 30, 'posted'], ['E3', None, 'closed'], ['E4', 31, 'posted'], ['E5', None, 'closed']][['E0', 34, 'posted'], ['E1', None, 'no_period'], ['E2', 30, 'posted'], ['E3', None, 'closed'], ['E4', 31, 'posted'], ['E5', None, 'closed']]Passed
control 6[['E0', None, 'no_period'], ['E1', None, 'no_period'], ['E2', None, 'no_period'], ['E3', None, 'no_period'], ['E4', None, 'no_period'], ['E5', None, 'no_period']][['E0', None, 'no_period'], ['E1', None, 'no_period'], ['E2', None, 'no_period'], ['E3', None, 'no_period'], ['E4', None, 'no_period'], ['E5', None, 'no_period']]Passed

SHA-256 / d3d28315e570d9f79e337c3087d307ba442a9118fa2dbc8a905fa64688da9e75

3 / The verified repair

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

N = 1
observations = []
def solve(x):
    periods = sorted(x['periods'])
    out = []
    for eid, date, adjusting in x['entries']:
        found = None
        for p in periods:
            if p[0] <= date <= p[1]:
                found = p
                break
        if found is None:
            out.append([eid, None, 'no_period'])
            continue
        status = found[2]
        if status == 'soft' and adjusting:
            status = 'open'
        if status == 'open':
            out.append([eid, date, 'posted'])
        elif x['policy'] == 'roll':
            nxt = [p for p in periods if p[0] > found[1] and p[2] == 'open']
            if nxt:
                out.append([eid, nxt[0][0], 'rolled'])
            else:
                out.append([eid, None, 'closed'])
        else:
            out.append([eid, None, 'closed'])
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: soft close adjusting gate', {'periods': [[122, 151, 'soft'], [92, 121, 'soft'], [31, 60, 'closed'], [1, 30, 'soft'], [61, 91, 'open']], 'policy': 'reject', 'entries': [['E0', 151, False], ['E1', 125, False], ['E2', 121, False]]}, [['E0', None, 'closed'], ['E1', None, 'closed'], ['E2', None, 'closed']]], ['control 1', {'periods': [[31, 60, 'closed'], [61, 90, 'closed'], [1, 30, 'closed'], [91, 121, 'closed']], 'policy': 'roll', 'entries': [['E0', 63, False], ['E1', 121, False], ['E2', 94, True], ['E3', 1, False], ['E4', 34, False], ['E5', 61, True]]}, [['E0', None, 'closed'], ['E1', None, 'closed'], ['E2', None, 'closed'], ['E3', None, 'closed'], ['E4', None, 'closed'], ['E5', None, 'closed']]], ['control 2', {'periods': [[29, 58, 'open'], [1, 28, 'open']], 'policy': 'roll', 'entries': [['E0', 29, True], ['E1', 58, True], ['E2', 58, False], ['E3', 29, True]]}, [['E0', 29, 'posted'], ['E1', 58, 'posted'], ['E2', 58, 'posted'], ['E3', 29, 'posted']]], ['control 3', {'periods': [[61, 91, 'open'], [31, 60, 'closed'], [92, 121, 'open'], [1, 30, 'open']], 'policy': 'reject', 'entries': [['E0', 4, False], ['E1', 64, False], ['E2', 92, True], ['E3', 63, False]]}, [['E0', 4, 'posted'], ['E1', 64, 'posted'], ['E2', 92, 'posted'], ['E3', 63, 'posted']]], ['control 4', {'periods': [[95, 122, 'closed'], [1, 31, 'open'], [67, 94, 'closed'], [32, 61, 'closed']], 'policy': 'roll', 'entries': [['E0', 62, False], ['E1', 95, False], ['E2', 123, False], ['E3', 61, False], ['E4', 122, False], ['E5', 32, False]]}, [['E0', None, 'no_period'], ['E1', None, 'closed'], ['E2', None, 'no_period'], ['E3', None, 'closed'], ['E4', None, 'closed'], ['E5', None, 'closed']]], ['control 5', {'periods': [[59, 88, 'closed'], [31, 58, 'open'], [1, 30, 'open']], 'policy': 'reject', 'entries': [['E0', 34, False], ['E1', 89, False], ['E2', 30, True], ['E3', 61, False], ['E4', 31, False], ['E5', 59, False]]}, [['E0', 34, 'posted'], ['E1', None, 'no_period'], ['E2', 30, 'posted'], ['E3', None, 'closed'], ['E4', 31, 'posted'], ['E5', None, 'closed']]], ['control 6', {'periods': [[1, 28, 'open'], [34, 61, 'open']], 'policy': 'roll', 'entries': [['E0', 29, True], ['E1', 31, True], ['E2', 31, False], ['E3', 64, True], ['E4', 31, True], ['E5', 62, False]]}, [['E0', None, 'no_period'], ['E1', None, 'no_period'], ['E2', None, 'no_period'], ['E3', None, 'no_period'], ['E4', None, 'no_period'], ['E5', None, 'no_period']]]], [['regression: soft close adjusting gate', {'periods': [[93, 120, 'closed'], [121, 148, 'soft'], [63, 92, 'soft'], [1, 31, 'soft'], [32, 62, 'open']], 'policy': 'roll', 'entries': [['E0', 149, True], ['E1', 63, True], ['E2', 148, True], ['E3', 4, False]]}, [['E0', None, 'no_period'], ['E1', 63, 'posted'], ['E2', 148, 'posted'], ['E3', 32, 'rolled']]], ['control 1', {'periods': [[1, 31, 'closed'], [60, 90, 'soft'], [32, 59, 'closed']], 'policy': 'roll', 'entries': [['E0', 60, True], ['E1', 62, True], ['E2', 1, True], ['E3', 31, False], ['E4', 62, True]]}, [['E0', 60, 'posted'], ['E1', 62, 'posted'], ['E2', None, 'closed'], ['E3', None, 'closed'], ['E4', 62, 'posted']]], ['control 2', {'periods': [[29, 59, 'closed'], [1, 28, 'closed'], [65, 94, 'open']], 'policy': 'reject', 'entries': [['E0', 68, False], ['E1', 97, False], ['E2', 95, True], ['E3', 68, False], ['E4', 28, False], ['E5', 28, False]]}, [['E0', 68, 'posted'], ['E1', None, 'no_period'], ['E2', None, 'no_period'], ['E3', 68, 'posted'], ['E4', None, 'closed'], ['E5', None, 'closed']]], ['control 3', {'periods': [[62, 89, 'open'], [1, 31, 'soft'], [32, 61, 'closed'], [90, 117, 'closed']], 'policy': 'reject', 'entries': [['E0', 62, False], ['E1', 117, False], ['E2', 93, False], ['E3', 65, False]]}, [['E0', 62, 'posted'], ['E1', None, 'closed'], ['E2', None, 'closed'], ['E3', 65, 'posted']]], ['control 4', {'periods': [[29, 59, 'open'], [1, 28, 'closed'], [60, 90, 'closed']], 'policy': 'roll', 'entries': [['E0', 31, False], ['E1', 62, True], ['E2', 29, False], ['E3', 93, False], ['E4', 59, False], ['E5', 60, True]]}, [['E0', 31, 'posted'], ['E1', None, 'closed'], ['E2', 29, 'posted'], ['E3', None, 'no_period'], ['E4', 59, 'posted'], ['E5', None, 'closed']]], ['control 5', {'periods': [[65, 92, 'open'], [34, 64, 'closed'], [1, 28, 'closed']], 'policy': 'reject', 'entries': [['E0', 67, False], ['E1', 1, False], ['E2', 64, True], ['E3', 68, False]]}, [['E0', 67, 'posted'], ['E1', None, 'closed'], ['E2', None, 'closed'], ['E3', 68, 'posted']]], ['control 6', {'periods': [[1, 28, 'closed'], [60, 89, 'closed'], [29, 59, 'closed'], [95, 125, 'closed']], 'policy': 'roll', 'entries': [['E0', 60, True], ['E1', 90, True], ['E2', 92, False]]}, [['E0', None, 'closed'], ['E1', None, 'no_period'], ['E2', None, 'no_period']]]], [['regression: soft close adjusting gate', {'periods': [[1, 30, 'soft'], [31, 60, 'soft']], 'policy': 'roll', 'entries': [['E0', 30, False], ['E1', 31, False], ['E2', 31, True], ['E3', 30, False]]}, [['E0', None, 'closed'], ['E1', None, 'closed'], ['E2', 31, 'posted'], ['E3', None, 'closed']]], ['control 1', {'periods': [[1, 28, 'closed'], [29, 59, 'closed']], 'policy': 'roll', 'entries': [['E0', 29, True], ['E1', 31, False], ['E2', 1, False]]}, [['E0', None, 'closed'], ['E1', None, 'closed'], ['E2', None, 'closed']]], ['control 2', {'periods': [[65, 92, 'open'], [1, 28, 'closed'], [34, 64, 'soft']], 'policy': 'roll', 'entries': [['E0', 65, False], ['E1', 65, False], ['E2', 92, False]]}, [['E0', 65, 'posted'], ['E1', 65, 'posted'], ['E2', 92, 'posted']]], ['control 3', {'periods': [[63, 90, 'open'], [1, 31, 'closed'], [32, 62, 'closed']], 'policy': 'roll', 'entries': [['E0', 63, True], ['E1', 65, True], ['E2', 63, True], ['E3', 1, False]]}, [['E0', 63, 'posted'], ['E1', 65, 'posted'], ['E2', 63, 'posted'], ['E3', 63, 'rolled']]], ['control 4', {'periods': [[1, 28, 'open'], [93, 122, 'closed'], [29, 59, 'soft'], [60, 87, 'open']], 'policy': 'roll', 'entries': [['E0', 93, True], ['E1', 122, True], ['E2', 87, False]]}, [['E0', None, 'closed'], ['E1', None, 'closed'], ['E2', 87, 'posted']]], ['control 5', {'periods': [[65, 92, 'closed'], [37, 64, 'soft'], [121, 150, 'open'], [1, 31, 'open'], [93, 120, 'soft']], 'policy': 'reject', 'entries': [['E0', 34, False], ['E1', 150, False], ['E2', 64, True]]}, [['E0', None, 'no_period'], ['E1', 150, 'posted'], ['E2', 64, 'posted']]], ['control 6', {'periods': [[62, 92, 'soft'], [1, 28, 'closed'], [34, 61, 'closed'], [93, 123, 'closed']], 'policy': 'reject', 'entries': [['E0', 93, True], ['E1', 93, False], ['E2', 4, True]]}, [['E0', None, 'closed'], ['E1', None, 'closed'], ['E2', None, 'closed']]]], [['regression: soft close adjusting gate', {'periods': [[37, 66, 'soft'], [1, 31, 'closed']], 'policy': 'roll', 'entries': [['E0', 37, False], ['E1', 67, True], ['E2', 69, False]]}, [['E0', None, 'closed'], ['E1', None, 'no_period'], ['E2', None, 'no_period']]], ['control 1', {'periods': [[29, 58, 'closed'], [1, 28, 'open']], 'policy': 'roll', 'entries': [['E0', 61, False], ['E1', 1, False], ['E2', 58, True]]}, [['E0', None, 'no_period'], ['E1', 1, 'posted'], ['E2', None, 'closed']]], ['control 2', {'periods': [[59, 86, 'open'], [29, 58, 'closed'], [1, 28, 'closed']], 'policy': 'roll', 'entries': [['E0', 59, False], ['E1', 87, False], ['E2', 87, False], ['E3', 61, False]]}, [['E0', 59, 'posted'], ['E1', None, 'no_period'], ['E2', None, 'no_period'], ['E3', 61, 'posted']]], ['control 3', {'periods': [[1, 31, 'soft'], [32, 59, 'open']], 'policy': 'reject', 'entries': [['E0', 60, True], ['E1', 32, False], ['E2', 62, False]]}, [['E0', None, 'no_period'], ['E1', 32, 'posted'], ['E2', None, 'no_period']]], ['control 4', {'periods': [[34, 61, 'soft'], [62, 92, 'open'], [1, 28, 'soft'], [93, 123, 'open']], 'policy': 'roll', 'entries': [['E0', 28, True], ['E1', 65, True], ['E2', 29, False], ['E3', 65, False], ['E4', 93, True]]}, [['E0', 28, 'posted'], ['E1', 65, 'posted'], ['E2', None, 'no_period'], ['E3', 65, 'posted'], ['E4', 93, 'posted']]], ['control 5', {'periods': [[63, 92, 'closed'], [1, 31, 'closed'], [98, 125, 'open'], [32, 62, 'soft']], 'policy': 'roll', 'entries': [['E0', 32, True], ['E1', 63, False], ['E2', 93, False]]}, [['E0', 32, 'posted'], ['E1', 98, 'rolled'], ['E2', None, 'no_period']]], ['control 6', {'periods': [[59, 86, 'closed'], [1, 30, 'closed'], [31, 58, 'closed']], 'policy': 'reject', 'entries': [['E0', 33, False], ['E1', 86, False], ['E2', 31, True], ['E3', 89, False]]}, [['E0', None, 'closed'], ['E1', None, 'closed'], ['E2', None, 'closed'], ['E3', None, 'no_period']]]], [['regression: soft close adjusting gate', {'periods': [[1, 28, 'closed'], [29, 59, 'closed'], [60, 89, 'soft']], 'policy': 'roll', 'entries': [['E0', 63, False], ['E1', 32, True], ['E2', 63, True]]}, [['E0', None, 'closed'], ['E1', None, 'closed'], ['E2', 63, 'posted']]], ['control 1', {'periods': [[34, 61, 'closed'], [1, 28, 'soft'], [67, 94, 'open'], [95, 122, 'open']], 'policy': 'roll', 'entries': [['E0', 95, True], ['E1', 37, False], ['E2', 94, False]]}, [['E0', 95, 'posted'], ['E1', 67, 'rolled'], ['E2', 94, 'posted']]], ['control 2', {'periods': [[93, 123, 'closed'], [1, 31, 'open'], [62, 92, 'closed'], [32, 61, 'closed']], 'policy': 'reject', 'entries': [['E0', 123, False], ['E1', 95, True], ['E2', 32, True], ['E3', 1, False], ['E4', 124, False]]}, [['E0', None, 'closed'], ['E1', None, 'closed'], ['E2', None, 'closed'], ['E3', 1, 'posted'], ['E4', None, 'no_period']]], ['control 3', {'periods': [[73, 100, 'open'], [1, 31, 'closed'], [37, 67, 'open'], [129, 159, 'open'], [101, 128, 'soft']], 'policy': 'reject', 'entries': [['E0', 129, False], ['E1', 40, True], ['E2', 132, True], ['E3', 73, False], ['E4', 132, False], ['E5', 34, False]]}, [['E0', 129, 'posted'], ['E1', 40, 'posted'], ['E2', 132, 'posted'], ['E3', 73, 'posted'], ['E4', 132, 'posted'], ['E5', None, 'no_period']]], ['control 4', {'periods': [[1, 28, 'open'], [29, 56, 'closed']], 'policy': 'roll', 'entries': [['E0', 29, True], ['E1', 57, False], ['E2', 4, False], ['E3', 29, True]]}, [['E0', None, 'closed'], ['E1', None, 'no_period'], ['E2', 4, 'posted'], ['E3', None, 'closed']]], ['control 5', {'periods': [[98, 125, 'closed'], [63, 92, 'open'], [32, 62, 'closed'], [126, 155, 'open'], [1, 31, 'open']], 'policy': 'reject', 'entries': [['E0', 34, False], ['E1', 126, False], ['E2', 32, False]]}, [['E0', None, 'closed'], ['E1', 126, 'posted'], ['E2', None, 'closed']]], ['control 6', {'periods': [[1, 30, 'closed'], [36, 63, 'open']], 'policy': 'roll', 'entries': [['E0', 31, True], ['E1', 30, True], ['E2', 33, False]]}, [['E0', None, 'no_period'], ['E1', 36, 'rolled'], ['E2', None, 'no_period']]]]]
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: soft close adjusting gate[['E0', None, 'closed'], ['E1', None, 'closed'], ['E2', None, 'closed']][['E0', None, 'closed'], ['E1', None, 'closed'], ['E2', None, 'closed']]Passed
control 1[['E0', None, 'closed'], ['E1', None, 'closed'], ['E2', None, 'closed'], ['E3', None, 'closed'], ['E4', None, 'closed'], ['E5', None, 'closed']][['E0', None, 'closed'], ['E1', None, 'closed'], ['E2', None, 'closed'], ['E3', None, 'closed'], ['E4', None, 'closed'], ['E5', None, 'closed']]Passed
control 2[['E0', 29, 'posted'], ['E1', 58, 'posted'], ['E2', 58, 'posted'], ['E3', 29, 'posted']][['E0', 29, 'posted'], ['E1', 58, 'posted'], ['E2', 58, 'posted'], ['E3', 29, 'posted']]Passed
control 3[['E0', 4, 'posted'], ['E1', 64, 'posted'], ['E2', 92, 'posted'], ['E3', 63, 'posted']][['E0', 4, 'posted'], ['E1', 64, 'posted'], ['E2', 92, 'posted'], ['E3', 63, 'posted']]Passed
control 4[['E0', None, 'no_period'], ['E1', None, 'closed'], ['E2', None, 'no_period'], ['E3', None, 'closed'], ['E4', None, 'closed'], ['E5', None, 'closed']][['E0', None, 'no_period'], ['E1', None, 'closed'], ['E2', None, 'no_period'], ['E3', None, 'closed'], ['E4', None, 'closed'], ['E5', None, 'closed']]Passed
control 5[['E0', 34, 'posted'], ['E1', None, 'no_period'], ['E2', 30, 'posted'], ['E3', None, 'closed'], ['E4', 31, 'posted'], ['E5', None, 'closed']][['E0', 34, 'posted'], ['E1', None, 'no_period'], ['E2', 30, 'posted'], ['E3', None, 'closed'], ['E4', 31, 'posted'], ['E5', None, 'closed']]Passed
control 6[['E0', None, 'no_period'], ['E1', None, 'no_period'], ['E2', None, 'no_period'], ['E3', None, 'no_period'], ['E4', None, 'no_period'], ['E5', None, 'no_period']][['E0', None, 'no_period'], ['E1', None, 'no_period'], ['E2', None, 'no_period'], ['E3', None, 'no_period'], ['E4', None, 'no_period'], ['E5', None, 'no_period']]Passed

SHA-256 / a1e056744245cbe572de24e91b8c3f5a8424e62743c06c0776c2b5526d608998

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

Case digest / 107cbd2bed4fd2a33ce3d0a30afb1f4bb043fa8f1b232686b3f197209387bca8