FA-76846 / Calendar recurrence rules / Open access
Weekly BYDAY expansion honouring the week-start day: interval step · case 01
An every-other-week series produces instances in every week.
ROOT CAUSE
The loop advances one week per iteration and never multiplies by INTERVAL.
VERIFIED REPAIR
At the interval step decision use `dt.timedelta(weeks=k * interval)`, leaving the other decision sites of the model unchanged.
Unsuccessful approach: The partial repair `dt.timedelta(days=k * interval)` multiplies by INTERVAL but advances in days, so the series drifts through weekdays.
Case contract
FREQ=WEEKLY expansion. byday lists weekday numbers (0=Monday..6=Sunday); an empty list means the weekday of dtstart. Weeks begin on wkst; the week containing dtstart is week 0 and only weeks whose index is a multiple of interval are active. Instances are chronological, never before dtstart, and dtstart itself is an instance only if its weekday is listed. Return the first count ISO dates.
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, byday, wkst, count):
start = dt.date.fromisoformat(dtstart)
days = sorted(set(byday)) if byday else [start.weekday()]
week0 = start - dt.timedelta(days=(start.weekday() - wkst) % 7)
out = []
for k in range(600):
week = week0 + dt.timedelta(weeks=k)
for wd in sorted(days, key=lambda w: (w - wkst) % 7):
d = week + dt.timedelta(days=(wd - wkst) % 7)
if d < start:
continue
if len(out) >= count:
return out
out.append(d.isoformat())
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: WKST=SU interval 2 TU,SU',
['1997-08-05', 2, [1, 6], 6, 4],
['1997-08-05', '1997-08-17', '1997-08-19', '1997-08-31']),
('regression: WKST=MO interval 2 TU,SU',
['1997-08-05', 2, [1, 6], 0, 4],
['1997-08-05', '1997-08-10', '1997-08-19', '1997-08-24']),
('non-matching dtstart Wednesday',
['2024-01-03', 1, [0, 4], 0, 3],
['2024-01-05', '2024-01-08', '2024-01-12']),
('dtstart mid-week weekly MO,WE,FR',
['2024-01-04', 1, [0, 2, 4], 0, 5],
['2024-01-05', '2024-01-08', '2024-01-10', '2024-01-12', '2024-01-15']),
('empty BYDAY uses dtstart weekday',
['2024-02-29', 3, [], 0, 3],
['2024-02-29', '2024-03-21', '2024-04-11']),
('count zero', ['2024-01-01', 1, [0], 0, 0], []),
('WKST=SU weekly SA,SU',
['2024-03-09', 1, [5, 6], 6, 4],
['2024-03-09', '2024-03-10', '2024-03-16', '2024-03-17'])],
[('non-matching dtstart Wednesday',
['2024-01-03', 1, [0, 4], 0, 3],
['2024-01-05', '2024-01-08', '2024-01-12']),
('dtstart mid-week weekly MO,WE,FR',
['2024-01-04', 1, [0, 2, 4], 0, 5],
['2024-01-05', '2024-01-08', '2024-01-10', '2024-01-12', '2024-01-15']),
('empty BYDAY uses dtstart weekday',
['2024-02-29', 3, [], 0, 3],
['2024-02-29', '2024-03-21', '2024-04-11']),
('count zero', ['2024-01-01', 1, [0], 0, 0], []),
('WKST=SU weekly SA,SU',
['2024-03-09', 1, [5, 6], 6, 4],
['2024-03-09', '2024-03-10', '2024-03-16', '2024-03-17']),
('interval 3 friday from monday', ['2024-05-06', 3, [4], 0, 3], ['2024-05-10', '2024-05-31', '2024-06-21']),
('WKST=WE interval 2 MO,TH',
['2024-06-04', 2, [0, 3], 2, 5],
['2024-06-13', '2024-06-17', '2024-06-27', '2024-07-01', '2024-07-11'])],
[('empty BYDAY uses dtstart weekday',
['2024-02-29', 3, [], 0, 3],
['2024-02-29', '2024-03-21', '2024-04-11']),
('count zero', ['2024-01-01', 1, [0], 0, 0], []),
('WKST=SU weekly SA,SU',
['2024-03-09', 1, [5, 6], 6, 4],
['2024-03-09', '2024-03-10', '2024-03-16', '2024-03-17']),
('interval 3 friday from monday', ['2024-05-06', 3, [4], 0, 3], ['2024-05-10', '2024-05-31', '2024-06-21']),
('WKST=WE interval 2 MO,TH',
['2024-06-04', 2, [0, 3], 2, 5],
['2024-06-13', '2024-06-17', '2024-06-27', '2024-07-01', '2024-07-11']),
('single sunday series', ['2024-12-29', 2, [6], 0, 3], ['2024-12-29', '2025-01-12', '2025-01-26']),
('dtstart on listed day',
['2025-01-06', 2, [0, 3], 0, 4],
['2025-01-06', '2025-01-09', '2025-01-20', '2025-01-23'])],
[('WKST=SU weekly SA,SU',
['2024-03-09', 1, [5, 6], 6, 4],
['2024-03-09', '2024-03-10', '2024-03-16', '2024-03-17']),
('interval 3 friday from monday', ['2024-05-06', 3, [4], 0, 3], ['2024-05-10', '2024-05-31', '2024-06-21']),
('WKST=WE interval 2 MO,TH',
['2024-06-04', 2, [0, 3], 2, 5],
['2024-06-13', '2024-06-17', '2024-06-27', '2024-07-01', '2024-07-11']),
('single sunday series', ['2024-12-29', 2, [6], 0, 3], ['2024-12-29', '2025-01-12', '2025-01-26']),
('dtstart on listed day',
['2025-01-06', 2, [0, 3], 0, 4],
['2025-01-06', '2025-01-09', '2025-01-20', '2025-01-23']),
('WKST=SU interval 2 from saturday',
['2025-03-01', 2, [6, 5], 6, 5],
['2025-03-01', '2025-03-09', '2025-03-15', '2025-03-23', '2025-03-29']),
('regression: WKST=SU interval 2 TU,SU',
['1997-08-05', 2, [1, 6], 6, 4],
['1997-08-05', '1997-08-17', '1997-08-19', '1997-08-31'])],
[('WKST=WE interval 2 MO,TH',
['2024-06-04', 2, [0, 3], 2, 5],
['2024-06-13', '2024-06-17', '2024-06-27', '2024-07-01', '2024-07-11']),
('single sunday series', ['2024-12-29', 2, [6], 0, 3], ['2024-12-29', '2025-01-12', '2025-01-26']),
('dtstart on listed day',
['2025-01-06', 2, [0, 3], 0, 4],
['2025-01-06', '2025-01-09', '2025-01-20', '2025-01-23']),
('WKST=SU interval 2 from saturday',
['2025-03-01', 2, [6, 5], 6, 5],
['2025-03-01', '2025-03-09', '2025-03-15', '2025-03-23', '2025-03-29']),
('regression: WKST=SU interval 2 TU,SU',
['1997-08-05', 2, [1, 6], 6, 4],
['1997-08-05', '1997-08-17', '1997-08-19', '1997-08-31']),
('regression: WKST=MO interval 2 TU,SU',
['1997-08-05', 2, [1, 6], 0, 4],
['1997-08-05', '1997-08-10', '1997-08-19', '1997-08-24']),
('non-matching dtstart Wednesday',
['2024-01-03', 1, [0, 4], 0, 3],
['2024-01-05', '2024-01-08', '2024-01-12'])]]
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: WKST=SU interval 2 TU,SU | ['1997-08-05', '1997-08-10', '1997-08-12', '1997-08-17'] | ['1997-08-05', '1997-08-17', '1997-08-19', '1997-08-31'] | Failed |
| regression: WKST=MO interval 2 TU,SU | ['1997-08-05', '1997-08-10', '1997-08-12', '1997-08-17'] | ['1997-08-05', '1997-08-10', '1997-08-19', '1997-08-24'] | Failed |
| non-matching dtstart Wednesday | ['2024-01-05', '2024-01-08', '2024-01-12'] | ['2024-01-05', '2024-01-08', '2024-01-12'] | Passed |
| dtstart mid-week weekly MO,WE,FR | ['2024-01-05', '2024-01-08', '2024-01-10', '2024-01-12', '2024-01-15'] | ['2024-01-05', '2024-01-08', '2024-01-10', '2024-01-12', '2024-01-15'] | Passed |
| empty BYDAY uses dtstart weekday | ['2024-02-29', '2024-03-07', '2024-03-14'] | ['2024-02-29', '2024-03-21', '2024-04-11'] | Failed |
| count zero | [] | [] | Passed |
| WKST=SU weekly SA,SU | ['2024-03-09', '2024-03-10', '2024-03-16', '2024-03-17'] | ['2024-03-09', '2024-03-10', '2024-03-16', '2024-03-17'] | Passed |
SHA-256 / 14d5aec8e739000a5652b6eade6a0e0631c63239a04c441ed7f5108a9b40f516
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, byday, wkst, count):
start = dt.date.fromisoformat(dtstart)
days = sorted(set(byday)) if byday else [start.weekday()]
week0 = start - dt.timedelta(days=(start.weekday() - wkst) % 7)
out = []
for k in range(600):
week = week0 + dt.timedelta(days=k * interval)
for wd in sorted(days, key=lambda w: (w - wkst) % 7):
d = week + dt.timedelta(days=(wd - wkst) % 7)
if d < start:
continue
if len(out) >= count:
return out
out.append(d.isoformat())
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: WKST=SU interval 2 TU,SU',
['1997-08-05', 2, [1, 6], 6, 4],
['1997-08-05', '1997-08-17', '1997-08-19', '1997-08-31']),
('regression: WKST=MO interval 2 TU,SU',
['1997-08-05', 2, [1, 6], 0, 4],
['1997-08-05', '1997-08-10', '1997-08-19', '1997-08-24']),
('non-matching dtstart Wednesday',
['2024-01-03', 1, [0, 4], 0, 3],
['2024-01-05', '2024-01-08', '2024-01-12']),
('dtstart mid-week weekly MO,WE,FR',
['2024-01-04', 1, [0, 2, 4], 0, 5],
['2024-01-05', '2024-01-08', '2024-01-10', '2024-01-12', '2024-01-15']),
('empty BYDAY uses dtstart weekday',
['2024-02-29', 3, [], 0, 3],
['2024-02-29', '2024-03-21', '2024-04-11']),
('count zero', ['2024-01-01', 1, [0], 0, 0], []),
('WKST=SU weekly SA,SU',
['2024-03-09', 1, [5, 6], 6, 4],
['2024-03-09', '2024-03-10', '2024-03-16', '2024-03-17'])],
[('non-matching dtstart Wednesday',
['2024-01-03', 1, [0, 4], 0, 3],
['2024-01-05', '2024-01-08', '2024-01-12']),
('dtstart mid-week weekly MO,WE,FR',
['2024-01-04', 1, [0, 2, 4], 0, 5],
['2024-01-05', '2024-01-08', '2024-01-10', '2024-01-12', '2024-01-15']),
('empty BYDAY uses dtstart weekday',
['2024-02-29', 3, [], 0, 3],
['2024-02-29', '2024-03-21', '2024-04-11']),
('count zero', ['2024-01-01', 1, [0], 0, 0], []),
('WKST=SU weekly SA,SU',
['2024-03-09', 1, [5, 6], 6, 4],
['2024-03-09', '2024-03-10', '2024-03-16', '2024-03-17']),
('interval 3 friday from monday', ['2024-05-06', 3, [4], 0, 3], ['2024-05-10', '2024-05-31', '2024-06-21']),
('WKST=WE interval 2 MO,TH',
['2024-06-04', 2, [0, 3], 2, 5],
['2024-06-13', '2024-06-17', '2024-06-27', '2024-07-01', '2024-07-11'])],
[('empty BYDAY uses dtstart weekday',
['2024-02-29', 3, [], 0, 3],
['2024-02-29', '2024-03-21', '2024-04-11']),
('count zero', ['2024-01-01', 1, [0], 0, 0], []),
('WKST=SU weekly SA,SU',
['2024-03-09', 1, [5, 6], 6, 4],
['2024-03-09', '2024-03-10', '2024-03-16', '2024-03-17']),
('interval 3 friday from monday', ['2024-05-06', 3, [4], 0, 3], ['2024-05-10', '2024-05-31', '2024-06-21']),
('WKST=WE interval 2 MO,TH',
['2024-06-04', 2, [0, 3], 2, 5],
['2024-06-13', '2024-06-17', '2024-06-27', '2024-07-01', '2024-07-11']),
('single sunday series', ['2024-12-29', 2, [6], 0, 3], ['2024-12-29', '2025-01-12', '2025-01-26']),
('dtstart on listed day',
['2025-01-06', 2, [0, 3], 0, 4],
['2025-01-06', '2025-01-09', '2025-01-20', '2025-01-23'])],
[('WKST=SU weekly SA,SU',
['2024-03-09', 1, [5, 6], 6, 4],
['2024-03-09', '2024-03-10', '2024-03-16', '2024-03-17']),
('interval 3 friday from monday', ['2024-05-06', 3, [4], 0, 3], ['2024-05-10', '2024-05-31', '2024-06-21']),
('WKST=WE interval 2 MO,TH',
['2024-06-04', 2, [0, 3], 2, 5],
['2024-06-13', '2024-06-17', '2024-06-27', '2024-07-01', '2024-07-11']),
('single sunday series', ['2024-12-29', 2, [6], 0, 3], ['2024-12-29', '2025-01-12', '2025-01-26']),
('dtstart on listed day',
['2025-01-06', 2, [0, 3], 0, 4],
['2025-01-06', '2025-01-09', '2025-01-20', '2025-01-23']),
('WKST=SU interval 2 from saturday',
['2025-03-01', 2, [6, 5], 6, 5],
['2025-03-01', '2025-03-09', '2025-03-15', '2025-03-23', '2025-03-29']),
('regression: WKST=SU interval 2 TU,SU',
['1997-08-05', 2, [1, 6], 6, 4],
['1997-08-05', '1997-08-17', '1997-08-19', '1997-08-31'])],
[('WKST=WE interval 2 MO,TH',
['2024-06-04', 2, [0, 3], 2, 5],
['2024-06-13', '2024-06-17', '2024-06-27', '2024-07-01', '2024-07-11']),
('single sunday series', ['2024-12-29', 2, [6], 0, 3], ['2024-12-29', '2025-01-12', '2025-01-26']),
('dtstart on listed day',
['2025-01-06', 2, [0, 3], 0, 4],
['2025-01-06', '2025-01-09', '2025-01-20', '2025-01-23']),
('WKST=SU interval 2 from saturday',
['2025-03-01', 2, [6, 5], 6, 5],
['2025-03-01', '2025-03-09', '2025-03-15', '2025-03-23', '2025-03-29']),
('regression: WKST=SU interval 2 TU,SU',
['1997-08-05', 2, [1, 6], 6, 4],
['1997-08-05', '1997-08-17', '1997-08-19', '1997-08-31']),
('regression: WKST=MO interval 2 TU,SU',
['1997-08-05', 2, [1, 6], 0, 4],
['1997-08-05', '1997-08-10', '1997-08-19', '1997-08-24']),
('non-matching dtstart Wednesday',
['2024-01-03', 1, [0, 4], 0, 3],
['2024-01-05', '2024-01-08', '2024-01-12'])]]
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: WKST=SU interval 2 TU,SU | ['1997-08-05', '1997-08-05', '1997-08-07', '1997-08-07'] | ['1997-08-05', '1997-08-17', '1997-08-19', '1997-08-31'] | Failed |
| regression: WKST=MO interval 2 TU,SU | ['1997-08-05', '1997-08-10', '1997-08-07', '1997-08-12'] | ['1997-08-05', '1997-08-10', '1997-08-19', '1997-08-24'] | Failed |
| non-matching dtstart Wednesday | ['2024-01-05', '2024-01-06', '2024-01-03'] | ['2024-01-05', '2024-01-08', '2024-01-12'] | Failed |
| dtstart mid-week weekly MO,WE,FR | ['2024-01-05', '2024-01-04', '2024-01-06', '2024-01-05', '2024-01-07'] | ['2024-01-05', '2024-01-08', '2024-01-10', '2024-01-12', '2024-01-15'] | Failed |
| empty BYDAY uses dtstart weekday | ['2024-02-29', '2024-03-03', '2024-03-06'] | ['2024-02-29', '2024-03-21', '2024-04-11'] | Failed |
| count zero | [] | [] | Passed |
| WKST=SU weekly SA,SU | ['2024-03-09', '2024-03-10', '2024-03-11', '2024-03-12'] | ['2024-03-09', '2024-03-10', '2024-03-16', '2024-03-17'] | Failed |
SHA-256 / 4664923a2bc55c612109476d71ca0b6da10c027aed015040b05d7b4366c02fb7
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, byday, wkst, count):
start = dt.date.fromisoformat(dtstart)
days = sorted(set(byday)) if byday else [start.weekday()]
week0 = start - dt.timedelta(days=(start.weekday() - wkst) % 7)
out = []
for k in range(600):
week = week0 + dt.timedelta(weeks=k * interval)
for wd in sorted(days, key=lambda w: (w - wkst) % 7):
d = week + dt.timedelta(days=(wd - wkst) % 7)
if d < start:
continue
if len(out) >= count:
return out
out.append(d.isoformat())
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: WKST=SU interval 2 TU,SU',
['1997-08-05', 2, [1, 6], 6, 4],
['1997-08-05', '1997-08-17', '1997-08-19', '1997-08-31']),
('regression: WKST=MO interval 2 TU,SU',
['1997-08-05', 2, [1, 6], 0, 4],
['1997-08-05', '1997-08-10', '1997-08-19', '1997-08-24']),
('non-matching dtstart Wednesday',
['2024-01-03', 1, [0, 4], 0, 3],
['2024-01-05', '2024-01-08', '2024-01-12']),
('dtstart mid-week weekly MO,WE,FR',
['2024-01-04', 1, [0, 2, 4], 0, 5],
['2024-01-05', '2024-01-08', '2024-01-10', '2024-01-12', '2024-01-15']),
('empty BYDAY uses dtstart weekday',
['2024-02-29', 3, [], 0, 3],
['2024-02-29', '2024-03-21', '2024-04-11']),
('count zero', ['2024-01-01', 1, [0], 0, 0], []),
('WKST=SU weekly SA,SU',
['2024-03-09', 1, [5, 6], 6, 4],
['2024-03-09', '2024-03-10', '2024-03-16', '2024-03-17'])],
[('non-matching dtstart Wednesday',
['2024-01-03', 1, [0, 4], 0, 3],
['2024-01-05', '2024-01-08', '2024-01-12']),
('dtstart mid-week weekly MO,WE,FR',
['2024-01-04', 1, [0, 2, 4], 0, 5],
['2024-01-05', '2024-01-08', '2024-01-10', '2024-01-12', '2024-01-15']),
('empty BYDAY uses dtstart weekday',
['2024-02-29', 3, [], 0, 3],
['2024-02-29', '2024-03-21', '2024-04-11']),
('count zero', ['2024-01-01', 1, [0], 0, 0], []),
('WKST=SU weekly SA,SU',
['2024-03-09', 1, [5, 6], 6, 4],
['2024-03-09', '2024-03-10', '2024-03-16', '2024-03-17']),
('interval 3 friday from monday', ['2024-05-06', 3, [4], 0, 3], ['2024-05-10', '2024-05-31', '2024-06-21']),
('WKST=WE interval 2 MO,TH',
['2024-06-04', 2, [0, 3], 2, 5],
['2024-06-13', '2024-06-17', '2024-06-27', '2024-07-01', '2024-07-11'])],
[('empty BYDAY uses dtstart weekday',
['2024-02-29', 3, [], 0, 3],
['2024-02-29', '2024-03-21', '2024-04-11']),
('count zero', ['2024-01-01', 1, [0], 0, 0], []),
('WKST=SU weekly SA,SU',
['2024-03-09', 1, [5, 6], 6, 4],
['2024-03-09', '2024-03-10', '2024-03-16', '2024-03-17']),
('interval 3 friday from monday', ['2024-05-06', 3, [4], 0, 3], ['2024-05-10', '2024-05-31', '2024-06-21']),
('WKST=WE interval 2 MO,TH',
['2024-06-04', 2, [0, 3], 2, 5],
['2024-06-13', '2024-06-17', '2024-06-27', '2024-07-01', '2024-07-11']),
('single sunday series', ['2024-12-29', 2, [6], 0, 3], ['2024-12-29', '2025-01-12', '2025-01-26']),
('dtstart on listed day',
['2025-01-06', 2, [0, 3], 0, 4],
['2025-01-06', '2025-01-09', '2025-01-20', '2025-01-23'])],
[('WKST=SU weekly SA,SU',
['2024-03-09', 1, [5, 6], 6, 4],
['2024-03-09', '2024-03-10', '2024-03-16', '2024-03-17']),
('interval 3 friday from monday', ['2024-05-06', 3, [4], 0, 3], ['2024-05-10', '2024-05-31', '2024-06-21']),
('WKST=WE interval 2 MO,TH',
['2024-06-04', 2, [0, 3], 2, 5],
['2024-06-13', '2024-06-17', '2024-06-27', '2024-07-01', '2024-07-11']),
('single sunday series', ['2024-12-29', 2, [6], 0, 3], ['2024-12-29', '2025-01-12', '2025-01-26']),
('dtstart on listed day',
['2025-01-06', 2, [0, 3], 0, 4],
['2025-01-06', '2025-01-09', '2025-01-20', '2025-01-23']),
('WKST=SU interval 2 from saturday',
['2025-03-01', 2, [6, 5], 6, 5],
['2025-03-01', '2025-03-09', '2025-03-15', '2025-03-23', '2025-03-29']),
('regression: WKST=SU interval 2 TU,SU',
['1997-08-05', 2, [1, 6], 6, 4],
['1997-08-05', '1997-08-17', '1997-08-19', '1997-08-31'])],
[('WKST=WE interval 2 MO,TH',
['2024-06-04', 2, [0, 3], 2, 5],
['2024-06-13', '2024-06-17', '2024-06-27', '2024-07-01', '2024-07-11']),
('single sunday series', ['2024-12-29', 2, [6], 0, 3], ['2024-12-29', '2025-01-12', '2025-01-26']),
('dtstart on listed day',
['2025-01-06', 2, [0, 3], 0, 4],
['2025-01-06', '2025-01-09', '2025-01-20', '2025-01-23']),
('WKST=SU interval 2 from saturday',
['2025-03-01', 2, [6, 5], 6, 5],
['2025-03-01', '2025-03-09', '2025-03-15', '2025-03-23', '2025-03-29']),
('regression: WKST=SU interval 2 TU,SU',
['1997-08-05', 2, [1, 6], 6, 4],
['1997-08-05', '1997-08-17', '1997-08-19', '1997-08-31']),
('regression: WKST=MO interval 2 TU,SU',
['1997-08-05', 2, [1, 6], 0, 4],
['1997-08-05', '1997-08-10', '1997-08-19', '1997-08-24']),
('non-matching dtstart Wednesday',
['2024-01-03', 1, [0, 4], 0, 3],
['2024-01-05', '2024-01-08', '2024-01-12'])]]
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: WKST=SU interval 2 TU,SU | ['1997-08-05', '1997-08-17', '1997-08-19', '1997-08-31'] | ['1997-08-05', '1997-08-17', '1997-08-19', '1997-08-31'] | Passed |
| regression: WKST=MO interval 2 TU,SU | ['1997-08-05', '1997-08-10', '1997-08-19', '1997-08-24'] | ['1997-08-05', '1997-08-10', '1997-08-19', '1997-08-24'] | Passed |
| non-matching dtstart Wednesday | ['2024-01-05', '2024-01-08', '2024-01-12'] | ['2024-01-05', '2024-01-08', '2024-01-12'] | Passed |
| dtstart mid-week weekly MO,WE,FR | ['2024-01-05', '2024-01-08', '2024-01-10', '2024-01-12', '2024-01-15'] | ['2024-01-05', '2024-01-08', '2024-01-10', '2024-01-12', '2024-01-15'] | Passed |
| empty BYDAY uses dtstart weekday | ['2024-02-29', '2024-03-21', '2024-04-11'] | ['2024-02-29', '2024-03-21', '2024-04-11'] | Passed |
| count zero | [] | [] | Passed |
| WKST=SU weekly SA,SU | ['2024-03-09', '2024-03-10', '2024-03-16', '2024-03-17'] | ['2024-03-09', '2024-03-10', '2024-03-16', '2024-03-17'] | Passed |
SHA-256 / bf0638a224bfd45196184fc0d883901496b446834ce5fe5ef559de0bc3b8fabf
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:19.989536+00:00.
Case digest / 95b12fc56ba8ed03b0a476c2da05c489ecf52a47b5b471b4e8805524f46f0b4a