FAILURE MAP
← Case archive

FA-77136 / Calendar recurrence rules / Open access

Monthly day 29-31 with OMIT/BACKWARD/FORWARD skip policy: leap feb · case 01

A day-29 series applies the skip policy in leap-year February instead of using February 29.

Verified by executionVariant 1 · 9 checks per implementationDownload source bundle ↓JSON ↗

ROOT CAUSE

February is hard-coded to 28 days.

VERIFIED REPAIR

At the leap feb decision use `monthday <= dim`, leaving the other decision sites of the model unchanged.

Unsuccessful approach: The partial repair `monthday <= (28 if m == 2 and y % 100 == 0 else dim)` treats every century February as 28 days, although 2000 is a leap year.

Case contract

FREQ=MONTHLY on a fixed monthday from the dtstart month. When the day does not exist in a month, skip decides: OMIT (also the default when skip is None) drops the month, BACKWARD uses the last day of the month, FORWARD uses the first day of the following month. February has 29 days in leap years. Instances before dtstart are dropped. 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, monthday, skip, count):
    start = dt.date.fromisoformat(dtstart)
    out = []
    for k in range(240):
        mi = start.month - 1 + k
        y, m = start.year + mi // 12, mi % 12 + 1
        dim = calendar.monthrange(y, m)[1]
        if monthday <= (28 if m == 2 else dim):
            d = dt.date(y, m, monthday)
        elif skip in (None, 'OMIT'):
            continue
        elif skip == 'BACKWARD':
            d = dt.date(y, m, dim)
        else:
            d = dt.date(y, m, dim) + dt.timedelta(days=1)
        if d < start:
            continue
        out.append(d.isoformat())
        if len(out) >= count:
            break
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: 31st forward in common year',
   ['2023-01-31', 31, 'FORWARD', 4],
   ['2023-01-31', '2023-03-01', '2023-03-31', '2023-05-01']),
  ('default omits', ['2023-01-30', 30, None, 3], ['2023-01-30', '2023-03-30', '2023-04-30']),
  ('explicit omit', ['2023-01-31', 31, 'OMIT', 3], ['2023-01-31', '2023-03-31', '2023-05-31']),
  ('backward from 31st',
   ['2024-03-31', 31, 'BACKWARD', 4],
   ['2024-03-31', '2024-04-30', '2024-05-31', '2024-06-30']),
  ('leap february 29', ['2024-01-29', 29, 'BACKWARD', 3], ['2024-01-29', '2024-02-29', '2024-03-29']),
  ('common february 29 backward',
   ['2023-01-29', 29, 'BACKWARD', 3],
   ['2023-01-29', '2023-02-28', '2023-03-29']),
  ('forward 30th in february leap',
   ['2024-01-30', 30, 'FORWARD', 3],
   ['2024-01-30', '2024-03-01', '2024-03-30']),
  ('leap day omit', ['2024-01-29', 29, None, 3], ['2024-01-29', '2024-02-29', '2024-03-29']),
  ('century leap day', ['2000-01-29', 29, 'OMIT', 3], ['2000-01-29', '2000-02-29', '2000-03-29'])],
 [('explicit omit', ['2023-01-31', 31, 'OMIT', 3], ['2023-01-31', '2023-03-31', '2023-05-31']),
  ('backward from 31st',
   ['2024-03-31', 31, 'BACKWARD', 4],
   ['2024-03-31', '2024-04-30', '2024-05-31', '2024-06-30']),
  ('leap february 29', ['2024-01-29', 29, 'BACKWARD', 3], ['2024-01-29', '2024-02-29', '2024-03-29']),
  ('common february 29 backward',
   ['2023-01-29', 29, 'BACKWARD', 3],
   ['2023-01-29', '2023-02-28', '2023-03-29']),
  ('forward 30th in february leap',
   ['2024-01-30', 30, 'FORWARD', 3],
   ['2024-01-30', '2024-03-01', '2024-03-30']),
  ('backward 30th in february',
   ['2023-01-30', 30, 'BACKWARD', 3],
   ['2023-01-30', '2023-02-28', '2023-03-30']),
  ('forward 29th in common february',
   ['2023-01-29', 29, 'FORWARD', 3],
   ['2023-01-29', '2023-03-01', '2023-03-29']),
  ('century leap day', ['2000-01-29', 29, 'OMIT', 3], ['2000-01-29', '2000-02-29', '2000-03-29'])],
 [('leap february 29', ['2024-01-29', 29, 'BACKWARD', 3], ['2024-01-29', '2024-02-29', '2024-03-29']),
  ('common february 29 backward',
   ['2023-01-29', 29, 'BACKWARD', 3],
   ['2023-01-29', '2023-02-28', '2023-03-29']),
  ('forward 30th in february leap',
   ['2024-01-30', 30, 'FORWARD', 3],
   ['2024-01-30', '2024-03-01', '2024-03-30']),
  ('backward 30th in february',
   ['2023-01-30', 30, 'BACKWARD', 3],
   ['2023-01-30', '2023-02-28', '2023-03-30']),
  ('forward 29th in common february',
   ['2023-01-29', 29, 'FORWARD', 3],
   ['2023-01-29', '2023-03-01', '2023-03-29']),
  ('leap day omit', ['2024-01-29', 29, None, 3], ['2024-01-29', '2024-02-29', '2024-03-29']),
  ('forward from april 31', ['2024-04-15', 31, 'FORWARD', 3], ['2024-05-01', '2024-05-31', '2024-07-01']),
  ('century leap day', ['2000-01-29', 29, 'OMIT', 3], ['2000-01-29', '2000-02-29', '2000-03-29'])],
 [('forward 30th in february leap',
   ['2024-01-30', 30, 'FORWARD', 3],
   ['2024-01-30', '2024-03-01', '2024-03-30']),
  ('backward 30th in february',
   ['2023-01-30', 30, 'BACKWARD', 3],
   ['2023-01-30', '2023-02-28', '2023-03-30']),
  ('forward 29th in common february',
   ['2023-01-29', 29, 'FORWARD', 3],
   ['2023-01-29', '2023-03-01', '2023-03-29']),
  ('leap day omit', ['2024-01-29', 29, None, 3], ['2024-01-29', '2024-02-29', '2024-03-29']),
  ('forward from april 31', ['2024-04-15', 31, 'FORWARD', 3], ['2024-05-01', '2024-05-31', '2024-07-01']),
  ('backward 31st leap february',
   ['2024-01-31', 31, 'BACKWARD', 3],
   ['2024-01-31', '2024-02-29', '2024-03-31']),
  ('century leap day', ['2000-01-29', 29, 'OMIT', 3], ['2000-01-29', '2000-02-29', '2000-03-29'])],
 [('forward 29th in common february',
   ['2023-01-29', 29, 'FORWARD', 3],
   ['2023-01-29', '2023-03-01', '2023-03-29']),
  ('leap day omit', ['2024-01-29', 29, None, 3], ['2024-01-29', '2024-02-29', '2024-03-29']),
  ('forward from april 31', ['2024-04-15', 31, 'FORWARD', 3], ['2024-05-01', '2024-05-31', '2024-07-01']),
  ('backward 31st leap february',
   ['2024-01-31', 31, 'BACKWARD', 3],
   ['2024-01-31', '2024-02-29', '2024-03-31']),
  ('century leap day', ['2000-01-29', 29, 'OMIT', 3], ['2000-01-29', '2000-02-29', '2000-03-29']),
  ('century common february', ['2100-01-29', 29, 'OMIT', 3], ['2100-01-29', '2100-03-29', '2100-04-29']),
  ('regression: 31st forward in common year',
   ['2023-01-31', 31, 'FORWARD', 4],
   ['2023-01-31', '2023-03-01', '2023-03-31', '2023-05-01'])]]
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 fixtureActualExpectedOutcome
regression: 31st forward in common year['2023-01-31', '2023-03-01', '2023-03-31', '2023-05-01']['2023-01-31', '2023-03-01', '2023-03-31', '2023-05-01']Passed
default omits['2023-01-30', '2023-03-30', '2023-04-30']['2023-01-30', '2023-03-30', '2023-04-30']Passed
explicit omit['2023-01-31', '2023-03-31', '2023-05-31']['2023-01-31', '2023-03-31', '2023-05-31']Passed
backward from 31st['2024-03-31', '2024-04-30', '2024-05-31', '2024-06-30']['2024-03-31', '2024-04-30', '2024-05-31', '2024-06-30']Passed
leap february 29['2024-01-29', '2024-02-29', '2024-03-29']['2024-01-29', '2024-02-29', '2024-03-29']Passed
common february 29 backward['2023-01-29', '2023-02-28', '2023-03-29']['2023-01-29', '2023-02-28', '2023-03-29']Passed
forward 30th in february leap['2024-01-30', '2024-03-01', '2024-03-30']['2024-01-30', '2024-03-01', '2024-03-30']Passed
leap day omit['2024-01-29', '2024-03-29', '2024-04-29']['2024-01-29', '2024-02-29', '2024-03-29']Failed
century leap day['2000-01-29', '2000-03-29', '2000-04-29']['2000-01-29', '2000-02-29', '2000-03-29']Failed

