FAILURE MAP
← Case archive

FA-66381 / Airline fare rule evaluation / Open access

Return exactly on the minimum-stay day rejected · case 01

A 7-day minimum stay rejects a return exactly seven days after departure.

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

ROOT CAUSE

The minimum stay comparison is inclusive of the limit.

VERIFIED REPAIR

Fail only when the stay is shorter than min_days.

Unsuccessful approach: Counting both travel days as stay days lets a stay one day short pass.

Case contract

Input {'depart','return' ISO dates,'rule':{'sat_night','min_days','max_months'}}. Saturday-night rule: return on or after the Sunday following the first Saturday on or after departure. Min stay: return - depart >= min_days. Max stay: return <= departure date plus max_months calendar months; a month-end departure maps to the target month end, otherwise day clamps to month length. Return failed rule names in order SAT, MIN, MAX.

Why this case matters

Stay restrictions mix weekday logic and calendar-month arithmetic with month-end and year-rollover rules.

1 / The failure

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
import datetime
import calendar
N = 1
observations = []
def solve(x):
    d = datetime.date.fromisoformat(x['depart'])
    r = datetime.date.fromisoformat(x['return'])
    rule = x['rule']
    fails = []
    if rule['sat_night']:
        sun = d + datetime.timedelta(days=(5 - d.weekday()) % 7 + 1)
        if r < sun: fails.append('SAT')
    if (r - d).days <= rule['min_days']: fails.append('MIN')
    mo = d.month - 1 + rule['max_months']
    y, mo = d.year + mo // 12, mo % 12 + 1
    last = calendar.monthrange(y, mo)[1]
    eom = d.day == calendar.monthrange(d.year, d.month)[1]
    lim = datetime.date(y, mo, last if eom else min(d.day, last))
    if r > lim: fails.append('MAX')
    return fails
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['Sunday departure next-day return', {'depart': '2027-03-07', 'return': '2027-03-08', 'rule': {'sat_night': True, 'min_days': 0, 'max_months': 1}}, ['SAT']], ['Saturday departure Sunday return', {'depart': '2027-03-13', 'return': '2027-03-14', 'rule': {'sat_night': True, 'min_days': 1, 'max_months': 1}}, []], ['Friday out Saturday back', {'depart': '2027-03-12', 'return': '2027-03-13', 'rule': {'sat_night': True, 'min_days': 0, 'max_months': 3}}, ['SAT']], ['month-end max stay', {'depart': '2027-02-28', 'return': '2027-03-30', 'rule': {'sat_night': False, 'min_days': 3, 'max_months': 1}}, []], ['the 28th is not month end', {'depart': '2027-04-28', 'return': '2027-05-30', 'rule': {'sat_night': False, 'min_days': 0, 'max_months': 1}}, ['MAX']], ['Jan 31 plus one month', {'depart': '2027-01-31', 'return': '2027-02-28', 'rule': {'sat_night': False, 'min_days': 0, 'max_months': 1}}, []], ['year rollover max stay', {'depart': '2027-11-11', 'return': '2028-01-10', 'rule': {'sat_night': False, 'min_days': 7, 'max_months': 2}}, []], ['exact minimum stay', {'depart': '2027-06-01', 'return': '2027-06-08', 'rule': {'sat_night': False, 'min_days': 7, 'max_months': 12}}, []], ['December twelve months', {'depart': '2027-12-15', 'return': '2028-12-14', 'rule': {'sat_night': True, 'min_days': 2, 'max_months': 12}}, []], ['sampled case 1', {'depart': '2029-08-19', 'return': '2029-08-28', 'rule': {'sat_night': True, 'min_days': 2, 'max_months': 2}}, []], ['sampled case 2', {'depart': '2028-06-13', 'return': '2028-12-13', 'rule': {'sat_night': True, 'min_days': 0, 'max_months': 12}}, []], ['sampled case 3', {'depart': '2028-04-16', 'return': '2028-08-20', 'rule': {'sat_night': False, 'min_days': 1, 'max_months': 1}}, ['MAX']], ['regression: minimum stay comparison', {'depart': '2027-01-26', 'return': '2027-02-01', 'rule': {'sat_night': True, 'min_days': 7, 'max_months': 3}}, ['MIN']]], [['Sunday departure next-day return', {'depart': '2027-03-07', 'return': '2027-03-09', 'rule': {'sat_night': True, 'min_days': 0, 'max_months': 1}}, ['SAT']], ['Saturday departure Sunday return', {'depart': '2027-03-13', 'return': '2027-03-14', 'rule': {'sat_night': True, 'min_days': 1, 'max_months': 1}}, []], ['Friday out Saturday back', {'depart': '2027-03-12', 'return': '2027-03-13', 'rule': {'sat_night': True, 'min_days': 0, 'max_months': 3}}, ['SAT']], ['month-end max stay', {'depart': '2027-02-28', 'return': '2027-03-31', 'rule': {'sat_night': False, 'min_days': 3, 'max_months': 1}}, []], ['the 28th is not month end', {'depart': '2027-04-28', 'return': '2027-05-31', 'rule': {'sat_night': False, 'min_days': 0, 'max_months': 1}}, ['MAX']], ['Jan 31 plus one month', {'depart': '2027-01-31', 'return': '2027-02-28', 'rule': {'sat_night': False, 'min_days': 0, 'max_months': 1}}, []], ['year rollover max stay', {'depart': '2027-11-12', 'return': '2028-01-12', 'rule': {'sat_night': False, 'min_days': 7, 'max_months': 2}}, []], ['exact minimum stay', {'depart': '2027-06-01', 'return': '2027-06-08', 'rule': {'sat_night': False, 'min_days': 7, 'max_months': 12}}, []], ['December twelve months', {'depart': '2027-12-15', 'return': '2028-12-15', 'rule': {'sat_night': True, 'min_days': 2, 'max_months': 12}}, []], ['sampled case 1', {'depart': '2029-07-11', 'return': '2029-07-23', 'rule': {'sat_night': True, 'min_days': 7, 'max_months': 12}}, []], ['sampled case 2', {'depart': '2029-06-25', 'return': '2029-12-12', 'rule': {'sat_night': True, 'min_days': 2, 'max_months': 2}}, ['MAX']], ['sampled case 3', {'depart': '2029-02-02', 'return': '2030-02-22', 'rule': {'sat_night': True, 'min_days': 1, 'max_months': 6}}, ['MAX']], ['regression: minimum stay comparison', {'depart': '2027-01-22', 'return': '2027-01-24', 'rule': {'sat_night': False, 'min_days': 3, 'max_months': 3}}, ['MIN']]], [['Sunday departure next-day return', {'depart': '2027-03-07', 'return': '2027-03-10', 'rule': {'sat_night': True, 'min_days': 0, 'max_months': 1}}, ['SAT']], ['Saturday departure Sunday return', {'depart': '2027-03-13', 'return': '2027-03-14', 'rule': {'sat_night': True, 'min_days': 1, 'max_months': 1}}, []], ['Friday out Saturday back', {'depart': '2027-03-12', 'return': '2027-03-13', 'rule': {'sat_night': True, 'min_days': 0, 'max_months': 3}}, ['SAT']], ['month-end max stay', {'depart': '2027-02-28', 'return': '2027-03-29', 'rule': {'sat_night': False, 'min_days': 3, 'max_months': 1}}, []], ['the 28th is not month end', {'depart': '2027-04-28', 'return': '2027-05-29', 'rule': {'sat_night': False, 'min_days': 0, 'max_months': 1}}, ['MAX']], ['Jan 31 plus one month', {'depart': '2027-01-31', 'return': '2027-02-28', 'rule': {'sat_night': False, 'min_days': 0, 'max_months': 1}}, []], ['year rollover max stay', {'depart': '2027-11-13', 'return': '2028-01-14', 'rule': {'sat_night': False, 'min_days': 7, 'max_months': 2}}, ['MAX']], ['exact minimum stay', {'depart': '2027-06-01', 'return': '2027-06-08', 'rule': {'sat_night': False, 'min_days': 7, 'max_months': 12}}, []], ['December twelve months', {'depart': '2027-12-15', 'return': '2028-12-16', 'rule': {'sat_night': True, 'min_days': 2, 'max_months': 12}}, ['MAX']], ['sampled case 1', {'depart': '2027-10-05', 'return': '2027-10-14', 'rule': {'sat_night': True, 'min_days': 3, 'max_months': 6}}, []], ['sampled case 2', {'depart': '2028-04-06', 'return': '2028-10-12', 'rule': {'sat_night': False, 'min_days': 7, 'max_months': 11}}, []], ['sampled case 3', {'depart': '2027-11-12', 'return': '2027-11-21', 'rule': {'sat_night': False, 'min_days': 0, 'max_months': 2}}, []], ['regression: minimum stay comparison', {'depart': '2027-10-11', 'return': '2027-10-17', 'rule': {'sat_night': True, 'min_days': 7, 'max_months': 3}}, ['MIN']]], [['Sunday departure next-day return', {'depart': '2027-03-07', 'return': '2027-03-11', 'rule': {'sat_night': True, 'min_days': 0, 'max_months': 1}}, ['SAT']], ['Saturday departure Sunday return', {'depart': '2027-03-13', 'return': '2027-03-14', 'rule': {'sat_night': True, 'min_days': 1, 'max_months': 1}}, []], ['Friday out Saturday back', {'depart': '2027-03-12', 'return': '2027-03-13', 'rule': {'sat_night': True, 'min_days': 0, 'max_months': 3}}, ['SAT']], ['month-end max stay', {'depart': '2027-02-28', 'return': '2027-03-30', 'rule': {'sat_night': False, 'min_days': 3, 'max_months': 1}}, []], ['the 28th is not month end', {'depart': '2027-04-28', 'return': '2027-05-30', 'rule': {'sat_night': False, 'min_days': 0, 'max_months': 1}}, ['MAX']], ['Jan 31 plus one month', {'depart': '2027-01-31', 'return': '2027-02-28', 'rule': {'sat_night': False, 'min_days': 0, 'max_months': 1}}, []], ['year rollover max stay', {'depart': '2027-11-14', 'return': '2028-01-16', 'rule': {'sat_night': False, 'min_days': 7, 'max_months': 2}}, ['MAX']], ['exact minimum stay', {'depart': '2027-06-01', 'return': '2027-06-08', 'rule': {'sat_night': False, 'min_days': 7, 'max_months': 12}}, []], ['December twelve months', {'depart': '2027-12-15', 'return': '2028-12-17', 'rule': {'sat_night': True, 'min_days': 2, 'max_months': 12}}, ['MAX']], ['sampled case 1', {'depart': '2027-06-01', 'return': '2027-06-09', 'rule': {'sat_night': True, 'min_days': 7, 'max_months': 1}}, []], ['sampled case 2', {'depart': '2028-03-04', 'return': '2028-06-07', 'rule': {'sat_night': True, 'min_days': 1, 'max_months': 6}}, []], ['sampled case 3', {'depart': '2029-03-17', 'return': '2029-03-25', 'rule': {'sat_night': True, 'min_days': 0, 'max_months': 12}}, []], ['regression: minimum stay comparison', {'depart': '2027-08-23', 'return': '2027-08-29', 'rule': {'sat_night': True, 'min_days': 7, 'max_months': 2}}, ['MIN']]], [['Sunday departure next-day return', {'depart': '2027-03-07', 'return': '2027-03-12', 'rule': {'sat_night': True, 'min_days': 0, 'max_months': 1}}, ['SAT']], ['Saturday departure Sunday return', {'depart': '2027-03-13', 'return': '2027-03-14', 'rule': {'sat_night': True, 'min_days': 1, 'max_months': 1}}, []], ['Friday out Saturday back', {'depart': '2027-03-12', 'return': '2027-03-13', 'rule': {'sat_night': True, 'min_days': 0, 'max_months': 3}}, ['SAT']], ['month-end max stay', {'depart': '2027-02-28', 'return': '2027-03-31', 'rule': {'sat_night': False, 'min_days': 3, 'max_months': 1}}, []], ['the 28th is not month end', {'depart': '2027-04-28', 'return': '2027-05-31', 'rule': {'sat_night': False, 'min_days': 0, 'max_months': 1}}, ['MAX']], ['Jan 31 plus one month', {'depart': '2027-01-31', 'return': '2027-02-28', 'rule': {'sat_night': False, 'min_days': 0, 'max_months': 1}}, []], ['year rollover max stay', {'depart': '2027-11-15', 'return': '2028-01-18', 'rule': {'sat_night': False, 'min_days': 7, 'max_months': 2}}, ['MAX']], ['exact minimum stay', {'depart': '2027-06-01', 'return': '2027-06-08', 'rule': {'sat_night': False, 'min_days': 7, 'max_months': 12}}, []], ['December twelve months', {'depart': '2027-12-15', 'return': '2028-12-18', 'rule': {'sat_night': True, 'min_days': 2, 'max_months': 12}}, ['MAX']], ['sampled case 1', {'depart': '2029-08-05', 'return': '2030-07-02', 'rule': {'sat_night': True, 'min_days': 1, 'max_months': 11}}, []], ['sampled case 2', {'depart': '2028-05-10', 'return': '2028-05-12', 'rule': {'sat_night': False, 'min_days': 2, 'max_months': 11}}, []], ['sampled case 3', {'depart': '2027-09-03', 'return': '2027-09-03', 'rule': {'sat_night': True, 'min_days': 0, 'max_months': 6}}, ['SAT']], ['regression: minimum stay comparison', {'depart': '2027-09-05', 'return': '2027-09-11', 'rule': {'sat_night': True, 'min_days': 7, 'max_months': 6}}, ['SAT', 'MIN']]]]
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
Sunday departure next-day return['SAT']['SAT']Passed
Saturday departure Sunday return['MIN'][]Failed
Friday out Saturday back['SAT']['SAT']Passed
month-end max stay[][]Passed
the 28th is not month end['MAX']['MAX']Passed
Jan 31 plus one month[][]Passed
year rollover max stay[][]Passed
exact minimum stay['MIN'][]Failed
December twelve months[][]Passed
sampled case 1[][]Passed
sampled case 2[][]Passed
sampled case 3['MAX']['MAX']Passed
regression: minimum stay comparison['MIN']['MIN']Passed

