FAILURE MAP
← Case archive

FA-85936 / Game economy crafting balance / Open access

Banner pity counter: Losing the fifty-fifty grants no guarantee · case 01

Players can lose the featured coin flip repeatedly.

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

ROOT CAUSE

The lost branch clears the guarantee instead of setting it.

VERIFIED REPAIR

Restore `guarantee = True` at the guarantee grant step.

Unsuccessful approach: Withholding the guarantee for hard-pity losses still breaks the carry-over rule.

Case contract

Each roll is 0..999. Pull number n = pity+1. Top-rarity rate is 6 per mille, plus 50*(n-73) from n >= 74 (soft pity); n >= 90 always hits. On a hit pity resets to 0; the item is featured ("F") if guarantee is set or the roll is even, otherwise lost ("L") and the guarantee is set; a featured hit clears the guarantee. Misses ("-") set pity = n.

Why this case matters

Game economies leak or destroy currency when one crafting or pricing rule is off by one boundary, rounding stage or state update; the defect is observable in exact integer outcomes.

1 / The failure

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(rolls, state):
    pity = state['pity']
    guarantee = state['guarantee']
    out = []
    for r in rolls:
        n = pity + 1
        rate = 6
        if n >= 74:
            rate += 50 * (n - 73)
        if n >= 90 or r < rate:
            pity = 0
            if guarantee or r % 2 == 0:
                out.append('F')
                guarantee = False
            else:
                out.append('L')
                guarantee = False
        else:
            pity = n
            out.append('-')
    return {'results': ''.join(out), 'pity': pity, 'guarantee': guarantee}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