SHA-256 / 69a207b19beeb6bddb9f569d554725d016fc21094617f744c996fc5d252ab599

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, monthday, skip, count):
    start = dt.date.fromisoformat(dtstart)
    out = []
    for k in range(240):
        mi = start.month - 1 + k
        y, m = start.year + mi // 12, mi % 12 + 1
        dim = calendar.monthrange(y, m)[1]
        if monthday <= (28 if m == 2 and y % 100 == 0 else dim):
            d = dt.date(y, m, monthday)
        elif skip in (None, 'OMIT'):
            continue
        elif skip == 'BACKWARD':
            d = dt.date(y, m, dim)
        else:
            d = dt.date(y, m, dim) + dt.timedelta(days=1)
        if d < start:
            continue
        out.append(d.isoformat())
        if len(out) >= count:
            break
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: 31st forward in common year',
   ['2023-01-31', 31, 'FORWARD', 4],
   ['2023-01-31', '2023-03-01', '2023-03-31', '2023-05-01']),
  ('default omits', ['2023-01-30', 30, None, 3], ['2023-01-30', '2023-03-30', '2023-04-30']),
  ('explicit omit', ['2023-01-31', 31, 'OMIT', 3], ['2023-01-31', '2023-03-31', '2023-05-31']),
  ('backward from 31st',
   ['2024-03-31', 31, 'BACKWARD', 4],
   ['2024-03-31', '2024-04-30', '2024-05-31', '2024-06-30']),
  ('leap february 29', ['2024-01-29', 29, 'BACKWARD', 3], ['2024-01-29', '2024-02-29', '2024-03-29']),
  ('common february 29 backward',
   ['2023-01-29', 29, 'BACKWARD', 3],
   ['2023-01-29', '2023-02-28', '2023-03-29']),
  ('forward 30th in february leap',
   ['2024-01-30', 30, 'FORWARD', 3],
   ['2024-01-30', '2024-03-01', '2024-03-30']),
  ('leap day omit', ['2024-01-29', 29, None, 3], ['2024-01-29', '2024-02-29', '2024-03-29']),
  ('century leap day', ['2000-01-29', 29, 'OMIT', 3], ['2000-01-29', '2000-02-29', '2000-03-29'])],
 [('explicit omit', ['2023-01-31', 31, 'OMIT', 3], ['2023-01-31', '2023-03-31', '2023-05-31']),
  ('backward from 31st',
   ['2024-03-31', 31, 'BACKWARD', 4],
   ['2024-03-31', '2024-04-30', '2024-05-31', '2024-06-30']),
  ('leap february 29', ['2024-01-29', 29, 'BACKWARD', 3], ['2024-01-29', '2024-02-29', '2024-03-29']),
  ('common february 29 backward',
   ['2023-01-29', 29, 'BACKWARD', 3],
   ['2023-01-29', '2023-02-28', '2023-03-29']),
  ('forward 30th in february leap',
   ['2024-01-30', 30, 'FORWARD', 3],
   ['2024-01-30', '2024-03-01', '2024-03-30']),
  ('backward 30th in february',
   ['2023-01-30', 30, 'BACKWARD', 3],
   ['2023-01-30', '2023-02-28', '2023-03-30']),
  ('forward 29th in common february',
   ['2023-01-29', 29, 'FORWARD', 3],
   ['2023-01-29', '2023-03-01', '2023-03-29']),
  ('century leap day', ['2000-01-29', 29, 'OMIT', 3], ['2000-01-29', '2000-02-29', '2000-03-29'])],
 [('leap february 29', ['2024-01-29', 29, 'BACKWARD', 3], ['2024-01-29', '2024-02-29', '2024-03-29']),
  ('common february 29 backward',
   ['2023-01-29', 29, 'BACKWARD', 3],
   ['2023-01-29', '2023-02-28', '2023-03-29']),
  ('forward 30th in february leap',
   ['2024-01-30', 30, 'FORWARD', 3],
   ['2024-01-30', '2024-03-01', '2024-03-30']),
  ('backward 30th in february',
   ['2023-01-30', 30, 'BACKWARD', 3],
   ['2023-01-30', '2023-02-28', '2023-03-30']),
  ('forward 29th in common february',
   ['2023-01-29', 29, 'FORWARD', 3],
   ['2023-01-29', '2023-03-01', '2023-03-29']),
  ('leap day omit', ['2024-01-29', 29, None, 3], ['2024-01-29', '2024-02-29', '2024-03-29']),
  ('forward from april 31', ['2024-04-15', 31, 'FORWARD', 3], ['2024-05-01', '2024-05-31', '2024-07-01']),
  ('century leap day', ['2000-01-29', 29, 'OMIT', 3], ['2000-01-29', '2000-02-29', '2000-03-29'])],
 [('forward 30th in february leap',
   ['2024-01-30', 30, 'FORWARD', 3],
   ['2024-01-30', '2024-03-01', '2024-03-30']),
  ('backward 30th in february',
   ['2023-01-30', 30, 'BACKWARD', 3],
   ['2023-01-30', '2023-02-28', '2023-03-30']),
  ('forward 29th in common february',
   ['2023-01-29', 29, 'FORWARD', 3],
   ['2023-01-29', '2023-03-01', '2023-03-29']),
  ('leap day omit', ['2024-01-29', 29, None, 3], ['2024-01-29', '2024-02-29', '2024-03-29']),
  ('forward from april 31', ['2024-04-15', 31, 'FORWARD', 3], ['2024-05-01', '2024-05-31', '2024-07-01']),
  ('backward 31st leap february',
   ['2024-01-31', 31, 'BACKWARD', 3],
   ['2024-01-31', '2024-02-29', '2024-03-31']),
  ('century leap day', ['2000-01-29', 29, 'OMIT', 3], ['2000-01-29', '2000-02-29', '2000-03-29'])],
 [('forward 29th in common february',
   ['2023-01-29', 29, 'FORWARD', 3],
   ['2023-01-29', '2023-03-01', '2023-03-29']),
  ('leap day omit', ['2024-01-29', 29, None, 3], ['2024-01-29', '2024-02-29', '2024-03-29']),
  ('forward from april 31', ['2024-04-15', 31, 'FORWARD', 3], ['2024-05-01', '2024-05-31', '2024-07-01']),
  ('backward 31st leap february',
   ['2024-01-31', 31, 'BACKWARD', 3],
   ['2024-01-31', '2024-02-29', '2024-03-31']),
  ('century leap day', ['2000-01-29', 29, 'OMIT', 3], ['2000-01-29', '2000-02-29', '2000-03-29']),
  ('century common february', ['2100-01-29', 29, 'OMIT', 3], ['2100-01-29', '2100-03-29', '2100-04-29']),
  ('regression: 31st forward in common year',
   ['2023-01-31', 31, 'FORWARD', 4],
   ['2023-01-31', '2023-03-01', '2023-03-31', '2023-05-01'])]]
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 fixtureActualExpectedOutcome
regression: 31st forward in common year['2023-01-31', '2023-03-01', '2023-03-31', '2023-05-01']['2023-01-31', '2023-03-01', '2023-03-31', '2023-05-01']Passed
default omits['2023-01-30', '2023-03-30', '2023-04-30']['2023-01-30', '2023-03-30', '2023-04-30']Passed
explicit omit['2023-01-31', '2023-03-31', '2023-05-31']['2023-01-31', '2023-03-31', '2023-05-31']Passed
backward from 31st['2024-03-31', '2024-04-30', '2024-05-31', '2024-06-30']['2024-03-31', '2024-04-30', '2024-05-31', '2024-06-30']Passed
leap february 29['2024-01-29', '2024-02-29', '2024-03-29']['2024-01-29', '2024-02-29', '2024-03-29']Passed
common february 29 backward['2023-01-29', '2023-02-28', '2023-03-29']['2023-01-29', '2023-02-28', '2023-03-29']Passed
forward 30th in february leap['2024-01-30', '2024-03-01', '2024-03-30']['2024-01-30', '2024-03-01', '2024-03-30']Passed
leap day omit['2024-01-29', '2024-02-29', '2024-03-29']['2024-01-29', '2024-02-29', '2024-03-29']Passed
century leap day['2000-01-29', '2000-03-29', '2000-04-29']['2000-01-29', '2000-02-29', '2000-03-29']Failed

