FA-60646 / Loyalty points ledgers / Open access
Partner miles conversion: minimum on usable points · case 01
A conversion goes through with fewer points than the partner minimum after block flooring.
ROOT CAUSE
The minimum is checked against the raw balance instead of the usable amount.
VERIFIED REPAIR
Check the minimum against usable (floored) points.
Unsuccessful approach: Using <= against usable points rejects conversions of exactly the minimum.
Case contract
Input {pts, block, min_pts, num, den, bonus_bp, threshold}. Usable points = pts floored to a block; usable below min_pts returns {"error"}. Miles = floor(usable*num/den). If usable >= threshold, bonus miles = floor(miles*bonus_bp/10000). Leftover points stay in the account. Return {used, miles, bonus, leftover}.
Why this case matters
Member point balances, statements and the program liability depend on this ledger rule.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
usable = x['pts'] // x['block'] * x['block']
if x['pts'] < x['min_pts']:
return {'error': 'below minimum'}
miles = usable * x['num'] // x['den']
bonus = miles * x['bonus_bp'] // 10000 if usable >= x['threshold'] else 0
return {'used': usable, 'miles': miles, 'bonus': bonus, 'leftover': x['pts'] - usable}
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['normal', {'pts': 12751, 'block': 1000, 'min_pts': 5000, 'num': 3, 'den': 4, 'bonus_bp': 2500, 'threshold': 10000}, {'used': 12000, 'miles': 9000, 'bonus': 2250, 'leftover': 751}], ['below minimum after flooring', {'pts': 5998, 'block': 1000, 'min_pts': 5500, 'num': 1, 'den': 1, 'bonus_bp': 0, 'threshold': 10000}, {'error': 'below minimum'}], ['raw above minimum', {'pts': 5099, 'block': 1000, 'min_pts': 5000, 'num': 2, 'den': 3, 'bonus_bp': 1000, 'threshold': 5000}, {'used': 5000, 'miles': 3333, 'bonus': 333, 'leftover': 99}], ['bonus threshold edge', {'pts': 10010, 'block': 500, 'min_pts': 1000, 'num': 1, 'den': 2, 'bonus_bp': 1500, 'threshold': 10000}, {'used': 10000, 'miles': 5000, 'bonus': 750, 'leftover': 10}], ['threshold by raw only', {'pts': 10401, 'block': 1000, 'min_pts': 1000, 'num': 1, 'den': 1, 'bonus_bp': 2000, 'threshold': 10200}, {'used': 10000, 'miles': 10000, 'bonus': 0, 'leftover': 401}], ['awkward ratio', {'pts': 7000, 'block': 250, 'min_pts': 2500, 'num': 5, 'den': 8, 'bonus_bp': 0, 'threshold': 99999}, {'used': 7000, 'miles': 4375, 'bonus': 0, 'leftover': 0}], ['large', {'pts': 250321, 'block': 1000, 'min_pts': 5000, 'num': 4, 'den': 5, 'bonus_bp': 3001, 'threshold': 50000}, {'used': 250000, 'miles': 200000, 'bonus': 60020, 'leftover': 321}]], [['normal', {'pts': 12752, 'block': 1000, 'min_pts': 5000, 'num': 3, 'den': 4, 'bonus_bp': 2500, 'threshold': 10000}, {'used': 12000, 'miles': 9000, 'bonus': 2250, 'leftover': 752}], ['below minimum after flooring', {'pts': 5997, 'block': 1000, 'min_pts': 5500, 'num': 1, 'den': 1, 'bonus_bp': 0, 'threshold': 10000}, {'error': 'below minimum'}], ['raw above minimum', {'pts': 5199, 'block': 1000, 'min_pts': 5000, 'num': 2, 'den': 3, 'bonus_bp': 1000, 'threshold': 5000}, {'used': 5000, 'miles': 3333, 'bonus': 333, 'leftover': 199}], ['bonus threshold edge', {'pts': 10020, 'block': 500, 'min_pts': 1000, 'num': 1, 'den': 2, 'bonus_bp': 1500, 'threshold': 10000}, {'used': 10000, 'miles': 5000, 'bonus': 750, 'leftover': 20}], ['threshold by raw only', {'pts': 10402, 'block': 1000, 'min_pts': 1000, 'num': 1, 'den': 1, 'bonus_bp': 2000, 'threshold': 10200}, {'used': 10000, 'miles': 10000, 'bonus': 0, 'leftover': 402}], ['awkward ratio', {'pts': 7000, 'block': 250, 'min_pts': 2500, 'num': 5, 'den': 9, 'bonus_bp': 0, 'threshold': 99999}, {'used': 7000, 'miles': 3888, 'bonus': 0, 'leftover': 0}], ['large', {'pts': 250321, 'block': 1000, 'min_pts': 5000, 'num': 4, 'den': 5, 'bonus_bp': 3002, 'threshold': 50000}, {'used': 250000, 'miles': 200000, 'bonus': 60040, 'leftover': 321}]], [['normal', {'pts': 12753, 'block': 1000, 'min_pts': 5000, 'num': 3, 'den': 4, 'bonus_bp': 2500, 'threshold': 10000}, {'used': 12000, 'miles': 9000, 'bonus': 2250, 'leftover': 753}], ['below minimum after flooring', {'pts': 5996, 'block': 1000, 'min_pts': 5500, 'num': 1, 'den': 1, 'bonus_bp': 0, 'threshold': 10000}, {'error': 'below minimum'}], ['raw above minimum', {'pts': 5299, 'block': 1000, 'min_pts': 5000, 'num': 2, 'den': 3, 'bonus_bp': 1000, 'threshold': 5000}, {'used': 5000, 'miles': 3333, 'bonus': 333, 'leftover': 299}], ['bonus threshold edge', {'pts': 10030, 'block': 500, 'min_pts': 1000, 'num': 1, 'den': 2, 'bonus_bp': 1500, 'threshold': 10000}, {'used': 10000, 'miles': 5000, 'bonus': 750, 'leftover': 30}], ['threshold by raw only', {'pts': 10403, 'block': 1000, 'min_pts': 1000, 'num': 1, 'den': 1, 'bonus_bp': 2000, 'threshold': 10200}, {'used': 10000, 'miles': 10000, 'bonus': 0, 'leftover': 403}], ['awkward ratio', {'pts': 7000, 'block': 250, 'min_pts': 2500, 'num': 5, 'den': 10, 'bonus_bp': 0, 'threshold': 99999}, {'used': 7000, 'miles': 3500, 'bonus': 0, 'leftover': 0}], ['large', {'pts': 250321, 'block': 1000, 'min_pts': 5000, 'num': 4, 'den': 5, 'bonus_bp': 3003, 'threshold': 50000}, {'used': 250000, 'miles': 200000, 'bonus': 60060, 'leftover': 321}]], [['normal', {'pts': 12754, 'block': 1000, 'min_pts': 5000, 'num': 3, 'den': 4, 'bonus_bp': 2500, 'threshold': 10000}, {'used': 12000, 'miles': 9000, 'bonus': 2250, 'leftover': 754}], ['below minimum after flooring', {'pts': 5995, 'block': 1000, 'min_pts': 5500, 'num': 1, 'den': 1, 'bonus_bp': 0, 'threshold': 10000}, {'error': 'below minimum'}], ['raw above minimum', {'pts': 5399, 'block': 1000, 'min_pts': 5000, 'num': 2, 'den': 3, 'bonus_bp': 1000, 'threshold': 5000}, {'used': 5000, 'miles': 3333, 'bonus': 333, 'leftover': 399}], ['bonus threshold edge', {'pts': 10040, 'block': 500, 'min_pts': 1000, 'num': 1, 'den': 2, 'bonus_bp': 1500, 'threshold': 10000}, {'used': 10000, 'miles': 5000, 'bonus': 750, 'leftover': 40}], ['threshold by raw only', {'pts': 10404, 'block': 1000, 'min_pts': 1000, 'num': 1, 'den': 1, 'bonus_bp': 2000, 'threshold': 10200}, {'used': 10000, 'miles': 10000, 'bonus': 0, 'leftover': 404}], ['awkward ratio', {'pts': 7000, 'block': 250, 'min_pts': 2500, 'num': 5, 'den': 11, 'bonus_bp': 0, 'threshold': 99999}, {'used': 7000, 'miles': 3181, 'bonus': 0, 'leftover': 0}], ['large', {'pts': 250321, 'block': 1000, 'min_pts': 5000, 'num': 4, 'den': 5, 'bonus_bp': 3004, 'threshold': 50000}, {'used': 250000, 'miles': 200000, 'bonus': 60080, 'leftover': 321}]], [['normal', {'pts': 12755, 'block': 1000, 'min_pts': 5000, 'num': 3, 'den': 4, 'bonus_bp': 2500, 'threshold': 10000}, {'used': 12000, 'miles': 9000, 'bonus': 2250, 'leftover': 755}], ['below minimum after flooring', {'pts': 5994, 'block': 1000, 'min_pts': 5500, 'num': 1, 'den': 1, 'bonus_bp': 0, 'threshold': 10000}, {'error': 'below minimum'}], ['raw above minimum', {'pts': 5499, 'block': 1000, 'min_pts': 5000, 'num': 2, 'den': 3, 'bonus_bp': 1000, 'threshold': 5000}, {'used': 5000, 'miles': 3333, 'bonus': 333, 'leftover': 499}], ['bonus threshold edge', {'pts': 10050, 'block': 500, 'min_pts': 1000, 'num': 1, 'den': 2, 'bonus_bp': 1500, 'threshold': 10000}, {'used': 10000, 'miles': 5000, 'bonus': 750, 'leftover': 50}], ['threshold by raw only', {'pts': 10405, 'block': 1000, 'min_pts': 1000, 'num': 1, 'den': 1, 'bonus_bp': 2000, 'threshold': 10200}, {'used': 10000, 'miles': 10000, 'bonus': 0, 'leftover': 405}], ['awkward ratio', {'pts': 7000, 'block': 250, 'min_pts': 2500, 'num': 5, 'den': 12, 'bonus_bp': 0, 'threshold': 99999}, {'used': 7000, 'miles': 2916, 'bonus': 0, 'leftover': 0}], ['large', {'pts': 250321, 'block': 1000, 'min_pts': 5000, 'num': 4, 'den': 5, 'bonus_bp': 3005, 'threshold': 50000}, {'used': 250000, 'miles': 200000, 'bonus': 60100, 'leftover': 321}]]]
for label, args, expected in fixtures[N-1]:
check(label, 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 |
|---|---|---|---|
| normal | {'bonus': 2250, 'leftover': 751, 'miles': 9000, 'used': 12000} | {'bonus': 2250, 'leftover': 751, 'miles': 9000, 'used': 12000} | Passed |
| below minimum after flooring | {'bonus': 0, 'leftover': 998, 'miles': 5000, 'used': 5000} | {'error': 'below minimum'} | Failed |
| raw above minimum | {'bonus': 333, 'leftover': 99, 'miles': 3333, 'used': 5000} | {'bonus': 333, 'leftover': 99, 'miles': 3333, 'used': 5000} | Passed |
| bonus threshold edge | {'bonus': 750, 'leftover': 10, 'miles': 5000, 'used': 10000} | {'bonus': 750, 'leftover': 10, 'miles': 5000, 'used': 10000} | Passed |
| threshold by raw only | {'bonus': 0, 'leftover': 401, 'miles': 10000, 'used': 10000} | {'bonus': 0, 'leftover': 401, 'miles': 10000, 'used': 10000} | Passed |
| awkward ratio | {'bonus': 0, 'leftover': 0, 'miles': 4375, 'used': 7000} | {'bonus': 0, 'leftover': 0, 'miles': 4375, 'used': 7000} | Passed |
| large | {'bonus': 60020, 'leftover': 321, 'miles': 200000, 'used': 250000} | {'bonus': 60020, 'leftover': 321, 'miles': 200000, 'used': 250000} | Passed |
SHA-256 / c96141366115e1520b6cb3785b1eb85e1a9d2986a18c998c26a521f4a826faf3
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
usable = x['pts'] // x['block'] * x['block']
if usable <= x['min_pts']:
return {'error': 'below minimum'}
miles = usable * x['num'] // x['den']
bonus = miles * x['bonus_bp'] // 10000 if usable >= x['threshold'] else 0
return {'used': usable, 'miles': miles, 'bonus': bonus, 'leftover': x['pts'] - usable}
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['normal', {'pts': 12751, 'block': 1000, 'min_pts': 5000, 'num': 3, 'den': 4, 'bonus_bp': 2500, 'threshold': 10000}, {'used': 12000, 'miles': 9000, 'bonus': 2250, 'leftover': 751}], ['below minimum after flooring', {'pts': 5998, 'block': 1000, 'min_pts': 5500, 'num': 1, 'den': 1, 'bonus_bp': 0, 'threshold': 10000}, {'error': 'below minimum'}], ['raw above minimum', {'pts': 5099, 'block': 1000, 'min_pts': 5000, 'num': 2, 'den': 3, 'bonus_bp': 1000, 'threshold': 5000}, {'used': 5000, 'miles': 3333, 'bonus': 333, 'leftover': 99}], ['bonus threshold edge', {'pts': 10010, 'block': 500, 'min_pts': 1000, 'num': 1, 'den': 2, 'bonus_bp': 1500, 'threshold': 10000}, {'used': 10000, 'miles': 5000, 'bonus': 750, 'leftover': 10}], ['threshold by raw only', {'pts': 10401, 'block': 1000, 'min_pts': 1000, 'num': 1, 'den': 1, 'bonus_bp': 2000, 'threshold': 10200}, {'used': 10000, 'miles': 10000, 'bonus': 0, 'leftover': 401}], ['awkward ratio', {'pts': 7000, 'block': 250, 'min_pts': 2500, 'num': 5, 'den': 8, 'bonus_bp': 0, 'threshold': 99999}, {'used': 7000, 'miles': 4375, 'bonus': 0, 'leftover': 0}], ['large', {'pts': 250321, 'block': 1000, 'min_pts': 5000, 'num': 4, 'den': 5, 'bonus_bp': 3001, 'threshold': 50000}, {'used': 250000, 'miles': 200000, 'bonus': 60020, 'leftover': 321}]], [['normal', {'pts': 12752, 'block': 1000, 'min_pts': 5000, 'num': 3, 'den': 4, 'bonus_bp': 2500, 'threshold': 10000}, {'used': 12000, 'miles': 9000, 'bonus': 2250, 'leftover': 752}], ['below minimum after flooring', {'pts': 5997, 'block': 1000, 'min_pts': 5500, 'num': 1, 'den': 1, 'bonus_bp': 0, 'threshold': 10000}, {'error': 'below minimum'}], ['raw above minimum', {'pts': 5199, 'block': 1000, 'min_pts': 5000, 'num': 2, 'den': 3, 'bonus_bp': 1000, 'threshold': 5000}, {'used': 5000, 'miles': 3333, 'bonus': 333, 'leftover': 199}], ['bonus threshold edge', {'pts': 10020, 'block': 500, 'min_pts': 1000, 'num': 1, 'den': 2, 'bonus_bp': 1500, 'threshold': 10000}, {'used': 10000, 'miles': 5000, 'bonus': 750, 'leftover': 20}], ['threshold by raw only', {'pts': 10402, 'block': 1000, 'min_pts': 1000, 'num': 1, 'den': 1, 'bonus_bp': 2000, 'threshold': 10200}, {'used': 10000, 'miles': 10000, 'bonus': 0, 'leftover': 402}], ['awkward ratio', {'pts': 7000, 'block': 250, 'min_pts': 2500, 'num': 5, 'den': 9, 'bonus_bp': 0, 'threshold': 99999}, {'used': 7000, 'miles': 3888, 'bonus': 0, 'leftover': 0}], ['large', {'pts': 250321, 'block': 1000, 'min_pts': 5000, 'num': 4, 'den': 5, 'bonus_bp': 3002, 'threshold': 50000}, {'used': 250000, 'miles': 200000, 'bonus': 60040, 'leftover': 321}]], [['normal', {'pts': 12753, 'block': 1000, 'min_pts': 5000, 'num': 3, 'den': 4, 'bonus_bp': 2500, 'threshold': 10000}, {'used': 12000, 'miles': 9000, 'bonus': 2250, 'leftover': 753}], ['below minimum after flooring', {'pts': 5996, 'block': 1000, 'min_pts': 5500, 'num': 1, 'den': 1, 'bonus_bp': 0, 'threshold': 10000}, {'error': 'below minimum'}], ['raw above minimum', {'pts': 5299, 'block': 1000, 'min_pts': 5000, 'num': 2, 'den': 3, 'bonus_bp': 1000, 'threshold': 5000}, {'used': 5000, 'miles': 3333, 'bonus': 333, 'leftover': 299}], ['bonus threshold edge', {'pts': 10030, 'block': 500, 'min_pts': 1000, 'num': 1, 'den': 2, 'bonus_bp': 1500, 'threshold': 10000}, {'used': 10000, 'miles': 5000, 'bonus': 750, 'leftover': 30}], ['threshold by raw only', {'pts': 10403, 'block': 1000, 'min_pts': 1000, 'num': 1, 'den': 1, 'bonus_bp': 2000, 'threshold': 10200}, {'used': 10000, 'miles': 10000, 'bonus': 0, 'leftover': 403}], ['awkward ratio', {'pts': 7000, 'block': 250, 'min_pts': 2500, 'num': 5, 'den': 10, 'bonus_bp': 0, 'threshold': 99999}, {'used': 7000, 'miles': 3500, 'bonus': 0, 'leftover': 0}], ['large', {'pts': 250321, 'block': 1000, 'min_pts': 5000, 'num': 4, 'den': 5, 'bonus_bp': 3003, 'threshold': 50000}, {'used': 250000, 'miles': 200000, 'bonus': 60060, 'leftover': 321}]], [['normal', {'pts': 12754, 'block': 1000, 'min_pts': 5000, 'num': 3, 'den': 4, 'bonus_bp': 2500, 'threshold': 10000}, {'used': 12000, 'miles': 9000, 'bonus': 2250, 'leftover': 754}], ['below minimum after flooring', {'pts': 5995, 'block': 1000, 'min_pts': 5500, 'num': 1, 'den': 1, 'bonus_bp': 0, 'threshold': 10000}, {'error': 'below minimum'}], ['raw above minimum', {'pts': 5399, 'block': 1000, 'min_pts': 5000, 'num': 2, 'den': 3, 'bonus_bp': 1000, 'threshold': 5000}, {'used': 5000, 'miles': 3333, 'bonus': 333, 'leftover': 399}], ['bonus threshold edge', {'pts': 10040, 'block': 500, 'min_pts': 1000, 'num': 1, 'den': 2, 'bonus_bp': 1500, 'threshold': 10000}, {'used': 10000, 'miles': 5000, 'bonus': 750, 'leftover': 40}], ['threshold by raw only', {'pts': 10404, 'block': 1000, 'min_pts': 1000, 'num': 1, 'den': 1, 'bonus_bp': 2000, 'threshold': 10200}, {'used': 10000, 'miles': 10000, 'bonus': 0, 'leftover': 404}], ['awkward ratio', {'pts': 7000, 'block': 250, 'min_pts': 2500, 'num': 5, 'den': 11, 'bonus_bp': 0, 'threshold': 99999}, {'used': 7000, 'miles': 3181, 'bonus': 0, 'leftover': 0}], ['large', {'pts': 250321, 'block': 1000, 'min_pts': 5000, 'num': 4, 'den': 5, 'bonus_bp': 3004, 'threshold': 50000}, {'used': 250000, 'miles': 200000, 'bonus': 60080, 'leftover': 321}]], [['normal', {'pts': 12755, 'block': 1000, 'min_pts': 5000, 'num': 3, 'den': 4, 'bonus_bp': 2500, 'threshold': 10000}, {'used': 12000, 'miles': 9000, 'bonus': 2250, 'leftover': 755}], ['below minimum after flooring', {'pts': 5994, 'block': 1000, 'min_pts': 5500, 'num': 1, 'den': 1, 'bonus_bp': 0, 'threshold': 10000}, {'error': 'below minimum'}], ['raw above minimum', {'pts': 5499, 'block': 1000, 'min_pts': 5000, 'num': 2, 'den': 3, 'bonus_bp': 1000, 'threshold': 5000}, {'used': 5000, 'miles': 3333, 'bonus': 333, 'leftover': 499}], ['bonus threshold edge', {'pts': 10050, 'block': 500, 'min_pts': 1000, 'num': 1, 'den': 2, 'bonus_bp': 1500, 'threshold': 10000}, {'used': 10000, 'miles': 5000, 'bonus': 750, 'leftover': 50}], ['threshold by raw only', {'pts': 10405, 'block': 1000, 'min_pts': 1000, 'num': 1, 'den': 1, 'bonus_bp': 2000, 'threshold': 10200}, {'used': 10000, 'miles': 10000, 'bonus': 0, 'leftover': 405}], ['awkward ratio', {'pts': 7000, 'block': 250, 'min_pts': 2500, 'num': 5, 'den': 12, 'bonus_bp': 0, 'threshold': 99999}, {'used': 7000, 'miles': 2916, 'bonus': 0, 'leftover': 0}], ['large', {'pts': 250321, 'block': 1000, 'min_pts': 5000, 'num': 4, 'den': 5, 'bonus_bp': 3005, 'threshold': 50000}, {'used': 250000, 'miles': 200000, 'bonus': 60100, 'leftover': 321}]]]
for label, args, expected in fixtures[N-1]:
check(label, 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 |
|---|---|---|---|
| normal | {'bonus': 2250, 'leftover': 751, 'miles': 9000, 'used': 12000} | {'bonus': 2250, 'leftover': 751, 'miles': 9000, 'used': 12000} | Passed |
| below minimum after flooring | {'error': 'below minimum'} | {'error': 'below minimum'} | Passed |
| raw above minimum | {'error': 'below minimum'} | {'bonus': 333, 'leftover': 99, 'miles': 3333, 'used': 5000} | Failed |
| bonus threshold edge | {'bonus': 750, 'leftover': 10, 'miles': 5000, 'used': 10000} | {'bonus': 750, 'leftover': 10, 'miles': 5000, 'used': 10000} | Passed |
| threshold by raw only | {'bonus': 0, 'leftover': 401, 'miles': 10000, 'used': 10000} | {'bonus': 0, 'leftover': 401, 'miles': 10000, 'used': 10000} | Passed |
| awkward ratio | {'bonus': 0, 'leftover': 0, 'miles': 4375, 'used': 7000} | {'bonus': 0, 'leftover': 0, 'miles': 4375, 'used': 7000} | Passed |
| large | {'bonus': 60020, 'leftover': 321, 'miles': 200000, 'used': 250000} | {'bonus': 60020, 'leftover': 321, 'miles': 200000, 'used': 250000} | Passed |
SHA-256 / a6b2ec1bb4a1276558cfb7df95f5b09998f3047d605aa806897b0ef9ac6b7803
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
usable = x['pts'] // x['block'] * x['block']
if usable < x['min_pts']:
return {'error': 'below minimum'}
miles = usable * x['num'] // x['den']
bonus = miles * x['bonus_bp'] // 10000 if usable >= x['threshold'] else 0
return {'used': usable, 'miles': miles, 'bonus': bonus, 'leftover': x['pts'] - usable}
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['normal', {'pts': 12751, 'block': 1000, 'min_pts': 5000, 'num': 3, 'den': 4, 'bonus_bp': 2500, 'threshold': 10000}, {'used': 12000, 'miles': 9000, 'bonus': 2250, 'leftover': 751}], ['below minimum after flooring', {'pts': 5998, 'block': 1000, 'min_pts': 5500, 'num': 1, 'den': 1, 'bonus_bp': 0, 'threshold': 10000}, {'error': 'below minimum'}], ['raw above minimum', {'pts': 5099, 'block': 1000, 'min_pts': 5000, 'num': 2, 'den': 3, 'bonus_bp': 1000, 'threshold': 5000}, {'used': 5000, 'miles': 3333, 'bonus': 333, 'leftover': 99}], ['bonus threshold edge', {'pts': 10010, 'block': 500, 'min_pts': 1000, 'num': 1, 'den': 2, 'bonus_bp': 1500, 'threshold': 10000}, {'used': 10000, 'miles': 5000, 'bonus': 750, 'leftover': 10}], ['threshold by raw only', {'pts': 10401, 'block': 1000, 'min_pts': 1000, 'num': 1, 'den': 1, 'bonus_bp': 2000, 'threshold': 10200}, {'used': 10000, 'miles': 10000, 'bonus': 0, 'leftover': 401}], ['awkward ratio', {'pts': 7000, 'block': 250, 'min_pts': 2500, 'num': 5, 'den': 8, 'bonus_bp': 0, 'threshold': 99999}, {'used': 7000, 'miles': 4375, 'bonus': 0, 'leftover': 0}], ['large', {'pts': 250321, 'block': 1000, 'min_pts': 5000, 'num': 4, 'den': 5, 'bonus_bp': 3001, 'threshold': 50000}, {'used': 250000, 'miles': 200000, 'bonus': 60020, 'leftover': 321}]], [['normal', {'pts': 12752, 'block': 1000, 'min_pts': 5000, 'num': 3, 'den': 4, 'bonus_bp': 2500, 'threshold': 10000}, {'used': 12000, 'miles': 9000, 'bonus': 2250, 'leftover': 752}], ['below minimum after flooring', {'pts': 5997, 'block': 1000, 'min_pts': 5500, 'num': 1, 'den': 1, 'bonus_bp': 0, 'threshold': 10000}, {'error': 'below minimum'}], ['raw above minimum', {'pts': 5199, 'block': 1000, 'min_pts': 5000, 'num': 2, 'den': 3, 'bonus_bp': 1000, 'threshold': 5000}, {'used': 5000, 'miles': 3333, 'bonus': 333, 'leftover': 199}], ['bonus threshold edge', {'pts': 10020, 'block': 500, 'min_pts': 1000, 'num': 1, 'den': 2, 'bonus_bp': 1500, 'threshold': 10000}, {'used': 10000, 'miles': 5000, 'bonus': 750, 'leftover': 20}], ['threshold by raw only', {'pts': 10402, 'block': 1000, 'min_pts': 1000, 'num': 1, 'den': 1, 'bonus_bp': 2000, 'threshold': 10200}, {'used': 10000, 'miles': 10000, 'bonus': 0, 'leftover': 402}], ['awkward ratio', {'pts': 7000, 'block': 250, 'min_pts': 2500, 'num': 5, 'den': 9, 'bonus_bp': 0, 'threshold': 99999}, {'used': 7000, 'miles': 3888, 'bonus': 0, 'leftover': 0}], ['large', {'pts': 250321, 'block': 1000, 'min_pts': 5000, 'num': 4, 'den': 5, 'bonus_bp': 3002, 'threshold': 50000}, {'used': 250000, 'miles': 200000, 'bonus': 60040, 'leftover': 321}]], [['normal', {'pts': 12753, 'block': 1000, 'min_pts': 5000, 'num': 3, 'den': 4, 'bonus_bp': 2500, 'threshold': 10000}, {'used': 12000, 'miles': 9000, 'bonus': 2250, 'leftover': 753}], ['below minimum after flooring', {'pts': 5996, 'block': 1000, 'min_pts': 5500, 'num': 1, 'den': 1, 'bonus_bp': 0, 'threshold': 10000}, {'error': 'below minimum'}], ['raw above minimum', {'pts': 5299, 'block': 1000, 'min_pts': 5000, 'num': 2, 'den': 3, 'bonus_bp': 1000, 'threshold': 5000}, {'used': 5000, 'miles': 3333, 'bonus': 333, 'leftover': 299}], ['bonus threshold edge', {'pts': 10030, 'block': 500, 'min_pts': 1000, 'num': 1, 'den': 2, 'bonus_bp': 1500, 'threshold': 10000}, {'used': 10000, 'miles': 5000, 'bonus': 750, 'leftover': 30}], ['threshold by raw only', {'pts': 10403, 'block': 1000, 'min_pts': 1000, 'num': 1, 'den': 1, 'bonus_bp': 2000, 'threshold': 10200}, {'used': 10000, 'miles': 10000, 'bonus': 0, 'leftover': 403}], ['awkward ratio', {'pts': 7000, 'block': 250, 'min_pts': 2500, 'num': 5, 'den': 10, 'bonus_bp': 0, 'threshold': 99999}, {'used': 7000, 'miles': 3500, 'bonus': 0, 'leftover': 0}], ['large', {'pts': 250321, 'block': 1000, 'min_pts': 5000, 'num': 4, 'den': 5, 'bonus_bp': 3003, 'threshold': 50000}, {'used': 250000, 'miles': 200000, 'bonus': 60060, 'leftover': 321}]], [['normal', {'pts': 12754, 'block': 1000, 'min_pts': 5000, 'num': 3, 'den': 4, 'bonus_bp': 2500, 'threshold': 10000}, {'used': 12000, 'miles': 9000, 'bonus': 2250, 'leftover': 754}], ['below minimum after flooring', {'pts': 5995, 'block': 1000, 'min_pts': 5500, 'num': 1, 'den': 1, 'bonus_bp': 0, 'threshold': 10000}, {'error': 'below minimum'}], ['raw above minimum', {'pts': 5399, 'block': 1000, 'min_pts': 5000, 'num': 2, 'den': 3, 'bonus_bp': 1000, 'threshold': 5000}, {'used': 5000, 'miles': 3333, 'bonus': 333, 'leftover': 399}], ['bonus threshold edge', {'pts': 10040, 'block': 500, 'min_pts': 1000, 'num': 1, 'den': 2, 'bonus_bp': 1500, 'threshold': 10000}, {'used': 10000, 'miles': 5000, 'bonus': 750, 'leftover': 40}], ['threshold by raw only', {'pts': 10404, 'block': 1000, 'min_pts': 1000, 'num': 1, 'den': 1, 'bonus_bp': 2000, 'threshold': 10200}, {'used': 10000, 'miles': 10000, 'bonus': 0, 'leftover': 404}], ['awkward ratio', {'pts': 7000, 'block': 250, 'min_pts': 2500, 'num': 5, 'den': 11, 'bonus_bp': 0, 'threshold': 99999}, {'used': 7000, 'miles': 3181, 'bonus': 0, 'leftover': 0}], ['large', {'pts': 250321, 'block': 1000, 'min_pts': 5000, 'num': 4, 'den': 5, 'bonus_bp': 3004, 'threshold': 50000}, {'used': 250000, 'miles': 200000, 'bonus': 60080, 'leftover': 321}]], [['normal', {'pts': 12755, 'block': 1000, 'min_pts': 5000, 'num': 3, 'den': 4, 'bonus_bp': 2500, 'threshold': 10000}, {'used': 12000, 'miles': 9000, 'bonus': 2250, 'leftover': 755}], ['below minimum after flooring', {'pts': 5994, 'block': 1000, 'min_pts': 5500, 'num': 1, 'den': 1, 'bonus_bp': 0, 'threshold': 10000}, {'error': 'below minimum'}], ['raw above minimum', {'pts': 5499, 'block': 1000, 'min_pts': 5000, 'num': 2, 'den': 3, 'bonus_bp': 1000, 'threshold': 5000}, {'used': 5000, 'miles': 3333, 'bonus': 333, 'leftover': 499}], ['bonus threshold edge', {'pts': 10050, 'block': 500, 'min_pts': 1000, 'num': 1, 'den': 2, 'bonus_bp': 1500, 'threshold': 10000}, {'used': 10000, 'miles': 5000, 'bonus': 750, 'leftover': 50}], ['threshold by raw only', {'pts': 10405, 'block': 1000, 'min_pts': 1000, 'num': 1, 'den': 1, 'bonus_bp': 2000, 'threshold': 10200}, {'used': 10000, 'miles': 10000, 'bonus': 0, 'leftover': 405}], ['awkward ratio', {'pts': 7000, 'block': 250, 'min_pts': 2500, 'num': 5, 'den': 12, 'bonus_bp': 0, 'threshold': 99999}, {'used': 7000, 'miles': 2916, 'bonus': 0, 'leftover': 0}], ['large', {'pts': 250321, 'block': 1000, 'min_pts': 5000, 'num': 4, 'den': 5, 'bonus_bp': 3005, 'threshold': 50000}, {'used': 250000, 'miles': 200000, 'bonus': 60100, 'leftover': 321}]]]
for label, args, expected in fixtures[N-1]:
check(label, 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 |
|---|---|---|---|
| normal | {'bonus': 2250, 'leftover': 751, 'miles': 9000, 'used': 12000} | {'bonus': 2250, 'leftover': 751, 'miles': 9000, 'used': 12000} | Passed |
| below minimum after flooring | {'error': 'below minimum'} | {'error': 'below minimum'} | Passed |
| raw above minimum | {'bonus': 333, 'leftover': 99, 'miles': 3333, 'used': 5000} | {'bonus': 333, 'leftover': 99, 'miles': 3333, 'used': 5000} | Passed |
| bonus threshold edge | {'bonus': 750, 'leftover': 10, 'miles': 5000, 'used': 10000} | {'bonus': 750, 'leftover': 10, 'miles': 5000, 'used': 10000} | Passed |
| threshold by raw only | {'bonus': 0, 'leftover': 401, 'miles': 10000, 'used': 10000} | {'bonus': 0, 'leftover': 401, 'miles': 10000, 'used': 10000} | Passed |
| awkward ratio | {'bonus': 0, 'leftover': 0, 'miles': 4375, 'used': 7000} | {'bonus': 0, 'leftover': 0, 'miles': 4375, 'used': 7000} | Passed |
| large | {'bonus': 60020, 'leftover': 321, 'miles': 200000, 'used': 250000} | {'bonus': 60020, 'leftover': 321, 'miles': 200000, 'used': 250000} | Passed |
SHA-256 / 73dfd98395af845c9ef4cdd6cb1922d5cd6c9e6b881073bd0c295062556428a1
Verification & scope
Stipulated bounded loyalty-program model with explicit toy rules; not any real program terms. 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:46:47.598225+00:00.
Case digest / 15c802eb7bf845df461db346f8fe8b0c090f4c754757a75c3abdc747075780d7