FAILURE MAP
← Case archive

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

Airport parking weekly cap: the remainder is added outside the weekly cap · case 01

Airport parking weekly cap returns a wrong result when the remainder is added outside the weekly cap.

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

ROOT CAUSE

Six days plus a partial day can exceed the weekly rate.

VERIFIED REPAIR

Restore the weekly cap scope rule so that the step reads `min(x['weekly'], days * x['daily'] + part)`.

Unsuccessful approach: Removing the cap overcharges leftover periods longer than a week-equivalent.

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 = 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': 1623, 'daily': 2800, 'weekly': 9000, 'hourly': 400}, 4400), ({'minutes': 1269, 'daily': 2800, 'weekly': 13000, 'hourly': 600}, 2800), ({'minutes': 1781, 'daily': 2800, 'weekly': 13000, 'hourly': 500}, 5600), ({'minutes': 10180, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 12000), ({'minutes': 7567, 'daily': 2800, 'weekly': 11000, 'hourly': 400}, 11000), ({'minutes': 28537, 'daily': 2800, 'weekly': 11000, 'hourly': 400}, 33000), ({'minutes': 8000, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 11000), ({'minutes': 10634, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 13200)], [({'minutes': 359, 'daily': 2200, 'weekly': 13000, 'hourly': 500}, 2200), ({'minutes': 1483, 'daily': 1800, 'weekly': 11000, 'hourly': 400}, 2200), ({'minutes': 16771, 'daily': 2800, 'weekly': 11000, 'hourly': 400}, 22000), ({'minutes': 6967, 'daily': 2800, 'weekly': 11000, 'hourly': 600}, 11000), ({'minutes': 14550, 'daily': 2800, 'weekly': 13000, 'hourly': 500}, 22900), ({'minutes': 545, 'daily': 1800, 'weekly': 13000, 'hourly': 600}, 1800), ({'minutes': 10180, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 12000), ({'minutes': 8000, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 11000)], [({'minutes': 7709, 'daily': 2200, 'weekly': 9000, 'hourly': 500}, 9000), ({'minutes': 2470, 'daily': 2800, 'weekly': 11000, 'hourly': 400}, 5600), ({'minutes': 10180, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 12000), ({'minutes': 8000, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 11000), ({'minutes': 341, 'daily': 2800, 'weekly': 9000, 'hourly': 400}, 2400), ({'minutes': 2201, 'daily': 1800, 'weekly': 11000, 'hourly': 400}, 3600), ({'minutes': 28168, 'daily': 1800, 'weekly': 9000, 'hourly': 400}, 27000), ({'minutes': 16961, 'daily': 1800, 'weekly': 11000, 'hourly': 600}, 20000)], [({'minutes': 18720, 'daily': 2200, 'weekly': 11000, 'hourly': 600}, 22000), ({'minutes': 18720, 'daily': 1800, 'weekly': 11000, 'hourly': 400}, 21800), ({'minutes': 21432, 'daily': 1800, 'weekly': 9000, 'hourly': 500}, 19800), ({'minutes': 17123, 'daily': 2200, 'weekly': 9000, 'hourly': 600}, 18000), ({'minutes': 19758, 'daily': 2200, 'weekly': 9000, 'hourly': 400}, 18000), ({'minutes': 8000, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 11000), ({'minutes': 23040, 'daily': 2800, 'weekly': 13000, 'hourly': 400}, 31600), ({'minutes': 10180, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 12000)], [({'minutes': 8000, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 11000), ({'minutes': 18720, 'daily': 2200, 'weekly': 9000, 'hourly': 400}, 18000), ({'minutes': 1239, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 2200), ({'minutes': 10180, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 12000), ({'minutes': 27681, 'daily': 2800, 'weekly': 11000, 'hourly': 400}, 33000), ({'minutes': 27719, 'daily': 2200, 'weekly': 13000, 'hourly': 500}, 39000), ({'minutes': 2181, 'daily': 2200, 'weekly': 13000, 'hourly': 500}, 4400), ({'minutes': 1371, 'daily': 1800, 'weekly': 11000, 'hourly': 500}, 1800)]]
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 044004400Passed
fee oracle 128002800Passed
fee oracle 256005600Passed
fee oracle 31200012000Passed
fee oracle 41380011000Failed
fee oracle 53580033000Failed
fee oracle 61320011000Failed
fee oracle 71320013200Passed

