FA-77576 / Legal deadline computation / Open access
Regulatory review clock with stop-clock pauses: pause length · case 01
The clock loses a day for every pause because the resume day is not counted.
ROOT CAUSE
The resume day is treated as part of the pause.
VERIFIED REPAIR
At the pause length decision use `(b - a).days`, leaving the other decision sites of the model unchanged.
Unsuccessful approach: The partial repair `(b - a).days - 1` counts the stop day itself as a clock day.
Case contract
Stipulated: a review has days_allowed clock days, counted from the day after start. A pause [stop, resume] stops the clock on the stop day and every day before the resume day; the resume day counts. A pause with resume None is open-ended and starts on its stop day; if the clock would reach a day on or after the earliest open-ended stop before expiring, the result is None. Return the date of the last clock day.
Why this case matters
Docketing systems compute filing and response deadlines from trigger events; a wrong date can forfeit a right.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
import datetime as dt
import calendar
N = 1
observations = []
def solve(start, days_allowed, pauses):
st = dt.date.fromisoformat(start)
paused = set()
open_ended = None
for a, b in pauses:
a = dt.date.fromisoformat(a)
if b is None:
open_ended = a if open_ended is None else min(open_ended, a)
continue
b = dt.date.fromisoformat(b)
for i in range((b - a).days + 1):
paused.add(a + dt.timedelta(days=i))
d = st
counted = 0
while counted < days_allowed:
d += dt.timedelta(days=1)
if open_ended is not None and d >= open_ended:
return None
if d in paused:
continue
counted += 1
return d.isoformat()
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: pause resume day counts', ['2024-01-01', 10, [['2024-01-04', '2024-01-08']]], '2024-01-15'),
('no pauses', ['2024-01-01', 30, []], '2024-01-31'),
('two open-ended stops', ['2024-01-01', 30, [['2024-01-20', None], ['2024-01-10', None]]], None),
('earlier open-ended listed first', ['2024-01-01', 12, [['2024-01-10', None], ['2024-01-20', None]]], None),
('open-ended after expiry', ['2024-01-01', 10, [['2024-01-20', None]]], '2024-01-11'),
('open-ended on last day', ['2024-01-01', 10, [['2024-01-11', None]]], None),
('open-ended the day after', ['2024-01-01', 10, [['2024-01-12', None]]], '2024-01-11')],
[('two open-ended stops', ['2024-01-01', 30, [['2024-01-20', None], ['2024-01-10', None]]], None),
('earlier open-ended listed first', ['2024-01-01', 12, [['2024-01-10', None], ['2024-01-20', None]]], None),
('open-ended after expiry', ['2024-01-01', 10, [['2024-01-20', None]]], '2024-01-11'),
('open-ended on last day', ['2024-01-01', 10, [['2024-01-11', None]]], None),
('open-ended the day after', ['2024-01-01', 10, [['2024-01-12', None]]], '2024-01-11'),
('overlapping pauses',
['2024-02-01', 15, [['2024-02-05', '2024-02-10'], ['2024-02-08', '2024-02-12']]],
'2024-02-23'),
('pause before start', ['2024-03-10', 5, [['2024-03-01', '2024-03-05']]], '2024-03-15')],
[('open-ended after expiry', ['2024-01-01', 10, [['2024-01-20', None]]], '2024-01-11'),
('open-ended on last day', ['2024-01-01', 10, [['2024-01-11', None]]], None),
('open-ended the day after', ['2024-01-01', 10, [['2024-01-12', None]]], '2024-01-11'),
('overlapping pauses',
['2024-02-01', 15, [['2024-02-05', '2024-02-10'], ['2024-02-08', '2024-02-12']]],
'2024-02-23'),
('pause before start', ['2024-03-10', 5, [['2024-03-01', '2024-03-05']]], '2024-03-15'),
('weekday start', ['2024-04-02', 7, []], '2024-04-09'),
('saturday start', ['2024-04-06', 7, [['2024-04-08', '2024-04-09']]], '2024-04-14')],
[('open-ended the day after', ['2024-01-01', 10, [['2024-01-12', None]]], '2024-01-11'),
('overlapping pauses',
['2024-02-01', 15, [['2024-02-05', '2024-02-10'], ['2024-02-08', '2024-02-12']]],
'2024-02-23'),
('pause before start', ['2024-03-10', 5, [['2024-03-01', '2024-03-05']]], '2024-03-15'),
('weekday start', ['2024-04-02', 7, []], '2024-04-09'),
('saturday start', ['2024-04-06', 7, [['2024-04-08', '2024-04-09']]], '2024-04-14'),
('pause then open-ended', ['2024-05-01', 20, [['2024-05-05', '2024-05-15'], ['2024-05-25', None]]], None),
('open-ended pushed by pause',
['2024-06-01', 10, [['2024-06-03', '2024-06-06'], ['2024-06-14', None]]],
None)],
[('pause before start', ['2024-03-10', 5, [['2024-03-01', '2024-03-05']]], '2024-03-15'),
('weekday start', ['2024-04-02', 7, []], '2024-04-09'),
('saturday start', ['2024-04-06', 7, [['2024-04-08', '2024-04-09']]], '2024-04-14'),
('pause then open-ended', ['2024-05-01', 20, [['2024-05-05', '2024-05-15'], ['2024-05-25', None]]], None),
('open-ended pushed by pause',
['2024-06-01', 10, [['2024-06-03', '2024-06-06'], ['2024-06-14', None]]],
None),
('regression: pause resume day counts', ['2024-01-01', 10, [['2024-01-04', '2024-01-08']]], '2024-01-15'),
('no pauses', ['2024-01-01', 30, []], '2024-01-31')]]
for label, args, expected in fixtures[N-1]:
check(label, solve(*args), 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: pause resume day counts | 2024-01-16 | 2024-01-15 | Failed |
| no pauses | 2024-01-31 | 2024-01-31 | Passed |
| two open-ended stops | None | None | Passed |
| earlier open-ended listed first | None | None | Passed |
| open-ended after expiry | 2024-01-11 | 2024-01-11 | Passed |
| open-ended on last day | None | None | Passed |
| open-ended the day after | 2024-01-11 | 2024-01-11 | Passed |
SHA-256 / 1a87033fba745888acf680cb8ecbaf6f67f372941f2f31cc756f2902cabd61bb
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
import datetime as dt
import calendar
N = 1
observations = []
def solve(start, days_allowed, pauses):
st = dt.date.fromisoformat(start)
paused = set()
open_ended = None
for a, b in pauses:
a = dt.date.fromisoformat(a)
if b is None:
open_ended = a if open_ended is None else min(open_ended, a)
continue
b = dt.date.fromisoformat(b)
for i in range((b - a).days - 1):
paused.add(a + dt.timedelta(days=i))
d = st
counted = 0
while counted < days_allowed:
d += dt.timedelta(days=1)
if open_ended is not None and d >= open_ended:
return None
if d in paused:
continue
counted += 1
return d.isoformat()
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: pause resume day counts', ['2024-01-01', 10, [['2024-01-04', '2024-01-08']]], '2024-01-15'),
('no pauses', ['2024-01-01', 30, []], '2024-01-31'),
('two open-ended stops', ['2024-01-01', 30, [['2024-01-20', None], ['2024-01-10', None]]], None),
('earlier open-ended listed first', ['2024-01-01', 12, [['2024-01-10', None], ['2024-01-20', None]]], None),
('open-ended after expiry', ['2024-01-01', 10, [['2024-01-20', None]]], '2024-01-11'),
('open-ended on last day', ['2024-01-01', 10, [['2024-01-11', None]]], None),
('open-ended the day after', ['2024-01-01', 10, [['2024-01-12', None]]], '2024-01-11')],
[('two open-ended stops', ['2024-01-01', 30, [['2024-01-20', None], ['2024-01-10', None]]], None),
('earlier open-ended listed first', ['2024-01-01', 12, [['2024-01-10', None], ['2024-01-20', None]]], None),
('open-ended after expiry', ['2024-01-01', 10, [['2024-01-20', None]]], '2024-01-11'),
('open-ended on last day', ['2024-01-01', 10, [['2024-01-11', None]]], None),
('open-ended the day after', ['2024-01-01', 10, [['2024-01-12', None]]], '2024-01-11'),
('overlapping pauses',
['2024-02-01', 15, [['2024-02-05', '2024-02-10'], ['2024-02-08', '2024-02-12']]],
'2024-02-23'),
('pause before start', ['2024-03-10', 5, [['2024-03-01', '2024-03-05']]], '2024-03-15')],
[('open-ended after expiry', ['2024-01-01', 10, [['2024-01-20', None]]], '2024-01-11'),
('open-ended on last day', ['2024-01-01', 10, [['2024-01-11', None]]], None),
('open-ended the day after', ['2024-01-01', 10, [['2024-01-12', None]]], '2024-01-11'),
('overlapping pauses',
['2024-02-01', 15, [['2024-02-05', '2024-02-10'], ['2024-02-08', '2024-02-12']]],
'2024-02-23'),
('pause before start', ['2024-03-10', 5, [['2024-03-01', '2024-03-05']]], '2024-03-15'),
('weekday start', ['2024-04-02', 7, []], '2024-04-09'),
('saturday start', ['2024-04-06', 7, [['2024-04-08', '2024-04-09']]], '2024-04-14')],
[('open-ended the day after', ['2024-01-01', 10, [['2024-01-12', None]]], '2024-01-11'),
('overlapping pauses',
['2024-02-01', 15, [['2024-02-05', '2024-02-10'], ['2024-02-08', '2024-02-12']]],
'2024-02-23'),
('pause before start', ['2024-03-10', 5, [['2024-03-01', '2024-03-05']]], '2024-03-15'),
('weekday start', ['2024-04-02', 7, []], '2024-04-09'),
('saturday start', ['2024-04-06', 7, [['2024-04-08', '2024-04-09']]], '2024-04-14'),
('pause then open-ended', ['2024-05-01', 20, [['2024-05-05', '2024-05-15'], ['2024-05-25', None]]], None),
('open-ended pushed by pause',
['2024-06-01', 10, [['2024-06-03', '2024-06-06'], ['2024-06-14', None]]],
None)],
[('pause before start', ['2024-03-10', 5, [['2024-03-01', '2024-03-05']]], '2024-03-15'),
('weekday start', ['2024-04-02', 7, []], '2024-04-09'),
('saturday start', ['2024-04-06', 7, [['2024-04-08', '2024-04-09']]], '2024-04-14'),
('pause then open-ended', ['2024-05-01', 20, [['2024-05-05', '2024-05-15'], ['2024-05-25', None]]], None),
('open-ended pushed by pause',
['2024-06-01', 10, [['2024-06-03', '2024-06-06'], ['2024-06-14', None]]],
None),
('regression: pause resume day counts', ['2024-01-01', 10, [['2024-01-04', '2024-01-08']]], '2024-01-15'),
('no pauses', ['2024-01-01', 30, []], '2024-01-31')]]
for label, args, expected in fixtures[N-1]:
check(label, solve(*args), 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: pause resume day counts | 2024-01-14 | 2024-01-15 | Failed |
| no pauses | 2024-01-31 | 2024-01-31 | Passed |
| two open-ended stops | None | None | Passed |
| earlier open-ended listed first | None | None | Passed |
| open-ended after expiry | 2024-01-11 | 2024-01-11 | Passed |
| open-ended on last day | None | None | Passed |
| open-ended the day after | 2024-01-11 | 2024-01-11 | Passed |
SHA-256 / 5d18d04fe8c8bd3af6d53e1e657f5f6140b25f16db37150d9df00d4e6f8bb9b8
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
import datetime as dt
import calendar
N = 1
observations = []
def solve(start, days_allowed, pauses):
st = dt.date.fromisoformat(start)
paused = set()
open_ended = None
for a, b in pauses:
a = dt.date.fromisoformat(a)
if b is None:
open_ended = a if open_ended is None else min(open_ended, a)
continue
b = dt.date.fromisoformat(b)
for i in range((b - a).days):
paused.add(a + dt.timedelta(days=i))
d = st
counted = 0
while counted < days_allowed:
d += dt.timedelta(days=1)
if open_ended is not None and d >= open_ended:
return None
if d in paused:
continue
counted += 1
return d.isoformat()
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: pause resume day counts', ['2024-01-01', 10, [['2024-01-04', '2024-01-08']]], '2024-01-15'),
('no pauses', ['2024-01-01', 30, []], '2024-01-31'),
('two open-ended stops', ['2024-01-01', 30, [['2024-01-20', None], ['2024-01-10', None]]], None),
('earlier open-ended listed first', ['2024-01-01', 12, [['2024-01-10', None], ['2024-01-20', None]]], None),
('open-ended after expiry', ['2024-01-01', 10, [['2024-01-20', None]]], '2024-01-11'),
('open-ended on last day', ['2024-01-01', 10, [['2024-01-11', None]]], None),
('open-ended the day after', ['2024-01-01', 10, [['2024-01-12', None]]], '2024-01-11')],
[('two open-ended stops', ['2024-01-01', 30, [['2024-01-20', None], ['2024-01-10', None]]], None),
('earlier open-ended listed first', ['2024-01-01', 12, [['2024-01-10', None], ['2024-01-20', None]]], None),
('open-ended after expiry', ['2024-01-01', 10, [['2024-01-20', None]]], '2024-01-11'),
('open-ended on last day', ['2024-01-01', 10, [['2024-01-11', None]]], None),
('open-ended the day after', ['2024-01-01', 10, [['2024-01-12', None]]], '2024-01-11'),
('overlapping pauses',
['2024-02-01', 15, [['2024-02-05', '2024-02-10'], ['2024-02-08', '2024-02-12']]],
'2024-02-23'),
('pause before start', ['2024-03-10', 5, [['2024-03-01', '2024-03-05']]], '2024-03-15')],
[('open-ended after expiry', ['2024-01-01', 10, [['2024-01-20', None]]], '2024-01-11'),
('open-ended on last day', ['2024-01-01', 10, [['2024-01-11', None]]], None),
('open-ended the day after', ['2024-01-01', 10, [['2024-01-12', None]]], '2024-01-11'),
('overlapping pauses',
['2024-02-01', 15, [['2024-02-05', '2024-02-10'], ['2024-02-08', '2024-02-12']]],
'2024-02-23'),
('pause before start', ['2024-03-10', 5, [['2024-03-01', '2024-03-05']]], '2024-03-15'),
('weekday start', ['2024-04-02', 7, []], '2024-04-09'),
('saturday start', ['2024-04-06', 7, [['2024-04-08', '2024-04-09']]], '2024-04-14')],
[('open-ended the day after', ['2024-01-01', 10, [['2024-01-12', None]]], '2024-01-11'),
('overlapping pauses',
['2024-02-01', 15, [['2024-02-05', '2024-02-10'], ['2024-02-08', '2024-02-12']]],
'2024-02-23'),
('pause before start', ['2024-03-10', 5, [['2024-03-01', '2024-03-05']]], '2024-03-15'),
('weekday start', ['2024-04-02', 7, []], '2024-04-09'),
('saturday start', ['2024-04-06', 7, [['2024-04-08', '2024-04-09']]], '2024-04-14'),
('pause then open-ended', ['2024-05-01', 20, [['2024-05-05', '2024-05-15'], ['2024-05-25', None]]], None),
('open-ended pushed by pause',
['2024-06-01', 10, [['2024-06-03', '2024-06-06'], ['2024-06-14', None]]],
None)],
[('pause before start', ['2024-03-10', 5, [['2024-03-01', '2024-03-05']]], '2024-03-15'),
('weekday start', ['2024-04-02', 7, []], '2024-04-09'),
('saturday start', ['2024-04-06', 7, [['2024-04-08', '2024-04-09']]], '2024-04-14'),
('pause then open-ended', ['2024-05-01', 20, [['2024-05-05', '2024-05-15'], ['2024-05-25', None]]], None),
('open-ended pushed by pause',
['2024-06-01', 10, [['2024-06-03', '2024-06-06'], ['2024-06-14', None]]],
None),
('regression: pause resume day counts', ['2024-01-01', 10, [['2024-01-04', '2024-01-08']]], '2024-01-15'),
('no pauses', ['2024-01-01', 30, []], '2024-01-31')]]
for label, args, expected in fixtures[N-1]:
check(label, solve(*args), 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: pause resume day counts | 2024-01-15 | 2024-01-15 | Passed |
| no pauses | 2024-01-31 | 2024-01-31 | Passed |
| two open-ended stops | None | None | Passed |
| earlier open-ended listed first | None | None | Passed |
| open-ended after expiry | 2024-01-11 | 2024-01-11 | Passed |
| open-ended on last day | None | None | Passed |
| open-ended the day after | 2024-01-11 | 2024-01-11 | Passed |
SHA-256 / 1883e514e522c711910e6d8dd8ec4d2fea0c80f39e1b89429d7116c337ef878c
Verification & scope
Stipulated toy deadline rules evaluated offline on explicit fixtures. The contract is inspired by common court-rule structures but is not legal advice and makes no claim to reproduce any jurisdiction's rules. 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:49:27.029728+00:00.
Case digest / 96f9cb3dacb7fca014968e95a4b1313e9882000b480b1bc30af291bc4e851a47