FA-68681 / Toll and parking fee computation / Open access
Merchant parking validations: flat validations can drive the fee negative · case 01
Merchant parking validations returns a wrong result when flat validations can drive the fee negative.
ROOT CAUSE
Flat validations larger than the fee produce a refund.
VERIFIED REPAIR
Restore the zero floor rule so that the step reads `return max(0, fee - flat)`.
Unsuccessful approach: Flooring before subtracting still returns negative amounts.
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'], -(-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 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': 794, 'validations': [], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 60}, 2400), ({'minutes': 754, 'validations': [['free_min', 30], ['free_min', 120], ['free_min', 30], ['pct', 25]], 'hourly': 300, 'daily_max': 1800, 'max_free_min': 180}, 1350), ({'minutes': 7, 'validations': [['flat', 250], ['free_min', 15], ['free_min', 60]], 'hourly': 350, 'daily_max': 1800, 'max_free_min': 120}, 0), ({'minutes': 27, 'validations': [['free_min', 90], ['flat', 500], ['free_min', 15]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 0), ({'minutes': 95, 'validations': [['free_min', 30]], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 120}, 700), ({'minutes': 42, 'validations': [['pct', 10], ['flat', 500], ['flat', 500]], 'hourly': 200, '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': 27, 'validations': [['free_min', 90], ['free_min', 60], ['flat', 100], ['flat', 100]], 'hourly': 200, 'daily_max': 1800, 'max_free_min': 180}, 0), ({'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': 1012, 'validations': [['pct', 50], ['flat', 250], ['free_min', 30], ['pct', 50]], 'hourly': 300, 'daily_max': 1800, 'max_free_min': 120}, 650), ({'minutes': 42, 'validations': [['free_min', 60], ['flat', 500]], 'hourly': 200, 'daily_max': 2400, 'max_free_min': 60}, 0), ({'minutes': 1400, 'validations': [['free_min', 30], ['flat', 250], ['free_min', 90], ['free_min', 120]], 'hourly': 200, 'daily_max': 3000, 'max_free_min': 180}, 2750), ({'minutes': 200, 'validations': [['pct', 25], ['pct', 10], ['flat', 100], ['flat', 250]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 550), ({'minutes': 29, 'validations': [['flat', 250], ['free_min', 90], ['free_min', 30]], 'hourly': 350, 'daily_max': 3000, 'max_free_min': 60}, 0)], [({'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': 259, 'validations': [['flat', 250], ['free_min', 60], ['free_min', 120], ['free_min', 120]], 'hourly': 350, 'daily_max': 3000, 'max_free_min': 180}, 450), ({'minutes': 420, 'validations': [['free_min', 120], ['free_min', 90], ['free_min', 90]], 'hourly': 300, 'daily_max': 1800, 'max_free_min': 180}, 1200), ({'minutes': 135, 'validations': [['free_min', 120], ['flat', 500], ['free_min', 30]], 'hourly': 200, 'daily_max': 3000, 'max_free_min': 180}, 0), ({'minutes': 95, 'validations': [['free_min', 30]], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 120}, 700), ({'minutes': 94, 'validations': [['free_min', 60], ['flat', 500], ['pct', 25]], 'hourly': 300, 'daily_max': 1800, 'max_free_min': 120}, 0), ({'minutes': 87, 'validations': [['flat', 500], ['free_min', 120], ['flat', 250], ['free_min', 120]], 'hourly': 200, 'daily_max': 2400, 'max_free_min': 180}, 0)], [({'minutes': 209, 'validations': [['pct', 25], ['free_min', 30], ['flat', 500], ['pct', 50]], 'hourly': 300, 'daily_max': 1800, 'max_free_min': 60}, 0), ({'minutes': 19, 'validations': [['pct', 10], ['flat', 100], ['free_min', 120]], 'hourly': 200, 'daily_max': 2400, 'max_free_min': 180}, 0), ({'minutes': 95, 'validations': [['free_min', 30]], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 120}, 700), ({'minutes': 568, 'validations': [['free_min', 60], ['free_min', 60], ['free_min', 30], ['free_min', 120]], 'hourly': 200, 'daily_max': 2400, 'max_free_min': 60}, 1800), ({'minutes': 200, 'validations': [['pct', 25], ['pct', 10], ['flat', 100], ['flat', 250]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 550), ({'minutes': 806, 'validations': [['pct', 50], ['free_min', 60], ['free_min', 60], ['flat', 500]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 700), ({'minutes': 56, 'validations': [['flat', 100], ['flat', 100], ['pct', 10], ['free_min', 90]], 'hourly': 350, 'daily_max': 3000, 'max_free_min': 60}, 0), ({'minutes': 150, 'validations': [['free_min', 60], ['free_min', 60], ['free_min', 60]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 300)], [({'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': 485, 'validations': [['pct', 10], ['free_min', 60]], 'hourly': 350, 'daily_max': 3000, 'max_free_min': 120}, 2520), ({'minutes': 37, 'validations': [['free_min', 90], ['pct', 50], ['flat', 500]], 'hourly': 200, 'daily_max': 1800, 'max_free_min': 60}, 0), ({'minutes': 12, 'validations': [['flat', 500], ['flat', 500]], 'hourly': 350, 'daily_max': 3000, 'max_free_min': 180}, 0), ({'minutes': 1247, 'validations': [['flat', 250]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 180}, 2150), ({'minutes': 161, 'validations': [['free_min', 60], ['flat', 500], ['flat', 250]], 'hourly': 300, 'daily_max': 1800, 'max_free_min': 120}, 0)]]
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 | 300 | 300 | Passed |
| fee oracle 1 | 2400 | 2400 | Passed |
| fee oracle 2 | 1350 | 1350 | Passed |
| fee oracle 3 | -250 | 0 | Failed |
| fee oracle 4 | -500 | 0 | Failed |
| fee oracle 5 | 700 | 700 | Passed |
| fee oracle 6 | -820 | 0 | Failed |
| fee oracle 7 | 550 | 550 | Passed |
SHA-256 / e86222e4554a5e24c4ebf64c33162aae8111bd68b14c92590b2be402de6d84dd
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'], -(-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': 794, 'validations': [], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 60}, 2400), ({'minutes': 754, 'validations': [['free_min', 30], ['free_min', 120], ['free_min', 30], ['pct', 25]], 'hourly': 300, 'daily_max': 1800, 'max_free_min': 180}, 1350), ({'minutes': 7, 'validations': [['flat', 250], ['free_min', 15], ['free_min', 60]], 'hourly': 350, 'daily_max': 1800, 'max_free_min': 120}, 0), ({'minutes': 27, 'validations': [['free_min', 90], ['flat', 500], ['free_min', 15]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 0), ({'minutes': 95, 'validations': [['free_min', 30]], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 120}, 700), ({'minutes': 42, 'validations': [['pct', 10], ['flat', 500], ['flat', 500]], 'hourly': 200, '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': 27, 'validations': [['free_min', 90], ['free_min', 60], ['flat', 100], ['flat', 100]], 'hourly': 200, 'daily_max': 1800, 'max_free_min': 180}, 0), ({'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': 1012, 'validations': [['pct', 50], ['flat', 250], ['free_min', 30], ['pct', 50]], 'hourly': 300, 'daily_max': 1800, 'max_free_min': 120}, 650), ({'minutes': 42, 'validations': [['free_min', 60], ['flat', 500]], 'hourly': 200, 'daily_max': 2400, 'max_free_min': 60}, 0), ({'minutes': 1400, 'validations': [['free_min', 30], ['flat', 250], ['free_min', 90], ['free_min', 120]], 'hourly': 200, 'daily_max': 3000, 'max_free_min': 180}, 2750), ({'minutes': 200, 'validations': [['pct', 25], ['pct', 10], ['flat', 100], ['flat', 250]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 550), ({'minutes': 29, 'validations': [['flat', 250], ['free_min', 90], ['free_min', 30]], 'hourly': 350, 'daily_max': 3000, 'max_free_min': 60}, 0)], [({'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': 259, 'validations': [['flat', 250], ['free_min', 60], ['free_min', 120], ['free_min', 120]], 'hourly': 350, 'daily_max': 3000, 'max_free_min': 180}, 450), ({'minutes': 420, 'validations': [['free_min', 120], ['free_min', 90], ['free_min', 90]], 'hourly': 300, 'daily_max': 1800, 'max_free_min': 180}, 1200), ({'minutes': 135, 'validations': [['free_min', 120], ['flat', 500], ['free_min', 30]], 'hourly': 200, 'daily_max': 3000, 'max_free_min': 180}, 0), ({'minutes': 95, 'validations': [['free_min', 30]], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 120}, 700), ({'minutes': 94, 'validations': [['free_min', 60], ['flat', 500], ['pct', 25]], 'hourly': 300, 'daily_max': 1800, 'max_free_min': 120}, 0), ({'minutes': 87, 'validations': [['flat', 500], ['free_min', 120], ['flat', 250], ['free_min', 120]], 'hourly': 200, 'daily_max': 2400, 'max_free_min': 180}, 0)], [({'minutes': 209, 'validations': [['pct', 25], ['free_min', 30], ['flat', 500], ['pct', 50]], 'hourly': 300, 'daily_max': 1800, 'max_free_min': 60}, 0), ({'minutes': 19, 'validations': [['pct', 10], ['flat', 100], ['free_min', 120]], 'hourly': 200, 'daily_max': 2400, 'max_free_min': 180}, 0), ({'minutes': 95, 'validations': [['free_min', 30]], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 120}, 700), ({'minutes': 568, 'validations': [['free_min', 60], ['free_min', 60], ['free_min', 30], ['free_min', 120]], 'hourly': 200, 'daily_max': 2400, 'max_free_min': 60}, 1800), ({'minutes': 200, 'validations': [['pct', 25], ['pct', 10], ['flat', 100], ['flat', 250]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 550), ({'minutes': 806, 'validations': [['pct', 50], ['free_min', 60], ['free_min', 60], ['flat', 500]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 700), ({'minutes': 56, 'validations': [['flat', 100], ['flat', 100], ['pct', 10], ['free_min', 90]], 'hourly': 350, 'daily_max': 3000, 'max_free_min': 60}, 0), ({'minutes': 150, 'validations': [['free_min', 60], ['free_min', 60], ['free_min', 60]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 300)], [({'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': 485, 'validations': [['pct', 10], ['free_min', 60]], 'hourly': 350, 'daily_max': 3000, 'max_free_min': 120}, 2520), ({'minutes': 37, 'validations': [['free_min', 90], ['pct', 50], ['flat', 500]], 'hourly': 200, 'daily_max': 1800, 'max_free_min': 60}, 0), ({'minutes': 12, 'validations': [['flat', 500], ['flat', 500]], 'hourly': 350, 'daily_max': 3000, 'max_free_min': 180}, 0), ({'minutes': 1247, 'validations': [['flat', 250]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 180}, 2150), ({'minutes': 161, 'validations': [['free_min', 60], ['flat', 500], ['flat', 250]], 'hourly': 300, 'daily_max': 1800, 'max_free_min': 120}, 0)]]
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 | 300 | 300 | Passed |
| fee oracle 1 | 2400 | 2400 | Passed |
| fee oracle 2 | 1350 | 1350 | Passed |
| fee oracle 3 | -250 | 0 | Failed |
| fee oracle 4 | -500 | 0 | Failed |
| fee oracle 5 | 700 | 700 | Passed |
| fee oracle 6 | -820 | 0 | Failed |
| fee oracle 7 | 550 | 550 | Passed |
SHA-256 / 30eea9e50bd34286f4e423e93a8583f499c89a433aee0720863e555e1c4622b1
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': 794, 'validations': [], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 60}, 2400), ({'minutes': 754, 'validations': [['free_min', 30], ['free_min', 120], ['free_min', 30], ['pct', 25]], 'hourly': 300, 'daily_max': 1800, 'max_free_min': 180}, 1350), ({'minutes': 7, 'validations': [['flat', 250], ['free_min', 15], ['free_min', 60]], 'hourly': 350, 'daily_max': 1800, 'max_free_min': 120}, 0), ({'minutes': 27, 'validations': [['free_min', 90], ['flat', 500], ['free_min', 15]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 0), ({'minutes': 95, 'validations': [['free_min', 30]], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 120}, 700), ({'minutes': 42, 'validations': [['pct', 10], ['flat', 500], ['flat', 500]], 'hourly': 200, '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': 27, 'validations': [['free_min', 90], ['free_min', 60], ['flat', 100], ['flat', 100]], 'hourly': 200, 'daily_max': 1800, 'max_free_min': 180}, 0), ({'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': 1012, 'validations': [['pct', 50], ['flat', 250], ['free_min', 30], ['pct', 50]], 'hourly': 300, 'daily_max': 1800, 'max_free_min': 120}, 650), ({'minutes': 42, 'validations': [['free_min', 60], ['flat', 500]], 'hourly': 200, 'daily_max': 2400, 'max_free_min': 60}, 0), ({'minutes': 1400, 'validations': [['free_min', 30], ['flat', 250], ['free_min', 90], ['free_min', 120]], 'hourly': 200, 'daily_max': 3000, 'max_free_min': 180}, 2750), ({'minutes': 200, 'validations': [['pct', 25], ['pct', 10], ['flat', 100], ['flat', 250]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 550), ({'minutes': 29, 'validations': [['flat', 250], ['free_min', 90], ['free_min', 30]], 'hourly': 350, 'daily_max': 3000, 'max_free_min': 60}, 0)], [({'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': 259, 'validations': [['flat', 250], ['free_min', 60], ['free_min', 120], ['free_min', 120]], 'hourly': 350, 'daily_max': 3000, 'max_free_min': 180}, 450), ({'minutes': 420, 'validations': [['free_min', 120], ['free_min', 90], ['free_min', 90]], 'hourly': 300, 'daily_max': 1800, 'max_free_min': 180}, 1200), ({'minutes': 135, 'validations': [['free_min', 120], ['flat', 500], ['free_min', 30]], 'hourly': 200, 'daily_max': 3000, 'max_free_min': 180}, 0), ({'minutes': 95, 'validations': [['free_min', 30]], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 120}, 700), ({'minutes': 94, 'validations': [['free_min', 60], ['flat', 500], ['pct', 25]], 'hourly': 300, 'daily_max': 1800, 'max_free_min': 120}, 0), ({'minutes': 87, 'validations': [['flat', 500], ['free_min', 120], ['flat', 250], ['free_min', 120]], 'hourly': 200, 'daily_max': 2400, 'max_free_min': 180}, 0)], [({'minutes': 209, 'validations': [['pct', 25], ['free_min', 30], ['flat', 500], ['pct', 50]], 'hourly': 300, 'daily_max': 1800, 'max_free_min': 60}, 0), ({'minutes': 19, 'validations': [['pct', 10], ['flat', 100], ['free_min', 120]], 'hourly': 200, 'daily_max': 2400, 'max_free_min': 180}, 0), ({'minutes': 95, 'validations': [['free_min', 30]], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 120}, 700), ({'minutes': 568, 'validations': [['free_min', 60], ['free_min', 60], ['free_min', 30], ['free_min', 120]], 'hourly': 200, 'daily_max': 2400, 'max_free_min': 60}, 1800), ({'minutes': 200, 'validations': [['pct', 25], ['pct', 10], ['flat', 100], ['flat', 250]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 550), ({'minutes': 806, 'validations': [['pct', 50], ['free_min', 60], ['free_min', 60], ['flat', 500]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 700), ({'minutes': 56, 'validations': [['flat', 100], ['flat', 100], ['pct', 10], ['free_min', 90]], 'hourly': 350, 'daily_max': 3000, 'max_free_min': 60}, 0), ({'minutes': 150, 'validations': [['free_min', 60], ['free_min', 60], ['free_min', 60]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 300)], [({'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': 485, 'validations': [['pct', 10], ['free_min', 60]], 'hourly': 350, 'daily_max': 3000, 'max_free_min': 120}, 2520), ({'minutes': 37, 'validations': [['free_min', 90], ['pct', 50], ['flat', 500]], 'hourly': 200, 'daily_max': 1800, 'max_free_min': 60}, 0), ({'minutes': 12, 'validations': [['flat', 500], ['flat', 500]], 'hourly': 350, 'daily_max': 3000, 'max_free_min': 180}, 0), ({'minutes': 1247, 'validations': [['flat', 250]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 180}, 2150), ({'minutes': 161, 'validations': [['free_min', 60], ['flat', 500], ['flat', 250]], 'hourly': 300, 'daily_max': 1800, 'max_free_min': 120}, 0)]]
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 | 300 | 300 | Passed |
| fee oracle 1 | 2400 | 2400 | Passed |
| fee oracle 2 | 1350 | 1350 | Passed |
| fee oracle 3 | 0 | 0 | Passed |
| fee oracle 4 | 0 | 0 | Passed |
| fee oracle 5 | 700 | 700 | Passed |
| fee oracle 6 | 0 | 0 | Passed |
| fee oracle 7 | 550 | 550 | Passed |
SHA-256 / 9ce76cabad81d95e3f883f597200bdc08477d4021cc37770a935e7ce27442873
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.493512+00:00.
Case digest / e8b9dc3b8eb5a9f4c875f06dae82af82d10264c8dcca35a5b2c0d0b72248add1