FAILURE MAP
← Case archive

FA-68786 / Toll and parking fee computation / Open access

Airport parking weekly cap: the partial day is capped at the weekly rate · case 01

Airport parking weekly cap returns a wrong result when the partial day is capped at the weekly rate.

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

ROOT CAUSE

Long partial days cost more than a full day.

VERIFIED REPAIR

Restore the partial day cap rule so that the step reads `min(x['daily'], -(-r // 60) * x['hourly'])`.

Unsuccessful approach: The weekly rate is far above one day, so the partial day is effectively uncapped.

Case contract

Input {minutes, daily, weekly, hourly}. Full 1440-minute days and a remainder; the remainder costs started hours * hourly capped at daily. Each full 7-day week costs weekly; the leftover full days plus the remainder cost days*daily + remainder charge, capped at weekly.

Why this case matters

Fee engines bill customers in integer cents; a wrong boundary, rounding stage or cap scope silently over- or under-charges.

1 / The failure

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(x):
    m = x['minutes']
    full, r = divmod(m, 1440)
    part = -(-r // 60) * x['hourly']
    weeks, days = divmod(full, 7)
    return weeks * x['weekly'] + min(x['weekly'], days * x['daily'] + part)
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[({'minutes': 10180, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 12000), ({'minutes': 14154, 'daily': 2800, 'weekly': 11000, 'hourly': 400}, 19400), ({'minutes': 14214, 'daily': 2200, 'weekly': 13000, 'hourly': 600}, 19600), ({'minutes': 219, 'daily': 2200, 'weekly': 13000, 'hourly': 500}, 2000), ({'minutes': 556, 'daily': 2800, 'weekly': 13000, 'hourly': 400}, 2800), ({'minutes': 8000, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 11000), ({'minutes': 20477, 'daily': 2200, 'weekly': 13000, 'hourly': 400}, 28200), ({'minutes': 24480, 'daily': 1800, 'weekly': 13000, 'hourly': 600}, 31400)], [({'minutes': 8000, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 11000), ({'minutes': 18720, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 22000), ({'minutes': 707, 'daily': 1800, 'weekly': 11000, 'hourly': 400}, 1800), ({'minutes': 10180, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 12000), ({'minutes': 6904, 'daily': 2200, 'weekly': 9000, 'hourly': 400}, 9000), ({'minutes': 28590, 'daily': 2200, 'weekly': 9000, 'hourly': 500}, 27000), ({'minutes': 1088, 'daily': 1800, 'weekly': 9000, 'hourly': 500}, 1800), ({'minutes': 12560, 'daily': 2800, 'weekly': 11000, 'hourly': 600}, 16600)], [({'minutes': 10180, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 12000), ({'minutes': 2985, 'daily': 2200, 'weekly': 9000, 'hourly': 500}, 5400), ({'minutes': 8000, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 11000), ({'minutes': 23466, 'daily': 1800, 'weekly': 11000, 'hourly': 600}, 27400), ({'minutes': 21183, 'daily': 2200, 'weekly': 11000, 'hourly': 600}, 24200), ({'minutes': 28412, 'daily': 1800, 'weekly': 9000, 'hourly': 400}, 27000), ({'minutes': 1125, 'daily': 1800, 'weekly': 13000, 'hourly': 600}, 1800), ({'minutes': 16564, 'daily': 1800, 'weekly': 11000, 'hourly': 500}, 20000)], [({'minutes': 4320, 'daily': 1800, 'weekly': 9000, 'hourly': 400}, 5400), ({'minutes': 11520, 'daily': 2200, 'weekly': 9000, 'hourly': 500}, 11200), ({'minutes': 24848, 'daily': 2800, 'weekly': 13000, 'hourly': 600}, 37200), ({'minutes': 23040, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 26400), ({'minutes': 22252, 'daily': 2200, 'weekly': 9000, 'hourly': 600}, 22400), ({'minutes': 661, 'daily': 2200, 'weekly': 13000, 'hourly': 500}, 2200), ({'minutes': 8000, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 11000), ({'minutes': 10180, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 12000)], [({'minutes': 10180, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 12000), ({'minutes': 15174, 'daily': 2200, 'weekly': 13000, 'hourly': 600}, 21800), ({'minutes': 5760, 'daily': 2200, 'weekly': 13000, 'hourly': 400}, 8800), ({'minutes': 22028, 'daily': 2200, 'weekly': 9000, 'hourly': 400}, 22400), ({'minutes': 8640, 'daily': 1800, 'weekly': 11000, 'hourly': 400}, 10800), ({'minutes': 8000, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 11000), ({'minutes': 318, 'daily': 2800, 'weekly': 13000, 'hourly': 500}, 2800), ({'minutes': 27901, 'daily': 2200, 'weekly': 13000, 'hourly': 400}, 39000)]]
for i, (args, expected) in enumerate(fixtures[N-1]):
    check('fee oracle' + ' %d' % i, 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
fee oracle 01200012000Passed
fee oracle 12200019400Failed
fee oracle 22600019600Failed
fee oracle 320002000Passed
fee oracle 440002800Failed
fee oracle 51100011000Passed
fee oracle 62840028200Failed
fee oracle 73140031400Passed

SHA-256 / 34f76d47a764ea229725264a07f02b3e43b069590f5171bad35c28031e03a6c7

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(x):
    m = x['minutes']
    full, r = divmod(m, 1440)
    part = min(x['weekly'], -(-r // 60) * x['hourly'])
    weeks, days = divmod(full, 7)
    return weeks * x['weekly'] + min(x['weekly'], days * x['daily'] + part)
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[({'minutes': 10180, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 12000), ({'minutes': 14154, 'daily': 2800, 'weekly': 11000, 'hourly': 400}, 19400), ({'minutes': 14214, 'daily': 2200, 'weekly': 13000, 'hourly': 600}, 19600), ({'minutes': 219, 'daily': 2200, 'weekly': 13000, 'hourly': 500}, 2000), ({'minutes': 556, 'daily': 2800, 'weekly': 13000, 'hourly': 400}, 2800), ({'minutes': 8000, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 11000), ({'minutes': 20477, 'daily': 2200, 'weekly': 13000, 'hourly': 400}, 28200), ({'minutes': 24480, 'daily': 1800, 'weekly': 13000, 'hourly': 600}, 31400)], [({'minutes': 8000, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 11000), ({'minutes': 18720, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 22000), ({'minutes': 707, 'daily': 1800, 'weekly': 11000, 'hourly': 400}, 1800), ({'minutes': 10180, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 12000), ({'minutes': 6904, 'daily': 2200, 'weekly': 9000, 'hourly': 400}, 9000), ({'minutes': 28590, 'daily': 2200, 'weekly': 9000, 'hourly': 500}, 27000), ({'minutes': 1088, 'daily': 1800, 'weekly': 9000, 'hourly': 500}, 1800), ({'minutes': 12560, 'daily': 2800, 'weekly': 11000, 'hourly': 600}, 16600)], [({'minutes': 10180, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 12000), ({'minutes': 2985, 'daily': 2200, 'weekly': 9000, 'hourly': 500}, 5400), ({'minutes': 8000, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 11000), ({'minutes': 23466, 'daily': 1800, 'weekly': 11000, 'hourly': 600}, 27400), ({'minutes': 21183, 'daily': 2200, 'weekly': 11000, 'hourly': 600}, 24200), ({'minutes': 28412, 'daily': 1800, 'weekly': 9000, 'hourly': 400}, 27000), ({'minutes': 1125, 'daily': 1800, 'weekly': 13000, 'hourly': 600}, 1800), ({'minutes': 16564, 'daily': 1800, 'weekly': 11000, 'hourly': 500}, 20000)], [({'minutes': 4320, 'daily': 1800, 'weekly': 9000, 'hourly': 400}, 5400), ({'minutes': 11520, 'daily': 2200, 'weekly': 9000, 'hourly': 500}, 11200), ({'minutes': 24848, 'daily': 2800, 'weekly': 13000, 'hourly': 600}, 37200), ({'minutes': 23040, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 26400), ({'minutes': 22252, 'daily': 2200, 'weekly': 9000, 'hourly': 600}, 22400), ({'minutes': 661, 'daily': 2200, 'weekly': 13000, 'hourly': 500}, 2200), ({'minutes': 8000, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 11000), ({'minutes': 10180, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 12000)], [({'minutes': 10180, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 12000), ({'minutes': 15174, 'daily': 2200, 'weekly': 13000, 'hourly': 600}, 21800), ({'minutes': 5760, 'daily': 2200, 'weekly': 13000, 'hourly': 400}, 8800), ({'minutes': 22028, 'daily': 2200, 'weekly': 9000, 'hourly': 400}, 22400), ({'minutes': 8640, 'daily': 1800, 'weekly': 11000, 'hourly': 400}, 10800), ({'minutes': 8000, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 11000), ({'minutes': 318, 'daily': 2800, 'weekly': 13000, 'hourly': 500}, 2800), ({'minutes': 27901, 'daily': 2200, 'weekly': 13000, 'hourly': 400}, 39000)]]
for i, (args, expected) in enumerate(fixtures[N-1]):
    check('fee oracle' + ' %d' % i, 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
fee oracle 01200012000Passed
fee oracle 12200019400Failed
fee oracle 22600019600Failed
fee oracle 320002000Passed
fee oracle 440002800Failed
fee oracle 51100011000Passed
fee oracle 62840028200Failed
fee oracle 73140031400Passed

SHA-256 / f0b9f96c722ed74a927b3befc8b34bea9dffc975ebaed3379833bac37f762d75

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(x):
    m = x['minutes']
    full, r = divmod(m, 1440)
    part = min(x['daily'], -(-r // 60) * x['hourly'])
    weeks, days = divmod(full, 7)
    return weeks * x['weekly'] + min(x['weekly'], days * x['daily'] + part)
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[({'minutes': 10180, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 12000), ({'minutes': 14154, 'daily': 2800, 'weekly': 11000, 'hourly': 400}, 19400), ({'minutes': 14214, 'daily': 2200, 'weekly': 13000, 'hourly': 600}, 19600), ({'minutes': 219, 'daily': 2200, 'weekly': 13000, 'hourly': 500}, 2000), ({'minutes': 556, 'daily': 2800, 'weekly': 13000, 'hourly': 400}, 2800), ({'minutes': 8000, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 11000), ({'minutes': 20477, 'daily': 2200, 'weekly': 13000, 'hourly': 400}, 28200), ({'minutes': 24480, 'daily': 1800, 'weekly': 13000, 'hourly': 600}, 31400)], [({'minutes': 8000, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 11000), ({'minutes': 18720, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 22000), ({'minutes': 707, 'daily': 1800, 'weekly': 11000, 'hourly': 400}, 1800), ({'minutes': 10180, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 12000), ({'minutes': 6904, 'daily': 2200, 'weekly': 9000, 'hourly': 400}, 9000), ({'minutes': 28590, 'daily': 2200, 'weekly': 9000, 'hourly': 500}, 27000), ({'minutes': 1088, 'daily': 1800, 'weekly': 9000, 'hourly': 500}, 1800), ({'minutes': 12560, 'daily': 2800, 'weekly': 11000, 'hourly': 600}, 16600)], [({'minutes': 10180, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 12000), ({'minutes': 2985, 'daily': 2200, 'weekly': 9000, 'hourly': 500}, 5400), ({'minutes': 8000, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 11000), ({'minutes': 23466, 'daily': 1800, 'weekly': 11000, 'hourly': 600}, 27400), ({'minutes': 21183, 'daily': 2200, 'weekly': 11000, 'hourly': 600}, 24200), ({'minutes': 28412, 'daily': 1800, 'weekly': 9000, 'hourly': 400}, 27000), ({'minutes': 1125, 'daily': 1800, 'weekly': 13000, 'hourly': 600}, 1800), ({'minutes': 16564, 'daily': 1800, 'weekly': 11000, 'hourly': 500}, 20000)], [({'minutes': 4320, 'daily': 1800, 'weekly': 9000, 'hourly': 400}, 5400), ({'minutes': 11520, 'daily': 2200, 'weekly': 9000, 'hourly': 500}, 11200), ({'minutes': 24848, 'daily': 2800, 'weekly': 13000, 'hourly': 600}, 37200), ({'minutes': 23040, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 26400), ({'minutes': 22252, 'daily': 2200, 'weekly': 9000, 'hourly': 600}, 22400), ({'minutes': 661, 'daily': 2200, 'weekly': 13000, 'hourly': 500}, 2200), ({'minutes': 8000, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 11000), ({'minutes': 10180, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 12000)], [({'minutes': 10180, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 12000), ({'minutes': 15174, 'daily': 2200, 'weekly': 13000, 'hourly': 600}, 21800), ({'minutes': 5760, 'daily': 2200, 'weekly': 13000, 'hourly': 400}, 8800), ({'minutes': 22028, 'daily': 2200, 'weekly': 9000, 'hourly': 400}, 22400), ({'minutes': 8640, 'daily': 1800, 'weekly': 11000, 'hourly': 400}, 10800), ({'minutes': 8000, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 11000), ({'minutes': 318, 'daily': 2800, 'weekly': 13000, 'hourly': 500}, 2800), ({'minutes': 27901, 'daily': 2200, 'weekly': 13000, 'hourly': 400}, 39000)]]
for i, (args, expected) in enumerate(fixtures[N-1]):
    check('fee oracle' + ' %d' % i, 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
fee oracle 01200012000Passed
fee oracle 11940019400Passed
fee oracle 21960019600Passed
fee oracle 320002000Passed
fee oracle 428002800Passed
fee oracle 51100011000Passed
fee oracle 62820028200Passed
fee oracle 73140031400Passed

SHA-256 / 97af01546ade038fe1b255429752fdfe119147a297c902cd524f0741bf42d8ad

Verification & scope

A deterministic, bounded toy model with a stipulated contract; it makes no claim of conformance to any agency manual or standard. 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:48:05.503914+00:00.

Case digest / 7e3c02398caa00fc08cf0d330a6df773ced2a0ddb00e041b43318ca5239d4e80