FA-77191 / Calendar recurrence rules / Open access
Pending alarms for a recurring timed series: late catchup · case 01
A missed alarm for a meeting that has not started yet is silently dropped.
ROOT CAUSE
Missed alarms are only caught up within a fixed 15 minute grace window.
THE FAILURE
Missed alarms are only caught up within a fixed 15 minute grace window.
Unsuccessful approach: The partial repair `s >= now_t` also catches up an occurrence starting exactly now, which the contract treats as started.
Case contract
Occurrences start at dtstart + k*interval_hours for k < count. Each has one alarm at start + trigger_min minutes (negative means before the start). Occurrences whose start string (YYYY-MM-DDTHH:MM) is in acknowledged have no alarm. An alarm due at or before now is delivered at now if the occurrence has not started yet (start > now), otherwise dropped. Alarms due after now + horizon_hours are not scheduled. Return [occurrence_start, fire_time] pairs in series order.
Why this case matters
Recurring calendar series are expanded into concrete instances for display, reminders and conflict checks.
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(dtstart, interval_hours, count, trigger_min, acknowledged, now, horizon_hours):
first = dt.datetime.fromisoformat(dtstart)
now_t = dt.datetime.fromisoformat(now)
acked = set(acknowledged)
end = now_t + dt.timedelta(hours=horizon_hours)
out = []
for k in range(count):
s = first + dt.timedelta(hours=k * interval_hours)
fire = s + dt.timedelta(minutes=trigger_min)
if fire > end:
break
if s.isoformat(timespec='minutes') in acked:
continue
if fire <= now_t:
if fire > now_t - dt.timedelta(minutes=15):
fire = now_t
else:
continue
out.append([s.isoformat(timespec='minutes'), fire.isoformat(timespec='minutes')])
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: negative trigger',
['2024-01-01T09:00', 24, 3, -15, [], '2024-01-01T00:00', 72],
[['2024-01-01T09:00', '2024-01-01T08:45'],
['2024-01-02T09:00', '2024-01-02T08:45'],
['2024-01-03T09:00', '2024-01-03T08:45']]),
('positive trigger',
['2024-01-01T09:00', 24, 3, 10, [], '2024-01-01T00:00', 72],
[['2024-01-01T09:00', '2024-01-01T09:10'],
['2024-01-02T09:00', '2024-01-02T09:10'],
['2024-01-03T09:00', '2024-01-03T09:10']]),
('horizon edge with lead time',
['2024-01-01T10:00', 1, 6, -60, [], '2024-01-01T08:00', 4],
[['2024-01-01T10:00', '2024-01-01T09:00'],
['2024-01-01T11:00', '2024-01-01T10:00'],
['2024-01-01T12:00', '2024-01-01T11:00'],
['2024-01-01T13:00', '2024-01-01T12:00']]),
('horizon exact',
['2024-01-01T10:00', 2, 5, 0, [], '2024-01-01T08:00', 4],
[['2024-01-01T10:00', '2024-01-01T10:00'], ['2024-01-01T12:00', '2024-01-01T12:00']]),
('acknowledged occurrence',
['2024-01-01T09:00', 4, 4, -30, ['2024-01-01T13:00'], '2024-01-01T00:00', 48],
[['2024-01-01T09:00', '2024-01-01T08:30'],
['2024-01-01T17:00', '2024-01-01T16:30'],
['2024-01-01T21:00', '2024-01-01T20:30']]),
('missed alarm catch-up',
['2024-01-01T09:00', 24, 2, -120, [], '2024-01-01T08:30', 48],
[['2024-01-01T09:00', '2024-01-01T08:30'], ['2024-01-02T09:00', '2024-01-02T07:00']]),
('missed long before start',
['2024-01-01T12:00', 24, 2, -1440, [], '2024-01-01T09:00', 48],
[['2024-01-01T12:00', '2024-01-01T09:00'], ['2024-01-02T12:00', '2024-01-01T12:00']]),
('occurrence starting now',
['2024-01-01T09:00', 24, 2, -10, [], '2024-01-01T09:00', 48],
[['2024-01-02T09:00', '2024-01-02T08:50']])],
[('horizon edge with lead time',
['2024-01-01T10:00', 1, 6, -60, [], '2024-01-01T08:00', 4],
[['2024-01-01T10:00', '2024-01-01T09:00'],
['2024-01-01T11:00', '2024-01-01T10:00'],
['2024-01-01T12:00', '2024-01-01T11:00'],
['2024-01-01T13:00', '2024-01-01T12:00']]),
('horizon exact',
['2024-01-01T10:00', 2, 5, 0, [], '2024-01-01T08:00', 4],
[['2024-01-01T10:00', '2024-01-01T10:00'], ['2024-01-01T12:00', '2024-01-01T12:00']]),
('acknowledged occurrence',
['2024-01-01T09:00', 4, 4, -30, ['2024-01-01T13:00'], '2024-01-01T00:00', 48],
[['2024-01-01T09:00', '2024-01-01T08:30'],
['2024-01-01T17:00', '2024-01-01T16:30'],
['2024-01-01T21:00', '2024-01-01T20:30']]),
('missed alarm catch-up',
['2024-01-01T09:00', 24, 2, -120, [], '2024-01-01T08:30', 48],
[['2024-01-01T09:00', '2024-01-01T08:30'], ['2024-01-02T09:00', '2024-01-02T07:00']]),
('missed long before start',
['2024-01-01T12:00', 24, 2, -1440, [], '2024-01-01T09:00', 48],
[['2024-01-01T12:00', '2024-01-01T09:00'], ['2024-01-02T12:00', '2024-01-01T12:00']]),
('occurrence starting now',
['2024-01-01T09:00', 24, 2, -10, [], '2024-01-01T09:00', 48],
[['2024-01-02T09:00', '2024-01-02T08:50']]),
('started occurrence dropped',
['2024-01-01T09:00', 1, 4, -5, [], '2024-01-01T10:30', 4],
[['2024-01-01T11:00', '2024-01-01T10:55'], ['2024-01-01T12:00', '2024-01-01T11:55']])],
[('acknowledged occurrence',
['2024-01-01T09:00', 4, 4, -30, ['2024-01-01T13:00'], '2024-01-01T00:00', 48],
[['2024-01-01T09:00', '2024-01-01T08:30'],
['2024-01-01T17:00', '2024-01-01T16:30'],
['2024-01-01T21:00', '2024-01-01T20:30']]),
('missed alarm catch-up',
['2024-01-01T09:00', 24, 2, -120, [], '2024-01-01T08:30', 48],
[['2024-01-01T09:00', '2024-01-01T08:30'], ['2024-01-02T09:00', '2024-01-02T07:00']]),
('missed long before start',
['2024-01-01T12:00', 24, 2, -1440, [], '2024-01-01T09:00', 48],
[['2024-01-01T12:00', '2024-01-01T09:00'], ['2024-01-02T12:00', '2024-01-01T12:00']]),
('occurrence starting now',
['2024-01-01T09:00', 24, 2, -10, [], '2024-01-01T09:00', 48],
[['2024-01-02T09:00', '2024-01-02T08:50']]),
('started occurrence dropped',
['2024-01-01T09:00', 1, 4, -5, [], '2024-01-01T10:30', 4],
[['2024-01-01T11:00', '2024-01-01T10:55'], ['2024-01-01T12:00', '2024-01-01T11:55']]),
('ack and catch-up mix',
['2024-02-01T09:00', 3, 4, -240, ['2024-02-01T12:00'], '2024-02-01T08:00', 12],
[['2024-02-01T09:00', '2024-02-01T08:00'],
['2024-02-01T15:00', '2024-02-01T11:00'],
['2024-02-01T18:00', '2024-02-01T14:00']]),
('zero trigger all future',
['2024-03-01T06:00', 6, 3, 0, ['2024-03-01T06:00'], '2024-03-01T00:00', 24],
[['2024-03-01T12:00', '2024-03-01T12:00'], ['2024-03-01T18:00', '2024-03-01T18:00']])],
[('missed long before start',
['2024-01-01T12:00', 24, 2, -1440, [], '2024-01-01T09:00', 48],
[['2024-01-01T12:00', '2024-01-01T09:00'], ['2024-01-02T12:00', '2024-01-01T12:00']]),
('occurrence starting now',
['2024-01-01T09:00', 24, 2, -10, [], '2024-01-01T09:00', 48],
[['2024-01-02T09:00', '2024-01-02T08:50']]),
('started occurrence dropped',
['2024-01-01T09:00', 1, 4, -5, [], '2024-01-01T10:30', 4],
[['2024-01-01T11:00', '2024-01-01T10:55'], ['2024-01-01T12:00', '2024-01-01T11:55']]),
('ack and catch-up mix',
['2024-02-01T09:00', 3, 4, -240, ['2024-02-01T12:00'], '2024-02-01T08:00', 12],
[['2024-02-01T09:00', '2024-02-01T08:00'],
['2024-02-01T15:00', '2024-02-01T11:00'],
['2024-02-01T18:00', '2024-02-01T14:00']]),
('zero trigger all future',
['2024-03-01T06:00', 6, 3, 0, ['2024-03-01T06:00'], '2024-03-01T00:00', 24],
[['2024-03-01T12:00', '2024-03-01T12:00'], ['2024-03-01T18:00', '2024-03-01T18:00']]),
('regression: negative trigger',
['2024-01-01T09:00', 24, 3, -15, [], '2024-01-01T00:00', 72],
[['2024-01-01T09:00', '2024-01-01T08:45'],
['2024-01-02T09:00', '2024-01-02T08:45'],
['2024-01-03T09:00', '2024-01-03T08:45']]),
('positive trigger',
['2024-01-01T09:00', 24, 3, 10, [], '2024-01-01T00:00', 72],
[['2024-01-01T09:00', '2024-01-01T09:10'],
['2024-01-02T09:00', '2024-01-02T09:10'],
['2024-01-03T09:00', '2024-01-03T09:10']])],
[('started occurrence dropped',
['2024-01-01T09:00', 1, 4, -5, [], '2024-01-01T10:30', 4],
[['2024-01-01T11:00', '2024-01-01T10:55'], ['2024-01-01T12:00', '2024-01-01T11:55']]),
('ack and catch-up mix',
['2024-02-01T09:00', 3, 4, -240, ['2024-02-01T12:00'], '2024-02-01T08:00', 12],
[['2024-02-01T09:00', '2024-02-01T08:00'],
['2024-02-01T15:00', '2024-02-01T11:00'],
['2024-02-01T18:00', '2024-02-01T14:00']]),
('zero trigger all future',
['2024-03-01T06:00', 6, 3, 0, ['2024-03-01T06:00'], '2024-03-01T00:00', 24],
[['2024-03-01T12:00', '2024-03-01T12:00'], ['2024-03-01T18:00', '2024-03-01T18:00']]),
('regression: negative trigger',
['2024-01-01T09:00', 24, 3, -15, [], '2024-01-01T00:00', 72],
[['2024-01-01T09:00', '2024-01-01T08:45'],
['2024-01-02T09:00', '2024-01-02T08:45'],
['2024-01-03T09:00', '2024-01-03T08:45']]),
('positive trigger',
['2024-01-01T09:00', 24, 3, 10, [], '2024-01-01T00:00', 72],
[['2024-01-01T09:00', '2024-01-01T09:10'],
['2024-01-02T09:00', '2024-01-02T09:10'],
['2024-01-03T09:00', '2024-01-03T09:10']]),
('horizon edge with lead time',
['2024-01-01T10:00', 1, 6, -60, [], '2024-01-01T08:00', 4],
[['2024-01-01T10:00', '2024-01-01T09:00'],
['2024-01-01T11:00', '2024-01-01T10:00'],
['2024-01-01T12:00', '2024-01-01T11:00'],
['2024-01-01T13:00', '2024-01-01T12:00']]),
('horizon exact',
['2024-01-01T10:00', 2, 5, 0, [], '2024-01-01T08:00', 4],
[['2024-01-01T10:00', '2024-01-01T10:00'], ['2024-01-01T12:00', '2024-01-01T12:00']]),
('occurrence starting now',
['2024-01-01T09:00', 24, 2, -10, [], '2024-01-01T09:00', 48],
[['2024-01-02T09:00', '2024-01-02T08:50']])]]
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: negative trigger | [['2024-01-01T09:00', '2024-01-01T08:45'], ['2024-01-02T09:00', '2024-01-02T08:45'], ['2024-01-03T09:00', '2024-01-03T08:45']] | [['2024-01-01T09:00', '2024-01-01T08:45'], ['2024-01-02T09:00', '2024-01-02T08:45'], ['2024-01-03T09:00', '2024-01-03T08:45']] | Passed |
| positive trigger | [['2024-01-01T09:00', '2024-01-01T09:10'], ['2024-01-02T09:00', '2024-01-02T09:10'], ['2024-01-03T09:00', '2024-01-03T09:10']] | [['2024-01-01T09:00', '2024-01-01T09:10'], ['2024-01-02T09:00', '2024-01-02T09:10'], ['2024-01-03T09:00', '2024-01-03T09:10']] | Passed |
| horizon edge with lead time | [['2024-01-01T10:00', '2024-01-01T09:00'], ['2024-01-01T11:00', '2024-01-01T10:00'], ['2024-01-01T12:00', '2024-01-01T11:00'], ['2024-01-01T13:00', '2024-01-01T12:00']] | [['2024-01-01T10:00', '2024-01-01T09:00'], ['2024-01-01T11:00', '2024-01-01T10:00'], ['2024-01-01T12:00', '2024-01-01T11:00'], ['2024-01-01T13:00', '2024-01-01T12:00']] | Passed |
| horizon exact | [['2024-01-01T10:00', '2024-01-01T10:00'], ['2024-01-01T12:00', '2024-01-01T12:00']] | [['2024-01-01T10:00', '2024-01-01T10:00'], ['2024-01-01T12:00', '2024-01-01T12:00']] | Passed |
| acknowledged occurrence | [['2024-01-01T09:00', '2024-01-01T08:30'], ['2024-01-01T17:00', '2024-01-01T16:30'], ['2024-01-01T21:00', '2024-01-01T20:30']] | [['2024-01-01T09:00', '2024-01-01T08:30'], ['2024-01-01T17:00', '2024-01-01T16:30'], ['2024-01-01T21:00', '2024-01-01T20:30']] | Passed |
| missed alarm catch-up | [['2024-01-02T09:00', '2024-01-02T07:00']] | [['2024-01-01T09:00', '2024-01-01T08:30'], ['2024-01-02T09:00', '2024-01-02T07:00']] | Failed |
| missed long before start | [['2024-01-02T12:00', '2024-01-01T12:00']] | [['2024-01-01T12:00', '2024-01-01T09:00'], ['2024-01-02T12:00', '2024-01-01T12:00']] | Failed |
| occurrence starting now | [['2024-01-01T09:00', '2024-01-01T09:00'], ['2024-01-02T09:00', '2024-01-02T08:50']] | [['2024-01-02T09:00', '2024-01-02T08:50']] | Failed |
SHA-256 / 9038832f8706e1a86eab191d16300c930a3a90baaea726f027768b58dc9e66e7
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(dtstart, interval_hours, count, trigger_min, acknowledged, now, horizon_hours):
first = dt.datetime.fromisoformat(dtstart)
now_t = dt.datetime.fromisoformat(now)
acked = set(acknowledged)
end = now_t + dt.timedelta(hours=horizon_hours)
out = []
for k in range(count):
s = first + dt.timedelta(hours=k * interval_hours)
fire = s + dt.timedelta(minutes=trigger_min)
if fire > end:
break
if s.isoformat(timespec='minutes') in acked:
continue
if fire <= now_t:
if s >= now_t:
fire = now_t
else:
continue
out.append([s.isoformat(timespec='minutes'), fire.isoformat(timespec='minutes')])
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: negative trigger',
['2024-01-01T09:00', 24, 3, -15, [], '2024-01-01T00:00', 72],
[['2024-01-01T09:00', '2024-01-01T08:45'],
['2024-01-02T09:00', '2024-01-02T08:45'],
['2024-01-03T09:00', '2024-01-03T08:45']]),
('positive trigger',
['2024-01-01T09:00', 24, 3, 10, [], '2024-01-01T00:00', 72],
[['2024-01-01T09:00', '2024-01-01T09:10'],
['2024-01-02T09:00', '2024-01-02T09:10'],
['2024-01-03T09:00', '2024-01-03T09:10']]),
('horizon edge with lead time',
['2024-01-01T10:00', 1, 6, -60, [], '2024-01-01T08:00', 4],
[['2024-01-01T10:00', '2024-01-01T09:00'],
['2024-01-01T11:00', '2024-01-01T10:00'],
['2024-01-01T12:00', '2024-01-01T11:00'],
['2024-01-01T13:00', '2024-01-01T12:00']]),
('horizon exact',
['2024-01-01T10:00', 2, 5, 0, [], '2024-01-01T08:00', 4],
[['2024-01-01T10:00', '2024-01-01T10:00'], ['2024-01-01T12:00', '2024-01-01T12:00']]),
('acknowledged occurrence',
['2024-01-01T09:00', 4, 4, -30, ['2024-01-01T13:00'], '2024-01-01T00:00', 48],
[['2024-01-01T09:00', '2024-01-01T08:30'],
['2024-01-01T17:00', '2024-01-01T16:30'],
['2024-01-01T21:00', '2024-01-01T20:30']]),
('missed alarm catch-up',
['2024-01-01T09:00', 24, 2, -120, [], '2024-01-01T08:30', 48],
[['2024-01-01T09:00', '2024-01-01T08:30'], ['2024-01-02T09:00', '2024-01-02T07:00']]),
('missed long before start',
['2024-01-01T12:00', 24, 2, -1440, [], '2024-01-01T09:00', 48],
[['2024-01-01T12:00', '2024-01-01T09:00'], ['2024-01-02T12:00', '2024-01-01T12:00']]),
('occurrence starting now',
['2024-01-01T09:00', 24, 2, -10, [], '2024-01-01T09:00', 48],
[['2024-01-02T09:00', '2024-01-02T08:50']])],
[('horizon edge with lead time',
['2024-01-01T10:00', 1, 6, -60, [], '2024-01-01T08:00', 4],
[['2024-01-01T10:00', '2024-01-01T09:00'],
['2024-01-01T11:00', '2024-01-01T10:00'],
['2024-01-01T12:00', '2024-01-01T11:00'],
['2024-01-01T13:00', '2024-01-01T12:00']]),
('horizon exact',
['2024-01-01T10:00', 2, 5, 0, [], '2024-01-01T08:00', 4],
[['2024-01-01T10:00', '2024-01-01T10:00'], ['2024-01-01T12:00', '2024-01-01T12:00']]),
('acknowledged occurrence',
['2024-01-01T09:00', 4, 4, -30, ['2024-01-01T13:00'], '2024-01-01T00:00', 48],
[['2024-01-01T09:00', '2024-01-01T08:30'],
['2024-01-01T17:00', '2024-01-01T16:30'],
['2024-01-01T21:00', '2024-01-01T20:30']]),
('missed alarm catch-up',
['2024-01-01T09:00', 24, 2, -120, [], '2024-01-01T08:30', 48],
[['2024-01-01T09:00', '2024-01-01T08:30'], ['2024-01-02T09:00', '2024-01-02T07:00']]),
('missed long before start',
['2024-01-01T12:00', 24, 2, -1440, [], '2024-01-01T09:00', 48],
[['2024-01-01T12:00', '2024-01-01T09:00'], ['2024-01-02T12:00', '2024-01-01T12:00']]),
('occurrence starting now',
['2024-01-01T09:00', 24, 2, -10, [], '2024-01-01T09:00', 48],
[['2024-01-02T09:00', '2024-01-02T08:50']]),
('started occurrence dropped',
['2024-01-01T09:00', 1, 4, -5, [], '2024-01-01T10:30', 4],
[['2024-01-01T11:00', '2024-01-01T10:55'], ['2024-01-01T12:00', '2024-01-01T11:55']])],
[('acknowledged occurrence',
['2024-01-01T09:00', 4, 4, -30, ['2024-01-01T13:00'], '2024-01-01T00:00', 48],
[['2024-01-01T09:00', '2024-01-01T08:30'],
['2024-01-01T17:00', '2024-01-01T16:30'],
['2024-01-01T21:00', '2024-01-01T20:30']]),
('missed alarm catch-up',
['2024-01-01T09:00', 24, 2, -120, [], '2024-01-01T08:30', 48],
[['2024-01-01T09:00', '2024-01-01T08:30'], ['2024-01-02T09:00', '2024-01-02T07:00']]),
('missed long before start',
['2024-01-01T12:00', 24, 2, -1440, [], '2024-01-01T09:00', 48],
[['2024-01-01T12:00', '2024-01-01T09:00'], ['2024-01-02T12:00', '2024-01-01T12:00']]),
('occurrence starting now',
['2024-01-01T09:00', 24, 2, -10, [], '2024-01-01T09:00', 48],
[['2024-01-02T09:00', '2024-01-02T08:50']]),
('started occurrence dropped',
['2024-01-01T09:00', 1, 4, -5, [], '2024-01-01T10:30', 4],
[['2024-01-01T11:00', '2024-01-01T10:55'], ['2024-01-01T12:00', '2024-01-01T11:55']]),
('ack and catch-up mix',
['2024-02-01T09:00', 3, 4, -240, ['2024-02-01T12:00'], '2024-02-01T08:00', 12],
[['2024-02-01T09:00', '2024-02-01T08:00'],
['2024-02-01T15:00', '2024-02-01T11:00'],
['2024-02-01T18:00', '2024-02-01T14:00']]),
('zero trigger all future',
['2024-03-01T06:00', 6, 3, 0, ['2024-03-01T06:00'], '2024-03-01T00:00', 24],
[['2024-03-01T12:00', '2024-03-01T12:00'], ['2024-03-01T18:00', '2024-03-01T18:00']])],
[('missed long before start',
['2024-01-01T12:00', 24, 2, -1440, [], '2024-01-01T09:00', 48],
[['2024-01-01T12:00', '2024-01-01T09:00'], ['2024-01-02T12:00', '2024-01-01T12:00']]),
('occurrence starting now',
['2024-01-01T09:00', 24, 2, -10, [], '2024-01-01T09:00', 48],
[['2024-01-02T09:00', '2024-01-02T08:50']]),
('started occurrence dropped',
['2024-01-01T09:00', 1, 4, -5, [], '2024-01-01T10:30', 4],
[['2024-01-01T11:00', '2024-01-01T10:55'], ['2024-01-01T12:00', '2024-01-01T11:55']]),
('ack and catch-up mix',
['2024-02-01T09:00', 3, 4, -240, ['2024-02-01T12:00'], '2024-02-01T08:00', 12],
[['2024-02-01T09:00', '2024-02-01T08:00'],
['2024-02-01T15:00', '2024-02-01T11:00'],
['2024-02-01T18:00', '2024-02-01T14:00']]),
('zero trigger all future',
['2024-03-01T06:00', 6, 3, 0, ['2024-03-01T06:00'], '2024-03-01T00:00', 24],
[['2024-03-01T12:00', '2024-03-01T12:00'], ['2024-03-01T18:00', '2024-03-01T18:00']]),
('regression: negative trigger',
['2024-01-01T09:00', 24, 3, -15, [], '2024-01-01T00:00', 72],
[['2024-01-01T09:00', '2024-01-01T08:45'],
['2024-01-02T09:00', '2024-01-02T08:45'],
['2024-01-03T09:00', '2024-01-03T08:45']]),
('positive trigger',
['2024-01-01T09:00', 24, 3, 10, [], '2024-01-01T00:00', 72],
[['2024-01-01T09:00', '2024-01-01T09:10'],
['2024-01-02T09:00', '2024-01-02T09:10'],
['2024-01-03T09:00', '2024-01-03T09:10']])],
[('started occurrence dropped',
['2024-01-01T09:00', 1, 4, -5, [], '2024-01-01T10:30', 4],
[['2024-01-01T11:00', '2024-01-01T10:55'], ['2024-01-01T12:00', '2024-01-01T11:55']]),
('ack and catch-up mix',
['2024-02-01T09:00', 3, 4, -240, ['2024-02-01T12:00'], '2024-02-01T08:00', 12],
[['2024-02-01T09:00', '2024-02-01T08:00'],
['2024-02-01T15:00', '2024-02-01T11:00'],
['2024-02-01T18:00', '2024-02-01T14:00']]),
('zero trigger all future',
['2024-03-01T06:00', 6, 3, 0, ['2024-03-01T06:00'], '2024-03-01T00:00', 24],
[['2024-03-01T12:00', '2024-03-01T12:00'], ['2024-03-01T18:00', '2024-03-01T18:00']]),
('regression: negative trigger',
['2024-01-01T09:00', 24, 3, -15, [], '2024-01-01T00:00', 72],
[['2024-01-01T09:00', '2024-01-01T08:45'],
['2024-01-02T09:00', '2024-01-02T08:45'],
['2024-01-03T09:00', '2024-01-03T08:45']]),
('positive trigger',
['2024-01-01T09:00', 24, 3, 10, [], '2024-01-01T00:00', 72],
[['2024-01-01T09:00', '2024-01-01T09:10'],
['2024-01-02T09:00', '2024-01-02T09:10'],
['2024-01-03T09:00', '2024-01-03T09:10']]),
('horizon edge with lead time',
['2024-01-01T10:00', 1, 6, -60, [], '2024-01-01T08:00', 4],
[['2024-01-01T10:00', '2024-01-01T09:00'],
['2024-01-01T11:00', '2024-01-01T10:00'],
['2024-01-01T12:00', '2024-01-01T11:00'],
['2024-01-01T13:00', '2024-01-01T12:00']]),
('horizon exact',
['2024-01-01T10:00', 2, 5, 0, [], '2024-01-01T08:00', 4],
[['2024-01-01T10:00', '2024-01-01T10:00'], ['2024-01-01T12:00', '2024-01-01T12:00']]),
('occurrence starting now',
['2024-01-01T09:00', 24, 2, -10, [], '2024-01-01T09:00', 48],
[['2024-01-02T09:00', '2024-01-02T08:50']])]]
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: negative trigger | [['2024-01-01T09:00', '2024-01-01T08:45'], ['2024-01-02T09:00', '2024-01-02T08:45'], ['2024-01-03T09:00', '2024-01-03T08:45']] | [['2024-01-01T09:00', '2024-01-01T08:45'], ['2024-01-02T09:00', '2024-01-02T08:45'], ['2024-01-03T09:00', '2024-01-03T08:45']] | Passed |
| positive trigger | [['2024-01-01T09:00', '2024-01-01T09:10'], ['2024-01-02T09:00', '2024-01-02T09:10'], ['2024-01-03T09:00', '2024-01-03T09:10']] | [['2024-01-01T09:00', '2024-01-01T09:10'], ['2024-01-02T09:00', '2024-01-02T09:10'], ['2024-01-03T09:00', '2024-01-03T09:10']] | Passed |
| horizon edge with lead time | [['2024-01-01T10:00', '2024-01-01T09:00'], ['2024-01-01T11:00', '2024-01-01T10:00'], ['2024-01-01T12:00', '2024-01-01T11:00'], ['2024-01-01T13:00', '2024-01-01T12:00']] | [['2024-01-01T10:00', '2024-01-01T09:00'], ['2024-01-01T11:00', '2024-01-01T10:00'], ['2024-01-01T12:00', '2024-01-01T11:00'], ['2024-01-01T13:00', '2024-01-01T12:00']] | Passed |
| horizon exact | [['2024-01-01T10:00', '2024-01-01T10:00'], ['2024-01-01T12:00', '2024-01-01T12:00']] | [['2024-01-01T10:00', '2024-01-01T10:00'], ['2024-01-01T12:00', '2024-01-01T12:00']] | Passed |
| acknowledged occurrence | [['2024-01-01T09:00', '2024-01-01T08:30'], ['2024-01-01T17:00', '2024-01-01T16:30'], ['2024-01-01T21:00', '2024-01-01T20:30']] | [['2024-01-01T09:00', '2024-01-01T08:30'], ['2024-01-01T17:00', '2024-01-01T16:30'], ['2024-01-01T21:00', '2024-01-01T20:30']] | Passed |
| missed alarm catch-up | [['2024-01-01T09:00', '2024-01-01T08:30'], ['2024-01-02T09:00', '2024-01-02T07:00']] | [['2024-01-01T09:00', '2024-01-01T08:30'], ['2024-01-02T09:00', '2024-01-02T07:00']] | Passed |
| missed long before start | [['2024-01-01T12:00', '2024-01-01T09:00'], ['2024-01-02T12:00', '2024-01-01T12:00']] | [['2024-01-01T12:00', '2024-01-01T09:00'], ['2024-01-02T12:00', '2024-01-01T12:00']] | Passed |
| occurrence starting now | [['2024-01-01T09:00', '2024-01-01T09:00'], ['2024-01-02T09:00', '2024-01-02T08:50']] | [['2024-01-02T09:00', '2024-01-02T08:50']] | Failed |
SHA-256 / d51f7ec3650d0fa773aa7e38d6e9581773182bf13663cca030b928e9d9aa3e14
HELD IN THE MEMBER ARCHIVE
The verified repair and its recorded checks are member-only.
This mechanism has 8 recorded checks per implementation. The open-access tier publishes the failure and the unsuccessful fix; the repaired source that passes every check, and the observations that prove it, are available to members.
Every case sharing this mechanism uses the same contract and the same repair, so this one record is held back for all of them.
Member access is invitation-based. Sign in with your invited account to inspect the repair.
Sign in to the archive ↗Verification & scope
Stipulated, bounded recurrence-expansion model evaluated offline on explicit fixtures; it is not a complete iCalendar implementation and makes no claim of standards conformance. 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:23.254693+00:00.
Case digest / 379f93605fbfa9147d1f52ac8a79cf1e4ce55fec3e217b689813f177d5b1d4ec