FAILURE MAP
← Case archive

FA-60656 / Loyalty points ledgers / Open access

Partner miles conversion: bonus threshold basis · case 01

Members whose raw balance crosses the bonus threshold get a bonus though fewer usable points were converted.

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

ROOT CAUSE

The bonus threshold compares the raw balance instead of converted points.

VERIFIED REPAIR

Compare usable points with the threshold.

Unsuccessful approach: Using a strict comparison on usable points skips the bonus at exactly the threshold.

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 usable < x['min_pts']:
        return {'error': 'below minimum'}
    miles = usable * x['num'] // x['den']
    bonus = miles * x['bonus_bp'] // 10000 if x['pts'] >= 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 fixtureActualExpectedOutcome
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': 2000, 'leftover': 401, 'miles': 10000, 'used': 10000}{'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': 60020, 'leftover': 321, 'miles': 200000, 'used': 250000}{'bonus': 60020, 'leftover': 321, 'miles': 200000, 'used': 250000}Passed

SHA-256 / 13e8460a40d48595d9934deec6af82a2cd6d265cff3bb8b818f2bb65b153b1e3

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 fixtureActualExpectedOutcome
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': 0, 'leftover': 99, 'miles': 3333, 'used': 5000}{'bonus': 333, 'leftover': 99, 'miles': 3333, 'used': 5000}Failed
bonus threshold edge{'bonus': 0, 'leftover': 10, 'miles': 5000, 'used': 10000}{'bonus': 750, 'leftover': 10, 'miles': 5000, 'used': 10000}Failed
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 / aacb8f6b7ea78049da9ae6dd91ef18138e0dc0f2f377637ab5204dca9f782378

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

Case digest / bd70e352031830ccf9540a918257b68676cbbeeab13d6fb47a30f6d23abfca0b