cases = [[('hard pity pull #1',
   [[999, 999], {'pity': 89, 'guarantee': False}],
   {'results': 'L-', 'pity': 1, 'guarantee': True}),
  ('fault site guarantee grant #1',
   [[922, 571, 11, 40, 49, 776, 996, 952, 946, 14, 108, 822, 888, 25], {'pity': 84, 'guarantee': False}],
   {'results': '-L------------', 'pity': 12, 'guarantee': True}),
  ('fault site guarantee grant #2',
   [[18, 973, 5], {'pity': 72, 'guarantee': False}],
   {'results': '--L', 'pity': 0, 'guarantee': True}),
  ('regression guarantee grant #1',
   [[13, 897, 905, 973, 838, 47, 24, 42, 813, 832, 963, 957, 47, 811, 56, 994, 13, 928],
    {'pity': 89, 'guarantee': False}],
   {'results': 'L-----------------', 'pity': 17, 'guarantee': True}),
  ('regression guarantee grant #2',
   [[15, 807, 9, 881, 1, 54, 966, 923, 250, 107, 0, 892, 136, 3, 18, 878], {'pity': 89, 'guarantee': False}],
   {'results': 'L---F-----F--L--', 'pity': 2, 'guarantee': True}),
  ('first soft pity pull #1',
   [[100, 3], {'pity': 73, 'guarantee': True}],
   {'results': '-F', 'pity': 0, 'guarantee': False}),
  ('lost fifty fifty then featured #1',
   [[1, 999, 0], {'pity': 10, 'guarantee': False}],
   {'results': 'L-F', 'pity': 0, 'guarantee': False}),
  ('control #1',
   [[15, 31, 302, 259, 332, 886, 12, 851, 55, 45, 6, 903, 946, 869, 725], {'pity': 88, 'guarantee': True}],
   {'results': 'F--------------', 'pity': 14, 'guarantee': False})],
 [('hard pity pull #1',
   [[999, 999], {'pity': 89, 'guarantee': False}],
   {'results': 'L-', 'pity': 1, 'guarantee': True}),
  ('fault site guarantee grant #1',
   [[18, 973, 5], {'pity': 72, 'guarantee': False}],
   {'results': '--L', 'pity': 0, 'guarantee': True}),
  ('fault site guarantee grant #2',
   [[935, 90, 29, 166, 937, 997, 903, 315, 848, 1, 893, 36, 218, 730, 858, 726, 972, 10],
    {'pity': 89, 'guarantee': True}],
   {'results': 'F--------L--------', 'pity': 8, 'guarantee': True}),
  ('regression guarantee grant #1',
   [[15, 807, 9, 881, 1, 54, 966, 923, 250, 107, 0, 892, 136, 3, 18, 878], {'pity': 89, 'guarantee': False}],
   {'results': 'L---F-----F--L--', 'pity': 2, 'guarantee': True}),
  ('regression guarantee grant #2',
   [[988, 831, 818, 438, 385, 1, 11, 60, 93, 932, 991, 819], {'pity': 88, 'guarantee': False}],
   {'results': '-L---F------', 'pity': 6, 'guarantee': False}),
  ('first soft pity pull #1',
   [[100, 3], {'pity': 73, 'guarantee': True}],
   {'results': '-F', 'pity': 0, 'guarantee': False}),
  ('lost fifty fifty then featured #1',
   [[1, 999, 0], {'pity': 10, 'guarantee': False}],
   {'results': 'L-F', 'pity': 0, 'guarantee': False}),
  ('control #1',
   [[15, 31, 302, 259, 332, 886, 12, 851, 55, 45, 6, 903, 946, 869, 725], {'pity': 88, 'guarantee': True}],
   {'results': 'F--------------', 'pity': 14, 'guarantee': False})],
 [('hard pity pull #1',
   [[999, 999], {'pity': 89, 'guarantee': False}],
   {'results': 'L-', 'pity': 1, 'guarantee': True}),
  ('fault site guarantee grant #1',
   [[346, 740, 973, 629, 933, 35, 831, 930, 214, 969, 923], {'pity': 73, 'guarantee': False}],
   {'results': '-----L-----', 'pity': 5, 'guarantee': True}),
  ('fault site guarantee grant #2',
   [[860, 832, 950, 795, 21, 53, 128, 667, 5, 11, 16], {'pity': 0, 'guarantee': False}],
   {'results': '--------L--', 'pity': 2, 'guarantee': True}),
  ('regression guarantee grant #1',
   [[879, 933, 335, 968, 23, 554, 957, 37, 960, 47, 35, 24, 892, 11, 52, 851, 334, 43, 807, 808],
    {'pity': 88, 'guarantee': False}],
   {'results': '-L------------------', 'pity': 18, 'guarantee': True}),
  ('regression guarantee grant #2',
   [[812, 997, 899, 10], {'pity': 88, 'guarantee': False}],
   {'results': '-L--', 'pity': 2, 'guarantee': True}),
  ('first soft pity pull #1',
   [[100, 3], {'pity': 73, 'guarantee': True}],
   {'results': '-F', 'pity': 0, 'guarantee': False}),
  ('lost fifty fifty then featured #1',
   [[1, 999, 0], {'pity': 10, 'guarantee': False}],
   {'results': 'L-F', 'pity': 0, 'guarantee': False}),
  ('control #1',
   [[15, 31, 302, 259, 332, 886, 12, 851, 55, 45, 6, 903, 946, 869, 725], {'pity': 88, 'guarantee': True}],
   {'results': 'F--------------', 'pity': 14, 'guarantee': False})],
 [('hard pity pull #1',
   [[999, 999], {'pity': 89, 'guarantee': False}],
   {'results': 'L-', 'pity': 1, 'guarantee': True}),
  ('fault site guarantee grant #1',
   [[984, 954, 47, 297, 21, 192, 35, 1, 87, 521, 965, 945, 130, 990], {'pity': 72, 'guarantee': True}],
   {'results': '--F----L------', 'pity': 6, 'guarantee': True}),
  ('fault site guarantee grant #2',
   [[4, 981, 950, 937, 739, 13, 768, 921, 979, 2, 3, 996], {'pity': 89, 'guarantee': False}],
   {'results': 'F--------FL-', 'pity': 1, 'guarantee': True}),
  ('regression guarantee grant #1',
   [[11, 47, 871, 857, 891, 200, 545, 440, 54, 153, 670, 183, 56, 969, 930, 688, 52, 36],
    {'pity': 89, 'guarantee': False}],
   {'results': 'L-----------------', 'pity': 17, 'guarantee': True}),
  ('regression guarantee grant #2',
   [[941, 855, 955], {'pity': 89, 'guarantee': False}],
   {'results': 'L--', 'pity': 2, 'guarantee': True}),
  ('first soft pity pull #1',
   [[100, 3], {'pity': 73, 'guarantee': True}],
   {'results': '-F', 'pity': 0, 'guarantee': False}),
  ('lost fifty fifty then featured #1',
   [[1, 999, 0], {'pity': 10, 'guarantee': False}],
   {'results': 'L-F', 'pity': 0, 'guarantee': False}),
  ('control #1',
   [[507, 965, 27, 525, 851], {'pity': 73, 'guarantee': True}],
   {'results': '--F--', 'pity': 2, 'guarantee': False})],
 [('hard pity pull #1',
   [[999, 999], {'pity': 89, 'guarantee': False}],
   {'results': 'L-', 'pity': 1, 'guarantee': True}),
  ('fault site guarantee grant #1',
   [[711, 926, 856, 59, 840, 978, 927, 160, 919, 993, 878, 579, 989], {'pity': 73, 'guarantee': False}],
   {'results': '---L---------', 'pity': 9, 'guarantee': True}),
  ('fault site guarantee grant #2',
   [[55, 51, 37, 985, 339, 849, 34, 33, 811, 935, 6, 3], {'pity': 66, 'guarantee': False}],
   {'results': '-------L---F', 'pity': 0, 'guarantee': False}),
  ('regression guarantee grant #1',
   [[811, 511, 897, 20, 849, 22, 758, 623, 891, 950], {'pity': 88, 'guarantee': False}],
   {'results': '-L--------', 'pity': 8, 'guarantee': True}),
  ('regression guarantee grant #2',
   [[835, 921, 31, 855, 841, 35, 966, 806, 957, 858, 42, 57, 921], {'pity': 88, 'guarantee': False}],
   {'results': '-L-----------', 'pity': 11, 'guarantee': True}),
  ('first soft pity pull #1',
   [[100, 3], {'pity': 73, 'guarantee': True}],
   {'results': '-F', 'pity': 0, 'guarantee': False}),
  ('lost fifty fifty then featured #1',
   [[1, 999, 0], {'pity': 10, 'guarantee': False}],
   {'results': 'L-F', 'pity': 0, 'guarantee': False}),
  ('control #1',
   [[480, 489, 823, 13, 936, 776, 44, 409, 26, 974, 9, 54, 911, 804, 433, 47, 942, 847],
    {'pity': 89, 'guarantee': True}],
   {'results': 'F-----------------', 'pity': 17, 'guarantee': False})]]
