FA-76966 / Calendar recurrence rules / Open access
Merging RRULE instances with RDATE and EXDATE: exdate time normalization · case 01
An EXDATE written with a time component does not remove the all-day instance.
ROOT CAUSE
EXDATE values with a time part are silently discarded instead of reduced to their date.
VERIFIED REPAIR
At the exdate time normalization decision use `{dt.date.fromisoformat(x[:10]) for x in exdates}`, leaving the other decision sites of the model unchanged.
Unsuccessful approach: The partial repair `{dt.date.fromisoformat(x[:10]) for x in exdates if 'T' not in x or x.endswith('T00:00:00')}` only accepts midnight EXDATE values, so other time parts are still ignored.
Case contract
All-day series: the rule yields exactly count instances dtstart + k*interval days (COUNT counts rule instances before exclusions; RDATEs never consume COUNT). The instance set is rule plus RDATE minus EXDATE; EXDATE also removes RDATEs. EXDATE values may carry a time part (YYYY-MM-DDTHH:MM:SS) and then exclude their calendar date. Return the unique dates sorted ascending.
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, count, rdates, exdates):
start = dt.date.fromisoformat(dtstart)
excluded = {dt.date.fromisoformat(x) for x in exdates if 'T' not in x}
rule = [start + dt.timedelta(days=k * interval) for k in range(count)]
extra = [dt.date.fromisoformat(x) for x in rdates]
rule = rule
merged = [d for d in rule + extra if d not in excluded]
result = sorted(set(merged))
return [d.isoformat() for d in result]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: exdate does not extend count',
['2024-03-01', 1, 5, [], ['2024-03-03']],
['2024-03-01', '2024-03-02', '2024-03-04', '2024-03-05']),
('timed exdate',
['2024-03-01', 2, 4, [], ['2024-03-05T09:30:00']],
['2024-03-01', '2024-03-03', '2024-03-07']),
('midnight exdate', ['2024-03-01', 1, 3, [], ['2024-03-02T00:00:00']], ['2024-03-01', '2024-03-03']),
('rdate equal to rule date',
['2024-01-01', 7, 3, ['2024-01-08'], []],
['2024-01-01', '2024-01-08', '2024-01-15']),
('rdate before dtstart',
['2024-01-10', 1, 3, ['2024-01-02'], []],
['2024-01-02', '2024-01-10', '2024-01-11', '2024-01-12']),
('exdate removes rdate',
['2024-01-01', 1, 3, ['2024-02-01'], ['2024-02-01']],
['2024-01-01', '2024-01-02', '2024-01-03']),
('exdate outside rule',
['2024-01-01', 3, 3, [], ['2024-01-02']],
['2024-01-01', '2024-01-04', '2024-01-07'])],
[('midnight exdate', ['2024-03-01', 1, 3, [], ['2024-03-02T00:00:00']], ['2024-03-01', '2024-03-03']),
('rdate equal to rule date',
['2024-01-01', 7, 3, ['2024-01-08'], []],
['2024-01-01', '2024-01-08', '2024-01-15']),
('rdate before dtstart',
['2024-01-10', 1, 3, ['2024-01-02'], []],
['2024-01-02', '2024-01-10', '2024-01-11', '2024-01-12']),
('exdate removes rdate',
['2024-01-01', 1, 3, ['2024-02-01'], ['2024-02-01']],
['2024-01-01', '2024-01-02', '2024-01-03']),
('exdate outside rule',
['2024-01-01', 3, 3, [], ['2024-01-02']],
['2024-01-01', '2024-01-04', '2024-01-07']),
('rdate between instances',
['2024-05-01', 10, 3, ['2024-05-05', '2024-05-30'], ['2024-05-11']],
['2024-05-01', '2024-05-05', '2024-05-21', '2024-05-30']),
('count zero with rdate', ['2024-01-01', 1, 0, ['2024-01-03'], []], ['2024-01-03']),
('timed exdate',
['2024-03-01', 2, 4, [], ['2024-03-05T09:30:00']],
['2024-03-01', '2024-03-03', '2024-03-07'])],
[('rdate before dtstart',
['2024-01-10', 1, 3, ['2024-01-02'], []],
['2024-01-02', '2024-01-10', '2024-01-11', '2024-01-12']),
('exdate removes rdate',
['2024-01-01', 1, 3, ['2024-02-01'], ['2024-02-01']],
['2024-01-01', '2024-01-02', '2024-01-03']),
('exdate outside rule',
['2024-01-01', 3, 3, [], ['2024-01-02']],
['2024-01-01', '2024-01-04', '2024-01-07']),
('rdate between instances',
['2024-05-01', 10, 3, ['2024-05-05', '2024-05-30'], ['2024-05-11']],
['2024-05-01', '2024-05-05', '2024-05-21', '2024-05-30']),
('count zero with rdate', ['2024-01-01', 1, 0, ['2024-01-03'], []], ['2024-01-03']),
('duplicate rdates and timed exdate',
['2024-02-27', 1, 4, ['2024-03-05', '2024-03-05'], ['2024-02-28T12:00:00']],
['2024-02-27', '2024-02-29', '2024-03-01', '2024-03-05']),
('all excluded', ['2024-07-01', 1, 2, [], ['2024-07-01', '2024-07-02']], [])],
[('exdate outside rule',
['2024-01-01', 3, 3, [], ['2024-01-02']],
['2024-01-01', '2024-01-04', '2024-01-07']),
('rdate between instances',
['2024-05-01', 10, 3, ['2024-05-05', '2024-05-30'], ['2024-05-11']],
['2024-05-01', '2024-05-05', '2024-05-21', '2024-05-30']),
('count zero with rdate', ['2024-01-01', 1, 0, ['2024-01-03'], []], ['2024-01-03']),
('duplicate rdates and timed exdate',
['2024-02-27', 1, 4, ['2024-03-05', '2024-03-05'], ['2024-02-28T12:00:00']],
['2024-02-27', '2024-02-29', '2024-03-01', '2024-03-05']),
('all excluded', ['2024-07-01', 1, 2, [], ['2024-07-01', '2024-07-02']], []),
('regression: exdate does not extend count',
['2024-03-01', 1, 5, [], ['2024-03-03']],
['2024-03-01', '2024-03-02', '2024-03-04', '2024-03-05']),
('timed exdate',
['2024-03-01', 2, 4, [], ['2024-03-05T09:30:00']],
['2024-03-01', '2024-03-03', '2024-03-07'])],
[('count zero with rdate', ['2024-01-01', 1, 0, ['2024-01-03'], []], ['2024-01-03']),
('duplicate rdates and timed exdate',
['2024-02-27', 1, 4, ['2024-03-05', '2024-03-05'], ['2024-02-28T12:00:00']],
['2024-02-27', '2024-02-29', '2024-03-01', '2024-03-05']),
('all excluded', ['2024-07-01', 1, 2, [], ['2024-07-01', '2024-07-02']], []),
('regression: exdate does not extend count',
['2024-03-01', 1, 5, [], ['2024-03-03']],
['2024-03-01', '2024-03-02', '2024-03-04', '2024-03-05']),
('timed exdate',
['2024-03-01', 2, 4, [], ['2024-03-05T09:30:00']],
['2024-03-01', '2024-03-03', '2024-03-07']),
('midnight exdate', ['2024-03-01', 1, 3, [], ['2024-03-02T00:00:00']], ['2024-03-01', '2024-03-03']),
('rdate equal to rule date',
['2024-01-01', 7, 3, ['2024-01-08'], []],
['2024-01-01', '2024-01-08', '2024-01-15'])]]
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: exdate does not extend count | ['2024-03-01', '2024-03-02', '2024-03-04', '2024-03-05'] | ['2024-03-01', '2024-03-02', '2024-03-04', '2024-03-05'] | Passed |
| timed exdate | ['2024-03-01', '2024-03-03', '2024-03-05', '2024-03-07'] | ['2024-03-01', '2024-03-03', '2024-03-07'] | Failed |
| midnight exdate | ['2024-03-01', '2024-03-02', '2024-03-03'] | ['2024-03-01', '2024-03-03'] | Failed |
| rdate equal to rule date | ['2024-01-01', '2024-01-08', '2024-01-15'] | ['2024-01-01', '2024-01-08', '2024-01-15'] | Passed |
| rdate before dtstart | ['2024-01-02', '2024-01-10', '2024-01-11', '2024-01-12'] | ['2024-01-02', '2024-01-10', '2024-01-11', '2024-01-12'] | Passed |
| exdate removes rdate | ['2024-01-01', '2024-01-02', '2024-01-03'] | ['2024-01-01', '2024-01-02', '2024-01-03'] | Passed |
| exdate outside rule | ['2024-01-01', '2024-01-04', '2024-01-07'] | ['2024-01-01', '2024-01-04', '2024-01-07'] | Passed |
SHA-256 / 0ea1ec56a185a35024a158b7b07c41c347116cb491f416d69ba900b067879597
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, count, rdates, exdates):
start = dt.date.fromisoformat(dtstart)
excluded = {dt.date.fromisoformat(x[:10]) for x in exdates if 'T' not in x or x.endswith('T00:00:00')}
rule = [start + dt.timedelta(days=k * interval) for k in range(count)]
extra = [dt.date.fromisoformat(x) for x in rdates]
rule = rule
merged = [d for d in rule + extra if d not in excluded]
result = sorted(set(merged))
return [d.isoformat() for d in result]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: exdate does not extend count',
['2024-03-01', 1, 5, [], ['2024-03-03']],
['2024-03-01', '2024-03-02', '2024-03-04', '2024-03-05']),
('timed exdate',
['2024-03-01', 2, 4, [], ['2024-03-05T09:30:00']],
['2024-03-01', '2024-03-03', '2024-03-07']),
('midnight exdate', ['2024-03-01', 1, 3, [], ['2024-03-02T00:00:00']], ['2024-03-01', '2024-03-03']),
('rdate equal to rule date',
['2024-01-01', 7, 3, ['2024-01-08'], []],
['2024-01-01', '2024-01-08', '2024-01-15']),
('rdate before dtstart',
['2024-01-10', 1, 3, ['2024-01-02'], []],
['2024-01-02', '2024-01-10', '2024-01-11', '2024-01-12']),
('exdate removes rdate',
['2024-01-01', 1, 3, ['2024-02-01'], ['2024-02-01']],
['2024-01-01', '2024-01-02', '2024-01-03']),
('exdate outside rule',
['2024-01-01', 3, 3, [], ['2024-01-02']],
['2024-01-01', '2024-01-04', '2024-01-07'])],
[('midnight exdate', ['2024-03-01', 1, 3, [], ['2024-03-02T00:00:00']], ['2024-03-01', '2024-03-03']),
('rdate equal to rule date',
['2024-01-01', 7, 3, ['2024-01-08'], []],
['2024-01-01', '2024-01-08', '2024-01-15']),
('rdate before dtstart',
['2024-01-10', 1, 3, ['2024-01-02'], []],
['2024-01-02', '2024-01-10', '2024-01-11', '2024-01-12']),
('exdate removes rdate',
['2024-01-01', 1, 3, ['2024-02-01'], ['2024-02-01']],
['2024-01-01', '2024-01-02', '2024-01-03']),
('exdate outside rule',
['2024-01-01', 3, 3, [], ['2024-01-02']],
['2024-01-01', '2024-01-04', '2024-01-07']),
('rdate between instances',
['2024-05-01', 10, 3, ['2024-05-05', '2024-05-30'], ['2024-05-11']],
['2024-05-01', '2024-05-05', '2024-05-21', '2024-05-30']),
('count zero with rdate', ['2024-01-01', 1, 0, ['2024-01-03'], []], ['2024-01-03']),
('timed exdate',
['2024-03-01', 2, 4, [], ['2024-03-05T09:30:00']],
['2024-03-01', '2024-03-03', '2024-03-07'])],
[('rdate before dtstart',
['2024-01-10', 1, 3, ['2024-01-02'], []],
['2024-01-02', '2024-01-10', '2024-01-11', '2024-01-12']),
('exdate removes rdate',
['2024-01-01', 1, 3, ['2024-02-01'], ['2024-02-01']],
['2024-01-01', '2024-01-02', '2024-01-03']),
('exdate outside rule',
['2024-01-01', 3, 3, [], ['2024-01-02']],
['2024-01-01', '2024-01-04', '2024-01-07']),
('rdate between instances',
['2024-05-01', 10, 3, ['2024-05-05', '2024-05-30'], ['2024-05-11']],
['2024-05-01', '2024-05-05', '2024-05-21', '2024-05-30']),
('count zero with rdate', ['2024-01-01', 1, 0, ['2024-01-03'], []], ['2024-01-03']),
('duplicate rdates and timed exdate',
['2024-02-27', 1, 4, ['2024-03-05', '2024-03-05'], ['2024-02-28T12:00:00']],
['2024-02-27', '2024-02-29', '2024-03-01', '2024-03-05']),
('all excluded', ['2024-07-01', 1, 2, [], ['2024-07-01', '2024-07-02']], [])],
[('exdate outside rule',
['2024-01-01', 3, 3, [], ['2024-01-02']],
['2024-01-01', '2024-01-04', '2024-01-07']),
('rdate between instances',
['2024-05-01', 10, 3, ['2024-05-05', '2024-05-30'], ['2024-05-11']],
['2024-05-01', '2024-05-05', '2024-05-21', '2024-05-30']),
('count zero with rdate', ['2024-01-01', 1, 0, ['2024-01-03'], []], ['2024-01-03']),
('duplicate rdates and timed exdate',
['2024-02-27', 1, 4, ['2024-03-05', '2024-03-05'], ['2024-02-28T12:00:00']],
['2024-02-27', '2024-02-29', '2024-03-01', '2024-03-05']),
('all excluded', ['2024-07-01', 1, 2, [], ['2024-07-01', '2024-07-02']], []),
('regression: exdate does not extend count',
['2024-03-01', 1, 5, [], ['2024-03-03']],
['2024-03-01', '2024-03-02', '2024-03-04', '2024-03-05']),
('timed exdate',
['2024-03-01', 2, 4, [], ['2024-03-05T09:30:00']],
['2024-03-01', '2024-03-03', '2024-03-07'])],
[('count zero with rdate', ['2024-01-01', 1, 0, ['2024-01-03'], []], ['2024-01-03']),
('duplicate rdates and timed exdate',
['2024-02-27', 1, 4, ['2024-03-05', '2024-03-05'], ['2024-02-28T12:00:00']],
['2024-02-27', '2024-02-29', '2024-03-01', '2024-03-05']),
('all excluded', ['2024-07-01', 1, 2, [], ['2024-07-01', '2024-07-02']], []),
('regression: exdate does not extend count',
['2024-03-01', 1, 5, [], ['2024-03-03']],
['2024-03-01', '2024-03-02', '2024-03-04', '2024-03-05']),
('timed exdate',
['2024-03-01', 2, 4, [], ['2024-03-05T09:30:00']],
['2024-03-01', '2024-03-03', '2024-03-07']),
('midnight exdate', ['2024-03-01', 1, 3, [], ['2024-03-02T00:00:00']], ['2024-03-01', '2024-03-03']),
('rdate equal to rule date',
['2024-01-01', 7, 3, ['2024-01-08'], []],
['2024-01-01', '2024-01-08', '2024-01-15'])]]
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: exdate does not extend count | ['2024-03-01', '2024-03-02', '2024-03-04', '2024-03-05'] | ['2024-03-01', '2024-03-02', '2024-03-04', '2024-03-05'] | Passed |
| timed exdate | ['2024-03-01', '2024-03-03', '2024-03-05', '2024-03-07'] | ['2024-03-01', '2024-03-03', '2024-03-07'] | Failed |
| midnight exdate | ['2024-03-01', '2024-03-03'] | ['2024-03-01', '2024-03-03'] | Passed |
| rdate equal to rule date | ['2024-01-01', '2024-01-08', '2024-01-15'] | ['2024-01-01', '2024-01-08', '2024-01-15'] | Passed |
| rdate before dtstart | ['2024-01-02', '2024-01-10', '2024-01-11', '2024-01-12'] | ['2024-01-02', '2024-01-10', '2024-01-11', '2024-01-12'] | Passed |
| exdate removes rdate | ['2024-01-01', '2024-01-02', '2024-01-03'] | ['2024-01-01', '2024-01-02', '2024-01-03'] | Passed |
| exdate outside rule | ['2024-01-01', '2024-01-04', '2024-01-07'] | ['2024-01-01', '2024-01-04', '2024-01-07'] | Passed |
SHA-256 / 5c485d85b8652fb8fa2afad6678d4532e874713ecbf5efb150227fef5a01dfbc
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(dtstart, interval, count, rdates, exdates):
start = dt.date.fromisoformat(dtstart)
excluded = {dt.date.fromisoformat(x[:10]) for x in exdates}
rule = [start + dt.timedelta(days=k * interval) for k in range(count)]
extra = [dt.date.fromisoformat(x) for x in rdates]
rule = rule
merged = [d for d in rule + extra if d not in excluded]
result = sorted(set(merged))
return [d.isoformat() for d in result]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: exdate does not extend count',
['2024-03-01', 1, 5, [], ['2024-03-03']],
['2024-03-01', '2024-03-02', '2024-03-04', '2024-03-05']),
('timed exdate',
['2024-03-01', 2, 4, [], ['2024-03-05T09:30:00']],
['2024-03-01', '2024-03-03', '2024-03-07']),
('midnight exdate', ['2024-03-01', 1, 3, [], ['2024-03-02T00:00:00']], ['2024-03-01', '2024-03-03']),
('rdate equal to rule date',
['2024-01-01', 7, 3, ['2024-01-08'], []],
['2024-01-01', '2024-01-08', '2024-01-15']),
('rdate before dtstart',
['2024-01-10', 1, 3, ['2024-01-02'], []],
['2024-01-02', '2024-01-10', '2024-01-11', '2024-01-12']),
('exdate removes rdate',
['2024-01-01', 1, 3, ['2024-02-01'], ['2024-02-01']],
['2024-01-01', '2024-01-02', '2024-01-03']),
('exdate outside rule',
['2024-01-01', 3, 3, [], ['2024-01-02']],
['2024-01-01', '2024-01-04', '2024-01-07'])],
[('midnight exdate', ['2024-03-01', 1, 3, [], ['2024-03-02T00:00:00']], ['2024-03-01', '2024-03-03']),
('rdate equal to rule date',
['2024-01-01', 7, 3, ['2024-01-08'], []],
['2024-01-01', '2024-01-08', '2024-01-15']),
('rdate before dtstart',
['2024-01-10', 1, 3, ['2024-01-02'], []],
['2024-01-02', '2024-01-10', '2024-01-11', '2024-01-12']),
('exdate removes rdate',
['2024-01-01', 1, 3, ['2024-02-01'], ['2024-02-01']],
['2024-01-01', '2024-01-02', '2024-01-03']),
('exdate outside rule',
['2024-01-01', 3, 3, [], ['2024-01-02']],
['2024-01-01', '2024-01-04', '2024-01-07']),
('rdate between instances',
['2024-05-01', 10, 3, ['2024-05-05', '2024-05-30'], ['2024-05-11']],
['2024-05-01', '2024-05-05', '2024-05-21', '2024-05-30']),
('count zero with rdate', ['2024-01-01', 1, 0, ['2024-01-03'], []], ['2024-01-03']),
('timed exdate',
['2024-03-01', 2, 4, [], ['2024-03-05T09:30:00']],
['2024-03-01', '2024-03-03', '2024-03-07'])],
[('rdate before dtstart',
['2024-01-10', 1, 3, ['2024-01-02'], []],
['2024-01-02', '2024-01-10', '2024-01-11', '2024-01-12']),
('exdate removes rdate',
['2024-01-01', 1, 3, ['2024-02-01'], ['2024-02-01']],
['2024-01-01', '2024-01-02', '2024-01-03']),
('exdate outside rule',
['2024-01-01', 3, 3, [], ['2024-01-02']],
['2024-01-01', '2024-01-04', '2024-01-07']),
('rdate between instances',
['2024-05-01', 10, 3, ['2024-05-05', '2024-05-30'], ['2024-05-11']],
['2024-05-01', '2024-05-05', '2024-05-21', '2024-05-30']),
('count zero with rdate', ['2024-01-01', 1, 0, ['2024-01-03'], []], ['2024-01-03']),
('duplicate rdates and timed exdate',
['2024-02-27', 1, 4, ['2024-03-05', '2024-03-05'], ['2024-02-28T12:00:00']],
['2024-02-27', '2024-02-29', '2024-03-01', '2024-03-05']),
('all excluded', ['2024-07-01', 1, 2, [], ['2024-07-01', '2024-07-02']], [])],
[('exdate outside rule',
['2024-01-01', 3, 3, [], ['2024-01-02']],
['2024-01-01', '2024-01-04', '2024-01-07']),
('rdate between instances',
['2024-05-01', 10, 3, ['2024-05-05', '2024-05-30'], ['2024-05-11']],
['2024-05-01', '2024-05-05', '2024-05-21', '2024-05-30']),
('count zero with rdate', ['2024-01-01', 1, 0, ['2024-01-03'], []], ['2024-01-03']),
('duplicate rdates and timed exdate',
['2024-02-27', 1, 4, ['2024-03-05', '2024-03-05'], ['2024-02-28T12:00:00']],
['2024-02-27', '2024-02-29', '2024-03-01', '2024-03-05']),
('all excluded', ['2024-07-01', 1, 2, [], ['2024-07-01', '2024-07-02']], []),
('regression: exdate does not extend count',
['2024-03-01', 1, 5, [], ['2024-03-03']],
['2024-03-01', '2024-03-02', '2024-03-04', '2024-03-05']),
('timed exdate',
['2024-03-01', 2, 4, [], ['2024-03-05T09:30:00']],
['2024-03-01', '2024-03-03', '2024-03-07'])],
[('count zero with rdate', ['2024-01-01', 1, 0, ['2024-01-03'], []], ['2024-01-03']),
('duplicate rdates and timed exdate',
['2024-02-27', 1, 4, ['2024-03-05', '2024-03-05'], ['2024-02-28T12:00:00']],
['2024-02-27', '2024-02-29', '2024-03-01', '2024-03-05']),
('all excluded', ['2024-07-01', 1, 2, [], ['2024-07-01', '2024-07-02']], []),
('regression: exdate does not extend count',
['2024-03-01', 1, 5, [], ['2024-03-03']],
['2024-03-01', '2024-03-02', '2024-03-04', '2024-03-05']),
('timed exdate',
['2024-03-01', 2, 4, [], ['2024-03-05T09:30:00']],
['2024-03-01', '2024-03-03', '2024-03-07']),
('midnight exdate', ['2024-03-01', 1, 3, [], ['2024-03-02T00:00:00']], ['2024-03-01', '2024-03-03']),
('rdate equal to rule date',
['2024-01-01', 7, 3, ['2024-01-08'], []],
['2024-01-01', '2024-01-08', '2024-01-15'])]]
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: exdate does not extend count | ['2024-03-01', '2024-03-02', '2024-03-04', '2024-03-05'] | ['2024-03-01', '2024-03-02', '2024-03-04', '2024-03-05'] | Passed |
| timed exdate | ['2024-03-01', '2024-03-03', '2024-03-07'] | ['2024-03-01', '2024-03-03', '2024-03-07'] | Passed |
| midnight exdate | ['2024-03-01', '2024-03-03'] | ['2024-03-01', '2024-03-03'] | Passed |
| rdate equal to rule date | ['2024-01-01', '2024-01-08', '2024-01-15'] | ['2024-01-01', '2024-01-08', '2024-01-15'] | Passed |
| rdate before dtstart | ['2024-01-02', '2024-01-10', '2024-01-11', '2024-01-12'] | ['2024-01-02', '2024-01-10', '2024-01-11', '2024-01-12'] | Passed |
| exdate removes rdate | ['2024-01-01', '2024-01-02', '2024-01-03'] | ['2024-01-01', '2024-01-02', '2024-01-03'] | Passed |
| exdate outside rule | ['2024-01-01', '2024-01-04', '2024-01-07'] | ['2024-01-01', '2024-01-04', '2024-01-07'] | Passed |
SHA-256 / eec1eefc64ad6219047c946e100ccf8b9248f6b7cb6bf2854cff3cf97f28d5af
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:21.154371+00:00.
Case digest / 99d1fe98ee98c92c0069c0d73a8d6686637a43c6cb57111c7b742a6e749afd09