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.
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| fee oracle 0 | 12000 | 12000 | Passed |
| fee oracle 1 | 22000 | 19400 | Failed |
| fee oracle 2 | 26000 | 19600 | Failed |
| fee oracle 3 | 2000 | 2000 | Passed |
| fee oracle 4 | 4000 | 2800 | Failed |
| fee oracle 5 | 11000 | 11000 | Passed |
| fee oracle 6 | 28400 | 28200 | Failed |
| fee oracle 7 | 31400 | 31400 | Passed |
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| fee oracle 0 | 12000 | 12000 | Passed |
| fee oracle 1 | 22000 | 19400 | Failed |
| fee oracle 2 | 26000 | 19600 | Failed |
| fee oracle 3 | 2000 | 2000 | Passed |
| fee oracle 4 | 4000 | 2800 | Failed |
| fee oracle 5 | 11000 | 11000 | Passed |
| fee oracle 6 | 28400 | 28200 | Failed |
| fee oracle 7 | 31400 | 31400 | Passed |
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| fee oracle 0 | 12000 | 12000 | Passed |
| fee oracle 1 | 19400 | 19400 | Passed |
| fee oracle 2 | 19600 | 19600 | Passed |
| fee oracle 3 | 2000 | 2000 | Passed |
| fee oracle 4 | 2800 | 2800 | Passed |
| fee oracle 5 | 11000 | 11000 | Passed |
| fee oracle 6 | 28200 | 28200 | Passed |
| fee oracle 7 | 31400 | 31400 | Passed |
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