SHA-256 / 828f7bd6bff2afe2ac3f43484efb8f878907cf243c41a58f19deacf0a70b79a2

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['daily'], -(-r // 60) * x['hourly'])
    weeks, days = divmod(full, 7)
    return weeks * x['weekly'] + days * x['daily'] + part
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[({'minutes': 1623, 'daily': 2800, 'weekly': 9000, 'hourly': 400}, 4400), ({'minutes': 1269, 'daily': 2800, 'weekly': 13000, 'hourly': 600}, 2800), ({'minutes': 1781, 'daily': 2800, 'weekly': 13000, 'hourly': 500}, 5600), ({'minutes': 10180, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 12000), ({'minutes': 7567, 'daily': 2800, 'weekly': 11000, 'hourly': 400}, 11000), ({'minutes': 28537, 'daily': 2800, 'weekly': 11000, 'hourly': 400}, 33000), ({'minutes': 8000, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 11000), ({'minutes': 10634, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 13200)], [({'minutes': 359, 'daily': 2200, 'weekly': 13000, 'hourly': 500}, 2200), ({'minutes': 1483, 'daily': 1800, 'weekly': 11000, 'hourly': 400}, 2200), ({'minutes': 16771, 'daily': 2800, 'weekly': 11000, 'hourly': 400}, 22000), ({'minutes': 6967, 'daily': 2800, 'weekly': 11000, 'hourly': 600}, 11000), ({'minutes': 14550, 'daily': 2800, 'weekly': 13000, 'hourly': 500}, 22900), ({'minutes': 545, 'daily': 1800, 'weekly': 13000, 'hourly': 600}, 1800), ({'minutes': 10180, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 12000), ({'minutes': 8000, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 11000)], [({'minutes': 7709, 'daily': 2200, 'weekly': 9000, 'hourly': 500}, 9000), ({'minutes': 2470, 'daily': 2800, 'weekly': 11000, 'hourly': 400}, 5600), ({'minutes': 10180, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 12000), ({'minutes': 8000, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 11000), ({'minutes': 341, 'daily': 2800, 'weekly': 9000, 'hourly': 400}, 2400), ({'minutes': 2201, 'daily': 1800, 'weekly': 11000, 'hourly': 400}, 3600), ({'minutes': 28168, 'daily': 1800, 'weekly': 9000, 'hourly': 400}, 27000), ({'minutes': 16961, 'daily': 1800, 'weekly': 11000, 'hourly': 600}, 20000)], [({'minutes': 18720, 'daily': 2200, 'weekly': 11000, 'hourly': 600}, 22000), ({'minutes': 18720, 'daily': 1800, 'weekly': 11000, 'hourly': 400}, 21800), ({'minutes': 21432, 'daily': 1800, 'weekly': 9000, 'hourly': 500}, 19800), ({'minutes': 17123, 'daily': 2200, 'weekly': 9000, 'hourly': 600}, 18000), ({'minutes': 19758, 'daily': 2200, 'weekly': 9000, 'hourly': 400}, 18000), ({'minutes': 8000, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 11000), ({'minutes': 23040, 'daily': 2800, 'weekly': 13000, 'hourly': 400}, 31600), ({'minutes': 10180, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 12000)], [({'minutes': 8000, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 11000), ({'minutes': 18720, 'daily': 2200, 'weekly': 9000, 'hourly': 400}, 18000), ({'minutes': 1239, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 2200), ({'minutes': 10180, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 12000), ({'minutes': 27681, 'daily': 2800, 'weekly': 11000, 'hourly': 400}, 33000), ({'minutes': 27719, 'daily': 2200, 'weekly': 13000, 'hourly': 500}, 39000), ({'minutes': 2181, 'daily': 2200, 'weekly': 13000, 'hourly': 500}, 4400), ({'minutes': 1371, 'daily': 1800, 'weekly': 11000, 'hourly': 500}, 1800)]]
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 044004400Passed
fee oracle 128002800Passed
fee oracle 256005600Passed
fee oracle 31200012000Passed
fee oracle 41680011000Failed
fee oracle 53880033000Failed
fee oracle 61320011000Failed
fee oracle 71320013200Passed

SHA-256 / 045921f39ccfe676fe016e25e72254ececb1f423ea2ca74e08b9019ef13c404f

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': 1623, 'daily': 2800, 'weekly': 9000, 'hourly': 400}, 4400), ({'minutes': 1269, 'daily': 2800, 'weekly': 13000, 'hourly': 600}, 2800), ({'minutes': 1781, 'daily': 2800, 'weekly': 13000, 'hourly': 500}, 5600), ({'minutes': 10180, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 12000), ({'minutes': 7567, 'daily': 2800, 'weekly': 11000, 'hourly': 400}, 11000), ({'minutes': 28537, 'daily': 2800, 'weekly': 11000, 'hourly': 400}, 33000), ({'minutes': 8000, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 11000), ({'minutes': 10634, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 13200)], [({'minutes': 359, 'daily': 2200, 'weekly': 13000, 'hourly': 500}, 2200), ({'minutes': 1483, 'daily': 1800, 'weekly': 11000, 'hourly': 400}, 2200), ({'minutes': 16771, 'daily': 2800, 'weekly': 11000, 'hourly': 400}, 22000), ({'minutes': 6967, 'daily': 2800, 'weekly': 11000, 'hourly': 600}, 11000), ({'minutes': 14550, 'daily': 2800, 'weekly': 13000, 'hourly': 500}, 22900), ({'minutes': 545, 'daily': 1800, 'weekly': 13000, 'hourly': 600}, 1800), ({'minutes': 10180, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 12000), ({'minutes': 8000, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 11000)], [({'minutes': 7709, 'daily': 2200, 'weekly': 9000, 'hourly': 500}, 9000), ({'minutes': 2470, 'daily': 2800, 'weekly': 11000, 'hourly': 400}, 5600), ({'minutes': 10180, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 12000), ({'minutes': 8000, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 11000), ({'minutes': 341, 'daily': 2800, 'weekly': 9000, 'hourly': 400}, 2400), ({'minutes': 2201, 'daily': 1800, 'weekly': 11000, 'hourly': 400}, 3600), ({'minutes': 28168, 'daily': 1800, 'weekly': 9000, 'hourly': 400}, 27000), ({'minutes': 16961, 'daily': 1800, 'weekly': 11000, 'hourly': 600}, 20000)], [({'minutes': 18720, 'daily': 2200, 'weekly': 11000, 'hourly': 600}, 22000), ({'minutes': 18720, 'daily': 1800, 'weekly': 11000, 'hourly': 400}, 21800), ({'minutes': 21432, 'daily': 1800, 'weekly': 9000, 'hourly': 500}, 19800), ({'minutes': 17123, 'daily': 2200, 'weekly': 9000, 'hourly': 600}, 18000), ({'minutes': 19758, 'daily': 2200, 'weekly': 9000, 'hourly': 400}, 18000), ({'minutes': 8000, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 11000), ({'minutes': 23040, 'daily': 2800, 'weekly': 13000, 'hourly': 400}, 31600), ({'minutes': 10180, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 12000)], [({'minutes': 8000, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 11000), ({'minutes': 18720, 'daily': 2200, 'weekly': 9000, 'hourly': 400}, 18000), ({'minutes': 1239, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 2200), ({'minutes': 10180, 'daily': 2200, 'weekly': 11000, 'hourly': 500}, 12000), ({'minutes': 27681, 'daily': 2800, 'weekly': 11000, 'hourly': 400}, 33000), ({'minutes': 27719, 'daily': 2200, 'weekly': 13000, 'hourly': 500}, 39000), ({'minutes': 2181, 'daily': 2200, 'weekly': 13000, 'hourly': 500}, 4400), ({'minutes': 1371, 'daily': 1800, 'weekly': 11000, 'hourly': 500}, 1800)]]
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 044004400Passed
fee oracle 128002800Passed
fee oracle 256005600Passed
fee oracle 31200012000Passed
fee oracle 41100011000Passed
fee oracle 53300033000Passed
fee oracle 61100011000Passed
fee oracle 71320013200Passed

SHA-256 / 78a2e7f99bbceb8a916dcb5515d7645999e871bb42756823eb2e27c3d56a3c46

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

Case digest / 6957955f5fff324672e2609a30a1d47264730dc226070c85fb8714ce23c60195