FAILURE MAP
← Case archive

FA-86231 / Game economy crafting balance / Open access

Profession skill-up colors: Recipe cannot be crafted at its learn level · case 01

A freshly learned recipe reports skill too low.

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

ROOT CAUSE

The learn gate is inclusive of the learn level.

VERIFIED REPAIR

Restore `if skill < learn:` at the learn gate step.

Unsuccessful approach: The shifted test lets a crafter one point short craft.

Case contract

recipe_levels = [learn, yellow, green, gray]. Skill below learn cannot craft (error "too low"). Per roll (0..99), while skill < 300: chance 100 below yellow (orange), 75 below green, 25 below gray, else 0; the skill goes up when roll < chance and the color is re-evaluated each craft.

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(skill, recipe_levels, rolls):
    learn, yellow, green, gray = recipe_levels
    if skill <= learn:
        return {'skill': skill, 'ups': 0, 'error': 'too low'}
    ups = 0
    for r in rolls:
        if skill >= 300:
            break
        if skill < yellow:
            chance = 100
        elif skill < green:
            chance = 75
        elif skill < gray:
            chance = 25
        else:
            chance = 0
        if r < chance:
            skill += 1
            ups += 1
    return {'skill': skill, 'ups': ups}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
cases = [[('exactly at learn level #1', [50, [50, 60, 70, 80], [0]], {'skill': 51, 'ups': 1}),
  ('fault site learn gate #1', [118, [118, 118, 123, 131], [75, 0, 66, 99, 25]], {'skill': 121, 'ups': 3}),
  ('fault site learn gate #2', [61, [61, 73, 84, 94], [75, 74]], {'skill': 63, 'ups': 2}),
  ('partial repair boundary #1',
   [135, [136, 138, 140, 143], [25, 25, 25, 7, 25, 0, 25, 25]],
   {'skill': 135, 'ups': 0, 'error': 'too low'}),
  ('partial repair boundary #2',
   [79, [80, 91, 104, 106], [16, 74]],
   {'skill': 79, 'ups': 0, 'error': 'too low'}),
  ('at cap #1', [299, [200, 250, 275, 320], [0, 0]], {'skill': 300, 'ups': 1}),
  ('gray recipe roll zero #1', [90, [50, 60, 70, 80], [0, 0]], {'skill': 90, 'ups': 0}),
  ('control #1', [23, [8, 14, 23, 38], [75]], {'skill': 23, 'ups': 0})],
 [('exactly at learn level #1', [50, [50, 60, 70, 80], [0]], {'skill': 51, 'ups': 1}),
  ('fault site learn gate #1', [61, [61, 73, 84, 94], [75, 74]], {'skill': 63, 'ups': 2}),
  ('fault site learn gate #2', [203, [203, 209, 219, 219], [13, 14]], {'skill': 205, 'ups': 2}),
  ('partial repair boundary #1',
   [32, [33, 46, 61, 75], [0, 0, 25, 0, 6]],
   {'skill': 32, 'ups': 0, 'error': 'too low'}),
  ('partial repair boundary #2', [75, [76, 79, 94, 104], [75]], {'skill': 75, 'ups': 0, 'error': 'too low'}),
  ('at cap #1', [299, [200, 250, 275, 320], [0, 0]], {'skill': 300, 'ups': 1}),
  ('gray recipe roll zero #1', [90, [50, 60, 70, 80], [0, 0]], {'skill': 90, 'ups': 0}),
  ('control #1', [23, [8, 14, 23, 38], [75]], {'skill': 23, 'ups': 0})],
 [('exactly at learn level #1', [50, [50, 60, 70, 80], [0]], {'skill': 51, 'ups': 1}),
  ('fault site learn gate #1',
   [90, [90, 94, 100, 110], [24, 74, 24, 24, 75, 75, 74]],
   {'skill': 95, 'ups': 5}),
  ('fault site learn gate #2',
   [273, [273, 284, 330, 340], [0, 1, 50, 1, 0, 0, 1, 0, 50, 0, 50]],
   {'skill': 284, 'ups': 11}),
  ('partial repair boundary #1',
   [9, [10, 12, 12, 19], [25, 99, 75, 99, 75, 56, 20, 75]],
   {'skill': 9, 'ups': 0, 'error': 'too low'}),
  ('partial repair boundary #2',
   [28, [29, 34, 49, 62], [75, 74, 25, 99, 24, 24, 0, 64]],
   {'skill': 28, 'ups': 0, 'error': 'too low'}),
  ('at cap #1', [299, [200, 250, 275, 320], [0, 0]], {'skill': 300, 'ups': 1}),
  ('gray recipe roll zero #1', [90, [50, 60, 70, 80], [0, 0]], {'skill': 90, 'ups': 0}),
  ('control #1', [23, [8, 14, 23, 38], [75]], {'skill': 23, 'ups': 0})],
 [('exactly at learn level #1', [50, [50, 60, 70, 80], [0]], {'skill': 51, 'ups': 1}),
  ('fault site learn gate #1', [64, [64, 79, 92, 99], [25, 75, 24, 74]], {'skill': 68, 'ups': 4}),
  ('fault site learn gate #2',
   [191, [191, 196, 208, 220], [99, 75, 74, 25, 74, 25, 0]],
   {'skill': 198, 'ups': 7}),
  ('partial repair boundary #1',
   [73, [74, 82, 84, 85], [13, 75, 47, 24, 25, 25]],
   {'skill': 73, 'ups': 0, 'error': 'too low'}),
  ('partial repair boundary #2',
   [210, [211, 216, 231, 243], [74, 74, 24]],
   {'skill': 210, 'ups': 0, 'error': 'too low'}),
  ('at cap #1', [299, [200, 250, 275, 320], [0, 0]], {'skill': 300, 'ups': 1}),
  ('gray recipe roll zero #1', [90, [50, 60, 70, 80], [0, 0]], {'skill': 90, 'ups': 0}),
  ('control #1', [84, [64, 70, 80, 85], [0, 99, 75, 25, 25, 99, 75, 0]], {'skill': 85, 'ups': 1})],
 [('exactly at learn level #1', [50, [50, 60, 70, 80], [0]], {'skill': 51, 'ups': 1}),
  ('fault site learn gate #1', [218, [218, 220, 224, 239], [74, 99]], {'skill': 220, 'ups': 2}),
  ('fault site learn gate #2', [265, [265, 266, 266, 277], [0, 75, 0, 0, 24]], {'skill': 269, 'ups': 4}),
  ('partial repair boundary #1',
   [65, [66, 71, 77, 79], [24, 24, 0, 24, 99, 25, 74, 0]],
   {'skill': 65, 'ups': 0, 'error': 'too low'}),
  ('partial repair boundary #2',
   [16, [17, 28, 39, 44], [25, 24]],
   {'skill': 16, 'ups': 0, 'error': 'too low'}),
  ('at cap #1', [299, [200, 250, 275, 320], [0, 0]], {'skill': 300, 'ups': 1}),
  ('gray recipe roll zero #1', [90, [50, 60, 70, 80], [0, 0]], {'skill': 90, 'ups': 0}),
  ('control #1', [289, [288, 314, 330, 340], [50, 0, 50, 0, 0]], {'skill': 294, 'ups': 5})]]
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
exactly at learn level #1{'error': 'too low', 'skill': 50, 'ups': 0}{'skill': 51, 'ups': 1}Failed
fault site learn gate #1{'error': 'too low', 'skill': 118, 'ups': 0}{'skill': 121, 'ups': 3}Failed
fault site learn gate #2{'error': 'too low', 'skill': 61, 'ups': 0}{'skill': 63, 'ups': 2}Failed
partial repair boundary #1{'error': 'too low', 'skill': 135, 'ups': 0}{'error': 'too low', 'skill': 135, 'ups': 0}Passed
partial repair boundary #2{'error': 'too low', 'skill': 79, 'ups': 0}{'error': 'too low', 'skill': 79, 'ups': 0}Passed
at cap #1{'skill': 300, 'ups': 1}{'skill': 300, 'ups': 1}Passed
gray recipe roll zero #1{'skill': 90, 'ups': 0}{'skill': 90, 'ups': 0}Passed
control #1{'skill': 23, 'ups': 0}{'skill': 23, 'ups': 0}Passed

