FA-60451 / Loyalty points ledgers / Open access
Rolling tier qualification with soft landing: highest tier met · case 01
A member who qualifies for gold is only granted silver.
ROOT CAUSE
The tier scan stops at the first threshold met.
VERIFIED REPAIR
Keep scanning and take the highest tier whose threshold is met.
Unsuccessful approach: Scanning from the top without stopping ends on the lowest tier met.
Case contract
Input {events:[[month,qualifying pts]], eval_month, current_tier, thresholds}. Qualifying points are summed over months eval-11..eval inclusive. The earned tier is the highest tier whose threshold is met (>=). Upgrades take effect fully; downgrades drop at most one level per evaluation. Tiers: member < silver < gold < platinum. Return {qualifying, earned, tier}.
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):
order = ['member', 'silver', 'gold', 'platinum']
m = x['eval_month']
q = sum(p for mo, p in x['events'] if m - 11 <= mo <= m)
earned = 'member'
for t in order[1:]:
if q >= x['thresholds'][t]:
earned = t
break
cur = order.index(x['current_tier'])
e = order.index(earned)
new = e if e >= cur else cur - 1
return {'qualifying': q, 'earned': earned, 'tier': order[new]}
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['upgrade', {'events': [[1, 3000], [5, 9000], [11, 3501]], 'eval_month': 12, 'current_tier': 'silver', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 15501, 'earned': 'gold', 'tier': 'gold'}], ['window edges', {'events': [[0, 20000], [1, 4000], [12, 1001]], 'eval_month': 12, 'current_tier': 'member', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 5001, 'earned': 'silver', 'tier': 'silver'}], ['future month', {'events': [[10, 4000], [13, 20000]], 'eval_month': 12, 'current_tier': 'member', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 4000, 'earned': 'member', 'tier': 'member'}], ['exact threshold', {'events': [[6, 15000]], 'eval_month': 7, 'current_tier': 'member', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 15000, 'earned': 'gold', 'tier': 'gold'}], ['soft landing', {'events': [[3, 1000]], 'eval_month': 12, 'current_tier': 'platinum', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 1000, 'earned': 'member', 'tier': 'gold'}], ['one step down', {'events': [[8, 15999]], 'eval_month': 12, 'current_tier': 'platinum', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 15999, 'earned': 'gold', 'tier': 'gold'}], ['big jump', {'events': [[12, 45000], [2, 1]], 'eval_month': 12, 'current_tier': 'member', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 45001, 'earned': 'platinum', 'tier': 'platinum'}], ['current month', {'events': [[20, 6001], [9, 100]], 'eval_month': 20, 'current_tier': 'gold', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 6101, 'earned': 'silver', 'tier': 'silver'}]], [['upgrade', {'events': [[1, 3000], [5, 9000], [11, 3502]], 'eval_month': 12, 'current_tier': 'silver', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 15502, 'earned': 'gold', 'tier': 'gold'}], ['window edges', {'events': [[0, 20000], [1, 4000], [12, 1002]], 'eval_month': 12, 'current_tier': 'member', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 5002, 'earned': 'silver', 'tier': 'silver'}], ['future month', {'events': [[10, 4000], [13, 20000]], 'eval_month': 12, 'current_tier': 'member', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 4000, 'earned': 'member', 'tier': 'member'}], ['exact threshold', {'events': [[6, 15000]], 'eval_month': 8, 'current_tier': 'member', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 15000, 'earned': 'gold', 'tier': 'gold'}], ['soft landing', {'events': [[3, 1000]], 'eval_month': 12, 'current_tier': 'platinum', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 1000, 'earned': 'member', 'tier': 'gold'}], ['one step down', {'events': [[8, 15998]], 'eval_month': 12, 'current_tier': 'platinum', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 15998, 'earned': 'gold', 'tier': 'gold'}], ['big jump', {'events': [[12, 45000], [2, 2]], 'eval_month': 12, 'current_tier': 'member', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 45002, 'earned': 'platinum', 'tier': 'platinum'}], ['current month', {'events': [[20, 6002], [9, 100]], 'eval_month': 20, 'current_tier': 'gold', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 6102, 'earned': 'silver', 'tier': 'silver'}]], [['upgrade', {'events': [[1, 3000], [5, 9000], [11, 3503]], 'eval_month': 12, 'current_tier': 'silver', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 15503, 'earned': 'gold', 'tier': 'gold'}], ['window edges', {'events': [[0, 20000], [1, 4000], [12, 1003]], 'eval_month': 12, 'current_tier': 'member', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 5003, 'earned': 'silver', 'tier': 'silver'}], ['future month', {'events': [[10, 4000], [13, 20000]], 'eval_month': 12, 'current_tier': 'member', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 4000, 'earned': 'member', 'tier': 'member'}], ['exact threshold', {'events': [[6, 15000]], 'eval_month': 9, 'current_tier': 'member', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 15000, 'earned': 'gold', 'tier': 'gold'}], ['soft landing', {'events': [[3, 1000]], 'eval_month': 12, 'current_tier': 'platinum', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 1000, 'earned': 'member', 'tier': 'gold'}], ['one step down', {'events': [[8, 15997]], 'eval_month': 12, 'current_tier': 'platinum', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 15997, 'earned': 'gold', 'tier': 'gold'}], ['big jump', {'events': [[12, 45000], [2, 3]], 'eval_month': 12, 'current_tier': 'member', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 45003, 'earned': 'platinum', 'tier': 'platinum'}], ['current month', {'events': [[20, 6003], [9, 100]], 'eval_month': 20, 'current_tier': 'gold', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 6103, 'earned': 'silver', 'tier': 'silver'}]], [['upgrade', {'events': [[1, 3000], [5, 9000], [11, 3504]], 'eval_month': 12, 'current_tier': 'silver', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 15504, 'earned': 'gold', 'tier': 'gold'}], ['window edges', {'events': [[0, 20000], [1, 4000], [12, 1004]], 'eval_month': 12, 'current_tier': 'member', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 5004, 'earned': 'silver', 'tier': 'silver'}], ['future month', {'events': [[10, 4000], [13, 20000]], 'eval_month': 12, 'current_tier': 'member', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 4000, 'earned': 'member', 'tier': 'member'}], ['exact threshold', {'events': [[6, 15000]], 'eval_month': 10, 'current_tier': 'member', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 15000, 'earned': 'gold', 'tier': 'gold'}], ['soft landing', {'events': [[3, 1000]], 'eval_month': 12, 'current_tier': 'platinum', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 1000, 'earned': 'member', 'tier': 'gold'}], ['one step down', {'events': [[8, 15996]], 'eval_month': 12, 'current_tier': 'platinum', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 15996, 'earned': 'gold', 'tier': 'gold'}], ['big jump', {'events': [[12, 45000], [2, 4]], 'eval_month': 12, 'current_tier': 'member', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 45004, 'earned': 'platinum', 'tier': 'platinum'}], ['current month', {'events': [[20, 6004], [9, 100]], 'eval_month': 20, 'current_tier': 'gold', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 6104, 'earned': 'silver', 'tier': 'silver'}]], [['upgrade', {'events': [[1, 3000], [5, 9000], [11, 3505]], 'eval_month': 12, 'current_tier': 'silver', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 15505, 'earned': 'gold', 'tier': 'gold'}], ['window edges', {'events': [[0, 20000], [1, 4000], [12, 1005]], 'eval_month': 12, 'current_tier': 'member', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 5005, 'earned': 'silver', 'tier': 'silver'}], ['future month', {'events': [[10, 4000], [13, 20000]], 'eval_month': 12, 'current_tier': 'member', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 4000, 'earned': 'member', 'tier': 'member'}], ['exact threshold', {'events': [[6, 15000]], 'eval_month': 11, 'current_tier': 'member', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 15000, 'earned': 'gold', 'tier': 'gold'}], ['soft landing', {'events': [[3, 1000]], 'eval_month': 12, 'current_tier': 'platinum', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 1000, 'earned': 'member', 'tier': 'gold'}], ['one step down', {'events': [[8, 15995]], 'eval_month': 12, 'current_tier': 'platinum', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 15995, 'earned': 'gold', 'tier': 'gold'}], ['big jump', {'events': [[12, 45000], [2, 5]], 'eval_month': 12, 'current_tier': 'member', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 45005, 'earned': 'platinum', 'tier': 'platinum'}], ['current month', {'events': [[20, 6005], [9, 100]], 'eval_month': 20, 'current_tier': 'gold', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 6105, 'earned': 'silver', 'tier': 'silver'}]]]
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 |
|---|---|---|---|
| upgrade | {'earned': 'silver', 'qualifying': 15501, 'tier': 'silver'} | {'earned': 'gold', 'qualifying': 15501, 'tier': 'gold'} | Failed |
| window edges | {'earned': 'silver', 'qualifying': 5001, 'tier': 'silver'} | {'earned': 'silver', 'qualifying': 5001, 'tier': 'silver'} | Passed |
| future month | {'earned': 'member', 'qualifying': 4000, 'tier': 'member'} | {'earned': 'member', 'qualifying': 4000, 'tier': 'member'} | Passed |
| exact threshold | {'earned': 'silver', 'qualifying': 15000, 'tier': 'silver'} | {'earned': 'gold', 'qualifying': 15000, 'tier': 'gold'} | Failed |
| soft landing | {'earned': 'member', 'qualifying': 1000, 'tier': 'gold'} | {'earned': 'member', 'qualifying': 1000, 'tier': 'gold'} | Passed |
| one step down | {'earned': 'silver', 'qualifying': 15999, 'tier': 'gold'} | {'earned': 'gold', 'qualifying': 15999, 'tier': 'gold'} | Failed |
| big jump | {'earned': 'silver', 'qualifying': 45001, 'tier': 'silver'} | {'earned': 'platinum', 'qualifying': 45001, 'tier': 'platinum'} | Failed |
| current month | {'earned': 'silver', 'qualifying': 6101, 'tier': 'silver'} | {'earned': 'silver', 'qualifying': 6101, 'tier': 'silver'} | Passed |
SHA-256 / 5e60f438f89383d79702bbe0a4b60523f6142c9864db4fb39728a08f4c8d4be0
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
order = ['member', 'silver', 'gold', 'platinum']
m = x['eval_month']
q = sum(p for mo, p in x['events'] if m - 11 <= mo <= m)
earned = 'member'
for t in order[:0:-1]:
if q >= x['thresholds'][t]:
earned = t
cur = order.index(x['current_tier'])
e = order.index(earned)
new = e if e >= cur else cur - 1
return {'qualifying': q, 'earned': earned, 'tier': order[new]}
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['upgrade', {'events': [[1, 3000], [5, 9000], [11, 3501]], 'eval_month': 12, 'current_tier': 'silver', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 15501, 'earned': 'gold', 'tier': 'gold'}], ['window edges', {'events': [[0, 20000], [1, 4000], [12, 1001]], 'eval_month': 12, 'current_tier': 'member', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 5001, 'earned': 'silver', 'tier': 'silver'}], ['future month', {'events': [[10, 4000], [13, 20000]], 'eval_month': 12, 'current_tier': 'member', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 4000, 'earned': 'member', 'tier': 'member'}], ['exact threshold', {'events': [[6, 15000]], 'eval_month': 7, 'current_tier': 'member', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 15000, 'earned': 'gold', 'tier': 'gold'}], ['soft landing', {'events': [[3, 1000]], 'eval_month': 12, 'current_tier': 'platinum', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 1000, 'earned': 'member', 'tier': 'gold'}], ['one step down', {'events': [[8, 15999]], 'eval_month': 12, 'current_tier': 'platinum', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 15999, 'earned': 'gold', 'tier': 'gold'}], ['big jump', {'events': [[12, 45000], [2, 1]], 'eval_month': 12, 'current_tier': 'member', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 45001, 'earned': 'platinum', 'tier': 'platinum'}], ['current month', {'events': [[20, 6001], [9, 100]], 'eval_month': 20, 'current_tier': 'gold', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 6101, 'earned': 'silver', 'tier': 'silver'}]], [['upgrade', {'events': [[1, 3000], [5, 9000], [11, 3502]], 'eval_month': 12, 'current_tier': 'silver', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 15502, 'earned': 'gold', 'tier': 'gold'}], ['window edges', {'events': [[0, 20000], [1, 4000], [12, 1002]], 'eval_month': 12, 'current_tier': 'member', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 5002, 'earned': 'silver', 'tier': 'silver'}], ['future month', {'events': [[10, 4000], [13, 20000]], 'eval_month': 12, 'current_tier': 'member', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 4000, 'earned': 'member', 'tier': 'member'}], ['exact threshold', {'events': [[6, 15000]], 'eval_month': 8, 'current_tier': 'member', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 15000, 'earned': 'gold', 'tier': 'gold'}], ['soft landing', {'events': [[3, 1000]], 'eval_month': 12, 'current_tier': 'platinum', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 1000, 'earned': 'member', 'tier': 'gold'}], ['one step down', {'events': [[8, 15998]], 'eval_month': 12, 'current_tier': 'platinum', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 15998, 'earned': 'gold', 'tier': 'gold'}], ['big jump', {'events': [[12, 45000], [2, 2]], 'eval_month': 12, 'current_tier': 'member', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 45002, 'earned': 'platinum', 'tier': 'platinum'}], ['current month', {'events': [[20, 6002], [9, 100]], 'eval_month': 20, 'current_tier': 'gold', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 6102, 'earned': 'silver', 'tier': 'silver'}]], [['upgrade', {'events': [[1, 3000], [5, 9000], [11, 3503]], 'eval_month': 12, 'current_tier': 'silver', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 15503, 'earned': 'gold', 'tier': 'gold'}], ['window edges', {'events': [[0, 20000], [1, 4000], [12, 1003]], 'eval_month': 12, 'current_tier': 'member', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 5003, 'earned': 'silver', 'tier': 'silver'}], ['future month', {'events': [[10, 4000], [13, 20000]], 'eval_month': 12, 'current_tier': 'member', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 4000, 'earned': 'member', 'tier': 'member'}], ['exact threshold', {'events': [[6, 15000]], 'eval_month': 9, 'current_tier': 'member', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 15000, 'earned': 'gold', 'tier': 'gold'}], ['soft landing', {'events': [[3, 1000]], 'eval_month': 12, 'current_tier': 'platinum', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 1000, 'earned': 'member', 'tier': 'gold'}], ['one step down', {'events': [[8, 15997]], 'eval_month': 12, 'current_tier': 'platinum', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 15997, 'earned': 'gold', 'tier': 'gold'}], ['big jump', {'events': [[12, 45000], [2, 3]], 'eval_month': 12, 'current_tier': 'member', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 45003, 'earned': 'platinum', 'tier': 'platinum'}], ['current month', {'events': [[20, 6003], [9, 100]], 'eval_month': 20, 'current_tier': 'gold', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 6103, 'earned': 'silver', 'tier': 'silver'}]], [['upgrade', {'events': [[1, 3000], [5, 9000], [11, 3504]], 'eval_month': 12, 'current_tier': 'silver', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 15504, 'earned': 'gold', 'tier': 'gold'}], ['window edges', {'events': [[0, 20000], [1, 4000], [12, 1004]], 'eval_month': 12, 'current_tier': 'member', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 5004, 'earned': 'silver', 'tier': 'silver'}], ['future month', {'events': [[10, 4000], [13, 20000]], 'eval_month': 12, 'current_tier': 'member', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 4000, 'earned': 'member', 'tier': 'member'}], ['exact threshold', {'events': [[6, 15000]], 'eval_month': 10, 'current_tier': 'member', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 15000, 'earned': 'gold', 'tier': 'gold'}], ['soft landing', {'events': [[3, 1000]], 'eval_month': 12, 'current_tier': 'platinum', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 1000, 'earned': 'member', 'tier': 'gold'}], ['one step down', {'events': [[8, 15996]], 'eval_month': 12, 'current_tier': 'platinum', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 15996, 'earned': 'gold', 'tier': 'gold'}], ['big jump', {'events': [[12, 45000], [2, 4]], 'eval_month': 12, 'current_tier': 'member', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 45004, 'earned': 'platinum', 'tier': 'platinum'}], ['current month', {'events': [[20, 6004], [9, 100]], 'eval_month': 20, 'current_tier': 'gold', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 6104, 'earned': 'silver', 'tier': 'silver'}]], [['upgrade', {'events': [[1, 3000], [5, 9000], [11, 3505]], 'eval_month': 12, 'current_tier': 'silver', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 15505, 'earned': 'gold', 'tier': 'gold'}], ['window edges', {'events': [[0, 20000], [1, 4000], [12, 1005]], 'eval_month': 12, 'current_tier': 'member', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 5005, 'earned': 'silver', 'tier': 'silver'}], ['future month', {'events': [[10, 4000], [13, 20000]], 'eval_month': 12, 'current_tier': 'member', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 4000, 'earned': 'member', 'tier': 'member'}], ['exact threshold', {'events': [[6, 15000]], 'eval_month': 11, 'current_tier': 'member', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 15000, 'earned': 'gold', 'tier': 'gold'}], ['soft landing', {'events': [[3, 1000]], 'eval_month': 12, 'current_tier': 'platinum', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 1000, 'earned': 'member', 'tier': 'gold'}], ['one step down', {'events': [[8, 15995]], 'eval_month': 12, 'current_tier': 'platinum', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 15995, 'earned': 'gold', 'tier': 'gold'}], ['big jump', {'events': [[12, 45000], [2, 5]], 'eval_month': 12, 'current_tier': 'member', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 45005, 'earned': 'platinum', 'tier': 'platinum'}], ['current month', {'events': [[20, 6005], [9, 100]], 'eval_month': 20, 'current_tier': 'gold', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 6105, 'earned': 'silver', 'tier': 'silver'}]]]
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 |
|---|---|---|---|
| upgrade | {'earned': 'silver', 'qualifying': 15501, 'tier': 'silver'} | {'earned': 'gold', 'qualifying': 15501, 'tier': 'gold'} | Failed |
| window edges | {'earned': 'silver', 'qualifying': 5001, 'tier': 'silver'} | {'earned': 'silver', 'qualifying': 5001, 'tier': 'silver'} | Passed |
| future month | {'earned': 'member', 'qualifying': 4000, 'tier': 'member'} | {'earned': 'member', 'qualifying': 4000, 'tier': 'member'} | Passed |
| exact threshold | {'earned': 'silver', 'qualifying': 15000, 'tier': 'silver'} | {'earned': 'gold', 'qualifying': 15000, 'tier': 'gold'} | Failed |
| soft landing | {'earned': 'member', 'qualifying': 1000, 'tier': 'gold'} | {'earned': 'member', 'qualifying': 1000, 'tier': 'gold'} | Passed |
| one step down | {'earned': 'silver', 'qualifying': 15999, 'tier': 'gold'} | {'earned': 'gold', 'qualifying': 15999, 'tier': 'gold'} | Failed |
| big jump | {'earned': 'silver', 'qualifying': 45001, 'tier': 'silver'} | {'earned': 'platinum', 'qualifying': 45001, 'tier': 'platinum'} | Failed |
| current month | {'earned': 'silver', 'qualifying': 6101, 'tier': 'silver'} | {'earned': 'silver', 'qualifying': 6101, 'tier': 'silver'} | Passed |
SHA-256 / 2485c5251058057082565926e0f486bf117a4bdb37d94354fe65e5af7ebeb90e
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
order = ['member', 'silver', 'gold', 'platinum']
m = x['eval_month']
q = sum(p for mo, p in x['events'] if m - 11 <= mo <= m)
earned = 'member'
for t in order[1:]:
if q >= x['thresholds'][t]:
earned = t
cur = order.index(x['current_tier'])
e = order.index(earned)
new = e if e >= cur else cur - 1
return {'qualifying': q, 'earned': earned, 'tier': order[new]}
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['upgrade', {'events': [[1, 3000], [5, 9000], [11, 3501]], 'eval_month': 12, 'current_tier': 'silver', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 15501, 'earned': 'gold', 'tier': 'gold'}], ['window edges', {'events': [[0, 20000], [1, 4000], [12, 1001]], 'eval_month': 12, 'current_tier': 'member', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 5001, 'earned': 'silver', 'tier': 'silver'}], ['future month', {'events': [[10, 4000], [13, 20000]], 'eval_month': 12, 'current_tier': 'member', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 4000, 'earned': 'member', 'tier': 'member'}], ['exact threshold', {'events': [[6, 15000]], 'eval_month': 7, 'current_tier': 'member', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 15000, 'earned': 'gold', 'tier': 'gold'}], ['soft landing', {'events': [[3, 1000]], 'eval_month': 12, 'current_tier': 'platinum', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 1000, 'earned': 'member', 'tier': 'gold'}], ['one step down', {'events': [[8, 15999]], 'eval_month': 12, 'current_tier': 'platinum', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 15999, 'earned': 'gold', 'tier': 'gold'}], ['big jump', {'events': [[12, 45000], [2, 1]], 'eval_month': 12, 'current_tier': 'member', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 45001, 'earned': 'platinum', 'tier': 'platinum'}], ['current month', {'events': [[20, 6001], [9, 100]], 'eval_month': 20, 'current_tier': 'gold', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 6101, 'earned': 'silver', 'tier': 'silver'}]], [['upgrade', {'events': [[1, 3000], [5, 9000], [11, 3502]], 'eval_month': 12, 'current_tier': 'silver', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 15502, 'earned': 'gold', 'tier': 'gold'}], ['window edges', {'events': [[0, 20000], [1, 4000], [12, 1002]], 'eval_month': 12, 'current_tier': 'member', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 5002, 'earned': 'silver', 'tier': 'silver'}], ['future month', {'events': [[10, 4000], [13, 20000]], 'eval_month': 12, 'current_tier': 'member', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 4000, 'earned': 'member', 'tier': 'member'}], ['exact threshold', {'events': [[6, 15000]], 'eval_month': 8, 'current_tier': 'member', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 15000, 'earned': 'gold', 'tier': 'gold'}], ['soft landing', {'events': [[3, 1000]], 'eval_month': 12, 'current_tier': 'platinum', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 1000, 'earned': 'member', 'tier': 'gold'}], ['one step down', {'events': [[8, 15998]], 'eval_month': 12, 'current_tier': 'platinum', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 15998, 'earned': 'gold', 'tier': 'gold'}], ['big jump', {'events': [[12, 45000], [2, 2]], 'eval_month': 12, 'current_tier': 'member', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 45002, 'earned': 'platinum', 'tier': 'platinum'}], ['current month', {'events': [[20, 6002], [9, 100]], 'eval_month': 20, 'current_tier': 'gold', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 6102, 'earned': 'silver', 'tier': 'silver'}]], [['upgrade', {'events': [[1, 3000], [5, 9000], [11, 3503]], 'eval_month': 12, 'current_tier': 'silver', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 15503, 'earned': 'gold', 'tier': 'gold'}], ['window edges', {'events': [[0, 20000], [1, 4000], [12, 1003]], 'eval_month': 12, 'current_tier': 'member', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 5003, 'earned': 'silver', 'tier': 'silver'}], ['future month', {'events': [[10, 4000], [13, 20000]], 'eval_month': 12, 'current_tier': 'member', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 4000, 'earned': 'member', 'tier': 'member'}], ['exact threshold', {'events': [[6, 15000]], 'eval_month': 9, 'current_tier': 'member', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 15000, 'earned': 'gold', 'tier': 'gold'}], ['soft landing', {'events': [[3, 1000]], 'eval_month': 12, 'current_tier': 'platinum', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 1000, 'earned': 'member', 'tier': 'gold'}], ['one step down', {'events': [[8, 15997]], 'eval_month': 12, 'current_tier': 'platinum', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 15997, 'earned': 'gold', 'tier': 'gold'}], ['big jump', {'events': [[12, 45000], [2, 3]], 'eval_month': 12, 'current_tier': 'member', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 45003, 'earned': 'platinum', 'tier': 'platinum'}], ['current month', {'events': [[20, 6003], [9, 100]], 'eval_month': 20, 'current_tier': 'gold', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 6103, 'earned': 'silver', 'tier': 'silver'}]], [['upgrade', {'events': [[1, 3000], [5, 9000], [11, 3504]], 'eval_month': 12, 'current_tier': 'silver', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 15504, 'earned': 'gold', 'tier': 'gold'}], ['window edges', {'events': [[0, 20000], [1, 4000], [12, 1004]], 'eval_month': 12, 'current_tier': 'member', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 5004, 'earned': 'silver', 'tier': 'silver'}], ['future month', {'events': [[10, 4000], [13, 20000]], 'eval_month': 12, 'current_tier': 'member', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 4000, 'earned': 'member', 'tier': 'member'}], ['exact threshold', {'events': [[6, 15000]], 'eval_month': 10, 'current_tier': 'member', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 15000, 'earned': 'gold', 'tier': 'gold'}], ['soft landing', {'events': [[3, 1000]], 'eval_month': 12, 'current_tier': 'platinum', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 1000, 'earned': 'member', 'tier': 'gold'}], ['one step down', {'events': [[8, 15996]], 'eval_month': 12, 'current_tier': 'platinum', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 15996, 'earned': 'gold', 'tier': 'gold'}], ['big jump', {'events': [[12, 45000], [2, 4]], 'eval_month': 12, 'current_tier': 'member', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 45004, 'earned': 'platinum', 'tier': 'platinum'}], ['current month', {'events': [[20, 6004], [9, 100]], 'eval_month': 20, 'current_tier': 'gold', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 6104, 'earned': 'silver', 'tier': 'silver'}]], [['upgrade', {'events': [[1, 3000], [5, 9000], [11, 3505]], 'eval_month': 12, 'current_tier': 'silver', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 15505, 'earned': 'gold', 'tier': 'gold'}], ['window edges', {'events': [[0, 20000], [1, 4000], [12, 1005]], 'eval_month': 12, 'current_tier': 'member', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 5005, 'earned': 'silver', 'tier': 'silver'}], ['future month', {'events': [[10, 4000], [13, 20000]], 'eval_month': 12, 'current_tier': 'member', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 4000, 'earned': 'member', 'tier': 'member'}], ['exact threshold', {'events': [[6, 15000]], 'eval_month': 11, 'current_tier': 'member', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 15000, 'earned': 'gold', 'tier': 'gold'}], ['soft landing', {'events': [[3, 1000]], 'eval_month': 12, 'current_tier': 'platinum', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 1000, 'earned': 'member', 'tier': 'gold'}], ['one step down', {'events': [[8, 15995]], 'eval_month': 12, 'current_tier': 'platinum', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 15995, 'earned': 'gold', 'tier': 'gold'}], ['big jump', {'events': [[12, 45000], [2, 5]], 'eval_month': 12, 'current_tier': 'member', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 45005, 'earned': 'platinum', 'tier': 'platinum'}], ['current month', {'events': [[20, 6005], [9, 100]], 'eval_month': 20, 'current_tier': 'gold', 'thresholds': {'silver': 5000, 'gold': 15000, 'platinum': 40000}}, {'qualifying': 6105, 'earned': 'silver', 'tier': 'silver'}]]]
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 |
|---|---|---|---|
| upgrade | {'earned': 'gold', 'qualifying': 15501, 'tier': 'gold'} | {'earned': 'gold', 'qualifying': 15501, 'tier': 'gold'} | Passed |
| window edges | {'earned': 'silver', 'qualifying': 5001, 'tier': 'silver'} | {'earned': 'silver', 'qualifying': 5001, 'tier': 'silver'} | Passed |
| future month | {'earned': 'member', 'qualifying': 4000, 'tier': 'member'} | {'earned': 'member', 'qualifying': 4000, 'tier': 'member'} | Passed |
| exact threshold | {'earned': 'gold', 'qualifying': 15000, 'tier': 'gold'} | {'earned': 'gold', 'qualifying': 15000, 'tier': 'gold'} | Passed |
| soft landing | {'earned': 'member', 'qualifying': 1000, 'tier': 'gold'} | {'earned': 'member', 'qualifying': 1000, 'tier': 'gold'} | Passed |
| one step down | {'earned': 'gold', 'qualifying': 15999, 'tier': 'gold'} | {'earned': 'gold', 'qualifying': 15999, 'tier': 'gold'} | Passed |
| big jump | {'earned': 'platinum', 'qualifying': 45001, 'tier': 'platinum'} | {'earned': 'platinum', 'qualifying': 45001, 'tier': 'platinum'} | Passed |
| current month | {'earned': 'silver', 'qualifying': 6101, 'tier': 'silver'} | {'earned': 'silver', 'qualifying': 6101, 'tier': 'silver'} | Passed |
SHA-256 / 1d0b11b968b267b319465f235377f5ab23cd25e80b4b90eae76af6af30fa67a2
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:45.714372+00:00.
Case digest / 027a8d40298fbd9eea8ffce81e76058d0ff98829149f239ae22f9de451f44557