FA-76976 / Calendar recurrence rules / Open access
Merging RRULE instances with RDATE and EXDATE: rdate count · case 01
Adding an RDATE removes the last rule instance.
ROOT CAUSE
RDATE values are charged against COUNT as if COUNT limited the whole instance set.
VERIFIED REPAIR
At the rdate count decision use `rule`, leaving the other decision sites of the model unchanged.
Unsuccessful approach: The partial repair `rule[:max(0, count - len([d for d in extra if d not in rule]))]` only charges RDATEs that are not rule dates, but still lets RDATEs consume COUNT.
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[: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[:max(0, count - len(extra))]
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'])],
[('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-01', '2024-01-08', '2024-01-15'] | Failed |
| rdate before dtstart | ['2024-01-02', '2024-01-10', '2024-01-11'] | ['2024-01-02', '2024-01-10', '2024-01-11', '2024-01-12'] | Failed |
| exdate removes rdate | ['2024-01-01', '2024-01-02'] | ['2024-01-01', '2024-01-02', '2024-01-03'] | Failed |
| exdate outside rule | ['2024-01-01', '2024-01-04', '2024-01-07'] | ['2024-01-01', '2024-01-04', '2024-01-07'] | Passed |
SHA-256 / 9878442e29138c5fcb6eb2181b181274f7a16d271f3f39b6fa69d43720122691
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}
rule = [start + dt.timedelta(days=k * interval) for k in range(count)]
extra = [dt.date.fromisoformat(x) for x in rdates]
rule = rule[:max(0, count - len([d for d in extra if d not in 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'])],
[('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-02', '2024-01-10', '2024-01-11', '2024-01-12'] | Failed |
| exdate removes rdate | ['2024-01-01', '2024-01-02'] | ['2024-01-01', '2024-01-02', '2024-01-03'] | Failed |
| exdate outside rule | ['2024-01-01', '2024-01-04', '2024-01-07'] | ['2024-01-01', '2024-01-04', '2024-01-07'] | Passed |
SHA-256 / 082bb771088a1a3bee566c8d72eb1772dbfb24ee947855aad204f60acaaab5e6
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'])],
[('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 / 2c6d08cf2a7c66086ab763b13b6553ecc1ccdcac2d472452c4bd9a2565e6126f
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.242444+00:00.
Case digest / acf1412bd54823569fe5a2f7b33edd52a51a8761eafde0c30231bad1fd454017