FAILURE MAP
← Case archive

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.

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

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