FAILURE MAP
← Case archive

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.

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

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 fixtureActualExpectedOutcome
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 fixtureActualExpectedOutcome
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 fixtureActualExpectedOutcome
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