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.
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| fee oracle 0 | 700 | 700 | Passed |
| fee oracle 1 | 600 | 800 | Failed |
| fee oracle 2 | 1125 | 1350 | Failed |
| fee oracle 3 | 1800 | 1800 | Passed |
| fee oracle 4 | 1550 | 1550 | Passed |
| fee oracle 5 | 0 | 300 | Failed |
| fee oracle 6 | 550 | 550 | Passed |
| fee oracle 7 | 2090 | 2090 | Passed |
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| fee oracle 0 | 700 | 700 | Passed |
| fee oracle 1 | 800 | 800 | Passed |
| fee oracle 2 | 1350 | 1350 | Passed |
| fee oracle 3 | 1800 | 1800 | Passed |
| fee oracle 4 | 1550 | 1550 | Passed |
| fee oracle 5 | 600 | 300 | Failed |
| fee oracle 6 | 550 | 550 | Passed |
| fee oracle 7 | 2270 | 2090 | Failed |
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| fee oracle 0 | 700 | 700 | Passed |
| fee oracle 1 | 800 | 800 | Passed |
| fee oracle 2 | 1350 | 1350 | Passed |
| fee oracle 3 | 1800 | 1800 | Passed |
| fee oracle 4 | 1550 | 1550 | Passed |
| fee oracle 5 | 300 | 300 | Passed |
| fee oracle 6 | 550 | 550 | Passed |
| fee oracle 7 | 2090 | 2090 | Passed |
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