SHA-256 / 02e9d8138001a4ecc5f189a36c5bce95c85540645069c667897305b0b31da5de

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
import datetime
import calendar
N = 1
observations = []
def solve(x):
    d = datetime.date.fromisoformat(x['depart'])
    r = datetime.date.fromisoformat(x['return'])
    rule = x['rule']
    fails = []
    if rule['sat_night']:
        sun = d + datetime.timedelta(days=(5 - d.weekday()) % 7 + 1)
        if r < sun: fails.append('SAT')
    if (r - d).days + 1 < rule['min_days']: fails.append('MIN')
    mo = d.month - 1 + rule['max_months']
    y, mo = d.year + mo // 12, mo % 12 + 1
    last = calendar.monthrange(y, mo)[1]
    eom = d.day == calendar.monthrange(d.year, d.month)[1]
    lim = datetime.date(y, mo, last if eom else min(d.day, last))
    if r > lim: fails.append('MAX')
    return fails
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['Sunday departure next-day return', {'depart': '2027-03-07', 'return': '2027-03-08', 'rule': {'sat_night': True, 'min_days': 0, 'max_months': 1}}, ['SAT']], ['Saturday departure Sunday return', {'depart': '2027-03-13', 'return': '2027-03-14', 'rule': {'sat_night': True, 'min_days': 1, 'max_months': 1}}, []], ['Friday out Saturday back', {'depart': '2027-03-12', 'return': '2027-03-13', 'rule': {'sat_night': True, 'min_days': 0, 'max_months': 3}}, ['SAT']], ['month-end max stay', {'depart': '2027-02-28', 'return': '2027-03-30', 'rule': {'sat_night': False, 'min_days': 3, 'max_months': 1}}, []], ['the 28th is not month end', {'depart': '2027-04-28', 'return': '2027-05-30', 'rule': {'sat_night': False, 'min_days': 0, 'max_months': 1}}, ['MAX']], ['Jan 31 plus one month', {'depart': '2027-01-31', 'return': '2027-02-28', 'rule': {'sat_night': False, 'min_days': 0, 'max_months': 1}}, []], ['year rollover max stay', {'depart': '2027-11-11', 'return': '2028-01-10', 'rule': {'sat_night': False, 'min_days': 7, 'max_months': 2}}, []], ['exact minimum stay', {'depart': '2027-06-01', 'return': '2027-06-08', 'rule': {'sat_night': False, 'min_days': 7, 'max_months': 12}}, []], ['December twelve months', {'depart': '2027-12-15', 'return': '2028-12-14', 'rule': {'sat_night': True, 'min_days': 2, 'max_months': 12}}, []], ['sampled case 1', {'depart': '2029-08-19', 'return': '2029-08-28', 'rule': {'sat_night': True, 'min_days': 2, 'max_months': 2}}, []], ['sampled case 2', {'depart': '2028-06-13', 'return': '2028-12-13', 'rule': {'sat_night': True, 'min_days': 0, 'max_months': 12}}, []], ['sampled case 3', {'depart': '2028-04-16', 'return': '2028-08-20', 'rule': {'sat_night': False, 'min_days': 1, 'max_months': 1}}, ['MAX']], ['regression: minimum stay comparison', {'depart': '2027-01-26', 'return': '2027-02-01', 'rule': {'sat_night': True, 'min_days': 7, 'max_months': 3}}, ['MIN']]], [['Sunday departure next-day return', {'depart': '2027-03-07', 'return': '2027-03-09', 'rule': {'sat_night': True, 'min_days': 0, 'max_months': 1}}, ['SAT']], ['Saturday departure Sunday return', {'depart': '2027-03-13', 'return': '2027-03-14', 'rule': {'sat_night': True, 'min_days': 1, 'max_months': 1}}, []], ['Friday out Saturday back', {'depart': '2027-03-12', 'return': '2027-03-13', 'rule': {'sat_night': True, 'min_days': 0, 'max_months': 3}}, ['SAT']], ['month-end max stay', {'depart': '2027-02-28', 'return': '2027-03-31', 'rule': {'sat_night': False, 'min_days': 3, 'max_months': 1}}, []], ['the 28th is not month end', {'depart': '2027-04-28', 'return': '2027-05-31', 'rule': {'sat_night': False, 'min_days': 0, 'max_months': 1}}, ['MAX']], ['Jan 31 plus one month', {'depart': '2027-01-31', 'return': '2027-02-28', 'rule': {'sat_night': False, 'min_days': 0, 'max_months': 1}}, []], ['year rollover max stay', {'depart': '2027-11-12', 'return': '2028-01-12', 'rule': {'sat_night': False, 'min_days': 7, 'max_months': 2}}, []], ['exact minimum stay', {'depart': '2027-06-01', 'return': '2027-06-08', 'rule': {'sat_night': False, 'min_days': 7, 'max_months': 12}}, []], ['December twelve months', {'depart': '2027-12-15', 'return': '2028-12-15', 'rule': {'sat_night': True, 'min_days': 2, 'max_months': 12}}, []], ['sampled case 1', {'depart': '2029-07-11', 'return': '2029-07-23', 'rule': {'sat_night': True, 'min_days': 7, 'max_months': 12}}, []], ['sampled case 2', {'depart': '2029-06-25', 'return': '2029-12-12', 'rule': {'sat_night': True, 'min_days': 2, 'max_months': 2}}, ['MAX']], ['sampled case 3', {'depart': '2029-02-02', 'return': '2030-02-22', 'rule': {'sat_night': True, 'min_days': 1, 'max_months': 6}}, ['MAX']], ['regression: minimum stay comparison', {'depart': '2027-01-22', 'return': '2027-01-24', 'rule': {'sat_night': False, 'min_days': 3, 'max_months': 3}}, ['MIN']]], [['Sunday departure next-day return', {'depart': '2027-03-07', 'return': '2027-03-10', 'rule': {'sat_night': True, 'min_days': 0, 'max_months': 1}}, ['SAT']], ['Saturday departure Sunday return', {'depart': '2027-03-13', 'return': '2027-03-14', 'rule': {'sat_night': True, 'min_days': 1, 'max_months': 1}}, []], ['Friday out Saturday back', {'depart': '2027-03-12', 'return': '2027-03-13', 'rule': {'sat_night': True, 'min_days': 0, 'max_months': 3}}, ['SAT']], ['month-end max stay', {'depart': '2027-02-28', 'return': '2027-03-29', 'rule': {'sat_night': False, 'min_days': 3, 'max_months': 1}}, []], ['the 28th is not month end', {'depart': '2027-04-28', 'return': '2027-05-29', 'rule': {'sat_night': False, 'min_days': 0, 'max_months': 1}}, ['MAX']], ['Jan 31 plus one month', {'depart': '2027-01-31', 'return': '2027-02-28', 'rule': {'sat_night': False, 'min_days': 0, 'max_months': 1}}, []], ['year rollover max stay', {'depart': '2027-11-13', 'return': '2028-01-14', 'rule': {'sat_night': False, 'min_days': 7, 'max_months': 2}}, ['MAX']], ['exact minimum stay', {'depart': '2027-06-01', 'return': '2027-06-08', 'rule': {'sat_night': False, 'min_days': 7, 'max_months': 12}}, []], ['December twelve months', {'depart': '2027-12-15', 'return': '2028-12-16', 'rule': {'sat_night': True, 'min_days': 2, 'max_months': 12}}, ['MAX']], ['sampled case 1', {'depart': '2027-10-05', 'return': '2027-10-14', 'rule': {'sat_night': True, 'min_days': 3, 'max_months': 6}}, []], ['sampled case 2', {'depart': '2028-04-06', 'return': '2028-10-12', 'rule': {'sat_night': False, 'min_days': 7, 'max_months': 11}}, []], ['sampled case 3', {'depart': '2027-11-12', 'return': '2027-11-21', 'rule': {'sat_night': False, 'min_days': 0, 'max_months': 2}}, []], ['regression: minimum stay comparison', {'depart': '2027-10-11', 'return': '2027-10-17', 'rule': {'sat_night': True, 'min_days': 7, 'max_months': 3}}, ['MIN']]], [['Sunday departure next-day return', {'depart': '2027-03-07', 'return': '2027-03-11', 'rule': {'sat_night': True, 'min_days': 0, 'max_months': 1}}, ['SAT']], ['Saturday departure Sunday return', {'depart': '2027-03-13', 'return': '2027-03-14', 'rule': {'sat_night': True, 'min_days': 1, 'max_months': 1}}, []], ['Friday out Saturday back', {'depart': '2027-03-12', 'return': '2027-03-13', 'rule': {'sat_night': True, 'min_days': 0, 'max_months': 3}}, ['SAT']], ['month-end max stay', {'depart': '2027-02-28', 'return': '2027-03-30', 'rule': {'sat_night': False, 'min_days': 3, 'max_months': 1}}, []], ['the 28th is not month end', {'depart': '2027-04-28', 'return': '2027-05-30', 'rule': {'sat_night': False, 'min_days': 0, 'max_months': 1}}, ['MAX']], ['Jan 31 plus one month', {'depart': '2027-01-31', 'return': '2027-02-28', 'rule': {'sat_night': False, 'min_days': 0, 'max_months': 1}}, []], ['year rollover max stay', {'depart': '2027-11-14', 'return': '2028-01-16', 'rule': {'sat_night': False, 'min_days': 7, 'max_months': 2}}, ['MAX']], ['exact minimum stay', {'depart': '2027-06-01', 'return': '2027-06-08', 'rule': {'sat_night': False, 'min_days': 7, 'max_months': 12}}, []], ['December twelve months', {'depart': '2027-12-15', 'return': '2028-12-17', 'rule': {'sat_night': True, 'min_days': 2, 'max_months': 12}}, ['MAX']], ['sampled case 1', {'depart': '2027-06-01', 'return': '2027-06-09', 'rule': {'sat_night': True, 'min_days': 7, 'max_months': 1}}, []], ['sampled case 2', {'depart': '2028-03-04', 'return': '2028-06-07', 'rule': {'sat_night': True, 'min_days': 1, 'max_months': 6}}, []], ['sampled case 3', {'depart': '2029-03-17', 'return': '2029-03-25', 'rule': {'sat_night': True, 'min_days': 0, 'max_months': 12}}, []], ['regression: minimum stay comparison', {'depart': '2027-08-23', 'return': '2027-08-29', 'rule': {'sat_night': True, 'min_days': 7, 'max_months': 2}}, ['MIN']]], [['Sunday departure next-day return', {'depart': '2027-03-07', 'return': '2027-03-12', 'rule': {'sat_night': True, 'min_days': 0, 'max_months': 1}}, ['SAT']], ['Saturday departure Sunday return', {'depart': '2027-03-13', 'return': '2027-03-14', 'rule': {'sat_night': True, 'min_days': 1, 'max_months': 1}}, []], ['Friday out Saturday back', {'depart': '2027-03-12', 'return': '2027-03-13', 'rule': {'sat_night': True, 'min_days': 0, 'max_months': 3}}, ['SAT']], ['month-end max stay', {'depart': '2027-02-28', 'return': '2027-03-31', 'rule': {'sat_night': False, 'min_days': 3, 'max_months': 1}}, []], ['the 28th is not month end', {'depart': '2027-04-28', 'return': '2027-05-31', 'rule': {'sat_night': False, 'min_days': 0, 'max_months': 1}}, ['MAX']], ['Jan 31 plus one month', {'depart': '2027-01-31', 'return': '2027-02-28', 'rule': {'sat_night': False, 'min_days': 0, 'max_months': 1}}, []], ['year rollover max stay', {'depart': '2027-11-15', 'return': '2028-01-18', 'rule': {'sat_night': False, 'min_days': 7, 'max_months': 2}}, ['MAX']], ['exact minimum stay', {'depart': '2027-06-01', 'return': '2027-06-08', 'rule': {'sat_night': False, 'min_days': 7, 'max_months': 12}}, []], ['December twelve months', {'depart': '2027-12-15', 'return': '2028-12-18', 'rule': {'sat_night': True, 'min_days': 2, 'max_months': 12}}, ['MAX']], ['sampled case 1', {'depart': '2029-08-05', 'return': '2030-07-02', 'rule': {'sat_night': True, 'min_days': 1, 'max_months': 11}}, []], ['sampled case 2', {'depart': '2028-05-10', 'return': '2028-05-12', 'rule': {'sat_night': False, 'min_days': 2, 'max_months': 11}}, []], ['sampled case 3', {'depart': '2027-09-03', 'return': '2027-09-03', 'rule': {'sat_night': True, 'min_days': 0, 'max_months': 6}}, ['SAT']], ['regression: minimum stay comparison', {'depart': '2027-09-05', 'return': '2027-09-11', 'rule': {'sat_night': True, 'min_days': 7, 'max_months': 6}}, ['SAT', 'MIN']]]]
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
Sunday departure next-day return['SAT']['SAT']Passed
Saturday departure Sunday return[][]Passed
Friday out Saturday back['SAT']['SAT']Passed
month-end max stay[][]Passed
the 28th is not month end['MAX']['MAX']Passed
Jan 31 plus one month[][]Passed
year rollover max stay[][]Passed
exact minimum stay[][]Passed
December twelve months[][]Passed
sampled case 1[][]Passed
sampled case 2[][]Passed
sampled case 3['MAX']['MAX']Passed
regression: minimum stay comparison[]['MIN']Failed

