FA-85921 / Game economy crafting balance / Open access
Banner pity counter: Hard pity pull can miss · case 01
The 90th pull may fail to award a top-rarity item.
ROOT CAUSE
The hard-pity comparison is strict, so pull 90 only hits by rate.
VERIFIED REPAIR
Restore `n >= 90 or r < rate` at the hard pity guarantee step.
Unsuccessful approach: Testing the stored pity instead of the pull number moves hard pity to pull 91.
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 = 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}),
('regression hard pity guarantee #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 hard pity guarantee #2',
[[986], {'pity': 89, 'guarantee': True}],
{'results': 'F', 'pity': 0, 'guarantee': False}),
('regression hard pity guarantee #3',
[[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 hard pity guarantee #4',
[[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}),
('regression hard pity guarantee #1',
[[986], {'pity': 89, 'guarantee': True}],
{'results': 'F', 'pity': 0, 'guarantee': False}),
('regression hard pity guarantee #2',
[[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 hard pity guarantee #3',
[[812, 997, 899, 10], {'pity': 88, 'guarantee': False}],
{'results': '-L--', 'pity': 2, 'guarantee': True}),
('regression hard pity guarantee #4',
[[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',
[[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}),
('regression hard pity guarantee #1',
[[812, 997, 899, 10], {'pity': 88, 'guarantee': False}],
{'results': '-L--', 'pity': 2, 'guarantee': True}),
('regression hard pity guarantee #2',
[[941, 855, 955], {'pity': 89, 'guarantee': False}],
{'results': 'L--', 'pity': 2, 'guarantee': True}),
('regression hard pity guarantee #3',
[[866, 716, 336, 806, 719, 971, 56, 858, 215, 881, 854, 21, 997, 459, 240],
{'pity': 89, 'guarantee': False}],
{'results': 'F--------------', 'pity': 14, 'guarantee': False}),
('regression hard pity guarantee #4',
[[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',
[[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}),
('regression hard pity guarantee #1',
[[866, 716, 336, 806, 719, 971, 56, 858, 215, 881, 854, 21, 997, 459, 240],
{'pity': 89, 'guarantee': False}],
{'results': 'F--------------', 'pity': 14, 'guarantee': False}),
('regression hard pity guarantee #2',
[[835, 921, 31, 855, 841, 35, 966, 806, 957, 858, 42, 57, 921], {'pity': 88, 'guarantee': False}],
{'results': '-L-----------', 'pity': 11, 'guarantee': True}),
('regression hard pity guarantee #3',
[[890, 52, 19, 184, 980], {'pity': 89, 'guarantee': False}],
{'results': 'F----', 'pity': 4, 'guarantee': False}),
('regression hard pity guarantee #4',
[[929, 229, 908, 987, 916, 982, 868, 899, 703, 873, 474, 54, 48, 190, 47, 959, 85],
{'pity': 89, 'guarantee': False}],
{'results': 'L----------------', 'pity': 16, '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}),
('regression hard pity guarantee #1',
[[890, 52, 19, 184, 980], {'pity': 89, 'guarantee': False}],
{'results': 'F----', 'pity': 4, 'guarantee': False}),
('regression hard pity guarantee #2',
[[929, 229, 908, 987, 916, 982, 868, 899, 703, 873, 474, 54, 48, 190, 47, 959, 85],
{'pity': 89, 'guarantee': False}],
{'results': 'L----------------', 'pity': 16, 'guarantee': True}),
('regression hard pity guarantee #3',
[[860, 578, 19, 809, 175, 896, 995, 51, 817, 955, 882, 623, 519, 962, 886, 900, 785, 824, 15],
{'pity': 89, 'guarantee': False}],
{'results': 'F------------------', 'pity': 18, 'guarantee': False}),
('regression hard pity guarantee #4',
[[999, 955, 867, 824, 299, 243, 930, 89, 25, 397, 757, 7, 112, 301, 716, 703, 998, 888, 950, 816],
{'pity': 88, 'guarantee': True}],
{'results': '-F------------------', 'pity': 18, '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',
[[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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| hard pity pull #1 | {'guarantee': True, 'pity': 0, 'results': '-L'} | {'guarantee': True, 'pity': 1, 'results': 'L-'} | Failed |
| regression hard pity guarantee #1 | {'guarantee': True, 'pity': 8, 'results': '-F-------L--------'} | {'guarantee': True, 'pity': 8, 'results': 'F--------L--------'} | Failed |
| regression hard pity guarantee #2 | {'guarantee': True, 'pity': 90, 'results': '-'} | {'guarantee': False, 'pity': 0, 'results': 'F'} | Failed |
| regression hard pity guarantee #3 | {'guarantee': True, 'pity': 17, 'results': '--L-----------------'} | {'guarantee': True, 'pity': 18, 'results': '-L------------------'} | Failed |
| regression hard pity guarantee #4 | {'guarantee': True, 'pity': 1, 'results': '--L-'} | {'guarantee': True, 'pity': 2, 'results': '-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 / a0e24a984b1ad7a66fdd83e673f5a2de6ad33e4935e704aaa962d90af2f9f57a
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 pity >= 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}),
('regression hard pity guarantee #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 hard pity guarantee #2',
[[986], {'pity': 89, 'guarantee': True}],
{'results': 'F', 'pity': 0, 'guarantee': False}),
('regression hard pity guarantee #3',
[[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 hard pity guarantee #4',
[[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}),
('regression hard pity guarantee #1',
[[986], {'pity': 89, 'guarantee': True}],
{'results': 'F', 'pity': 0, 'guarantee': False}),
('regression hard pity guarantee #2',
[[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 hard pity guarantee #3',
[[812, 997, 899, 10], {'pity': 88, 'guarantee': False}],
{'results': '-L--', 'pity': 2, 'guarantee': True}),
('regression hard pity guarantee #4',
[[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',
[[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}),
('regression hard pity guarantee #1',
[[812, 997, 899, 10], {'pity': 88, 'guarantee': False}],
{'results': '-L--', 'pity': 2, 'guarantee': True}),
('regression hard pity guarantee #2',
[[941, 855, 955], {'pity': 89, 'guarantee': False}],
{'results': 'L--', 'pity': 2, 'guarantee': True}),
('regression hard pity guarantee #3',
[[866, 716, 336, 806, 719, 971, 56, 858, 215, 881, 854, 21, 997, 459, 240],
{'pity': 89, 'guarantee': False}],
{'results': 'F--------------', 'pity': 14, 'guarantee': False}),
('regression hard pity guarantee #4',
[[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',
[[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}),
('regression hard pity guarantee #1',
[[866, 716, 336, 806, 719, 971, 56, 858, 215, 881, 854, 21, 997, 459, 240],
{'pity': 89, 'guarantee': False}],
{'results': 'F--------------', 'pity': 14, 'guarantee': False}),
('regression hard pity guarantee #2',
[[835, 921, 31, 855, 841, 35, 966, 806, 957, 858, 42, 57, 921], {'pity': 88, 'guarantee': False}],
{'results': '-L-----------', 'pity': 11, 'guarantee': True}),
('regression hard pity guarantee #3',
[[890, 52, 19, 184, 980], {'pity': 89, 'guarantee': False}],
{'results': 'F----', 'pity': 4, 'guarantee': False}),
('regression hard pity guarantee #4',
[[929, 229, 908, 987, 916, 982, 868, 899, 703, 873, 474, 54, 48, 190, 47, 959, 85],
{'pity': 89, 'guarantee': False}],
{'results': 'L----------------', 'pity': 16, '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}),
('regression hard pity guarantee #1',
[[890, 52, 19, 184, 980], {'pity': 89, 'guarantee': False}],
{'results': 'F----', 'pity': 4, 'guarantee': False}),
('regression hard pity guarantee #2',
[[929, 229, 908, 987, 916, 982, 868, 899, 703, 873, 474, 54, 48, 190, 47, 959, 85],
{'pity': 89, 'guarantee': False}],
{'results': 'L----------------', 'pity': 16, 'guarantee': True}),
('regression hard pity guarantee #3',
[[860, 578, 19, 809, 175, 896, 995, 51, 817, 955, 882, 623, 519, 962, 886, 900, 785, 824, 15],
{'pity': 89, 'guarantee': False}],
{'results': 'F------------------', 'pity': 18, 'guarantee': False}),
('regression hard pity guarantee #4',
[[999, 955, 867, 824, 299, 243, 930, 89, 25, 397, 757, 7, 112, 301, 716, 703, 998, 888, 950, 816],
{'pity': 88, 'guarantee': True}],
{'results': '-F------------------', 'pity': 18, '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',
[[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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| hard pity pull #1 | {'guarantee': True, 'pity': 0, 'results': '-L'} | {'guarantee': True, 'pity': 1, 'results': 'L-'} | Failed |
| regression hard pity guarantee #1 | {'guarantee': True, 'pity': 8, 'results': '-F-------L--------'} | {'guarantee': True, 'pity': 8, 'results': 'F--------L--------'} | Failed |
| regression hard pity guarantee #2 | {'guarantee': True, 'pity': 90, 'results': '-'} | {'guarantee': False, 'pity': 0, 'results': 'F'} | Failed |
| regression hard pity guarantee #3 | {'guarantee': True, 'pity': 17, 'results': '--L-----------------'} | {'guarantee': True, 'pity': 18, 'results': '-L------------------'} | Failed |
| regression hard pity guarantee #4 | {'guarantee': True, 'pity': 1, 'results': '--L-'} | {'guarantee': True, 'pity': 2, 'results': '-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 / ecc60c2d0d8ed07a0a19a8983090a7d6745b15e2af520b19d9625c49b2df1d25
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}),
('regression hard pity guarantee #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 hard pity guarantee #2',
[[986], {'pity': 89, 'guarantee': True}],
{'results': 'F', 'pity': 0, 'guarantee': False}),
('regression hard pity guarantee #3',
[[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 hard pity guarantee #4',
[[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}),
('regression hard pity guarantee #1',
[[986], {'pity': 89, 'guarantee': True}],
{'results': 'F', 'pity': 0, 'guarantee': False}),
('regression hard pity guarantee #2',
[[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 hard pity guarantee #3',
[[812, 997, 899, 10], {'pity': 88, 'guarantee': False}],
{'results': '-L--', 'pity': 2, 'guarantee': True}),
('regression hard pity guarantee #4',
[[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',
[[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}),
('regression hard pity guarantee #1',
[[812, 997, 899, 10], {'pity': 88, 'guarantee': False}],
{'results': '-L--', 'pity': 2, 'guarantee': True}),
('regression hard pity guarantee #2',
[[941, 855, 955], {'pity': 89, 'guarantee': False}],
{'results': 'L--', 'pity': 2, 'guarantee': True}),
('regression hard pity guarantee #3',
[[866, 716, 336, 806, 719, 971, 56, 858, 215, 881, 854, 21, 997, 459, 240],
{'pity': 89, 'guarantee': False}],
{'results': 'F--------------', 'pity': 14, 'guarantee': False}),
('regression hard pity guarantee #4',
[[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',
[[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}),
('regression hard pity guarantee #1',
[[866, 716, 336, 806, 719, 971, 56, 858, 215, 881, 854, 21, 997, 459, 240],
{'pity': 89, 'guarantee': False}],
{'results': 'F--------------', 'pity': 14, 'guarantee': False}),
('regression hard pity guarantee #2',
[[835, 921, 31, 855, 841, 35, 966, 806, 957, 858, 42, 57, 921], {'pity': 88, 'guarantee': False}],
{'results': '-L-----------', 'pity': 11, 'guarantee': True}),
('regression hard pity guarantee #3',
[[890, 52, 19, 184, 980], {'pity': 89, 'guarantee': False}],
{'results': 'F----', 'pity': 4, 'guarantee': False}),
('regression hard pity guarantee #4',
[[929, 229, 908, 987, 916, 982, 868, 899, 703, 873, 474, 54, 48, 190, 47, 959, 85],
{'pity': 89, 'guarantee': False}],
{'results': 'L----------------', 'pity': 16, '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}),
('regression hard pity guarantee #1',
[[890, 52, 19, 184, 980], {'pity': 89, 'guarantee': False}],
{'results': 'F----', 'pity': 4, 'guarantee': False}),
('regression hard pity guarantee #2',
[[929, 229, 908, 987, 916, 982, 868, 899, 703, 873, 474, 54, 48, 190, 47, 959, 85],
{'pity': 89, 'guarantee': False}],
{'results': 'L----------------', 'pity': 16, 'guarantee': True}),
('regression hard pity guarantee #3',
[[860, 578, 19, 809, 175, 896, 995, 51, 817, 955, 882, 623, 519, 962, 886, 900, 785, 824, 15],
{'pity': 89, 'guarantee': False}],
{'results': 'F------------------', 'pity': 18, 'guarantee': False}),
('regression hard pity guarantee #4',
[[999, 955, 867, 824, 299, 243, 930, 89, 25, 397, 757, 7, 112, 301, 716, 703, 998, 888, 950, 816],
{'pity': 88, 'guarantee': True}],
{'results': '-F------------------', 'pity': 18, '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',
[[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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| hard pity pull #1 | {'guarantee': True, 'pity': 1, 'results': 'L-'} | {'guarantee': True, 'pity': 1, 'results': 'L-'} | Passed |
| regression hard pity guarantee #1 | {'guarantee': True, 'pity': 8, 'results': 'F--------L--------'} | {'guarantee': True, 'pity': 8, 'results': 'F--------L--------'} | Passed |
| regression hard pity guarantee #2 | {'guarantee': False, 'pity': 0, 'results': 'F'} | {'guarantee': False, 'pity': 0, 'results': 'F'} | Passed |
| regression hard pity guarantee #3 | {'guarantee': True, 'pity': 18, 'results': '-L------------------'} | {'guarantee': True, 'pity': 18, 'results': '-L------------------'} | Passed |
| regression hard pity guarantee #4 | {'guarantee': True, 'pity': 2, 'results': '-L--'} | {'guarantee': True, 'pity': 2, '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 |
| control #1 | {'guarantee': False, 'pity': 14, 'results': 'F--------------'} | {'guarantee': False, 'pity': 14, 'results': 'F--------------'} | Passed |
SHA-256 / b11ab144bd7ec78de822e2145292a33125a6e797dbfb93dd138f362919fb3a26
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.858338+00:00.
Case digest / 23b4e45d4a733f9a930cdc6380a99d35a2c84f182b613f2d48d01c2c7b64d71f