SHA-256 / 7147e56bb66a08d4e011faa767d442cfa1f9403f6fcc23304bc129c9dc2c65b6

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(skill, recipe_levels, rolls):
    learn, yellow, green, gray = recipe_levels
    if skill + 1 < learn:
        return {'skill': skill, 'ups': 0, 'error': 'too low'}
    ups = 0
    for r in rolls:
        if skill >= 300:
            break
        if skill < yellow:
            chance = 100
        elif skill < green:
            chance = 75
        elif skill < gray:
            chance = 25
        else:
            chance = 0
        if r < chance:
            skill += 1
            ups += 1
    return {'skill': skill, 'ups': ups}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
cases = [[('exactly at learn level #1', [50, [50, 60, 70, 80], [0]], {'skill': 51, 'ups': 1}),
  ('fault site learn gate #1', [118, [118, 118, 123, 131], [75, 0, 66, 99, 25]], {'skill': 121, 'ups': 3}),
  ('fault site learn gate #2', [61, [61, 73, 84, 94], [75, 74]], {'skill': 63, 'ups': 2}),
  ('partial repair boundary #1',
   [135, [136, 138, 140, 143], [25, 25, 25, 7, 25, 0, 25, 25]],
   {'skill': 135, 'ups': 0, 'error': 'too low'}),
  ('partial repair boundary #2',
   [79, [80, 91, 104, 106], [16, 74]],
   {'skill': 79, 'ups': 0, 'error': 'too low'}),
  ('at cap #1', [299, [200, 250, 275, 320], [0, 0]], {'skill': 300, 'ups': 1}),
  ('gray recipe roll zero #1', [90, [50, 60, 70, 80], [0, 0]], {'skill': 90, 'ups': 0}),
  ('control #1', [23, [8, 14, 23, 38], [75]], {'skill': 23, 'ups': 0})],
 [('exactly at learn level #1', [50, [50, 60, 70, 80], [0]], {'skill': 51, 'ups': 1}),
  ('fault site learn gate #1', [61, [61, 73, 84, 94], [75, 74]], {'skill': 63, 'ups': 2}),
  ('fault site learn gate #2', [203, [203, 209, 219, 219], [13, 14]], {'skill': 205, 'ups': 2}),
  ('partial repair boundary #1',
   [32, [33, 46, 61, 75], [0, 0, 25, 0, 6]],
   {'skill': 32, 'ups': 0, 'error': 'too low'}),
  ('partial repair boundary #2', [75, [76, 79, 94, 104], [75]], {'skill': 75, 'ups': 0, 'error': 'too low'}),
  ('at cap #1', [299, [200, 250, 275, 320], [0, 0]], {'skill': 300, 'ups': 1}),
  ('gray recipe roll zero #1', [90, [50, 60, 70, 80], [0, 0]], {'skill': 90, 'ups': 0}),
  ('control #1', [23, [8, 14, 23, 38], [75]], {'skill': 23, 'ups': 0})],
 [('exactly at learn level #1', [50, [50, 60, 70, 80], [0]], {'skill': 51, 'ups': 1}),
  ('fault site learn gate #1',
   [90, [90, 94, 100, 110], [24, 74, 24, 24, 75, 75, 74]],
   {'skill': 95, 'ups': 5}),
  ('fault site learn gate #2',
   [273, [273, 284, 330, 340], [0, 1, 50, 1, 0, 0, 1, 0, 50, 0, 50]],
   {'skill': 284, 'ups': 11}),
  ('partial repair boundary #1',
   [9, [10, 12, 12, 19], [25, 99, 75, 99, 75, 56, 20, 75]],
   {'skill': 9, 'ups': 0, 'error': 'too low'}),
  ('partial repair boundary #2',
   [28, [29, 34, 49, 62], [75, 74, 25, 99, 24, 24, 0, 64]],
   {'skill': 28, 'ups': 0, 'error': 'too low'}),
  ('at cap #1', [299, [200, 250, 275, 320], [0, 0]], {'skill': 300, 'ups': 1}),
  ('gray recipe roll zero #1', [90, [50, 60, 70, 80], [0, 0]], {'skill': 90, 'ups': 0}),
  ('control #1', [23, [8, 14, 23, 38], [75]], {'skill': 23, 'ups': 0})],
 [('exactly at learn level #1', [50, [50, 60, 70, 80], [0]], {'skill': 51, 'ups': 1}),
  ('fault site learn gate #1', [64, [64, 79, 92, 99], [25, 75, 24, 74]], {'skill': 68, 'ups': 4}),
  ('fault site learn gate #2',
   [191, [191, 196, 208, 220], [99, 75, 74, 25, 74, 25, 0]],
   {'skill': 198, 'ups': 7}),
  ('partial repair boundary #1',
   [73, [74, 82, 84, 85], [13, 75, 47, 24, 25, 25]],
   {'skill': 73, 'ups': 0, 'error': 'too low'}),
  ('partial repair boundary #2',
   [210, [211, 216, 231, 243], [74, 74, 24]],
   {'skill': 210, 'ups': 0, 'error': 'too low'}),
  ('at cap #1', [299, [200, 250, 275, 320], [0, 0]], {'skill': 300, 'ups': 1}),
  ('gray recipe roll zero #1', [90, [50, 60, 70, 80], [0, 0]], {'skill': 90, 'ups': 0}),
  ('control #1', [84, [64, 70, 80, 85], [0, 99, 75, 25, 25, 99, 75, 0]], {'skill': 85, 'ups': 1})],
 [('exactly at learn level #1', [50, [50, 60, 70, 80], [0]], {'skill': 51, 'ups': 1}),
  ('fault site learn gate #1', [218, [218, 220, 224, 239], [74, 99]], {'skill': 220, 'ups': 2}),
  ('fault site learn gate #2', [265, [265, 266, 266, 277], [0, 75, 0, 0, 24]], {'skill': 269, 'ups': 4}),
  ('partial repair boundary #1',
   [65, [66, 71, 77, 79], [24, 24, 0, 24, 99, 25, 74, 0]],
   {'skill': 65, 'ups': 0, 'error': 'too low'}),
  ('partial repair boundary #2',
   [16, [17, 28, 39, 44], [25, 24]],
   {'skill': 16, 'ups': 0, 'error': 'too low'}),
  ('at cap #1', [299, [200, 250, 275, 320], [0, 0]], {'skill': 300, 'ups': 1}),
  ('gray recipe roll zero #1', [90, [50, 60, 70, 80], [0, 0]], {'skill': 90, 'ups': 0}),
  ('control #1', [289, [288, 314, 330, 340], [50, 0, 50, 0, 0]], {'skill': 294, 'ups': 5})]]
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
exactly at learn level #1{'skill': 51, 'ups': 1}{'skill': 51, 'ups': 1}Passed
fault site learn gate #1{'skill': 121, 'ups': 3}{'skill': 121, 'ups': 3}Passed
fault site learn gate #2{'skill': 63, 'ups': 2}{'skill': 63, 'ups': 2}Passed
partial repair boundary #1{'skill': 141, 'ups': 6}{'error': 'too low', 'skill': 135, 'ups': 0}Failed
partial repair boundary #2{'skill': 81, 'ups': 2}{'error': 'too low', 'skill': 79, 'ups': 0}Failed
at cap #1{'skill': 300, 'ups': 1}{'skill': 300, 'ups': 1}Passed
gray recipe roll zero #1{'skill': 90, 'ups': 0}{'skill': 90, 'ups': 0}Passed
control #1{'skill': 23, 'ups': 0}{'skill': 23, 'ups': 0}Passed