SHA-256 / 8d173a737e5cb46b47af2814107732451df187ce63c42ed1bae0198e4b1b3f74

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json
import datetime
import calendar
N = 1
observations = []
def solve(x):
    d = datetime.date.fromisoformat(x['depart'])
    r = datetime.date.fromisoformat(x['return'])
    rule = x['rule']
    fails = []
    if rule['sat_night']:
        sun = d + datetime.timedelta(days=(5 - d.weekday()) % 7 + 1)
        if r < sun: fails.append('SAT')
    if (r - d).days < rule['min_days']: fails.append('MIN')
    mo = d.month - 1 + rule['max_months']
    y, mo = d.year + mo // 12, mo % 12 + 1
    last = calendar.monthrange(y, mo)[1]
    eom = d.day == calendar.monthrange(d.year, d.month)[1]
    lim = datetime.date(y, mo, last if eom else min(d.day, last))
    if r > lim: fails.append('MAX')
    return fails
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['Sunday departure next-day return', {'depart': '2027-03-07', 'return': '2027-03-08', 'rule': {'sat_night': True, 'min_days': 0, 'max_months': 1}}, ['SAT']], ['Saturday departure Sunday return', {'depart': '2027-03-13', 'return': '2027-03-14', 'rule': {'sat_night': True, 'min_days': 1, 'max_months': 1}}, []], ['Friday out Saturday back', {'depart': '2027-03-12', 'return': '2027-03-13', 'rule': {'sat_night': True, 'min_days': 0, 'max_months': 3}}, ['SAT']], ['month-end max stay', {'depart': '2027-02-28', 'return': '2027-03-30', 'rule': {'sat_night': False, 'min_days': 3, 'max_months': 1}}, []], ['the 28th is not month end', {'depart': '2027-04-28', 'return': '2027-05-30', 'rule': {'sat_night': False, 'min_days': 0, 'max_months': 1}}, ['MAX']], ['Jan 31 plus one month', {'depart': '2027-01-31', 'return': '2027-02-28', 'rule': {'sat_night': False, 'min_days': 0, 'max_months': 1}}, []], ['year rollover max stay', {'depart': '2027-11-11', 'return': '2028-01-10', 'rule': {'sat_night': False, 'min_days': 7, 'max_months': 2}}, []], ['exact minimum stay', {'depart': '2027-06-01', 'return': '2027-06-08', 'rule': {'sat_night': False, 'min_days': 7, 'max_months': 12}}, []], ['December twelve months', {'depart': '2027-12-15', 'return': '2028-12-14', 'rule': {'sat_night': True, 'min_days': 2, 'max_months': 12}}, []], ['sampled case 1', {'depart': '2029-08-19', 'return': '2029-08-28', 'rule': {'sat_night': True, 'min_days': 2, 'max_months': 2}}, []], ['sampled case 2', {'depart': '2028-06-13', 'return': '2028-12-13', 'rule': {'sat_night': True, 'min_days': 0, 'max_months': 12}}, []], ['sampled case 3', {'depart': '2028-04-16', 'return': '2028-08-20', 'rule': {'sat_night': False, 'min_days': 1, 'max_months': 1}}, ['MAX']], ['regression: minimum stay comparison', {'depart': '2027-01-26', 'return': '2027-02-01', 'rule': {'sat_night': True, 'min_days': 7, 'max_months': 3}}, ['MIN']]], [['Sunday departure next-day return', {'depart': '2027-03-07', 'return': '2027-03-09', 'rule': {'sat_night': True, 'min_days': 0, 'max_months': 1}}, ['SAT']], ['Saturday departure Sunday return', {'depart': '2027-03-13', 'return': '2027-03-14', 'rule': {'sat_night': True, 'min_days': 1, 'max_months': 1}}, []], ['Friday out Saturday back', {'depart': '2027-03-12', 'return': '2027-03-13', 'rule': {'sat_night': True, 'min_days': 0, 'max_months': 3}}, ['SAT']], ['month-end max stay', {'depart': '2027-02-28', 'return': '2027-03-31', 'rule': {'sat_night': False, 'min_days': 3, 'max_months': 1}}, []], ['the 28th is not month end', {'depart': '2027-04-28', 'return': '2027-05-31', 'rule': {'sat_night': False, 'min_days': 0, 'max_months': 1}}, ['MAX']], ['Jan 31 plus one month', {'depart': '2027-01-31', 'return': '2027-02-28', 'rule': {'sat_night': False, 'min_days': 0, 'max_months': 1}}, []], ['year rollover max stay', {'depart': '2027-11-12', 'return': '2028-01-12', 'rule': {'sat_night': False, 'min_days': 7, 'max_months': 2}}, []], ['exact minimum stay', {'depart': '2027-06-01', 'return': '2027-06-08', 'rule': {'sat_night': False, 'min_days': 7, 'max_months': 12}}, []], ['December twelve months', {'depart': '2027-12-15', 'return': '2028-12-15', 'rule': {'sat_night': True, 'min_days': 2, 'max_months': 12}}, []], ['sampled case 1', {'depart': '2029-07-11', 'return': '2029-07-23', 'rule': {'sat_night': True, 'min_days': 7, 'max_months': 12}}, []], ['sampled case 2', {'depart': '2029-06-25', 'return': '2029-12-12', 'rule': {'sat_night': True, 'min_days': 2, 'max_months': 2}}, ['MAX']], ['sampled case 3', {'depart': '2029-02-02', 'return': '2030-02-22', 'rule': {'sat_night': True, 'min_days': 1, 'max_months': 6}}, ['MAX']], ['regression: minimum stay comparison', {'depart': '2027-01-22', 'return': '2027-01-24', 'rule': {'sat_night': False, 'min_days': 3, 'max_months': 3}}, ['MIN']]], [['Sunday departure next-day return', {'depart': '2027-03-07', 'return': '2027-03-10', 'rule': {'sat_night': True, 'min_days': 0, 'max_months': 1}}, ['SAT']], ['Saturday departure Sunday return', {'depart': '2027-03-13', 'return': '2027-03-14', 'rule': {'sat_night': True, 'min_days': 1, 'max_months': 1}}, []], ['Friday out Saturday back', {'depart': '2027-03-12', 'return': '2027-03-13', 'rule': {'sat_night': True, 'min_days': 0, 'max_months': 3}}, ['SAT']], ['month-end max stay', {'depart': '2027-02-28', 'return': '2027-03-29', 'rule': {'sat_night': False, 'min_days': 3, 'max_months': 1}}, []], ['the 28th is not month end', {'depart': '2027-04-28', 'return': '2027-05-29', 'rule': {'sat_night': False, 'min_days': 0, 'max_months': 1}}, ['MAX']], ['Jan 31 plus one month', {'depart': '2027-01-31', 'return': '2027-02-28', 'rule': {'sat_night': False, 'min_days': 0, 'max_months': 1}}, []], ['year rollover max stay', {'depart': '2027-11-13', 'return': '2028-01-14', 'rule': {'sat_night': False, 'min_days': 7, 'max_months': 2}}, ['MAX']], ['exact minimum stay', {'depart': '2027-06-01', 'return': '2027-06-08', 'rule': {'sat_night': False, 'min_days': 7, 'max_months': 12}}, []], ['December twelve months', {'depart': '2027-12-15', 'return': '2028-12-16', 'rule': {'sat_night': True, 'min_days': 2, 'max_months': 12}}, ['MAX']], ['sampled case 1', {'depart': '2027-10-05', 'return': '2027-10-14', 'rule': {'sat_night': True, 'min_days': 3, 'max_months': 6}}, []], ['sampled case 2', {'depart': '2028-04-06', 'return': '2028-10-12', 'rule': {'sat_night': False, 'min_days': 7, 'max_months': 11}}, []], ['sampled case 3', {'depart': '2027-11-12', 'return': '2027-11-21', 'rule': {'sat_night': False, 'min_days': 0, 'max_months': 2}}, []], ['regression: minimum stay comparison', {'depart': '2027-10-11', 'return': '2027-10-17', 'rule': {'sat_night': True, 'min_days': 7, 'max_months': 3}}, ['MIN']]], [['Sunday departure next-day return', {'depart': '2027-03-07', 'return': '2027-03-11', 'rule': {'sat_night': True, 'min_days': 0, 'max_months': 1}}, ['SAT']], ['Saturday departure Sunday return', {'depart': '2027-03-13', 'return': '2027-03-14', 'rule': {'sat_night': True, 'min_days': 1, 'max_months': 1}}, []], ['Friday out Saturday back', {'depart': '2027-03-12', 'return': '2027-03-13', 'rule': {'sat_night': True, 'min_days': 0, 'max_months': 3}}, ['SAT']], ['month-end max stay', {'depart': '2027-02-28', 'return': '2027-03-30', 'rule': {'sat_night': False, 'min_days': 3, 'max_months': 1}}, []], ['the 28th is not month end', {'depart': '2027-04-28', 'return': '2027-05-30', 'rule': {'sat_night': False, 'min_days': 0, 'max_months': 1}}, ['MAX']], ['Jan 31 plus one month', {'depart': '2027-01-31', 'return': '2027-02-28', 'rule': {'sat_night': False, 'min_days': 0, 'max_months': 1}}, []], ['year rollover max stay', {'depart': '2027-11-14', 'return': '2028-01-16', 'rule': {'sat_night': False, 'min_days': 7, 'max_months': 2}}, ['MAX']], ['exact minimum stay', {'depart': '2027-06-01', 'return': '2027-06-08', 'rule': {'sat_night': False, 'min_days': 7, 'max_months': 12}}, []], ['December twelve months', {'depart': '2027-12-15', 'return': '2028-12-17', 'rule': {'sat_night': True, 'min_days': 2, 'max_months': 12}}, ['MAX']], ['sampled case 1', {'depart': '2027-06-01', 'return': '2027-06-09', 'rule': {'sat_night': True, 'min_days': 7, 'max_months': 1}}, []], ['sampled case 2', {'depart': '2028-03-04', 'return': '2028-06-07', 'rule': {'sat_night': True, 'min_days': 1, 'max_months': 6}}, []], ['sampled case 3', {'depart': '2029-03-17', 'return': '2029-03-25', 'rule': {'sat_night': True, 'min_days': 0, 'max_months': 12}}, []], ['regression: minimum stay comparison', {'depart': '2027-08-23', 'return': '2027-08-29', 'rule': {'sat_night': True, 'min_days': 7, 'max_months': 2}}, ['MIN']]], [['Sunday departure next-day return', {'depart': '2027-03-07', 'return': '2027-03-12', 'rule': {'sat_night': True, 'min_days': 0, 'max_months': 1}}, ['SAT']], ['Saturday departure Sunday return', {'depart': '2027-03-13', 'return': '2027-03-14', 'rule': {'sat_night': True, 'min_days': 1, 'max_months': 1}}, []], ['Friday out Saturday back', {'depart': '2027-03-12', 'return': '2027-03-13', 'rule': {'sat_night': True, 'min_days': 0, 'max_months': 3}}, ['SAT']], ['month-end max stay', {'depart': '2027-02-28', 'return': '2027-03-31', 'rule': {'sat_night': False, 'min_days': 3, 'max_months': 1}}, []], ['the 28th is not month end', {'depart': '2027-04-28', 'return': '2027-05-31', 'rule': {'sat_night': False, 'min_days': 0, 'max_months': 1}}, ['MAX']], ['Jan 31 plus one month', {'depart': '2027-01-31', 'return': '2027-02-28', 'rule': {'sat_night': False, 'min_days': 0, 'max_months': 1}}, []], ['year rollover max stay', {'depart': '2027-11-15', 'return': '2028-01-18', 'rule': {'sat_night': False, 'min_days': 7, 'max_months': 2}}, ['MAX']], ['exact minimum stay', {'depart': '2027-06-01', 'return': '2027-06-08', 'rule': {'sat_night': False, 'min_days': 7, 'max_months': 12}}, []], ['December twelve months', {'depart': '2027-12-15', 'return': '2028-12-18', 'rule': {'sat_night': True, 'min_days': 2, 'max_months': 12}}, ['MAX']], ['sampled case 1', {'depart': '2029-08-05', 'return': '2030-07-02', 'rule': {'sat_night': True, 'min_days': 1, 'max_months': 11}}, []], ['sampled case 2', {'depart': '2028-05-10', 'return': '2028-05-12', 'rule': {'sat_night': False, 'min_days': 2, 'max_months': 11}}, []], ['sampled case 3', {'depart': '2027-09-03', 'return': '2027-09-03', 'rule': {'sat_night': True, 'min_days': 0, 'max_months': 6}}, ['SAT']], ['regression: minimum stay comparison', {'depart': '2027-09-05', 'return': '2027-09-11', 'rule': {'sat_night': True, 'min_days': 7, 'max_months': 6}}, ['SAT', 'MIN']]]]
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
Sunday departure next-day return['SAT']['SAT']Passed
Saturday departure Sunday return[][]Passed
Friday out Saturday back['SAT']['SAT']Passed
month-end max stay[][]Passed
the 28th is not month end['MAX']['MAX']Passed
Jan 31 plus one month[][]Passed
year rollover max stay[][]Passed
exact minimum stay[][]Passed
December twelve months[][]Passed
sampled case 1[][]Passed
sampled case 2[][]Passed
sampled case 3['MAX']['MAX']Passed
regression: minimum stay comparison['MIN']['MIN']Passed

SHA-256 / ad3d8aa89587ed79b4ac3e650c80e33caa8a224bc37597ff8a52b7a2e4f487dc

Verification & scope

A stipulated toy fare-rule contract with invented constants; it is not an ATPCO or carrier tariff implementation and makes no claim of industry-standard 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:47:42.832028+00:00.

Case digest / b58868be956a07b41fc005bab3742d8d247d8ee10924df2970a5dc1ea52be195