FAILURE MAP
← Case archive

FA-60441 / Loyalty points ledgers / Open access

Rolling tier qualification with soft landing: window end · case 01

Future-dated corrections posted for later months qualify members early.

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

ROOT CAUSE

The window has no upper bound on the event month.

VERIFIED REPAIR

Only count months up to and including the evaluation month.

Unsuccessful approach: Excluding the evaluation month itself drops current activity.

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)
    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': 'gold', 'qualifying': 24000, 'tier': 'gold'}{'earned': 'member', 'qualifying': 4000, 'tier': 'member'}Failed
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 / dc6ae393af12118aaceefe77892e20085814775dfff4fc18dc00c7a43bededd6

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[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': 'member', 'qualifying': 4000, 'tier': 'member'}{'earned': 'silver', 'qualifying': 5001, 'tier': 'silver'}Failed
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': 'member', 'qualifying': 1, 'tier': 'member'}{'earned': 'platinum', 'qualifying': 45001, 'tier': 'platinum'}Failed
current month{'earned': 'member', 'qualifying': 100, 'tier': 'silver'}{'earned': 'silver', 'qualifying': 6101, 'tier': 'silver'}Failed

SHA-256 / fd55f78474152ad0757cabc9818532a9afa28d4d3f5877bd34a4a690a46493f7

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

Case digest / 70cd6c3ef583f78355592e2392ba6e1a83334fe41a71df9416af67a947774db0