FA-60641 / Loyalty points ledgers / Open access
Partner miles conversion: conversion block floor · case 01
Odd point balances are converted in full, including fractions of a transfer block.
ROOT CAUSE
Usable points are the raw balance without flooring to the partner block.
VERIFIED REPAIR
Floor the balance to a whole block before converting.
Unsuccessful approach: Rounding to the nearest block can convert points the member does not have.
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']
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': 2390, 'leftover': 0, 'miles': 9563, 'used': 12751} | {'bonus': 2250, 'leftover': 751, 'miles': 9000, 'used': 12000} | Failed |
| below minimum after flooring | {'bonus': 0, 'leftover': 0, 'miles': 5998, 'used': 5998} | {'error': 'below minimum'} | Failed |
| raw above minimum | {'bonus': 339, 'leftover': 0, 'miles': 3399, 'used': 5099} | {'bonus': 333, 'leftover': 99, 'miles': 3333, 'used': 5000} | Failed |
| bonus threshold edge | {'bonus': 750, 'leftover': 0, 'miles': 5005, 'used': 10010} | {'bonus': 750, 'leftover': 10, 'miles': 5000, 'used': 10000} | Failed |
| threshold by raw only | {'bonus': 2080, 'leftover': 0, 'miles': 10401, 'used': 10401} | {'bonus': 0, 'leftover': 401, 'miles': 10000, 'used': 10000} | Failed |
| awkward ratio | {'bonus': 0, 'leftover': 0, 'miles': 4375, 'used': 7000} | {'bonus': 0, 'leftover': 0, 'miles': 4375, 'used': 7000} | Passed |
| large | {'bonus': 60096, 'leftover': 0, 'miles': 200256, 'used': 250321} | {'bonus': 60020, 'leftover': 321, 'miles': 200000, 'used': 250000} | Failed |
SHA-256 / f1c8dd2a9b6513b30b376fe828adfc5c6b3a13322e6049d474c6f6efc361b9ce
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'] // 2) // 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': 2437, 'leftover': -249, 'miles': 9750, 'used': 13000} | {'bonus': 2250, 'leftover': 751, 'miles': 9000, 'used': 12000} | Failed |
| below minimum after flooring | {'bonus': 0, 'leftover': -2, 'miles': 6000, 'used': 6000} | {'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 / 21130e09627b21750546f5fa03bcdc22fc786c6496090fdc9357684db67564d1
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.499388+00:00.
Case digest / 6055aeec6d9ab7c0d2a3066cf545746c5225913e32b3b2d9c60273c8e10a556d