FA-60816 / Loyalty points ledgers / Open access
Household pool redemption draw: requester priority · case 01
Household members are drained before the member who is redeeming.
ROOT CAUSE
All members, including the requester, are ordered by usable balance.
VERIFIED REPAIR
Draw from the requester first, then the other members.
Unsuccessful approach: Putting the requester last reverses the stipulated priority.
Case contract
Input {balances:{member:pts}, caps:{member:max contribution}, requester, pts}. The requester contributes their full balance first (caps never apply to the requester). Other members contribute up to min(balance, cap), in descending order of that usable amount, ties by name. If total usable points are short return {"error":"insufficient"}. Return {draws:[[member,pts]]} with zero draws omitted.
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):
bal = x['balances']
caps = x['caps']
rq = x['requester']
usable = lambda m: bal[m] if m == rq else min(bal[m], caps.get(m, bal[m]))
if x['pts'] > sum(usable(m) for m in bal):
return {'error': 'insufficient'}
others = sorted([m for m in bal if m != rq], key=lambda m: (-usable(m), m))
need = x['pts']
draws = []
for m in sorted(bal, key=lambda m: (-usable(m), m)):
t = min(need, usable(m))
if t > 0:
draws.append([m, t])
need -= t
return {'draws': draws}
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['requester first', {'balances': {'ann': 300, 'bob': 900, 'cy': 400}, 'caps': {}, 'requester': 'ann', 'pts': 1001}, {'draws': [['ann', 300], ['bob', 701]]}], ['capped contributor', {'balances': {'ann': 100, 'bob': 5000, 'cy': 400}, 'caps': {'bob': 201}, 'requester': 'ann', 'pts': 600}, {'draws': [['ann', 100], ['cy', 400], ['bob', 100]]}], ['insufficient with caps', {'balances': {'ann': 100, 'bob': 5000}, 'caps': {'bob': 100}, 'requester': 'ann', 'pts': 301}, {'error': 'insufficient'}], ['requester cap ignored', {'balances': {'ann': 800, 'bob': 100}, 'caps': {'ann': 10}, 'requester': 'ann', 'pts': 701}, {'draws': [['ann', 701]]}], ['order by usable', {'balances': {'ann': 0, 'bob': 5000, 'cy': 600, 'dee': 500}, 'caps': {'bob': 50}, 'requester': 'ann', 'pts': 701}, {'draws': [['cy', 600], ['dee', 101]]}], ['ties by name', {'balances': {'zed': 0, 'amy': 300, 'max': 300}, 'caps': {}, 'requester': 'zed', 'pts': 401}, {'draws': [['amy', 300], ['max', 101]]}], ['requester covers', {'balances': {'ann': 5000, 'bob': 9000}, 'caps': {}, 'requester': 'ann', 'pts': 4001}, {'draws': [['ann', 4001]]}]], [['requester first', {'balances': {'ann': 300, 'bob': 900, 'cy': 400}, 'caps': {}, 'requester': 'ann', 'pts': 1002}, {'draws': [['ann', 300], ['bob', 702]]}], ['capped contributor', {'balances': {'ann': 100, 'bob': 5000, 'cy': 400}, 'caps': {'bob': 202}, 'requester': 'ann', 'pts': 600}, {'draws': [['ann', 100], ['cy', 400], ['bob', 100]]}], ['insufficient with caps', {'balances': {'ann': 100, 'bob': 5000}, 'caps': {'bob': 100}, 'requester': 'ann', 'pts': 302}, {'error': 'insufficient'}], ['requester cap ignored', {'balances': {'ann': 800, 'bob': 100}, 'caps': {'ann': 10}, 'requester': 'ann', 'pts': 702}, {'draws': [['ann', 702]]}], ['order by usable', {'balances': {'ann': 0, 'bob': 5000, 'cy': 600, 'dee': 500}, 'caps': {'bob': 50}, 'requester': 'ann', 'pts': 702}, {'draws': [['cy', 600], ['dee', 102]]}], ['ties by name', {'balances': {'zed': 0, 'amy': 300, 'max': 300}, 'caps': {}, 'requester': 'zed', 'pts': 402}, {'draws': [['amy', 300], ['max', 102]]}], ['requester covers', {'balances': {'ann': 5000, 'bob': 9000}, 'caps': {}, 'requester': 'ann', 'pts': 4002}, {'draws': [['ann', 4002]]}]], [['requester first', {'balances': {'ann': 300, 'bob': 900, 'cy': 400}, 'caps': {}, 'requester': 'ann', 'pts': 1003}, {'draws': [['ann', 300], ['bob', 703]]}], ['capped contributor', {'balances': {'ann': 100, 'bob': 5000, 'cy': 400}, 'caps': {'bob': 203}, 'requester': 'ann', 'pts': 600}, {'draws': [['ann', 100], ['cy', 400], ['bob', 100]]}], ['insufficient with caps', {'balances': {'ann': 100, 'bob': 5000}, 'caps': {'bob': 100}, 'requester': 'ann', 'pts': 303}, {'error': 'insufficient'}], ['requester cap ignored', {'balances': {'ann': 800, 'bob': 100}, 'caps': {'ann': 10}, 'requester': 'ann', 'pts': 703}, {'draws': [['ann', 703]]}], ['order by usable', {'balances': {'ann': 0, 'bob': 5000, 'cy': 600, 'dee': 500}, 'caps': {'bob': 50}, 'requester': 'ann', 'pts': 703}, {'draws': [['cy', 600], ['dee', 103]]}], ['ties by name', {'balances': {'zed': 0, 'amy': 300, 'max': 300}, 'caps': {}, 'requester': 'zed', 'pts': 403}, {'draws': [['amy', 300], ['max', 103]]}], ['requester covers', {'balances': {'ann': 5000, 'bob': 9000}, 'caps': {}, 'requester': 'ann', 'pts': 4003}, {'draws': [['ann', 4003]]}]], [['requester first', {'balances': {'ann': 300, 'bob': 900, 'cy': 400}, 'caps': {}, 'requester': 'ann', 'pts': 1004}, {'draws': [['ann', 300], ['bob', 704]]}], ['capped contributor', {'balances': {'ann': 100, 'bob': 5000, 'cy': 400}, 'caps': {'bob': 204}, 'requester': 'ann', 'pts': 600}, {'draws': [['ann', 100], ['cy', 400], ['bob', 100]]}], ['insufficient with caps', {'balances': {'ann': 100, 'bob': 5000}, 'caps': {'bob': 100}, 'requester': 'ann', 'pts': 304}, {'error': 'insufficient'}], ['requester cap ignored', {'balances': {'ann': 800, 'bob': 100}, 'caps': {'ann': 10}, 'requester': 'ann', 'pts': 704}, {'draws': [['ann', 704]]}], ['order by usable', {'balances': {'ann': 0, 'bob': 5000, 'cy': 600, 'dee': 500}, 'caps': {'bob': 50}, 'requester': 'ann', 'pts': 704}, {'draws': [['cy', 600], ['dee', 104]]}], ['ties by name', {'balances': {'zed': 0, 'amy': 300, 'max': 300}, 'caps': {}, 'requester': 'zed', 'pts': 404}, {'draws': [['amy', 300], ['max', 104]]}], ['requester covers', {'balances': {'ann': 5000, 'bob': 9000}, 'caps': {}, 'requester': 'ann', 'pts': 4004}, {'draws': [['ann', 4004]]}]], [['requester first', {'balances': {'ann': 300, 'bob': 900, 'cy': 400}, 'caps': {}, 'requester': 'ann', 'pts': 1005}, {'draws': [['ann', 300], ['bob', 705]]}], ['capped contributor', {'balances': {'ann': 100, 'bob': 5000, 'cy': 400}, 'caps': {'bob': 205}, 'requester': 'ann', 'pts': 600}, {'draws': [['ann', 100], ['cy', 400], ['bob', 100]]}], ['insufficient with caps', {'balances': {'ann': 100, 'bob': 5000}, 'caps': {'bob': 100}, 'requester': 'ann', 'pts': 305}, {'error': 'insufficient'}], ['requester cap ignored', {'balances': {'ann': 800, 'bob': 100}, 'caps': {'ann': 10}, 'requester': 'ann', 'pts': 705}, {'draws': [['ann', 705]]}], ['order by usable', {'balances': {'ann': 0, 'bob': 5000, 'cy': 600, 'dee': 500}, 'caps': {'bob': 50}, 'requester': 'ann', 'pts': 705}, {'draws': [['cy', 600], ['dee', 105]]}], ['ties by name', {'balances': {'zed': 0, 'amy': 300, 'max': 300}, 'caps': {}, 'requester': 'zed', 'pts': 405}, {'draws': [['amy', 300], ['max', 105]]}], ['requester covers', {'balances': {'ann': 5000, 'bob': 9000}, 'caps': {}, 'requester': 'ann', 'pts': 4005}, {'draws': [['ann', 4005]]}]]]
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 |
|---|---|---|---|
| requester first | {'draws': [['bob', 900], ['cy', 101]]} | {'draws': [['ann', 300], ['bob', 701]]} | Failed |
| capped contributor | {'draws': [['cy', 400], ['bob', 200]]} | {'draws': [['ann', 100], ['cy', 400], ['bob', 100]]} | Failed |
| insufficient with caps | {'error': 'insufficient'} | {'error': 'insufficient'} | Passed |
| requester cap ignored | {'draws': [['ann', 701]]} | {'draws': [['ann', 701]]} | Passed |
| order by usable | {'draws': [['cy', 600], ['dee', 101]]} | {'draws': [['cy', 600], ['dee', 101]]} | Passed |
| ties by name | {'draws': [['amy', 300], ['max', 101]]} | {'draws': [['amy', 300], ['max', 101]]} | Passed |
| requester covers | {'draws': [['bob', 4001]]} | {'draws': [['ann', 4001]]} | Failed |
SHA-256 / 4604f47b19b6a7c5d786bb1ab91f39f6aae6538d45b7b0a9afb418ece2512224
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
bal = x['balances']
caps = x['caps']
rq = x['requester']
usable = lambda m: bal[m] if m == rq else min(bal[m], caps.get(m, bal[m]))
if x['pts'] > sum(usable(m) for m in bal):
return {'error': 'insufficient'}
others = sorted([m for m in bal if m != rq], key=lambda m: (-usable(m), m))
need = x['pts']
draws = []
for m in others + [rq]:
t = min(need, usable(m))
if t > 0:
draws.append([m, t])
need -= t
return {'draws': draws}
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['requester first', {'balances': {'ann': 300, 'bob': 900, 'cy': 400}, 'caps': {}, 'requester': 'ann', 'pts': 1001}, {'draws': [['ann', 300], ['bob', 701]]}], ['capped contributor', {'balances': {'ann': 100, 'bob': 5000, 'cy': 400}, 'caps': {'bob': 201}, 'requester': 'ann', 'pts': 600}, {'draws': [['ann', 100], ['cy', 400], ['bob', 100]]}], ['insufficient with caps', {'balances': {'ann': 100, 'bob': 5000}, 'caps': {'bob': 100}, 'requester': 'ann', 'pts': 301}, {'error': 'insufficient'}], ['requester cap ignored', {'balances': {'ann': 800, 'bob': 100}, 'caps': {'ann': 10}, 'requester': 'ann', 'pts': 701}, {'draws': [['ann', 701]]}], ['order by usable', {'balances': {'ann': 0, 'bob': 5000, 'cy': 600, 'dee': 500}, 'caps': {'bob': 50}, 'requester': 'ann', 'pts': 701}, {'draws': [['cy', 600], ['dee', 101]]}], ['ties by name', {'balances': {'zed': 0, 'amy': 300, 'max': 300}, 'caps': {}, 'requester': 'zed', 'pts': 401}, {'draws': [['amy', 300], ['max', 101]]}], ['requester covers', {'balances': {'ann': 5000, 'bob': 9000}, 'caps': {}, 'requester': 'ann', 'pts': 4001}, {'draws': [['ann', 4001]]}]], [['requester first', {'balances': {'ann': 300, 'bob': 900, 'cy': 400}, 'caps': {}, 'requester': 'ann', 'pts': 1002}, {'draws': [['ann', 300], ['bob', 702]]}], ['capped contributor', {'balances': {'ann': 100, 'bob': 5000, 'cy': 400}, 'caps': {'bob': 202}, 'requester': 'ann', 'pts': 600}, {'draws': [['ann', 100], ['cy', 400], ['bob', 100]]}], ['insufficient with caps', {'balances': {'ann': 100, 'bob': 5000}, 'caps': {'bob': 100}, 'requester': 'ann', 'pts': 302}, {'error': 'insufficient'}], ['requester cap ignored', {'balances': {'ann': 800, 'bob': 100}, 'caps': {'ann': 10}, 'requester': 'ann', 'pts': 702}, {'draws': [['ann', 702]]}], ['order by usable', {'balances': {'ann': 0, 'bob': 5000, 'cy': 600, 'dee': 500}, 'caps': {'bob': 50}, 'requester': 'ann', 'pts': 702}, {'draws': [['cy', 600], ['dee', 102]]}], ['ties by name', {'balances': {'zed': 0, 'amy': 300, 'max': 300}, 'caps': {}, 'requester': 'zed', 'pts': 402}, {'draws': [['amy', 300], ['max', 102]]}], ['requester covers', {'balances': {'ann': 5000, 'bob': 9000}, 'caps': {}, 'requester': 'ann', 'pts': 4002}, {'draws': [['ann', 4002]]}]], [['requester first', {'balances': {'ann': 300, 'bob': 900, 'cy': 400}, 'caps': {}, 'requester': 'ann', 'pts': 1003}, {'draws': [['ann', 300], ['bob', 703]]}], ['capped contributor', {'balances': {'ann': 100, 'bob': 5000, 'cy': 400}, 'caps': {'bob': 203}, 'requester': 'ann', 'pts': 600}, {'draws': [['ann', 100], ['cy', 400], ['bob', 100]]}], ['insufficient with caps', {'balances': {'ann': 100, 'bob': 5000}, 'caps': {'bob': 100}, 'requester': 'ann', 'pts': 303}, {'error': 'insufficient'}], ['requester cap ignored', {'balances': {'ann': 800, 'bob': 100}, 'caps': {'ann': 10}, 'requester': 'ann', 'pts': 703}, {'draws': [['ann', 703]]}], ['order by usable', {'balances': {'ann': 0, 'bob': 5000, 'cy': 600, 'dee': 500}, 'caps': {'bob': 50}, 'requester': 'ann', 'pts': 703}, {'draws': [['cy', 600], ['dee', 103]]}], ['ties by name', {'balances': {'zed': 0, 'amy': 300, 'max': 300}, 'caps': {}, 'requester': 'zed', 'pts': 403}, {'draws': [['amy', 300], ['max', 103]]}], ['requester covers', {'balances': {'ann': 5000, 'bob': 9000}, 'caps': {}, 'requester': 'ann', 'pts': 4003}, {'draws': [['ann', 4003]]}]], [['requester first', {'balances': {'ann': 300, 'bob': 900, 'cy': 400}, 'caps': {}, 'requester': 'ann', 'pts': 1004}, {'draws': [['ann', 300], ['bob', 704]]}], ['capped contributor', {'balances': {'ann': 100, 'bob': 5000, 'cy': 400}, 'caps': {'bob': 204}, 'requester': 'ann', 'pts': 600}, {'draws': [['ann', 100], ['cy', 400], ['bob', 100]]}], ['insufficient with caps', {'balances': {'ann': 100, 'bob': 5000}, 'caps': {'bob': 100}, 'requester': 'ann', 'pts': 304}, {'error': 'insufficient'}], ['requester cap ignored', {'balances': {'ann': 800, 'bob': 100}, 'caps': {'ann': 10}, 'requester': 'ann', 'pts': 704}, {'draws': [['ann', 704]]}], ['order by usable', {'balances': {'ann': 0, 'bob': 5000, 'cy': 600, 'dee': 500}, 'caps': {'bob': 50}, 'requester': 'ann', 'pts': 704}, {'draws': [['cy', 600], ['dee', 104]]}], ['ties by name', {'balances': {'zed': 0, 'amy': 300, 'max': 300}, 'caps': {}, 'requester': 'zed', 'pts': 404}, {'draws': [['amy', 300], ['max', 104]]}], ['requester covers', {'balances': {'ann': 5000, 'bob': 9000}, 'caps': {}, 'requester': 'ann', 'pts': 4004}, {'draws': [['ann', 4004]]}]], [['requester first', {'balances': {'ann': 300, 'bob': 900, 'cy': 400}, 'caps': {}, 'requester': 'ann', 'pts': 1005}, {'draws': [['ann', 300], ['bob', 705]]}], ['capped contributor', {'balances': {'ann': 100, 'bob': 5000, 'cy': 400}, 'caps': {'bob': 205}, 'requester': 'ann', 'pts': 600}, {'draws': [['ann', 100], ['cy', 400], ['bob', 100]]}], ['insufficient with caps', {'balances': {'ann': 100, 'bob': 5000}, 'caps': {'bob': 100}, 'requester': 'ann', 'pts': 305}, {'error': 'insufficient'}], ['requester cap ignored', {'balances': {'ann': 800, 'bob': 100}, 'caps': {'ann': 10}, 'requester': 'ann', 'pts': 705}, {'draws': [['ann', 705]]}], ['order by usable', {'balances': {'ann': 0, 'bob': 5000, 'cy': 600, 'dee': 500}, 'caps': {'bob': 50}, 'requester': 'ann', 'pts': 705}, {'draws': [['cy', 600], ['dee', 105]]}], ['ties by name', {'balances': {'zed': 0, 'amy': 300, 'max': 300}, 'caps': {}, 'requester': 'zed', 'pts': 405}, {'draws': [['amy', 300], ['max', 105]]}], ['requester covers', {'balances': {'ann': 5000, 'bob': 9000}, 'caps': {}, 'requester': 'ann', 'pts': 4005}, {'draws': [['ann', 4005]]}]]]
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 |
|---|---|---|---|
| requester first | {'draws': [['bob', 900], ['cy', 101]]} | {'draws': [['ann', 300], ['bob', 701]]} | Failed |
| capped contributor | {'draws': [['cy', 400], ['bob', 200]]} | {'draws': [['ann', 100], ['cy', 400], ['bob', 100]]} | Failed |
| insufficient with caps | {'error': 'insufficient'} | {'error': 'insufficient'} | Passed |
| requester cap ignored | {'draws': [['bob', 100], ['ann', 601]]} | {'draws': [['ann', 701]]} | Failed |
| order by usable | {'draws': [['cy', 600], ['dee', 101]]} | {'draws': [['cy', 600], ['dee', 101]]} | Passed |
| ties by name | {'draws': [['amy', 300], ['max', 101]]} | {'draws': [['amy', 300], ['max', 101]]} | Passed |
| requester covers | {'draws': [['bob', 4001]]} | {'draws': [['ann', 4001]]} | Failed |
SHA-256 / 4387891f74e3b1197caa001c9ec8bbd2ec121d26ac03ed2099c8bebb9240776f
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
bal = x['balances']
caps = x['caps']
rq = x['requester']
usable = lambda m: bal[m] if m == rq else min(bal[m], caps.get(m, bal[m]))
if x['pts'] > sum(usable(m) for m in bal):
return {'error': 'insufficient'}
others = sorted([m for m in bal if m != rq], key=lambda m: (-usable(m), m))
need = x['pts']
draws = []
for m in [rq] + others:
t = min(need, usable(m))
if t > 0:
draws.append([m, t])
need -= t
return {'draws': draws}
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['requester first', {'balances': {'ann': 300, 'bob': 900, 'cy': 400}, 'caps': {}, 'requester': 'ann', 'pts': 1001}, {'draws': [['ann', 300], ['bob', 701]]}], ['capped contributor', {'balances': {'ann': 100, 'bob': 5000, 'cy': 400}, 'caps': {'bob': 201}, 'requester': 'ann', 'pts': 600}, {'draws': [['ann', 100], ['cy', 400], ['bob', 100]]}], ['insufficient with caps', {'balances': {'ann': 100, 'bob': 5000}, 'caps': {'bob': 100}, 'requester': 'ann', 'pts': 301}, {'error': 'insufficient'}], ['requester cap ignored', {'balances': {'ann': 800, 'bob': 100}, 'caps': {'ann': 10}, 'requester': 'ann', 'pts': 701}, {'draws': [['ann', 701]]}], ['order by usable', {'balances': {'ann': 0, 'bob': 5000, 'cy': 600, 'dee': 500}, 'caps': {'bob': 50}, 'requester': 'ann', 'pts': 701}, {'draws': [['cy', 600], ['dee', 101]]}], ['ties by name', {'balances': {'zed': 0, 'amy': 300, 'max': 300}, 'caps': {}, 'requester': 'zed', 'pts': 401}, {'draws': [['amy', 300], ['max', 101]]}], ['requester covers', {'balances': {'ann': 5000, 'bob': 9000}, 'caps': {}, 'requester': 'ann', 'pts': 4001}, {'draws': [['ann', 4001]]}]], [['requester first', {'balances': {'ann': 300, 'bob': 900, 'cy': 400}, 'caps': {}, 'requester': 'ann', 'pts': 1002}, {'draws': [['ann', 300], ['bob', 702]]}], ['capped contributor', {'balances': {'ann': 100, 'bob': 5000, 'cy': 400}, 'caps': {'bob': 202}, 'requester': 'ann', 'pts': 600}, {'draws': [['ann', 100], ['cy', 400], ['bob', 100]]}], ['insufficient with caps', {'balances': {'ann': 100, 'bob': 5000}, 'caps': {'bob': 100}, 'requester': 'ann', 'pts': 302}, {'error': 'insufficient'}], ['requester cap ignored', {'balances': {'ann': 800, 'bob': 100}, 'caps': {'ann': 10}, 'requester': 'ann', 'pts': 702}, {'draws': [['ann', 702]]}], ['order by usable', {'balances': {'ann': 0, 'bob': 5000, 'cy': 600, 'dee': 500}, 'caps': {'bob': 50}, 'requester': 'ann', 'pts': 702}, {'draws': [['cy', 600], ['dee', 102]]}], ['ties by name', {'balances': {'zed': 0, 'amy': 300, 'max': 300}, 'caps': {}, 'requester': 'zed', 'pts': 402}, {'draws': [['amy', 300], ['max', 102]]}], ['requester covers', {'balances': {'ann': 5000, 'bob': 9000}, 'caps': {}, 'requester': 'ann', 'pts': 4002}, {'draws': [['ann', 4002]]}]], [['requester first', {'balances': {'ann': 300, 'bob': 900, 'cy': 400}, 'caps': {}, 'requester': 'ann', 'pts': 1003}, {'draws': [['ann', 300], ['bob', 703]]}], ['capped contributor', {'balances': {'ann': 100, 'bob': 5000, 'cy': 400}, 'caps': {'bob': 203}, 'requester': 'ann', 'pts': 600}, {'draws': [['ann', 100], ['cy', 400], ['bob', 100]]}], ['insufficient with caps', {'balances': {'ann': 100, 'bob': 5000}, 'caps': {'bob': 100}, 'requester': 'ann', 'pts': 303}, {'error': 'insufficient'}], ['requester cap ignored', {'balances': {'ann': 800, 'bob': 100}, 'caps': {'ann': 10}, 'requester': 'ann', 'pts': 703}, {'draws': [['ann', 703]]}], ['order by usable', {'balances': {'ann': 0, 'bob': 5000, 'cy': 600, 'dee': 500}, 'caps': {'bob': 50}, 'requester': 'ann', 'pts': 703}, {'draws': [['cy', 600], ['dee', 103]]}], ['ties by name', {'balances': {'zed': 0, 'amy': 300, 'max': 300}, 'caps': {}, 'requester': 'zed', 'pts': 403}, {'draws': [['amy', 300], ['max', 103]]}], ['requester covers', {'balances': {'ann': 5000, 'bob': 9000}, 'caps': {}, 'requester': 'ann', 'pts': 4003}, {'draws': [['ann', 4003]]}]], [['requester first', {'balances': {'ann': 300, 'bob': 900, 'cy': 400}, 'caps': {}, 'requester': 'ann', 'pts': 1004}, {'draws': [['ann', 300], ['bob', 704]]}], ['capped contributor', {'balances': {'ann': 100, 'bob': 5000, 'cy': 400}, 'caps': {'bob': 204}, 'requester': 'ann', 'pts': 600}, {'draws': [['ann', 100], ['cy', 400], ['bob', 100]]}], ['insufficient with caps', {'balances': {'ann': 100, 'bob': 5000}, 'caps': {'bob': 100}, 'requester': 'ann', 'pts': 304}, {'error': 'insufficient'}], ['requester cap ignored', {'balances': {'ann': 800, 'bob': 100}, 'caps': {'ann': 10}, 'requester': 'ann', 'pts': 704}, {'draws': [['ann', 704]]}], ['order by usable', {'balances': {'ann': 0, 'bob': 5000, 'cy': 600, 'dee': 500}, 'caps': {'bob': 50}, 'requester': 'ann', 'pts': 704}, {'draws': [['cy', 600], ['dee', 104]]}], ['ties by name', {'balances': {'zed': 0, 'amy': 300, 'max': 300}, 'caps': {}, 'requester': 'zed', 'pts': 404}, {'draws': [['amy', 300], ['max', 104]]}], ['requester covers', {'balances': {'ann': 5000, 'bob': 9000}, 'caps': {}, 'requester': 'ann', 'pts': 4004}, {'draws': [['ann', 4004]]}]], [['requester first', {'balances': {'ann': 300, 'bob': 900, 'cy': 400}, 'caps': {}, 'requester': 'ann', 'pts': 1005}, {'draws': [['ann', 300], ['bob', 705]]}], ['capped contributor', {'balances': {'ann': 100, 'bob': 5000, 'cy': 400}, 'caps': {'bob': 205}, 'requester': 'ann', 'pts': 600}, {'draws': [['ann', 100], ['cy', 400], ['bob', 100]]}], ['insufficient with caps', {'balances': {'ann': 100, 'bob': 5000}, 'caps': {'bob': 100}, 'requester': 'ann', 'pts': 305}, {'error': 'insufficient'}], ['requester cap ignored', {'balances': {'ann': 800, 'bob': 100}, 'caps': {'ann': 10}, 'requester': 'ann', 'pts': 705}, {'draws': [['ann', 705]]}], ['order by usable', {'balances': {'ann': 0, 'bob': 5000, 'cy': 600, 'dee': 500}, 'caps': {'bob': 50}, 'requester': 'ann', 'pts': 705}, {'draws': [['cy', 600], ['dee', 105]]}], ['ties by name', {'balances': {'zed': 0, 'amy': 300, 'max': 300}, 'caps': {}, 'requester': 'zed', 'pts': 405}, {'draws': [['amy', 300], ['max', 105]]}], ['requester covers', {'balances': {'ann': 5000, 'bob': 9000}, 'caps': {}, 'requester': 'ann', 'pts': 4005}, {'draws': [['ann', 4005]]}]]]
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 |
|---|---|---|---|
| requester first | {'draws': [['ann', 300], ['bob', 701]]} | {'draws': [['ann', 300], ['bob', 701]]} | Passed |
| capped contributor | {'draws': [['ann', 100], ['cy', 400], ['bob', 100]]} | {'draws': [['ann', 100], ['cy', 400], ['bob', 100]]} | Passed |
| insufficient with caps | {'error': 'insufficient'} | {'error': 'insufficient'} | Passed |
| requester cap ignored | {'draws': [['ann', 701]]} | {'draws': [['ann', 701]]} | Passed |
| order by usable | {'draws': [['cy', 600], ['dee', 101]]} | {'draws': [['cy', 600], ['dee', 101]]} | Passed |
| ties by name | {'draws': [['amy', 300], ['max', 101]]} | {'draws': [['amy', 300], ['max', 101]]} | Passed |
| requester covers | {'draws': [['ann', 4001]]} | {'draws': [['ann', 4001]]} | Passed |
SHA-256 / cf9deac331212d266e4df4d1561231e8064f02d59779379773be658b7ef35cb8
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:49.198215+00:00.
Case digest / ad12d516dba0f815f39e59010bbe54826ab1f30d3a4528c6b3fa4cb31f2c385b