FAILURE MAP
← Case archive

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

Merchant parking validations: the free-minute cap is applied per validation · case 01

Merchant parking validations returns a wrong result when the free-minute cap is applied per validation.

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

ROOT CAUSE

Capping each validation separately lets stacked validations exceed the per-stay free limit.

VERIFIED REPAIR

Restore the stacked free minutes rule so that the step reads `min(x['max_free_min'], sum(v for k, v in x['validations'] if k == 'free_min'))`.

Unsuccessful approach: Honouring only the largest validation ignores the stated stacking up to the cap.

Case contract

Input {minutes (single day), validations: [[free_min|pct|flat, value]], hourly, daily_max, max_free_min}. Free minutes from all validations are summed, capped at max_free_min and deducted from the stay before rating. The fee is started hours * hourly capped at daily_max. Only the largest percentage validation applies (discount floored to cents), then all flat validations are subtracted, never below zero.

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):
    free = sum(min(v, x['max_free_min']) for k, v in x['validations'] if k == 'free_min')
    bill = max(0, x['minutes'] - free)
    fee = min(x['daily_max'], -(-bill // 60) * x['hourly'])
    pcts = [v for k, v in x['validations'] if k == 'pct']
    if pcts:
        fee -= fee * max(pcts) // 100
    flat = sum(v for k, v in x['validations'] if k == 'flat')
    return max(0, fee - flat)
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[({'minutes': 95, 'validations': [['free_min', 30]], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 120}, 700), ({'minutes': 242, 'validations': [['free_min', 60], ['free_min', 15]], 'hourly': 200, 'daily_max': 2400, 'max_free_min': 60}, 800), ({'minutes': 405, 'validations': [['free_min', 90], ['free_min', 15], ['free_min', 60], ['pct', 25]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 60}, 1350), ({'minutes': 1305, 'validations': [['free_min', 30], ['free_min', 15], ['pct', 25]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 180}, 1800), ({'minutes': 527, 'validations': [['flat', 250]], 'hourly': 200, 'daily_max': 3000, 'max_free_min': 60}, 1550), ({'minutes': 150, 'validations': [['free_min', 60], ['free_min', 60], ['free_min', 60]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 300), ({'minutes': 200, 'validations': [['pct', 25], ['pct', 10], ['flat', 100], ['flat', 250]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 550), ({'minutes': 850, 'validations': [['pct', 10], ['free_min', 60], ['free_min', 30], ['flat', 250]], 'hourly': 200, 'daily_max': 3000, 'max_free_min': 180}, 2090)], [({'minutes': 761, 'validations': [['free_min', 120], ['free_min', 120], ['free_min', 60]], 'hourly': 200, 'daily_max': 1800, 'max_free_min': 120}, 1800), ({'minutes': 150, 'validations': [['free_min', 60], ['free_min', 60], ['free_min', 60]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 300), ({'minutes': 95, 'validations': [['free_min', 30]], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 120}, 700), ({'minutes': 967, 'validations': [['free_min', 120]], 'hourly': 300, 'daily_max': 3000, 'max_free_min': 60}, 3000), ({'minutes': 212, 'validations': [['free_min', 60]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 60}, 900), ({'minutes': 200, 'validations': [['pct', 25], ['pct', 10], ['flat', 100], ['flat', 250]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 550), ({'minutes': 203, 'validations': [['free_min', 120], ['flat', 250], ['pct', 10], ['free_min', 120]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 180}, 20), ({'minutes': 999, 'validations': [['free_min', 120], ['free_min', 30]], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 120}, 2400)], [({'minutes': 188, 'validations': [['free_min', 120], ['free_min', 30]], 'hourly': 200, 'daily_max': 3000, 'max_free_min': 60}, 600), ({'minutes': 150, 'validations': [['free_min', 60], ['free_min', 60], ['free_min', 60]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 300), ({'minutes': 200, 'validations': [['pct', 25], ['pct', 10], ['flat', 100], ['flat', 250]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 550), ({'minutes': 95, 'validations': [['free_min', 30]], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 120}, 700), ({'minutes': 583, 'validations': [], 'hourly': 200, 'daily_max': 1800, 'max_free_min': 60}, 1800), ({'minutes': 598, 'validations': [['flat', 100]], 'hourly': 350, 'daily_max': 3000, 'max_free_min': 120}, 2900), ({'minutes': 72, 'validations': [['free_min', 15], ['flat', 250], ['free_min', 60], ['free_min', 30]], 'hourly': 300, 'daily_max': 1800, 'max_free_min': 60}, 50), ({'minutes': 282, 'validations': [['pct', 10], ['free_min', 30], ['free_min', 30]], 'hourly': 200, 'daily_max': 1800, 'max_free_min': 120}, 720)], [({'minutes': 95, 'validations': [['free_min', 30]], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 120}, 700), ({'minutes': 150, 'validations': [['free_min', 60], ['free_min', 60], ['free_min', 60]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 300), ({'minutes': 431, 'validations': [], 'hourly': 200, 'daily_max': 1800, 'max_free_min': 60}, 1600), ({'minutes': 580, 'validations': [['flat', 500], ['free_min', 60], ['pct', 50]], 'hourly': 350, 'daily_max': 1800, 'max_free_min': 60}, 400), ({'minutes': 1309, 'validations': [['free_min', 30], ['pct', 10], ['pct', 25]], 'hourly': 200, 'daily_max': 3000, 'max_free_min': 120}, 2250), ({'minutes': 596, 'validations': [['pct', 10], ['free_min', 90], ['free_min', 120], ['free_min', 90]], 'hourly': 350, 'daily_max': 3000, 'max_free_min': 60}, 2700), ({'minutes': 200, 'validations': [['pct', 25], ['pct', 10], ['flat', 100], ['flat', 250]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 550), ({'minutes': 361, 'validations': [['free_min', 120], ['pct', 50], ['free_min', 15], ['free_min', 60]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 750)], [({'minutes': 143, 'validations': [['free_min', 15], ['pct', 25], ['flat', 500], ['pct', 10]], 'hourly': 200, 'daily_max': 2400, 'max_free_min': 120}, 0), ({'minutes': 449, 'validations': [['free_min', 15]], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 120}, 2400), ({'minutes': 328, 'validations': [['free_min', 15], ['flat', 250], ['flat', 100], ['free_min', 30]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 180}, 1150), ({'minutes': 302, 'validations': [['free_min', 30], ['free_min', 15], ['free_min', 90]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 60}, 1500), ({'minutes': 95, 'validations': [['free_min', 30]], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 120}, 700), ({'minutes': 244, 'validations': [['free_min', 30], ['flat', 500], ['free_min', 60], ['free_min', 15]], 'hourly': 300, 'daily_max': 1800, 'max_free_min': 60}, 700), ({'minutes': 200, 'validations': [['pct', 25], ['pct', 10], ['flat', 100], ['flat', 250]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 550), ({'minutes': 150, 'validations': [['free_min', 60], ['free_min', 60], ['free_min', 60]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 300)]]
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 0700700Passed
fee oracle 1600800Failed
fee oracle 211251350Failed
fee oracle 318001800Passed
fee oracle 415501550Passed
fee oracle 50300Failed
fee oracle 6550550Passed
fee oracle 720902090Passed

SHA-256 / 2a10759cee9ef3c6ba1db9753d0b0a5fd99491ccb4d3d65b5de6d935f48acff0

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(x):
    free = max([0] + [v for k, v in x['validations'] if k == 'free_min'])
    bill = max(0, x['minutes'] - free)
    fee = min(x['daily_max'], -(-bill // 60) * x['hourly'])
    pcts = [v for k, v in x['validations'] if k == 'pct']
    if pcts:
        fee -= fee * max(pcts) // 100
    flat = sum(v for k, v in x['validations'] if k == 'flat')
    return max(0, fee - flat)
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[({'minutes': 95, 'validations': [['free_min', 30]], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 120}, 700), ({'minutes': 242, 'validations': [['free_min', 60], ['free_min', 15]], 'hourly': 200, 'daily_max': 2400, 'max_free_min': 60}, 800), ({'minutes': 405, 'validations': [['free_min', 90], ['free_min', 15], ['free_min', 60], ['pct', 25]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 60}, 1350), ({'minutes': 1305, 'validations': [['free_min', 30], ['free_min', 15], ['pct', 25]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 180}, 1800), ({'minutes': 527, 'validations': [['flat', 250]], 'hourly': 200, 'daily_max': 3000, 'max_free_min': 60}, 1550), ({'minutes': 150, 'validations': [['free_min', 60], ['free_min', 60], ['free_min', 60]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 300), ({'minutes': 200, 'validations': [['pct', 25], ['pct', 10], ['flat', 100], ['flat', 250]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 550), ({'minutes': 850, 'validations': [['pct', 10], ['free_min', 60], ['free_min', 30], ['flat', 250]], 'hourly': 200, 'daily_max': 3000, 'max_free_min': 180}, 2090)], [({'minutes': 761, 'validations': [['free_min', 120], ['free_min', 120], ['free_min', 60]], 'hourly': 200, 'daily_max': 1800, 'max_free_min': 120}, 1800), ({'minutes': 150, 'validations': [['free_min', 60], ['free_min', 60], ['free_min', 60]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 300), ({'minutes': 95, 'validations': [['free_min', 30]], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 120}, 700), ({'minutes': 967, 'validations': [['free_min', 120]], 'hourly': 300, 'daily_max': 3000, 'max_free_min': 60}, 3000), ({'minutes': 212, 'validations': [['free_min', 60]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 60}, 900), ({'minutes': 200, 'validations': [['pct', 25], ['pct', 10], ['flat', 100], ['flat', 250]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 550), ({'minutes': 203, 'validations': [['free_min', 120], ['flat', 250], ['pct', 10], ['free_min', 120]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 180}, 20), ({'minutes': 999, 'validations': [['free_min', 120], ['free_min', 30]], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 120}, 2400)], [({'minutes': 188, 'validations': [['free_min', 120], ['free_min', 30]], 'hourly': 200, 'daily_max': 3000, 'max_free_min': 60}, 600), ({'minutes': 150, 'validations': [['free_min', 60], ['free_min', 60], ['free_min', 60]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 300), ({'minutes': 200, 'validations': [['pct', 25], ['pct', 10], ['flat', 100], ['flat', 250]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 550), ({'minutes': 95, 'validations': [['free_min', 30]], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 120}, 700), ({'minutes': 583, 'validations': [], 'hourly': 200, 'daily_max': 1800, 'max_free_min': 60}, 1800), ({'minutes': 598, 'validations': [['flat', 100]], 'hourly': 350, 'daily_max': 3000, 'max_free_min': 120}, 2900), ({'minutes': 72, 'validations': [['free_min', 15], ['flat', 250], ['free_min', 60], ['free_min', 30]], 'hourly': 300, 'daily_max': 1800, 'max_free_min': 60}, 50), ({'minutes': 282, 'validations': [['pct', 10], ['free_min', 30], ['free_min', 30]], 'hourly': 200, 'daily_max': 1800, 'max_free_min': 120}, 720)], [({'minutes': 95, 'validations': [['free_min', 30]], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 120}, 700), ({'minutes': 150, 'validations': [['free_min', 60], ['free_min', 60], ['free_min', 60]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 300), ({'minutes': 431, 'validations': [], 'hourly': 200, 'daily_max': 1800, 'max_free_min': 60}, 1600), ({'minutes': 580, 'validations': [['flat', 500], ['free_min', 60], ['pct', 50]], 'hourly': 350, 'daily_max': 1800, 'max_free_min': 60}, 400), ({'minutes': 1309, 'validations': [['free_min', 30], ['pct', 10], ['pct', 25]], 'hourly': 200, 'daily_max': 3000, 'max_free_min': 120}, 2250), ({'minutes': 596, 'validations': [['pct', 10], ['free_min', 90], ['free_min', 120], ['free_min', 90]], 'hourly': 350, 'daily_max': 3000, 'max_free_min': 60}, 2700), ({'minutes': 200, 'validations': [['pct', 25], ['pct', 10], ['flat', 100], ['flat', 250]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 550), ({'minutes': 361, 'validations': [['free_min', 120], ['pct', 50], ['free_min', 15], ['free_min', 60]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 750)], [({'minutes': 143, 'validations': [['free_min', 15], ['pct', 25], ['flat', 500], ['pct', 10]], 'hourly': 200, 'daily_max': 2400, 'max_free_min': 120}, 0), ({'minutes': 449, 'validations': [['free_min', 15]], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 120}, 2400), ({'minutes': 328, 'validations': [['free_min', 15], ['flat', 250], ['flat', 100], ['free_min', 30]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 180}, 1150), ({'minutes': 302, 'validations': [['free_min', 30], ['free_min', 15], ['free_min', 90]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 60}, 1500), ({'minutes': 95, 'validations': [['free_min', 30]], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 120}, 700), ({'minutes': 244, 'validations': [['free_min', 30], ['flat', 500], ['free_min', 60], ['free_min', 15]], 'hourly': 300, 'daily_max': 1800, 'max_free_min': 60}, 700), ({'minutes': 200, 'validations': [['pct', 25], ['pct', 10], ['flat', 100], ['flat', 250]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 550), ({'minutes': 150, 'validations': [['free_min', 60], ['free_min', 60], ['free_min', 60]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 300)]]
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 0700700Passed
fee oracle 1800800Passed
fee oracle 213501350Passed
fee oracle 318001800Passed
fee oracle 415501550Passed
fee oracle 5600300Failed
fee oracle 6550550Passed
fee oracle 722702090Failed

SHA-256 / 95ca1a6df22b90df2e7ba2ea2c988861614561b1339e7f79617d7fe7c9c34254

3 / The verified repair

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

N = 1
observations = []
def solve(x):
    free = min(x['max_free_min'], sum(v for k, v in x['validations'] if k == 'free_min'))
    bill = max(0, x['minutes'] - free)
    fee = min(x['daily_max'], -(-bill // 60) * x['hourly'])
    pcts = [v for k, v in x['validations'] if k == 'pct']
    if pcts:
        fee -= fee * max(pcts) // 100
    flat = sum(v for k, v in x['validations'] if k == 'flat')
    return max(0, fee - flat)
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[({'minutes': 95, 'validations': [['free_min', 30]], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 120}, 700), ({'minutes': 242, 'validations': [['free_min', 60], ['free_min', 15]], 'hourly': 200, 'daily_max': 2400, 'max_free_min': 60}, 800), ({'minutes': 405, 'validations': [['free_min', 90], ['free_min', 15], ['free_min', 60], ['pct', 25]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 60}, 1350), ({'minutes': 1305, 'validations': [['free_min', 30], ['free_min', 15], ['pct', 25]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 180}, 1800), ({'minutes': 527, 'validations': [['flat', 250]], 'hourly': 200, 'daily_max': 3000, 'max_free_min': 60}, 1550), ({'minutes': 150, 'validations': [['free_min', 60], ['free_min', 60], ['free_min', 60]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 300), ({'minutes': 200, 'validations': [['pct', 25], ['pct', 10], ['flat', 100], ['flat', 250]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 550), ({'minutes': 850, 'validations': [['pct', 10], ['free_min', 60], ['free_min', 30], ['flat', 250]], 'hourly': 200, 'daily_max': 3000, 'max_free_min': 180}, 2090)], [({'minutes': 761, 'validations': [['free_min', 120], ['free_min', 120], ['free_min', 60]], 'hourly': 200, 'daily_max': 1800, 'max_free_min': 120}, 1800), ({'minutes': 150, 'validations': [['free_min', 60], ['free_min', 60], ['free_min', 60]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 300), ({'minutes': 95, 'validations': [['free_min', 30]], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 120}, 700), ({'minutes': 967, 'validations': [['free_min', 120]], 'hourly': 300, 'daily_max': 3000, 'max_free_min': 60}, 3000), ({'minutes': 212, 'validations': [['free_min', 60]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 60}, 900), ({'minutes': 200, 'validations': [['pct', 25], ['pct', 10], ['flat', 100], ['flat', 250]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 550), ({'minutes': 203, 'validations': [['free_min', 120], ['flat', 250], ['pct', 10], ['free_min', 120]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 180}, 20), ({'minutes': 999, 'validations': [['free_min', 120], ['free_min', 30]], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 120}, 2400)], [({'minutes': 188, 'validations': [['free_min', 120], ['free_min', 30]], 'hourly': 200, 'daily_max': 3000, 'max_free_min': 60}, 600), ({'minutes': 150, 'validations': [['free_min', 60], ['free_min', 60], ['free_min', 60]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 300), ({'minutes': 200, 'validations': [['pct', 25], ['pct', 10], ['flat', 100], ['flat', 250]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 550), ({'minutes': 95, 'validations': [['free_min', 30]], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 120}, 700), ({'minutes': 583, 'validations': [], 'hourly': 200, 'daily_max': 1800, 'max_free_min': 60}, 1800), ({'minutes': 598, 'validations': [['flat', 100]], 'hourly': 350, 'daily_max': 3000, 'max_free_min': 120}, 2900), ({'minutes': 72, 'validations': [['free_min', 15], ['flat', 250], ['free_min', 60], ['free_min', 30]], 'hourly': 300, 'daily_max': 1800, 'max_free_min': 60}, 50), ({'minutes': 282, 'validations': [['pct', 10], ['free_min', 30], ['free_min', 30]], 'hourly': 200, 'daily_max': 1800, 'max_free_min': 120}, 720)], [({'minutes': 95, 'validations': [['free_min', 30]], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 120}, 700), ({'minutes': 150, 'validations': [['free_min', 60], ['free_min', 60], ['free_min', 60]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 300), ({'minutes': 431, 'validations': [], 'hourly': 200, 'daily_max': 1800, 'max_free_min': 60}, 1600), ({'minutes': 580, 'validations': [['flat', 500], ['free_min', 60], ['pct', 50]], 'hourly': 350, 'daily_max': 1800, 'max_free_min': 60}, 400), ({'minutes': 1309, 'validations': [['free_min', 30], ['pct', 10], ['pct', 25]], 'hourly': 200, 'daily_max': 3000, 'max_free_min': 120}, 2250), ({'minutes': 596, 'validations': [['pct', 10], ['free_min', 90], ['free_min', 120], ['free_min', 90]], 'hourly': 350, 'daily_max': 3000, 'max_free_min': 60}, 2700), ({'minutes': 200, 'validations': [['pct', 25], ['pct', 10], ['flat', 100], ['flat', 250]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 550), ({'minutes': 361, 'validations': [['free_min', 120], ['pct', 50], ['free_min', 15], ['free_min', 60]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 750)], [({'minutes': 143, 'validations': [['free_min', 15], ['pct', 25], ['flat', 500], ['pct', 10]], 'hourly': 200, 'daily_max': 2400, 'max_free_min': 120}, 0), ({'minutes': 449, 'validations': [['free_min', 15]], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 120}, 2400), ({'minutes': 328, 'validations': [['free_min', 15], ['flat', 250], ['flat', 100], ['free_min', 30]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 180}, 1150), ({'minutes': 302, 'validations': [['free_min', 30], ['free_min', 15], ['free_min', 90]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 60}, 1500), ({'minutes': 95, 'validations': [['free_min', 30]], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 120}, 700), ({'minutes': 244, 'validations': [['free_min', 30], ['flat', 500], ['free_min', 60], ['free_min', 15]], 'hourly': 300, 'daily_max': 1800, 'max_free_min': 60}, 700), ({'minutes': 200, 'validations': [['pct', 25], ['pct', 10], ['flat', 100], ['flat', 250]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 550), ({'minutes': 150, 'validations': [['free_min', 60], ['free_min', 60], ['free_min', 60]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 300)]]
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 0700700Passed
fee oracle 1800800Passed
fee oracle 213501350Passed
fee oracle 318001800Passed
fee oracle 415501550Passed
fee oracle 5300300Passed
fee oracle 6550550Passed
fee oracle 720902090Passed

SHA-256 / 98f3047e17b44a01f442d91e2571c2064db19d1585646901b91fd1a9cfa62857

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

Case digest / ddfd8ae84f23407d7486b1c9ab034d2d64d25395d41ab5dafe7e790c83392022