for label, args, expected in cases[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
hard pity pull #1{'guarantee': False, 'pity': 1, 'results': 'L-'}{'guarantee': True, 'pity': 1, 'results': 'L-'}Failed
fault site guarantee grant #1{'guarantee': False, 'pity': 12, 'results': '-L------------'}{'guarantee': True, 'pity': 12, 'results': '-L------------'}Failed
fault site guarantee grant #2{'guarantee': False, 'pity': 0, 'results': '--L'}{'guarantee': True, 'pity': 0, 'results': '--L'}Failed
regression guarantee grant #1{'guarantee': False, 'pity': 17, 'results': 'L-----------------'}{'guarantee': True, 'pity': 17, 'results': 'L-----------------'}Failed
regression guarantee grant #2{'guarantee': False, 'pity': 2, 'results': 'L---L-----F--L--'}{'guarantee': True, 'pity': 2, 'results': 'L---F-----F--L--'}Failed
first soft pity pull #1{'guarantee': False, 'pity': 0, 'results': '-F'}{'guarantee': False, 'pity': 0, 'results': '-F'}Passed
lost fifty fifty then featured #1{'guarantee': False, 'pity': 0, 'results': 'L-F'}{'guarantee': False, 'pity': 0, 'results': 'L-F'}Passed
control #1{'guarantee': False, 'pity': 14, 'results': 'F--------------'}{'guarantee': False, 'pity': 14, 'results': 'F--------------'}Passed

SHA-256 / 8ce9290c88c3e987e6494509dee456fd9aa63e5a96f712b17ed297f426e097ac

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(rolls, state):
    pity = state['pity']
    guarantee = state['guarantee']
    out = []
    for r in rolls:
        n = pity + 1
        rate = 6
        if n >= 74:
            rate += 50 * (n - 73)
        if n >= 90 or r < rate:
            pity = 0
            if guarantee or r % 2 == 0:
                out.append('F')
                guarantee = False
            else:
                out.append('L')
                guarantee = n < 90
        else:
            pity = n
            out.append('-')
    return {'results': ''.join(out), 'pity': pity, 'guarantee': guarantee}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
cases = [[('hard pity pull #1',
   [[999, 999], {'pity': 89, 'guarantee': False}],
   {'results': 'L-', 'pity': 1, 'guarantee': True}),
  ('fault site guarantee grant #1',
   [[922, 571, 11, 40, 49, 776, 996, 952, 946, 14, 108, 822, 888, 25], {'pity': 84, 'guarantee': False}],
   {'results': '-L------------', 'pity': 12, 'guarantee': True}),
  ('fault site guarantee grant #2',
   [[18, 973, 5], {'pity': 72, 'guarantee': False}],
   {'results': '--L', 'pity': 0, 'guarantee': True}),
  ('regression guarantee grant #1',
   [[13, 897, 905, 973, 838, 47, 24, 42, 813, 832, 963, 957, 47, 811, 56, 994, 13, 928],
    {'pity': 89, 'guarantee': False}],
   {'results': 'L-----------------', 'pity': 17, 'guarantee': True}),
  ('regression guarantee grant #2',
   [[15, 807, 9, 881, 1, 54, 966, 923, 250, 107, 0, 892, 136, 3, 18, 878], {'pity': 89, 'guarantee': False}],
   {'results': 'L---F-----F--L--', 'pity': 2, 'guarantee': True}),
  ('first soft pity pull #1',
   [[100, 3], {'pity': 73, 'guarantee': True}],
   {'results': '-F', 'pity': 0, 'guarantee': False}),
  ('lost fifty fifty then featured #1',
   [[1, 999, 0], {'pity': 10, 'guarantee': False}],
   {'results': 'L-F', 'pity': 0, 'guarantee': False}),
  ('control #1',
   [[15, 31, 302, 259, 332, 886, 12, 851, 55, 45, 6, 903, 946, 869, 725], {'pity': 88, 'guarantee': True}],
   {'results': 'F--------------', 'pity': 14, 'guarantee': False})],
 [('hard pity pull #1',
   [[999, 999], {'pity': 89, 'guarantee': False}],
   {'results': 'L-', 'pity': 1, 'guarantee': True}),
  ('fault site guarantee grant #1',
   [[18, 973, 5], {'pity': 72, 'guarantee': False}],
   {'results': '--L', 'pity': 0, 'guarantee': True}),
  ('fault site guarantee grant #2',
   [[935, 90, 29, 166, 937, 997, 903, 315, 848, 1, 893, 36, 218, 730, 858, 726, 972, 10],
    {'pity': 89, 'guarantee': True}],
   {'results': 'F--------L--------', 'pity': 8, 'guarantee': True}),
  ('regression guarantee grant #1',
   [[15, 807, 9, 881, 1, 54, 966, 923, 250, 107, 0, 892, 136, 3, 18, 878], {'pity': 89, 'guarantee': False}],
   {'results': 'L---F-----F--L--', 'pity': 2, 'guarantee': True}),
  ('regression guarantee grant #2',
   [[988, 831, 818, 438, 385, 1, 11, 60, 93, 932, 991, 819], {'pity': 88, 'guarantee': False}],
   {'results': '-L---F------', 'pity': 6, 'guarantee': False}),
  ('first soft pity pull #1',
   [[100, 3], {'pity': 73, 'guarantee': True}],
   {'results': '-F', 'pity': 0, 'guarantee': False}),
  ('lost fifty fifty then featured #1',
   [[1, 999, 0], {'pity': 10, 'guarantee': False}],
   {'results': 'L-F', 'pity': 0, 'guarantee': False}),
  ('control #1',
   [[15, 31, 302, 259, 332, 886, 12, 851, 55, 45, 6, 903, 946, 869, 725], {'pity': 88, 'guarantee': True}],
   {'results': 'F--------------', 'pity': 14, 'guarantee': False})],
 [('hard pity pull #1',
   [[999, 999], {'pity': 89, 'guarantee': False}],
   {'results': 'L-', 'pity': 1, 'guarantee': True}),
  ('fault site guarantee grant #1',
   [[346, 740, 973, 629, 933, 35, 831, 930, 214, 969, 923], {'pity': 73, 'guarantee': False}],
   {'results': '-----L-----', 'pity': 5, 'guarantee': True}),
  ('fault site guarantee grant #2',
   [[860, 832, 950, 795, 21, 53, 128, 667, 5, 11, 16], {'pity': 0, 'guarantee': False}],
   {'results': '--------L--', 'pity': 2, 'guarantee': True}),
  ('regression guarantee grant #1',
   [[879, 933, 335, 968, 23, 554, 957, 37, 960, 47, 35, 24, 892, 11, 52, 851, 334, 43, 807, 808],
    {'pity': 88, 'guarantee': False}],
   {'results': '-L------------------', 'pity': 18, 'guarantee': True}),
  ('regression guarantee grant #2',
   [[812, 997, 899, 10], {'pity': 88, 'guarantee': False}],
   {'results': '-L--', 'pity': 2, 'guarantee': True}),
  ('first soft pity pull #1',
   [[100, 3], {'pity': 73, 'guarantee': True}],
   {'results': '-F', 'pity': 0, 'guarantee': False}),
  ('lost fifty fifty then featured #1',
   [[1, 999, 0], {'pity': 10, 'guarantee': False}],
   {'results': 'L-F', 'pity': 0, 'guarantee': False}),
  ('control #1',
   [[15, 31, 302, 259, 332, 886, 12, 851, 55, 45, 6, 903, 946, 869, 725], {'pity': 88, 'guarantee': True}],
   {'results': 'F--------------', 'pity': 14, 'guarantee': False})],
 [('hard pity pull #1',
   [[999, 999], {'pity': 89, 'guarantee': False}],
   {'results': 'L-', 'pity': 1, 'guarantee': True}),
  ('fault site guarantee grant #1',
   [[984, 954, 47, 297, 21, 192, 35, 1, 87, 521, 965, 945, 130, 990], {'pity': 72, 'guarantee': True}],
   {'results': '--F----L------', 'pity': 6, 'guarantee': True}),
  ('fault site guarantee grant #2',
   [[4, 981, 950, 937, 739, 13, 768, 921, 979, 2, 3, 996], {'pity': 89, 'guarantee': False}],
   {'results': 'F--------FL-', 'pity': 1, 'guarantee': True}),
  ('regression guarantee grant #1',
   [[11, 47, 871, 857, 891, 200, 545, 440, 54, 153, 670, 183, 56, 969, 930, 688, 52, 36],
    {'pity': 89, 'guarantee': False}],
   {'results': 'L-----------------', 'pity': 17, 'guarantee': True}),
  ('regression guarantee grant #2',
   [[941, 855, 955], {'pity': 89, 'guarantee': False}],
   {'results': 'L--', 'pity': 2, 'guarantee': True}),
  ('first soft pity pull #1',
   [[100, 3], {'pity': 73, 'guarantee': True}],
   {'results': '-F', 'pity': 0, 'guarantee': False}),
  ('lost fifty fifty then featured #1',
   [[1, 999, 0], {'pity': 10, 'guarantee': False}],
   {'results': 'L-F', 'pity': 0, 'guarantee': False}),
  ('control #1',
   [[507, 965, 27, 525, 851], {'pity': 73, 'guarantee': True}],
   {'results': '--F--', 'pity': 2, 'guarantee': False})],
 [('hard pity pull #1',
   [[999, 999], {'pity': 89, 'guarantee': False}],
   {'results': 'L-', 'pity': 1, 'guarantee': True}),
  ('fault site guarantee grant #1',
   [[711, 926, 856, 59, 840, 978, 927, 160, 919, 993, 878, 579, 989], {'pity': 73, 'guarantee': False}],
   {'results': '---L---------', 'pity': 9, 'guarantee': True}),
  ('fault site guarantee grant #2',
   [[55, 51, 37, 985, 339, 849, 34, 33, 811, 935, 6, 3], {'pity': 66, 'guarantee': False}],
   {'results': '-------L---F', 'pity': 0, 'guarantee': False}),
  ('regression guarantee grant #1',
   [[811, 511, 897, 20, 849, 22, 758, 623, 891, 950], {'pity': 88, 'guarantee': False}],
   {'results': '-L--------', 'pity': 8, 'guarantee': True}),
  ('regression guarantee grant #2',
   [[835, 921, 31, 855, 841, 35, 966, 806, 957, 858, 42, 57, 921], {'pity': 88, 'guarantee': False}],
   {'results': '-L-----------', 'pity': 11, 'guarantee': True}),
  ('first soft pity pull #1',
   [[100, 3], {'pity': 73, 'guarantee': True}],
   {'results': '-F', 'pity': 0, 'guarantee': False}),
  ('lost fifty fifty then featured #1',
   [[1, 999, 0], {'pity': 10, 'guarantee': False}],
   {'results': 'L-F', 'pity': 0, 'guarantee': False}),
  ('control #1',
   [[480, 489, 823, 13, 936, 776, 44, 409, 26, 974, 9, 54, 911, 804, 433, 47, 942, 847],
    {'pity': 89, 'guarantee': True}],
   {'results': 'F-----------------', 'pity': 17, 'guarantee': False})]]
for label, args, expected in cases[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
hard pity pull #1{'guarantee': False, 'pity': 1, 'results': 'L-'}{'guarantee': True, 'pity': 1, 'results': 'L-'}Failed
fault site guarantee grant #1{'guarantee': True, 'pity': 12, 'results': '-L------------'}{'guarantee': True, 'pity': 12, 'results': '-L------------'}Passed
fault site guarantee grant #2{'guarantee': True, 'pity': 0, 'results': '--L'}{'guarantee': True, 'pity': 0, 'results': '--L'}Passed
regression guarantee grant #1{'guarantee': False, 'pity': 17, 'results': 'L-----------------'}{'guarantee': True, 'pity': 17, 'results': 'L-----------------'}Failed
regression guarantee grant #2{'guarantee': True, 'pity': 2, 'results': 'L---L-----F--L--'}{'guarantee': True, 'pity': 2, 'results': 'L---F-----F--L--'}Failed
first soft pity pull #1{'guarantee': False, 'pity': 0, 'results': '-F'}{'guarantee': False, 'pity': 0, 'results': '-F'}Passed
lost fifty fifty then featured #1{'guarantee': False, 'pity': 0, 'results': 'L-F'}{'guarantee': False, 'pity': 0, 'results': 'L-F'}Passed
control #1{'guarantee': False, 'pity': 14, 'results': 'F--------------'}{'guarantee': False, 'pity': 14, 'results': 'F--------------'}Passed

SHA-256 / 81b7ce355c96078859857a51ec279d86ebd1849a1acd1cf80be0ce7cfdfa9c5b

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(rolls, state):
    pity = state['pity']
    guarantee = state['guarantee']
    out = []
    for r in rolls:
        n = pity + 1
        rate = 6
        if n >= 74:
            rate += 50 * (n - 73)
        if n >= 90 or r < rate:
            pity = 0
            if guarantee or r % 2 == 0:
                out.append('F')
                guarantee = False
            else:
                out.append('L')
                guarantee = True
        else:
            pity = n
            out.append('-')
    return {'results': ''.join(out), 'pity': pity, 'guarantee': guarantee}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
cases = [[('hard pity pull #1',
   [[999, 999], {'pity': 89, 'guarantee': False}],
   {'results': 'L-', 'pity': 1, 'guarantee': True}),
  ('fault site guarantee grant #1',
   [[922, 571, 11, 40, 49, 776, 996, 952, 946, 14, 108, 822, 888, 25], {'pity': 84, 'guarantee': False}],
   {'results': '-L------------', 'pity': 12, 'guarantee': True}),
  ('fault site guarantee grant #2',
   [[18, 973, 5], {'pity': 72, 'guarantee': False}],
   {'results': '--L', 'pity': 0, 'guarantee': True}),
  ('regression guarantee grant #1',
   [[13, 897, 905, 973, 838, 47, 24, 42, 813, 832, 963, 957, 47, 811, 56, 994, 13, 928],
    {'pity': 89, 'guarantee': False}],
   {'results': 'L-----------------', 'pity': 17, 'guarantee': True}),
  ('regression guarantee grant #2',
   [[15, 807, 9, 881, 1, 54, 966, 923, 250, 107, 0, 892, 136, 3, 18, 878], {'pity': 89, 'guarantee': False}],
   {'results': 'L---F-----F--L--', 'pity': 2, 'guarantee': True}),
  ('first soft pity pull #1',
   [[100, 3], {'pity': 73, 'guarantee': True}],
   {'results': '-F', 'pity': 0, 'guarantee': False}),
  ('lost fifty fifty then featured #1',
   [[1, 999, 0], {'pity': 10, 'guarantee': False}],
   {'results': 'L-F', 'pity': 0, 'guarantee': False}),
  ('control #1',
   [[15, 31, 302, 259, 332, 886, 12, 851, 55, 45, 6, 903, 946, 869, 725], {'pity': 88, 'guarantee': True}],
   {'results': 'F--------------', 'pity': 14, 'guarantee': False})],
 [('hard pity pull #1',
   [[999, 999], {'pity': 89, 'guarantee': False}],
   {'results': 'L-', 'pity': 1, 'guarantee': True}),
  ('fault site guarantee grant #1',
   [[18, 973, 5], {'pity': 72, 'guarantee': False}],
   {'results': '--L', 'pity': 0, 'guarantee': True}),
  ('fault site guarantee grant #2',
   [[935, 90, 29, 166, 937, 997, 903, 315, 848, 1, 893, 36, 218, 730, 858, 726, 972, 10],
    {'pity': 89, 'guarantee': True}],
   {'results': 'F--------L--------', 'pity': 8, 'guarantee': True}),
  ('regression guarantee grant #1',
   [[15, 807, 9, 881, 1, 54, 966, 923, 250, 107, 0, 892, 136, 3, 18, 878], {'pity': 89, 'guarantee': False}],
   {'results': 'L---F-----F--L--', 'pity': 2, 'guarantee': True}),
  ('regression guarantee grant #2',
   [[988, 831, 818, 438, 385, 1, 11, 60, 93, 932, 991, 819], {'pity': 88, 'guarantee': False}],
   {'results': '-L---F------', 'pity': 6, 'guarantee': False}),
  ('first soft pity pull #1',
   [[100, 3], {'pity': 73, 'guarantee': True}],
   {'results': '-F', 'pity': 0, 'guarantee': False}),
  ('lost fifty fifty then featured #1',
   [[1, 999, 0], {'pity': 10, 'guarantee': False}],
   {'results': 'L-F', 'pity': 0, 'guarantee': False}),
  ('control #1',
   [[15, 31, 302, 259, 332, 886, 12, 851, 55, 45, 6, 903, 946, 869, 725], {'pity': 88, 'guarantee': True}],
   {'results': 'F--------------', 'pity': 14, 'guarantee': False})],
 [('hard pity pull #1',
   [[999, 999], {'pity': 89, 'guarantee': False}],
   {'results': 'L-', 'pity': 1, 'guarantee': True}),
  ('fault site guarantee grant #1',
   [[346, 740, 973, 629, 933, 35, 831, 930, 214, 969, 923], {'pity': 73, 'guarantee': False}],
   {'results': '-----L-----', 'pity': 5, 'guarantee': True}),
  ('fault site guarantee grant #2',
   [[860, 832, 950, 795, 21, 53, 128, 667, 5, 11, 16], {'pity': 0, 'guarantee': False}],
   {'results': '--------L--', 'pity': 2, 'guarantee': True}),
  ('regression guarantee grant #1',
   [[879, 933, 335, 968, 23, 554, 957, 37, 960, 47, 35, 24, 892, 11, 52, 851, 334, 43, 807, 808],
    {'pity': 88, 'guarantee': False}],
   {'results': '-L------------------', 'pity': 18, 'guarantee': True}),
  ('regression guarantee grant #2',
   [[812, 997, 899, 10], {'pity': 88, 'guarantee': False}],
   {'results': '-L--', 'pity': 2, 'guarantee': True}),
  ('first soft pity pull #1',
   [[100, 3], {'pity': 73, 'guarantee': True}],
   {'results': '-F', 'pity': 0, 'guarantee': False}),
  ('lost fifty fifty then featured #1',
   [[1, 999, 0], {'pity': 10, 'guarantee': False}],
   {'results': 'L-F', 'pity': 0, 'guarantee': False}),
  ('control #1',
   [[15, 31, 302, 259, 332, 886, 12, 851, 55, 45, 6, 903, 946, 869, 725], {'pity': 88, 'guarantee': True}],
   {'results': 'F--------------', 'pity': 14, 'guarantee': False})],
 [('hard pity pull #1',
   [[999, 999], {'pity': 89, 'guarantee': False}],
   {'results': 'L-', 'pity': 1, 'guarantee': True}),
  ('fault site guarantee grant #1',
   [[984, 954, 47, 297, 21, 192, 35, 1, 87, 521, 965, 945, 130, 990], {'pity': 72, 'guarantee': True}],
   {'results': '--F----L------', 'pity': 6, 'guarantee': True}),
  ('fault site guarantee grant #2',
   [[4, 981, 950, 937, 739, 13, 768, 921, 979, 2, 3, 996], {'pity': 89, 'guarantee': False}],
   {'results': 'F--------FL-', 'pity': 1, 'guarantee': True}),
  ('regression guarantee grant #1',
   [[11, 47, 871, 857, 891, 200, 545, 440, 54, 153, 670, 183, 56, 969, 930, 688, 52, 36],
    {'pity': 89, 'guarantee': False}],
   {'results': 'L-----------------', 'pity': 17, 'guarantee': True}),
  ('regression guarantee grant #2',
   [[941, 855, 955], {'pity': 89, 'guarantee': False}],
   {'results': 'L--', 'pity': 2, 'guarantee': True}),
  ('first soft pity pull #1',
   [[100, 3], {'pity': 73, 'guarantee': True}],
   {'results': '-F', 'pity': 0, 'guarantee': False}),
  ('lost fifty fifty then featured #1',
   [[1, 999, 0], {'pity': 10, 'guarantee': False}],
   {'results': 'L-F', 'pity': 0, 'guarantee': False}),
  ('control #1',
   [[507, 965, 27, 525, 851], {'pity': 73, 'guarantee': True}],
   {'results': '--F--', 'pity': 2, 'guarantee': False})],
 [('hard pity pull #1',
   [[999, 999], {'pity': 89, 'guarantee': False}],
   {'results': 'L-', 'pity': 1, 'guarantee': True}),
  ('fault site guarantee grant #1',
   [[711, 926, 856, 59, 840, 978, 927, 160, 919, 993, 878, 579, 989], {'pity': 73, 'guarantee': False}],
   {'results': '---L---------', 'pity': 9, 'guarantee': True}),
  ('fault site guarantee grant #2',
   [[55, 51, 37, 985, 339, 849, 34, 33, 811, 935, 6, 3], {'pity': 66, 'guarantee': False}],
   {'results': '-------L---F', 'pity': 0, 'guarantee': False}),
  ('regression guarantee grant #1',
   [[811, 511, 897, 20, 849, 22, 758, 623, 891, 950], {'pity': 88, 'guarantee': False}],
   {'results': '-L--------', 'pity': 8, 'guarantee': True}),
  ('regression guarantee grant #2',
   [[835, 921, 31, 855, 841, 35, 966, 806, 957, 858, 42, 57, 921], {'pity': 88, 'guarantee': False}],
   {'results': '-L-----------', 'pity': 11, 'guarantee': True}),
  ('first soft pity pull #1',
   [[100, 3], {'pity': 73, 'guarantee': True}],
   {'results': '-F', 'pity': 0, 'guarantee': False}),
  ('lost fifty fifty then featured #1',
   [[1, 999, 0], {'pity': 10, 'guarantee': False}],
   {'results': 'L-F', 'pity': 0, 'guarantee': False}),
  ('control #1',
   [[480, 489, 823, 13, 936, 776, 44, 409, 26, 974, 9, 54, 911, 804, 433, 47, 942, 847],
    {'pity': 89, 'guarantee': True}],
   {'results': 'F-----------------', 'pity': 17, 'guarantee': False})]]
for label, args, expected in cases[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
hard pity pull #1{'guarantee': True, 'pity': 1, 'results': 'L-'}{'guarantee': True, 'pity': 1, 'results': 'L-'}Passed
fault site guarantee grant #1{'guarantee': True, 'pity': 12, 'results': '-L------------'}{'guarantee': True, 'pity': 12, 'results': '-L------------'}Passed
fault site guarantee grant #2{'guarantee': True, 'pity': 0, 'results': '--L'}{'guarantee': True, 'pity': 0, 'results': '--L'}Passed
regression guarantee grant #1{'guarantee': True, 'pity': 17, 'results': 'L-----------------'}{'guarantee': True, 'pity': 17, 'results': 'L-----------------'}Passed
regression guarantee grant #2{'guarantee': True, 'pity': 2, 'results': 'L---F-----F--L--'}{'guarantee': True, 'pity': 2, 'results': 'L---F-----F--L--'}Passed
first soft pity pull #1{'guarantee': False, 'pity': 0, 'results': '-F'}{'guarantee': False, 'pity': 0, 'results': '-F'}Passed
lost fifty fifty then featured #1{'guarantee': False, 'pity': 0, 'results': 'L-F'}{'guarantee': False, 'pity': 0, 'results': 'L-F'}Passed
control #1{'guarantee': False, 'pity': 14, 'results': 'F--------------'}{'guarantee': False, 'pity': 14, 'results': 'F--------------'}Passed

SHA-256 / 7d4f0e538955febdfcb41c173b38f9a0ac0d07830fb4dd3a8fbbfa7557d64b13

Verification & scope

Deterministic toy contract stipulated for this model; integer or exact arithmetic only, not a reproduction of any specific game engine. 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:50:45.000202+00:00.

Case digest / ad0d0fdf6cd1953c5396061f08b4b4e612cad050181d183a7857d22b64865a9a