FAILURE MAP
← Case archive

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

Merchant parking validations: free minutes are converted to money after rating · case 01

Merchant parking validations returns a wrong result when free minutes are converted to money after rating.

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

ROOT CAUSE

Deducting whole free hours from a fee rounded on the full stay loses the partial-hour benefit of free minutes.

VERIFIED REPAIR

Restore the free time application rule so that the step reads `fee = min(x['daily_max'], -(-bill // 60) * x['hourly'])`.

Unsuccessful approach: Rounding free minutes up to hours over-credits validations such as 30 minutes.

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 = 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'], -(-x['minutes'] // 60) * x['hourly']) - (free // 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': 150, 'validations': [['free_min', 60], ['free_min', 60], ['free_min', 60]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 300), ({'minutes': 426, 'validations': [['pct', 50], ['free_min', 15], ['free_min', 30], ['pct', 10]], 'hourly': 200, 'daily_max': 2400, 'max_free_min': 180}, 700), ({'minutes': 200, 'validations': [['pct', 25], ['pct', 10], ['flat', 100], ['flat', 250]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 550), ({'minutes': 854, 'validations': [['pct', 10], ['free_min', 30], ['free_min', 30], ['flat', 100]], 'hourly': 200, 'daily_max': 1800, 'max_free_min': 60}, 1520), ({'minutes': 217, 'validations': [['pct', 50], ['pct', 10], ['free_min', 15]], 'hourly': 350, 'daily_max': 3000, 'max_free_min': 120}, 700), ({'minutes': 8, 'validations': [], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 60}, 350), ({'minutes': 859, 'validations': [['flat', 500], ['free_min', 15], ['free_min', 90]], 'hourly': 350, 'daily_max': 1800, 'max_free_min': 180}, 1300), ({'minutes': 95, 'validations': [['free_min', 30]], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 120}, 700)], [({'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': 975, 'validations': [['free_min', 120], ['pct', 50], ['pct', 25]], 'hourly': 350, 'daily_max': 1800, 'max_free_min': 180}, 900), ({'minutes': 936, 'validations': [['pct', 50], ['free_min', 120]], 'hourly': 300, 'daily_max': 1800, 'max_free_min': 60}, 900), ({'minutes': 523, 'validations': [['free_min', 120], ['pct', 10], ['pct', 50]], 'hourly': 300, 'daily_max': 1800, 'max_free_min': 60}, 900), ({'minutes': 351, 'validations': [['free_min', 30]], 'hourly': 350, 'daily_max': 3000, 'max_free_min': 60}, 2100), ({'minutes': 200, 'validations': [['pct', 25], ['pct', 10], ['flat', 100], ['flat', 250]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 550), ({'minutes': 419, 'validations': [['flat', 500]], 'hourly': 200, 'daily_max': 3000, 'max_free_min': 180}, 900)], [({'minutes': 95, 'validations': [['free_min', 30]], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 120}, 700), ({'minutes': 825, 'validations': [['pct', 25], ['free_min', 60], ['free_min', 30]], 'hourly': 300, 'daily_max': 2400, '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': 751, 'validations': [['free_min', 120], ['free_min', 15], ['free_min', 90], ['flat', 250]], 'hourly': 200, 'daily_max': 1800, 'max_free_min': 60}, 1550), ({'minutes': 267, 'validations': [['free_min', 15]], 'hourly': 350, 'daily_max': 1800, 'max_free_min': 180}, 1750), ({'minutes': 580, 'validations': [['free_min', 90], ['free_min', 15], ['flat', 250]], 'hourly': 200, 'daily_max': 2400, 'max_free_min': 180}, 1350), ({'minutes': 51, 'validations': [['pct', 25], ['free_min', 30], ['free_min', 120], ['pct', 10]], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 120}, 0), ({'minutes': 200, 'validations': [['pct', 25], ['pct', 10], ['flat', 100], ['flat', 250]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 550)], [({'minutes': 1354, 'validations': [['flat', 250], ['free_min', 90], ['pct', 10], ['free_min', 120]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 180}, 1910), ({'minutes': 406, 'validations': [['flat', 500], ['pct', 25], ['free_min', 90], ['pct', 50]], 'hourly': 350, 'daily_max': 1800, 'max_free_min': 60}, 400), ({'minutes': 200, 'validations': [['pct', 25], ['pct', 10], ['flat', 100], ['flat', 250]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 550), ({'minutes': 1257, 'validations': [['free_min', 90], ['flat', 250], ['free_min', 60], ['free_min', 120]], 'hourly': 300, 'daily_max': 1800, 'max_free_min': 60}, 1550), ({'minutes': 95, 'validations': [['free_min', 30]], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 120}, 700), ({'minutes': 540, 'validations': [['flat', 100], ['free_min', 60]], 'hourly': 300, 'daily_max': 3000, 'max_free_min': 60}, 2300), ({'minutes': 224, 'validations': [['pct', 50], ['free_min', 15]], 'hourly': 350, 'daily_max': 1800, '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': 200, 'validations': [['pct', 25], ['pct', 10], ['flat', 100], ['flat', 250]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 550), ({'minutes': 911, 'validations': [['flat', 250], ['free_min', 30], ['free_min', 60], ['free_min', 15]], 'hourly': 350, 'daily_max': 1800, 'max_free_min': 120}, 1550), ({'minutes': 1367, 'validations': [['free_min', 90], ['flat', 250], ['free_min', 30], ['free_min', 120]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 2150), ({'minutes': 494, 'validations': [], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 180}, 2400), ({'minutes': 440, 'validations': [['free_min', 15], ['flat', 250]], 'hourly': 200, 'daily_max': 1800, 'max_free_min': 180}, 1350), ({'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': 1259, 'validations': [['free_min', 120], ['free_min', 30], ['free_min', 120], ['free_min', 120]], 'hourly': 300, 'daily_max': 1800, 'max_free_min': 60}, 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 0300300Passed
fee oracle 1800700Failed
fee oracle 2550550Passed
fee oracle 313401520Failed
fee oracle 4700700Passed
fee oracle 5350350Passed
fee oracle 69501300Failed
fee oracle 7700700Passed

SHA-256 / f96b062decd4d4950507c222e694037c868fb5289b308c0e3976f7b51632db23

2 / The unsuccessful fix

Exit 1
"""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'], -(-x['minutes'] // 60) * x['hourly'] - -(-free // 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': 150, 'validations': [['free_min', 60], ['free_min', 60], ['free_min', 60]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 300), ({'minutes': 426, 'validations': [['pct', 50], ['free_min', 15], ['free_min', 30], ['pct', 10]], 'hourly': 200, 'daily_max': 2400, 'max_free_min': 180}, 700), ({'minutes': 200, 'validations': [['pct', 25], ['pct', 10], ['flat', 100], ['flat', 250]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 550), ({'minutes': 854, 'validations': [['pct', 10], ['free_min', 30], ['free_min', 30], ['flat', 100]], 'hourly': 200, 'daily_max': 1800, 'max_free_min': 60}, 1520), ({'minutes': 217, 'validations': [['pct', 50], ['pct', 10], ['free_min', 15]], 'hourly': 350, 'daily_max': 3000, 'max_free_min': 120}, 700), ({'minutes': 8, 'validations': [], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 60}, 350), ({'minutes': 859, 'validations': [['flat', 500], ['free_min', 15], ['free_min', 90]], 'hourly': 350, 'daily_max': 1800, 'max_free_min': 180}, 1300), ({'minutes': 95, 'validations': [['free_min', 30]], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 120}, 700)], [({'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': 975, 'validations': [['free_min', 120], ['pct', 50], ['pct', 25]], 'hourly': 350, 'daily_max': 1800, 'max_free_min': 180}, 900), ({'minutes': 936, 'validations': [['pct', 50], ['free_min', 120]], 'hourly': 300, 'daily_max': 1800, 'max_free_min': 60}, 900), ({'minutes': 523, 'validations': [['free_min', 120], ['pct', 10], ['pct', 50]], 'hourly': 300, 'daily_max': 1800, 'max_free_min': 60}, 900), ({'minutes': 351, 'validations': [['free_min', 30]], 'hourly': 350, 'daily_max': 3000, 'max_free_min': 60}, 2100), ({'minutes': 200, 'validations': [['pct', 25], ['pct', 10], ['flat', 100], ['flat', 250]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 550), ({'minutes': 419, 'validations': [['flat', 500]], 'hourly': 200, 'daily_max': 3000, 'max_free_min': 180}, 900)], [({'minutes': 95, 'validations': [['free_min', 30]], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 120}, 700), ({'minutes': 825, 'validations': [['pct', 25], ['free_min', 60], ['free_min', 30]], 'hourly': 300, 'daily_max': 2400, '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': 751, 'validations': [['free_min', 120], ['free_min', 15], ['free_min', 90], ['flat', 250]], 'hourly': 200, 'daily_max': 1800, 'max_free_min': 60}, 1550), ({'minutes': 267, 'validations': [['free_min', 15]], 'hourly': 350, 'daily_max': 1800, 'max_free_min': 180}, 1750), ({'minutes': 580, 'validations': [['free_min', 90], ['free_min', 15], ['flat', 250]], 'hourly': 200, 'daily_max': 2400, 'max_free_min': 180}, 1350), ({'minutes': 51, 'validations': [['pct', 25], ['free_min', 30], ['free_min', 120], ['pct', 10]], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 120}, 0), ({'minutes': 200, 'validations': [['pct', 25], ['pct', 10], ['flat', 100], ['flat', 250]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 550)], [({'minutes': 1354, 'validations': [['flat', 250], ['free_min', 90], ['pct', 10], ['free_min', 120]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 180}, 1910), ({'minutes': 406, 'validations': [['flat', 500], ['pct', 25], ['free_min', 90], ['pct', 50]], 'hourly': 350, 'daily_max': 1800, 'max_free_min': 60}, 400), ({'minutes': 200, 'validations': [['pct', 25], ['pct', 10], ['flat', 100], ['flat', 250]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 550), ({'minutes': 1257, 'validations': [['free_min', 90], ['flat', 250], ['free_min', 60], ['free_min', 120]], 'hourly': 300, 'daily_max': 1800, 'max_free_min': 60}, 1550), ({'minutes': 95, 'validations': [['free_min', 30]], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 120}, 700), ({'minutes': 540, 'validations': [['flat', 100], ['free_min', 60]], 'hourly': 300, 'daily_max': 3000, 'max_free_min': 60}, 2300), ({'minutes': 224, 'validations': [['pct', 50], ['free_min', 15]], 'hourly': 350, 'daily_max': 1800, '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': 200, 'validations': [['pct', 25], ['pct', 10], ['flat', 100], ['flat', 250]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 550), ({'minutes': 911, 'validations': [['flat', 250], ['free_min', 30], ['free_min', 60], ['free_min', 15]], 'hourly': 350, 'daily_max': 1800, 'max_free_min': 120}, 1550), ({'minutes': 1367, 'validations': [['free_min', 90], ['flat', 250], ['free_min', 30], ['free_min', 120]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 2150), ({'minutes': 494, 'validations': [], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 180}, 2400), ({'minutes': 440, 'validations': [['free_min', 15], ['flat', 250]], 'hourly': 200, 'daily_max': 1800, 'max_free_min': 180}, 1350), ({'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': 1259, 'validations': [['free_min', 120], ['free_min', 30], ['free_min', 120], ['free_min', 120]], 'hourly': 300, 'daily_max': 1800, 'max_free_min': 60}, 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 0300300Passed
fee oracle 1700700Passed
fee oracle 2550550Passed
fee oracle 315201520Passed
fee oracle 4525700Failed
fee oracle 5350350Passed
fee oracle 613001300Passed
fee oracle 7350700Failed

SHA-256 / 1462fb8c1c44f20e33de97fdae772732311eee9d82357d0fdbe177947752cd32

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': 150, 'validations': [['free_min', 60], ['free_min', 60], ['free_min', 60]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 300), ({'minutes': 426, 'validations': [['pct', 50], ['free_min', 15], ['free_min', 30], ['pct', 10]], 'hourly': 200, 'daily_max': 2400, 'max_free_min': 180}, 700), ({'minutes': 200, 'validations': [['pct', 25], ['pct', 10], ['flat', 100], ['flat', 250]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 550), ({'minutes': 854, 'validations': [['pct', 10], ['free_min', 30], ['free_min', 30], ['flat', 100]], 'hourly': 200, 'daily_max': 1800, 'max_free_min': 60}, 1520), ({'minutes': 217, 'validations': [['pct', 50], ['pct', 10], ['free_min', 15]], 'hourly': 350, 'daily_max': 3000, 'max_free_min': 120}, 700), ({'minutes': 8, 'validations': [], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 60}, 350), ({'minutes': 859, 'validations': [['flat', 500], ['free_min', 15], ['free_min', 90]], 'hourly': 350, 'daily_max': 1800, 'max_free_min': 180}, 1300), ({'minutes': 95, 'validations': [['free_min', 30]], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 120}, 700)], [({'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': 975, 'validations': [['free_min', 120], ['pct', 50], ['pct', 25]], 'hourly': 350, 'daily_max': 1800, 'max_free_min': 180}, 900), ({'minutes': 936, 'validations': [['pct', 50], ['free_min', 120]], 'hourly': 300, 'daily_max': 1800, 'max_free_min': 60}, 900), ({'minutes': 523, 'validations': [['free_min', 120], ['pct', 10], ['pct', 50]], 'hourly': 300, 'daily_max': 1800, 'max_free_min': 60}, 900), ({'minutes': 351, 'validations': [['free_min', 30]], 'hourly': 350, 'daily_max': 3000, 'max_free_min': 60}, 2100), ({'minutes': 200, 'validations': [['pct', 25], ['pct', 10], ['flat', 100], ['flat', 250]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 550), ({'minutes': 419, 'validations': [['flat', 500]], 'hourly': 200, 'daily_max': 3000, 'max_free_min': 180}, 900)], [({'minutes': 95, 'validations': [['free_min', 30]], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 120}, 700), ({'minutes': 825, 'validations': [['pct', 25], ['free_min', 60], ['free_min', 30]], 'hourly': 300, 'daily_max': 2400, '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': 751, 'validations': [['free_min', 120], ['free_min', 15], ['free_min', 90], ['flat', 250]], 'hourly': 200, 'daily_max': 1800, 'max_free_min': 60}, 1550), ({'minutes': 267, 'validations': [['free_min', 15]], 'hourly': 350, 'daily_max': 1800, 'max_free_min': 180}, 1750), ({'minutes': 580, 'validations': [['free_min', 90], ['free_min', 15], ['flat', 250]], 'hourly': 200, 'daily_max': 2400, 'max_free_min': 180}, 1350), ({'minutes': 51, 'validations': [['pct', 25], ['free_min', 30], ['free_min', 120], ['pct', 10]], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 120}, 0), ({'minutes': 200, 'validations': [['pct', 25], ['pct', 10], ['flat', 100], ['flat', 250]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 550)], [({'minutes': 1354, 'validations': [['flat', 250], ['free_min', 90], ['pct', 10], ['free_min', 120]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 180}, 1910), ({'minutes': 406, 'validations': [['flat', 500], ['pct', 25], ['free_min', 90], ['pct', 50]], 'hourly': 350, 'daily_max': 1800, 'max_free_min': 60}, 400), ({'minutes': 200, 'validations': [['pct', 25], ['pct', 10], ['flat', 100], ['flat', 250]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 550), ({'minutes': 1257, 'validations': [['free_min', 90], ['flat', 250], ['free_min', 60], ['free_min', 120]], 'hourly': 300, 'daily_max': 1800, 'max_free_min': 60}, 1550), ({'minutes': 95, 'validations': [['free_min', 30]], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 120}, 700), ({'minutes': 540, 'validations': [['flat', 100], ['free_min', 60]], 'hourly': 300, 'daily_max': 3000, 'max_free_min': 60}, 2300), ({'minutes': 224, 'validations': [['pct', 50], ['free_min', 15]], 'hourly': 350, 'daily_max': 1800, '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': 200, 'validations': [['pct', 25], ['pct', 10], ['flat', 100], ['flat', 250]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 550), ({'minutes': 911, 'validations': [['flat', 250], ['free_min', 30], ['free_min', 60], ['free_min', 15]], 'hourly': 350, 'daily_max': 1800, 'max_free_min': 120}, 1550), ({'minutes': 1367, 'validations': [['free_min', 90], ['flat', 250], ['free_min', 30], ['free_min', 120]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 2150), ({'minutes': 494, 'validations': [], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 180}, 2400), ({'minutes': 440, 'validations': [['free_min', 15], ['flat', 250]], 'hourly': 200, 'daily_max': 1800, 'max_free_min': 180}, 1350), ({'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': 1259, 'validations': [['free_min', 120], ['free_min', 30], ['free_min', 120], ['free_min', 120]], 'hourly': 300, 'daily_max': 1800, 'max_free_min': 60}, 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 0300300Passed
fee oracle 1700700Passed
fee oracle 2550550Passed
fee oracle 315201520Passed
fee oracle 4700700Passed
fee oracle 5350350Passed
fee oracle 613001300Passed
fee oracle 7700700Passed

SHA-256 / 3064a3425046e2fd797b3e0ee223d06c7ac1dcf43506c8a055870bfa684f3425

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

Case digest / b3c40632408c0a4c5002c328096b1b2aa434e138d900bd26e47f273f82289d0d