FA-85926 / Game economy crafting balance / Open access
Banner pity counter: Pity is not reset on a hit · case 01
After a top-rarity hit the next hit arrives far too early.
ROOT CAUSE
A hit stores the pull number as the new pity instead of resetting to zero.
VERIFIED REPAIR
Restore `pity = 0` at the pity reset step.
Unsuccessful approach: Resetting to one counts the winning pull toward the next cycle.
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 = n
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}),
('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}),
('regression pity reset #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}),
('regression pity reset #2',
[[507, 965, 27, 525, 851], {'pity': 73, 'guarantee': True}],
{'results': '--F--', 'pity': 2, 'guarantee': False}),
('regression pity reset #3',
[[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}),
('control #1', [[911], {'pity': 73, 'guarantee': True}], {'results': '-', 'pity': 74, 'guarantee': True}),
('control #2',
[[685, 976, 49, 33, 16, 30, 427, 839], {'pity': 0, 'guarantee': False}],
{'results': '--------', 'pity': 8, '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}),
('regression pity reset #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}),
('regression pity reset #2',
[[507, 965, 27, 525, 851], {'pity': 73, 'guarantee': True}],
{'results': '--F--', 'pity': 2, 'guarantee': False}),
('regression pity reset #3',
[[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}),
('regression pity reset #4',
[[922, 571, 11, 40, 49, 776, 996, 952, 946, 14, 108, 822, 888, 25], {'pity': 84, 'guarantee': False}],
{'results': '-L------------', 'pity': 12, 'guarantee': True}),
('control #1',
[[773, 957, 60, 353, 59, 19, 862, 820, 993, 27, 22, 893, 950], {'pity': 0, 'guarantee': True}],
{'results': '-------------', 'pity': 13, 'guarantee': True}),
('control #2', [[54], {'pity': 61, 'guarantee': False}], {'results': '-', 'pity': 62, 'guarantee': False})],
[('lost fifty fifty then featured #1',
[[1, 999, 0], {'pity': 10, 'guarantee': False}],
{'results': 'L-F', 'pity': 0, 'guarantee': False}),
('hard pity pull #1',
[[999, 999], {'pity': 89, 'guarantee': False}],
{'results': 'L-', 'pity': 1, 'guarantee': True}),
('regression pity reset #1',
[[507, 965, 27, 525, 851], {'pity': 73, 'guarantee': True}],
{'results': '--F--', 'pity': 2, 'guarantee': False}),
('regression pity reset #2',
[[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}),
('regression pity reset #3',
[[922, 571, 11, 40, 49, 776, 996, 952, 946, 14, 108, 822, 888, 25], {'pity': 84, 'guarantee': False}],
{'results': '-L------------', 'pity': 12, 'guarantee': True}),
('regression pity reset #4',
[[18, 973, 5], {'pity': 72, 'guarantee': False}],
{'results': '--L', 'pity': 0, 'guarantee': True}),
('control #1',
[[938, 58, 37, 11, 926, 889, 844, 11, 265], {'pity': 0, 'guarantee': False}],
{'results': '---------', 'pity': 9, 'guarantee': False}),
('control #2',
[[43, 382, 597, 932, 22, 950, 46, 694, 804, 21, 825, 523, 125, 765], {'pity': 26, 'guarantee': False}],
{'results': '--------------', 'pity': 40, 'guarantee': False})],
[('hard pity pull #1',
[[999, 999], {'pity': 89, 'guarantee': False}],
{'results': 'L-', 'pity': 1, 'guarantee': True}),
('first soft pity pull #1',
[[100, 3], {'pity': 73, 'guarantee': True}],
{'results': '-F', 'pity': 0, 'guarantee': False}),
('regression pity reset #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}),
('regression pity reset #2',
[[18, 973, 5], {'pity': 72, 'guarantee': False}],
{'results': '--L', 'pity': 0, 'guarantee': True}),
('regression pity reset #3',
[[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 pity reset #4',
[[815, 889, 39, 873, 939, 933, 908, 992, 421, 939, 821, 53, 12, 40, 8, 884, 975, 551, 967, 39],
{'pity': 63, 'guarantee': True}],
{'results': '-----------F--------', 'pity': 8, 'guarantee': False}),
('control #1', [[901], {'pity': 54, 'guarantee': False}], {'results': '-', 'pity': 55, 'guarantee': False}),
('control #2',
[[40, 846, 823, 917, 973, 874, 95, 46, 59, 36, 36, 872, 9, 854, 926, 882, 133],
{'pity': 0, 'guarantee': False}],
{'results': '-----------------', 'pity': 17, '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}),
('regression pity reset #1',
[[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 pity reset #2',
[[815, 889, 39, 873, 939, 933, 908, 992, 421, 939, 821, 53, 12, 40, 8, 884, 975, 551, 967, 39],
{'pity': 63, 'guarantee': True}],
{'results': '-----------F--------', 'pity': 8, 'guarantee': False}),
('regression pity reset #3',
[[4, 155, 441, 951, 967, 353, 21], {'pity': 68, 'guarantee': False}],
{'results': 'F------', 'pity': 6, 'guarantee': False}),
('regression pity reset #4',
[[18, 16, 60, 53, 197, 713, 972, 933], {'pity': 75, 'guarantee': True}],
{'results': 'F-------', 'pity': 7, 'guarantee': False}),
('control #1',
[[986, 892, 958, 29, 925, 855, 10, 138, 806, 213, 889, 837, 994, 19], {'pity': 14, 'guarantee': False}],
{'results': '--------------', 'pity': 28, 'guarantee': False}),
('control #2',
[[806, 775, 826, 58], {'pity': 66, 'guarantee': False}],
{'results': '----', 'pity': 70, '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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| hard pity pull #1 | {'guarantee': False, 'pity': 91, 'results': 'LF'} | {'guarantee': True, 'pity': 1, 'results': 'L-'} | Failed |
| first soft pity pull #1 | {'guarantee': False, 'pity': 75, 'results': '-F'} | {'guarantee': False, 'pity': 0, 'results': '-F'} | Failed |
| lost fifty fifty then featured #1 | {'guarantee': False, 'pity': 13, 'results': 'L-F'} | {'guarantee': False, 'pity': 0, 'results': 'L-F'} | Failed |
| regression pity reset #1 | {'guarantee': False, 'pity': 103, 'results': 'FLFLFFFLFLFLFLF'} | {'guarantee': False, 'pity': 14, 'results': 'F--------------'} | Failed |
| regression pity reset #2 | {'guarantee': False, 'pity': 78, 'results': '--F--'} | {'guarantee': False, 'pity': 2, 'results': '--F--'} | Failed |
| regression pity reset #3 | {'guarantee': True, 'pity': 107, 'results': 'FLFLFFFLFFLFLFLFFL'} | {'guarantee': False, 'pity': 17, 'results': 'F-----------------'} | Failed |
| control #1 | {'guarantee': True, 'pity': 74, 'results': '-'} | {'guarantee': True, 'pity': 74, 'results': '-'} | Passed |
| control #2 | {'guarantee': False, 'pity': 8, 'results': '--------'} | {'guarantee': False, 'pity': 8, 'results': '--------'} | Passed |
SHA-256 / a67cf26e007aa79c17b98689ddc382784ea59d778a2f6bc431b9efaefdb0c65b
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 = 1
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}),
('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}),
('regression pity reset #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}),
('regression pity reset #2',
[[507, 965, 27, 525, 851], {'pity': 73, 'guarantee': True}],
{'results': '--F--', 'pity': 2, 'guarantee': False}),
('regression pity reset #3',
[[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}),
('control #1', [[911], {'pity': 73, 'guarantee': True}], {'results': '-', 'pity': 74, 'guarantee': True}),
('control #2',
[[685, 976, 49, 33, 16, 30, 427, 839], {'pity': 0, 'guarantee': False}],
{'results': '--------', 'pity': 8, '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}),
('regression pity reset #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}),
('regression pity reset #2',
[[507, 965, 27, 525, 851], {'pity': 73, 'guarantee': True}],
{'results': '--F--', 'pity': 2, 'guarantee': False}),
('regression pity reset #3',
[[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}),
('regression pity reset #4',
[[922, 571, 11, 40, 49, 776, 996, 952, 946, 14, 108, 822, 888, 25], {'pity': 84, 'guarantee': False}],
{'results': '-L------------', 'pity': 12, 'guarantee': True}),
('control #1',
[[773, 957, 60, 353, 59, 19, 862, 820, 993, 27, 22, 893, 950], {'pity': 0, 'guarantee': True}],
{'results': '-------------', 'pity': 13, 'guarantee': True}),
('control #2', [[54], {'pity': 61, 'guarantee': False}], {'results': '-', 'pity': 62, 'guarantee': False})],
[('lost fifty fifty then featured #1',
[[1, 999, 0], {'pity': 10, 'guarantee': False}],
{'results': 'L-F', 'pity': 0, 'guarantee': False}),
('hard pity pull #1',
[[999, 999], {'pity': 89, 'guarantee': False}],
{'results': 'L-', 'pity': 1, 'guarantee': True}),
('regression pity reset #1',
[[507, 965, 27, 525, 851], {'pity': 73, 'guarantee': True}],
{'results': '--F--', 'pity': 2, 'guarantee': False}),
('regression pity reset #2',
[[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}),
('regression pity reset #3',
[[922, 571, 11, 40, 49, 776, 996, 952, 946, 14, 108, 822, 888, 25], {'pity': 84, 'guarantee': False}],
{'results': '-L------------', 'pity': 12, 'guarantee': True}),
('regression pity reset #4',
[[18, 973, 5], {'pity': 72, 'guarantee': False}],
{'results': '--L', 'pity': 0, 'guarantee': True}),
('control #1',
[[938, 58, 37, 11, 926, 889, 844, 11, 265], {'pity': 0, 'guarantee': False}],
{'results': '---------', 'pity': 9, 'guarantee': False}),
('control #2',
[[43, 382, 597, 932, 22, 950, 46, 694, 804, 21, 825, 523, 125, 765], {'pity': 26, 'guarantee': False}],
{'results': '--------------', 'pity': 40, 'guarantee': False})],
[('hard pity pull #1',
[[999, 999], {'pity': 89, 'guarantee': False}],
{'results': 'L-', 'pity': 1, 'guarantee': True}),
('first soft pity pull #1',
[[100, 3], {'pity': 73, 'guarantee': True}],
{'results': '-F', 'pity': 0, 'guarantee': False}),
('regression pity reset #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}),
('regression pity reset #2',
[[18, 973, 5], {'pity': 72, 'guarantee': False}],
{'results': '--L', 'pity': 0, 'guarantee': True}),
('regression pity reset #3',
[[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 pity reset #4',
[[815, 889, 39, 873, 939, 933, 908, 992, 421, 939, 821, 53, 12, 40, 8, 884, 975, 551, 967, 39],
{'pity': 63, 'guarantee': True}],
{'results': '-----------F--------', 'pity': 8, 'guarantee': False}),
('control #1', [[901], {'pity': 54, 'guarantee': False}], {'results': '-', 'pity': 55, 'guarantee': False}),
('control #2',
[[40, 846, 823, 917, 973, 874, 95, 46, 59, 36, 36, 872, 9, 854, 926, 882, 133],
{'pity': 0, 'guarantee': False}],
{'results': '-----------------', 'pity': 17, '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}),
('regression pity reset #1',
[[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 pity reset #2',
[[815, 889, 39, 873, 939, 933, 908, 992, 421, 939, 821, 53, 12, 40, 8, 884, 975, 551, 967, 39],
{'pity': 63, 'guarantee': True}],
{'results': '-----------F--------', 'pity': 8, 'guarantee': False}),
('regression pity reset #3',
[[4, 155, 441, 951, 967, 353, 21], {'pity': 68, 'guarantee': False}],
{'results': 'F------', 'pity': 6, 'guarantee': False}),
('regression pity reset #4',
[[18, 16, 60, 53, 197, 713, 972, 933], {'pity': 75, 'guarantee': True}],
{'results': 'F-------', 'pity': 7, 'guarantee': False}),
('control #1',
[[986, 892, 958, 29, 925, 855, 10, 138, 806, 213, 889, 837, 994, 19], {'pity': 14, 'guarantee': False}],
{'results': '--------------', 'pity': 28, 'guarantee': False}),
('control #2',
[[806, 775, 826, 58], {'pity': 66, 'guarantee': False}],
{'results': '----', 'pity': 70, '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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| hard pity pull #1 | {'guarantee': True, 'pity': 2, 'results': 'L-'} | {'guarantee': True, 'pity': 1, 'results': 'L-'} | Failed |
| first soft pity pull #1 | {'guarantee': False, 'pity': 1, 'results': '-F'} | {'guarantee': False, 'pity': 0, 'results': '-F'} | Failed |
| lost fifty fifty then featured #1 | {'guarantee': False, 'pity': 1, 'results': 'L-F'} | {'guarantee': False, 'pity': 0, 'results': 'L-F'} | Failed |
| regression pity reset #1 | {'guarantee': False, 'pity': 15, 'results': 'F--------------'} | {'guarantee': False, 'pity': 14, 'results': 'F--------------'} | Failed |
| regression pity reset #2 | {'guarantee': False, 'pity': 3, 'results': '--F--'} | {'guarantee': False, 'pity': 2, 'results': '--F--'} | Failed |
| regression pity reset #3 | {'guarantee': False, 'pity': 18, 'results': 'F-----------------'} | {'guarantee': False, 'pity': 17, 'results': 'F-----------------'} | Failed |
| control #1 | {'guarantee': True, 'pity': 74, 'results': '-'} | {'guarantee': True, 'pity': 74, 'results': '-'} | Passed |
| control #2 | {'guarantee': False, 'pity': 8, 'results': '--------'} | {'guarantee': False, 'pity': 8, 'results': '--------'} | Passed |
SHA-256 / c87210c97bc859b729a952023377d1717dc51dd161f1906deb9fbdccd3af0b3a
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}),
('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}),
('regression pity reset #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}),
('regression pity reset #2',
[[507, 965, 27, 525, 851], {'pity': 73, 'guarantee': True}],
{'results': '--F--', 'pity': 2, 'guarantee': False}),
('regression pity reset #3',
[[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}),
('control #1', [[911], {'pity': 73, 'guarantee': True}], {'results': '-', 'pity': 74, 'guarantee': True}),
('control #2',
[[685, 976, 49, 33, 16, 30, 427, 839], {'pity': 0, 'guarantee': False}],
{'results': '--------', 'pity': 8, '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}),
('regression pity reset #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}),
('regression pity reset #2',
[[507, 965, 27, 525, 851], {'pity': 73, 'guarantee': True}],
{'results': '--F--', 'pity': 2, 'guarantee': False}),
('regression pity reset #3',
[[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}),
('regression pity reset #4',
[[922, 571, 11, 40, 49, 776, 996, 952, 946, 14, 108, 822, 888, 25], {'pity': 84, 'guarantee': False}],
{'results': '-L------------', 'pity': 12, 'guarantee': True}),
('control #1',
[[773, 957, 60, 353, 59, 19, 862, 820, 993, 27, 22, 893, 950], {'pity': 0, 'guarantee': True}],
{'results': '-------------', 'pity': 13, 'guarantee': True}),
('control #2', [[54], {'pity': 61, 'guarantee': False}], {'results': '-', 'pity': 62, 'guarantee': False})],
[('lost fifty fifty then featured #1',
[[1, 999, 0], {'pity': 10, 'guarantee': False}],
{'results': 'L-F', 'pity': 0, 'guarantee': False}),
('hard pity pull #1',
[[999, 999], {'pity': 89, 'guarantee': False}],
{'results': 'L-', 'pity': 1, 'guarantee': True}),
('regression pity reset #1',
[[507, 965, 27, 525, 851], {'pity': 73, 'guarantee': True}],
{'results': '--F--', 'pity': 2, 'guarantee': False}),
('regression pity reset #2',
[[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}),
('regression pity reset #3',
[[922, 571, 11, 40, 49, 776, 996, 952, 946, 14, 108, 822, 888, 25], {'pity': 84, 'guarantee': False}],
{'results': '-L------------', 'pity': 12, 'guarantee': True}),
('regression pity reset #4',
[[18, 973, 5], {'pity': 72, 'guarantee': False}],
{'results': '--L', 'pity': 0, 'guarantee': True}),
('control #1',
[[938, 58, 37, 11, 926, 889, 844, 11, 265], {'pity': 0, 'guarantee': False}],
{'results': '---------', 'pity': 9, 'guarantee': False}),
('control #2',
[[43, 382, 597, 932, 22, 950, 46, 694, 804, 21, 825, 523, 125, 765], {'pity': 26, 'guarantee': False}],
{'results': '--------------', 'pity': 40, 'guarantee': False})],
[('hard pity pull #1',
[[999, 999], {'pity': 89, 'guarantee': False}],
{'results': 'L-', 'pity': 1, 'guarantee': True}),
('first soft pity pull #1',
[[100, 3], {'pity': 73, 'guarantee': True}],
{'results': '-F', 'pity': 0, 'guarantee': False}),
('regression pity reset #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}),
('regression pity reset #2',
[[18, 973, 5], {'pity': 72, 'guarantee': False}],
{'results': '--L', 'pity': 0, 'guarantee': True}),
('regression pity reset #3',
[[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 pity reset #4',
[[815, 889, 39, 873, 939, 933, 908, 992, 421, 939, 821, 53, 12, 40, 8, 884, 975, 551, 967, 39],
{'pity': 63, 'guarantee': True}],
{'results': '-----------F--------', 'pity': 8, 'guarantee': False}),
('control #1', [[901], {'pity': 54, 'guarantee': False}], {'results': '-', 'pity': 55, 'guarantee': False}),
('control #2',
[[40, 846, 823, 917, 973, 874, 95, 46, 59, 36, 36, 872, 9, 854, 926, 882, 133],
{'pity': 0, 'guarantee': False}],
{'results': '-----------------', 'pity': 17, '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}),
('regression pity reset #1',
[[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 pity reset #2',
[[815, 889, 39, 873, 939, 933, 908, 992, 421, 939, 821, 53, 12, 40, 8, 884, 975, 551, 967, 39],
{'pity': 63, 'guarantee': True}],
{'results': '-----------F--------', 'pity': 8, 'guarantee': False}),
('regression pity reset #3',
[[4, 155, 441, 951, 967, 353, 21], {'pity': 68, 'guarantee': False}],
{'results': 'F------', 'pity': 6, 'guarantee': False}),
('regression pity reset #4',
[[18, 16, 60, 53, 197, 713, 972, 933], {'pity': 75, 'guarantee': True}],
{'results': 'F-------', 'pity': 7, 'guarantee': False}),
('control #1',
[[986, 892, 958, 29, 925, 855, 10, 138, 806, 213, 889, 837, 994, 19], {'pity': 14, 'guarantee': False}],
{'results': '--------------', 'pity': 28, 'guarantee': False}),
('control #2',
[[806, 775, 826, 58], {'pity': 66, 'guarantee': False}],
{'results': '----', 'pity': 70, '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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| hard pity pull #1 | {'guarantee': True, 'pity': 1, 'results': 'L-'} | {'guarantee': True, 'pity': 1, 'results': '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 |
| regression pity reset #1 | {'guarantee': False, 'pity': 14, 'results': 'F--------------'} | {'guarantee': False, 'pity': 14, 'results': 'F--------------'} | Passed |
| regression pity reset #2 | {'guarantee': False, 'pity': 2, 'results': '--F--'} | {'guarantee': False, 'pity': 2, 'results': '--F--'} | Passed |
| regression pity reset #3 | {'guarantee': False, 'pity': 17, 'results': 'F-----------------'} | {'guarantee': False, 'pity': 17, 'results': 'F-----------------'} | Passed |
| control #1 | {'guarantee': True, 'pity': 74, 'results': '-'} | {'guarantee': True, 'pity': 74, 'results': '-'} | Passed |
| control #2 | {'guarantee': False, 'pity': 8, 'results': '--------'} | {'guarantee': False, 'pity': 8, 'results': '--------'} | Passed |
SHA-256 / deac2d0ab196e5a301bb29fd9d2bc73c89f0159c8f120f32541a788a6d6d1dfe
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:44.860995+00:00.
Case digest / 74cf391282dd0865ccd42c57bc386d783834985de9998dafafe77ee1f8340c27