SHA-256 / f210165c844e2ddae34a035639221b3e344c00008d54c759f09c0f6c4176262d

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, monthday, skip, count):
    start = dt.date.fromisoformat(dtstart)
    out = []
    for k in range(240):
        mi = start.month - 1 + k
        y, m = start.year + mi // 12, mi % 12 + 1
        dim = calendar.monthrange(y, m)[1]
        if monthday <= dim:
            d = dt.date(y, m, monthday)
        elif skip in (None, 'OMIT'):
            continue
        elif skip == 'BACKWARD':
            d = dt.date(y, m, dim)
        else:
            d = dt.date(y, m, dim) + dt.timedelta(days=1)
        if d < start:
            continue
        out.append(d.isoformat())
        if len(out) >= count:
            break
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: 31st forward in common year',
   ['2023-01-31', 31, 'FORWARD', 4],
   ['2023-01-31', '2023-03-01', '2023-03-31', '2023-05-01']),
  ('default omits', ['2023-01-30', 30, None, 3], ['2023-01-30', '2023-03-30', '2023-04-30']),
  ('explicit omit', ['2023-01-31', 31, 'OMIT', 3], ['2023-01-31', '2023-03-31', '2023-05-31']),
  ('backward from 31st',
   ['2024-03-31', 31, 'BACKWARD', 4],
   ['2024-03-31', '2024-04-30', '2024-05-31', '2024-06-30']),
  ('leap february 29', ['2024-01-29', 29, 'BACKWARD', 3], ['2024-01-29', '2024-02-29', '2024-03-29']),
  ('common february 29 backward',
   ['2023-01-29', 29, 'BACKWARD', 3],
   ['2023-01-29', '2023-02-28', '2023-03-29']),
  ('forward 30th in february leap',
   ['2024-01-30', 30, 'FORWARD', 3],
   ['2024-01-30', '2024-03-01', '2024-03-30']),
  ('leap day omit', ['2024-01-29', 29, None, 3], ['2024-01-29', '2024-02-29', '2024-03-29']),
  ('century leap day', ['2000-01-29', 29, 'OMIT', 3], ['2000-01-29', '2000-02-29', '2000-03-29'])],
 [('explicit omit', ['2023-01-31', 31, 'OMIT', 3], ['2023-01-31', '2023-03-31', '2023-05-31']),
  ('backward from 31st',
   ['2024-03-31', 31, 'BACKWARD', 4],
   ['2024-03-31', '2024-04-30', '2024-05-31', '2024-06-30']),
  ('leap february 29', ['2024-01-29', 29, 'BACKWARD', 3], ['2024-01-29', '2024-02-29', '2024-03-29']),
  ('common february 29 backward',
   ['2023-01-29', 29, 'BACKWARD', 3],
   ['2023-01-29', '2023-02-28', '2023-03-29']),
  ('forward 30th in february leap',
   ['2024-01-30', 30, 'FORWARD', 3],
   ['2024-01-30', '2024-03-01', '2024-03-30']),
  ('backward 30th in february',
   ['2023-01-30', 30, 'BACKWARD', 3],
   ['2023-01-30', '2023-02-28', '2023-03-30']),
  ('forward 29th in common february',
   ['2023-01-29', 29, 'FORWARD', 3],
   ['2023-01-29', '2023-03-01', '2023-03-29']),
  ('century leap day', ['2000-01-29', 29, 'OMIT', 3], ['2000-01-29', '2000-02-29', '2000-03-29'])],
 [('leap february 29', ['2024-01-29', 29, 'BACKWARD', 3], ['2024-01-29', '2024-02-29', '2024-03-29']),
  ('common february 29 backward',
   ['2023-01-29', 29, 'BACKWARD', 3],
   ['2023-01-29', '2023-02-28', '2023-03-29']),
  ('forward 30th in february leap',
   ['2024-01-30', 30, 'FORWARD', 3],
   ['2024-01-30', '2024-03-01', '2024-03-30']),
  ('backward 30th in february',
   ['2023-01-30', 30, 'BACKWARD', 3],
   ['2023-01-30', '2023-02-28', '2023-03-30']),
  ('forward 29th in common february',
   ['2023-01-29', 29, 'FORWARD', 3],
   ['2023-01-29', '2023-03-01', '2023-03-29']),
  ('leap day omit', ['2024-01-29', 29, None, 3], ['2024-01-29', '2024-02-29', '2024-03-29']),
  ('forward from april 31', ['2024-04-15', 31, 'FORWARD', 3], ['2024-05-01', '2024-05-31', '2024-07-01']),
  ('century leap day', ['2000-01-29', 29, 'OMIT', 3], ['2000-01-29', '2000-02-29', '2000-03-29'])],
 [('forward 30th in february leap',
   ['2024-01-30', 30, 'FORWARD', 3],
   ['2024-01-30', '2024-03-01', '2024-03-30']),
  ('backward 30th in february',
   ['2023-01-30', 30, 'BACKWARD', 3],
   ['2023-01-30', '2023-02-28', '2023-03-30']),
  ('forward 29th in common february',
   ['2023-01-29', 29, 'FORWARD', 3],
   ['2023-01-29', '2023-03-01', '2023-03-29']),
  ('leap day omit', ['2024-01-29', 29, None, 3], ['2024-01-29', '2024-02-29', '2024-03-29']),
  ('forward from april 31', ['2024-04-15', 31, 'FORWARD', 3], ['2024-05-01', '2024-05-31', '2024-07-01']),
  ('backward 31st leap february',
   ['2024-01-31', 31, 'BACKWARD', 3],
   ['2024-01-31', '2024-02-29', '2024-03-31']),
  ('century leap day', ['2000-01-29', 29, 'OMIT', 3], ['2000-01-29', '2000-02-29', '2000-03-29'])],
 [('forward 29th in common february',
   ['2023-01-29', 29, 'FORWARD', 3],
   ['2023-01-29', '2023-03-01', '2023-03-29']),
  ('leap day omit', ['2024-01-29', 29, None, 3], ['2024-01-29', '2024-02-29', '2024-03-29']),
  ('forward from april 31', ['2024-04-15', 31, 'FORWARD', 3], ['2024-05-01', '2024-05-31', '2024-07-01']),
  ('backward 31st leap february',
   ['2024-01-31', 31, 'BACKWARD', 3],
   ['2024-01-31', '2024-02-29', '2024-03-31']),
  ('century leap day', ['2000-01-29', 29, 'OMIT', 3], ['2000-01-29', '2000-02-29', '2000-03-29']),
  ('century common february', ['2100-01-29', 29, 'OMIT', 3], ['2100-01-29', '2100-03-29', '2100-04-29']),
  ('regression: 31st forward in common year',
   ['2023-01-31', 31, 'FORWARD', 4],
   ['2023-01-31', '2023-03-01', '2023-03-31', '2023-05-01'])]]
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 fixtureActualExpectedOutcome
regression: 31st forward in common year['2023-01-31', '2023-03-01', '2023-03-31', '2023-05-01']['2023-01-31', '2023-03-01', '2023-03-31', '2023-05-01']Passed
default omits['2023-01-30', '2023-03-30', '2023-04-30']['2023-01-30', '2023-03-30', '2023-04-30']Passed
explicit omit['2023-01-31', '2023-03-31', '2023-05-31']['2023-01-31', '2023-03-31', '2023-05-31']Passed
backward from 31st['2024-03-31', '2024-04-30', '2024-05-31', '2024-06-30']['2024-03-31', '2024-04-30', '2024-05-31', '2024-06-30']Passed
leap february 29['2024-01-29', '2024-02-29', '2024-03-29']['2024-01-29', '2024-02-29', '2024-03-29']Passed
common february 29 backward['2023-01-29', '2023-02-28', '2023-03-29']['2023-01-29', '2023-02-28', '2023-03-29']Passed
forward 30th in february leap['2024-01-30', '2024-03-01', '2024-03-30']['2024-01-30', '2024-03-01', '2024-03-30']Passed
leap day omit['2024-01-29', '2024-02-29', '2024-03-29']['2024-01-29', '2024-02-29', '2024-03-29']Passed
century leap day['2000-01-29', '2000-02-29', '2000-03-29']['2000-01-29', '2000-02-29', '2000-03-29']Passed

SHA-256 / 5adcff0a9ab22daa34e23aec74428144bc416ee633afd25bf52d16a55dba75b9

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:22.634949+00:00.

Case digest / 6893ec7a21b919e50fbddd8c96b65e5927cc8bf3c3c2ea9d0466bc8b8cd459e5