FAILURE MAP
← Case archive

FA-60831 / Loyalty points ledgers / Open access

Household pool redemption draw: contributor order key · case 01

A capped high-balance member is drawn before members who can actually contribute more.

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

ROOT CAUSE

Contributors are ordered by raw balance instead of usable amount.

VERIFIED REPAIR

Order other members by descending usable amount, then name.

Unsuccessful approach: Ordering by ascending usable amount drains the smallest contributors first.

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: (-bal[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], ['bob', 201], ['cy', 299]]}{'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': [['bob', 50], ['cy', 600], ['dee', 51]]}{'draws': [['cy', 600], ['dee', 101]]}Failed
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 / 26dcd92276da809d9ccda9aae81557f41439b43fed5383298c6899ffcd3f213d

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 [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], ['cy', 400], ['bob', 301]]}{'draws': [['ann', 300], ['bob', 701]]}Failed
capped contributor{'draws': [['ann', 100], ['bob', 201], ['cy', 299]]}{'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': [['bob', 50], ['dee', 500], ['cy', 151]]}{'draws': [['cy', 600], ['dee', 101]]}Failed
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 / 83e9afb07b1b9101264f199a63fafee8c002002f08b61ba8bfbee3075e96677f

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

Case digest / ba7a39f8e6db418d42c78acaf2dbd3c4071d31e3d98f54fb3e0dec33eface9e1