SHA-256 / 7792098d1d96ca1a8baaafb074cbfbd165a5eed1e17c3051a098089de91b3e66

3 / The verified repair

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

N = 1
observations = []
def solve(skill, recipe_levels, rolls):
    learn, yellow, green, gray = recipe_levels
    if skill < learn:
        return {'skill': skill, 'ups': 0, 'error': 'too low'}
    ups = 0
    for r in rolls:
        if skill >= 300:
            break
        if skill < yellow:
            chance = 100
        elif skill < green:
            chance = 75
        elif skill < gray:
            chance = 25
        else:
            chance = 0
        if r < chance:
            skill += 1
            ups += 1
    return {'skill': skill, 'ups': ups}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
cases = [[('exactly at learn level #1', [50, [50, 60, 70, 80], [0]], {'skill': 51, 'ups': 1}),
  ('fault site learn gate #1', [118, [118, 118, 123, 131], [75, 0, 66, 99, 25]], {'skill': 121, 'ups': 3}),
  ('fault site learn gate #2', [61, [61, 73, 84, 94], [75, 74]], {'skill': 63, 'ups': 2}),
  ('partial repair boundary #1',
   [135, [136, 138, 140, 143], [25, 25, 25, 7, 25, 0, 25, 25]],
   {'skill': 135, 'ups': 0, 'error': 'too low'}),
  ('partial repair boundary #2',
   [79, [80, 91, 104, 106], [16, 74]],
   {'skill': 79, 'ups': 0, 'error': 'too low'}),
  ('at cap #1', [299, [200, 250, 275, 320], [0, 0]], {'skill': 300, 'ups': 1}),
  ('gray recipe roll zero #1', [90, [50, 60, 70, 80], [0, 0]], {'skill': 90, 'ups': 0}),
  ('control #1', [23, [8, 14, 23, 38], [75]], {'skill': 23, 'ups': 0})],
 [('exactly at learn level #1', [50, [50, 60, 70, 80], [0]], {'skill': 51, 'ups': 1}),
  ('fault site learn gate #1', [61, [61, 73, 84, 94], [75, 74]], {'skill': 63, 'ups': 2}),
  ('fault site learn gate #2', [203, [203, 209, 219, 219], [13, 14]], {'skill': 205, 'ups': 2}),
  ('partial repair boundary #1',
   [32, [33, 46, 61, 75], [0, 0, 25, 0, 6]],
   {'skill': 32, 'ups': 0, 'error': 'too low'}),
  ('partial repair boundary #2', [75, [76, 79, 94, 104], [75]], {'skill': 75, 'ups': 0, 'error': 'too low'}),
  ('at cap #1', [299, [200, 250, 275, 320], [0, 0]], {'skill': 300, 'ups': 1}),
  ('gray recipe roll zero #1', [90, [50, 60, 70, 80], [0, 0]], {'skill': 90, 'ups': 0}),
  ('control #1', [23, [8, 14, 23, 38], [75]], {'skill': 23, 'ups': 0})],
 [('exactly at learn level #1', [50, [50, 60, 70, 80], [0]], {'skill': 51, 'ups': 1}),
  ('fault site learn gate #1',
   [90, [90, 94, 100, 110], [24, 74, 24, 24, 75, 75, 74]],
   {'skill': 95, 'ups': 5}),
  ('fault site learn gate #2',
   [273, [273, 284, 330, 340], [0, 1, 50, 1, 0, 0, 1, 0, 50, 0, 50]],
   {'skill': 284, 'ups': 11}),
  ('partial repair boundary #1',
   [9, [10, 12, 12, 19], [25, 99, 75, 99, 75, 56, 20, 75]],
   {'skill': 9, 'ups': 0, 'error': 'too low'}),
  ('partial repair boundary #2',
   [28, [29, 34, 49, 62], [75, 74, 25, 99, 24, 24, 0, 64]],
   {'skill': 28, 'ups': 0, 'error': 'too low'}),
  ('at cap #1', [299, [200, 250, 275, 320], [0, 0]], {'skill': 300, 'ups': 1}),
  ('gray recipe roll zero #1', [90, [50, 60, 70, 80], [0, 0]], {'skill': 90, 'ups': 0}),
  ('control #1', [23, [8, 14, 23, 38], [75]], {'skill': 23, 'ups': 0})],
 [('exactly at learn level #1', [50, [50, 60, 70, 80], [0]], {'skill': 51, 'ups': 1}),
  ('fault site learn gate #1', [64, [64, 79, 92, 99], [25, 75, 24, 74]], {'skill': 68, 'ups': 4}),
  ('fault site learn gate #2',
   [191, [191, 196, 208, 220], [99, 75, 74, 25, 74, 25, 0]],
   {'skill': 198, 'ups': 7}),
  ('partial repair boundary #1',
   [73, [74, 82, 84, 85], [13, 75, 47, 24, 25, 25]],
   {'skill': 73, 'ups': 0, 'error': 'too low'}),
  ('partial repair boundary #2',
   [210, [211, 216, 231, 243], [74, 74, 24]],
   {'skill': 210, 'ups': 0, 'error': 'too low'}),
  ('at cap #1', [299, [200, 250, 275, 320], [0, 0]], {'skill': 300, 'ups': 1}),
  ('gray recipe roll zero #1', [90, [50, 60, 70, 80], [0, 0]], {'skill': 90, 'ups': 0}),
  ('control #1', [84, [64, 70, 80, 85], [0, 99, 75, 25, 25, 99, 75, 0]], {'skill': 85, 'ups': 1})],
 [('exactly at learn level #1', [50, [50, 60, 70, 80], [0]], {'skill': 51, 'ups': 1}),
  ('fault site learn gate #1', [218, [218, 220, 224, 239], [74, 99]], {'skill': 220, 'ups': 2}),
  ('fault site learn gate #2', [265, [265, 266, 266, 277], [0, 75, 0, 0, 24]], {'skill': 269, 'ups': 4}),
  ('partial repair boundary #1',
   [65, [66, 71, 77, 79], [24, 24, 0, 24, 99, 25, 74, 0]],
   {'skill': 65, 'ups': 0, 'error': 'too low'}),
  ('partial repair boundary #2',
   [16, [17, 28, 39, 44], [25, 24]],
   {'skill': 16, 'ups': 0, 'error': 'too low'}),
  ('at cap #1', [299, [200, 250, 275, 320], [0, 0]], {'skill': 300, 'ups': 1}),
  ('gray recipe roll zero #1', [90, [50, 60, 70, 80], [0, 0]], {'skill': 90, 'ups': 0}),
  ('control #1', [289, [288, 314, 330, 340], [50, 0, 50, 0, 0]], {'skill': 294, 'ups': 5})]]
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
exactly at learn level #1{'skill': 51, 'ups': 1}{'skill': 51, 'ups': 1}Passed
fault site learn gate #1{'skill': 121, 'ups': 3}{'skill': 121, 'ups': 3}Passed
fault site learn gate #2{'skill': 63, 'ups': 2}{'skill': 63, 'ups': 2}Passed
partial repair boundary #1{'error': 'too low', 'skill': 135, 'ups': 0}{'error': 'too low', 'skill': 135, 'ups': 0}Passed
partial repair boundary #2{'error': 'too low', 'skill': 79, 'ups': 0}{'error': 'too low', 'skill': 79, 'ups': 0}Passed
at cap #1{'skill': 300, 'ups': 1}{'skill': 300, 'ups': 1}Passed
gray recipe roll zero #1{'skill': 90, 'ups': 0}{'skill': 90, 'ups': 0}Passed
control #1{'skill': 23, 'ups': 0}{'skill': 23, 'ups': 0}Passed

SHA-256 / 2886bbb3054faf8dc67c201d379e37fa9388645e12198c439eb10a3a260e5115

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

Case digest / 16559f2e84b6b16937666c62aaa2fedacacbf11a410584aa969a3b2c4151cdd6