{"abstract":"Crafting at 300 raises skill to 301.","category":"Game economy crafting balance","checks":8,"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.","contract_signature":"skill, recipe_levels, rolls","evaluation_group":"w2-game-economy-crafting-balance-profession-skillup","failed_approach":"Adding ups double-counts gains already folded into skill.","family":"w2-game-economy-crafting-balance-profession-skillup-skill-cap","id":"FA-86236","implementations":{"attempt":{"sha256":"ada66968ca0b5087e5c5ecf6d3549b33ba0dfd7e83b79b11112ab04a8cfdb791","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(skill, recipe_levels, rolls):\n    learn, yellow, green, gray = recipe_levels\n    if skill < learn:\n        return {'skill': skill, 'ups': 0, 'error': 'too low'}\n    ups = 0\n    for r in rolls:\n        if skill + ups >= 300:\n            break\n        if skill < yellow:\n            chance = 100\n        elif skill < green:\n            chance = 75\n        elif skill < gray:\n            chance = 25\n        else:\n            chance = 0\n        if r < chance:\n            skill += 1\n            ups += 1\n    return {'skill': skill, 'ups': ups}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = [[('at cap #1', [299, [200, 250, 275, 320], [0, 0]], {'skill': 300, 'ups': 1}),\n  ('fault site skill cap #1',\n   [299, [277, 291, 302, 311], [74, 74, 74, 75, 14, 25, 25, 99]],\n   {'skill': 300, 'ups': 1}),\n  ('regression skill cap #1',\n   [291, [288, 328, 330, 340], [50, 50, 0, 0, 0, 50, 0, 1, 50, 0, 50]],\n   {'skill': 300, 'ups': 9}),\n  ('regression skill cap #2',\n   [291, [289, 309, 330, 340], [0, 0, 1, 1, 1, 50, 0, 1, 1, 1]],\n   {'skill': 300, 'ups': 9}),\n  ('partial repair boundary #1',\n   [278, [271, 282, 330, 340], [0, 0, 50, 50, 50, 1, 0, 50, 1, 1, 50, 1]],\n   {'skill': 290, 'ups': 12}),\n  ('exactly at learn level #1', [50, [50, 60, 70, 80], [0]], {'skill': 51, 'ups': 1}),\n  ('gray recipe roll zero #1', [90, [50, 60, 70, 80], [0, 0]], {'skill': 90, 'ups': 0}),\n  ('control #1', [23, [8, 14, 23, 38], [75]], {'skill': 23, 'ups': 0})],\n [('at cap #1', [299, [200, 250, 275, 320], [0, 0]], {'skill': 300, 'ups': 1}),\n  ('regression skill cap #1',\n   [291, [288, 328, 330, 340], [50, 50, 0, 0, 0, 50, 0, 1, 50, 0, 50]],\n   {'skill': 300, 'ups': 9}),\n  ('regression skill cap #2',\n   [291, [289, 309, 330, 340], [0, 0, 1, 1, 1, 50, 0, 1, 1, 1]],\n   {'skill': 300, 'ups': 9}),\n  ('partial repair boundary #1',\n   [278, [271, 282, 330, 340], [0, 0, 50, 50, 50, 1, 0, 50, 1, 1, 50, 1]],\n   {'skill': 290, 'ups': 12}),\n  ('regression skill cap #3',\n   [296, [288, 306, 330, 340], [50, 1, 50, 1, 0, 50, 1]],\n   {'skill': 300, 'ups': 4}),\n  ('exactly at learn level #1', [50, [50, 60, 70, 80], [0]], {'skill': 51, 'ups': 1}),\n  ('gray recipe roll zero #1', [90, [50, 60, 70, 80], [0, 0]], {'skill': 90, 'ups': 0}),\n  ('control #1', [23, [8, 14, 23, 38], [75]], {'skill': 23, 'ups': 0})],\n [('at cap #1', [299, [200, 250, 275, 320], [0, 0]], {'skill': 300, 'ups': 1}),\n  ('regression skill cap #1',\n   [296, [288, 306, 330, 340], [50, 1, 50, 1, 0, 50, 1]],\n   {'skill': 300, 'ups': 4}),\n  ('regression skill cap #2',\n   [293, [292, 315, 330, 340], [0, 50, 1, 50, 50, 50, 1, 0, 50]],\n   {'skill': 300, 'ups': 7}),\n  ('partial repair boundary #1',\n   [283, [277, 302, 330, 340], [1, 1, 1, 50, 0, 0, 0, 50, 1, 1]],\n   {'skill': 293, 'ups': 10}),\n  ('regression skill cap #3',\n   [295, [291, 301, 330, 340], [50, 50, 1, 1, 1, 0, 50, 1, 0, 1, 0]],\n   {'skill': 300, 'ups': 5}),\n  ('exactly at learn level #1', [50, [50, 60, 70, 80], [0]], {'skill': 51, 'ups': 1}),\n  ('gray recipe roll zero #1', [90, [50, 60, 70, 80], [0, 0]], {'skill': 90, 'ups': 0}),\n  ('control #1', [23, [8, 14, 23, 38], [75]], {'skill': 23, 'ups': 0})],\n [('at cap #1', [299, [200, 250, 275, 320], [0, 0]], {'skill': 300, 'ups': 1}),\n  ('regression skill cap #1',\n   [295, [291, 301, 330, 340], [50, 50, 1, 1, 1, 0, 50, 1, 0, 1, 0]],\n   {'skill': 300, 'ups': 5}),\n  ('fault site skill cap #1',\n   [299, [292, 308, 330, 340], [50, 1, 1, 0, 1, 0, 1, 1]],\n   {'skill': 300, 'ups': 1}),\n  ('partial repair boundary #1',\n   [287, [281, 296, 330, 340], [1, 1, 50, 0, 0, 0, 50, 1, 1, 50, 0]],\n   {'skill': 298, 'ups': 11}),\n  ('partial repair boundary #2',\n   [293, [288, 298, 330, 340], [50, 0, 50, 0, 0, 50]],\n   {'skill': 299, 'ups': 6}),\n  ('exactly at learn level #1', [50, [50, 60, 70, 80], [0]], {'skill': 51, 'ups': 1}),\n  ('gray recipe roll zero #1', [90, [50, 60, 70, 80], [0, 0]], {'skill': 90, 'ups': 0}),\n  ('control #1', [84, [64, 70, 80, 85], [0, 99, 75, 25, 25, 99, 75, 0]], {'skill': 85, 'ups': 1})],\n [('at cap #1', [299, [200, 250, 275, 320], [0, 0]], {'skill': 300, 'ups': 1}),\n  ('regression skill cap #1',\n   [292, [286, 325, 330, 340], [50, 1, 50, 0, 50, 0, 0, 50, 1]],\n   {'skill': 300, 'ups': 8}),\n  ('fault site skill cap #1',\n   [299, [270, 285, 297, 302], [24, 24, 74, 24, 47, 0, 99]],\n   {'skill': 300, 'ups': 1}),\n  ('partial repair boundary #1',\n   [293, [288, 298, 330, 340], [50, 0, 50, 0, 0, 50]],\n   {'skill': 299, 'ups': 6}),\n  ('partial repair boundary #2',\n   [286, [281, 305, 330, 340], [50, 1, 1, 0, 50, 0, 50, 0, 0]],\n   {'skill': 295, 'ups': 9}),\n  ('exactly at learn level #1', [50, [50, 60, 70, 80], [0]], {'skill': 51, 'ups': 1}),\n  ('gray recipe roll zero #1', [90, [50, 60, 70, 80], [0, 0]], {'skill': 90, 'ups': 0}),\n  ('control #1', [289, [288, 314, 330, 340], [50, 0, 50, 0, 0]], {'skill': 294, 'ups': 5})]]\nfor label, args, expected in cases[N-1]:\n    check(label, solve(*args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"broken":{"sha256":"f97f057dfd83687c78b5687006316833cb6c656cdcd78caa1f7d2ea9c95db6e0","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(skill, recipe_levels, rolls):\n    learn, yellow, green, gray = recipe_levels\n    if skill < learn:\n        return {'skill': skill, 'ups': 0, 'error': 'too low'}\n    ups = 0\n    for r in rolls:\n        if skill > 300:\n            break\n        if skill < yellow:\n            chance = 100\n        elif skill < green:\n            chance = 75\n        elif skill < gray:\n            chance = 25\n        else:\n            chance = 0\n        if r < chance:\n            skill += 1\n            ups += 1\n    return {'skill': skill, 'ups': ups}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = [[('at cap #1', [299, [200, 250, 275, 320], [0, 0]], {'skill': 300, 'ups': 1}),\n  ('fault site skill cap #1',\n   [299, [277, 291, 302, 311], [74, 74, 74, 75, 14, 25, 25, 99]],\n   {'skill': 300, 'ups': 1}),\n  ('regression skill cap #1',\n   [291, [288, 328, 330, 340], [50, 50, 0, 0, 0, 50, 0, 1, 50, 0, 50]],\n   {'skill': 300, 'ups': 9}),\n  ('regression skill cap #2',\n   [291, [289, 309, 330, 340], [0, 0, 1, 1, 1, 50, 0, 1, 1, 1]],\n   {'skill': 300, 'ups': 9}),\n  ('partial repair boundary #1',\n   [278, [271, 282, 330, 340], [0, 0, 50, 50, 50, 1, 0, 50, 1, 1, 50, 1]],\n   {'skill': 290, 'ups': 12}),\n  ('exactly at learn level #1', [50, [50, 60, 70, 80], [0]], {'skill': 51, 'ups': 1}),\n  ('gray recipe roll zero #1', [90, [50, 60, 70, 80], [0, 0]], {'skill': 90, 'ups': 0}),\n  ('control #1', [23, [8, 14, 23, 38], [75]], {'skill': 23, 'ups': 0})],\n [('at cap #1', [299, [200, 250, 275, 320], [0, 0]], {'skill': 300, 'ups': 1}),\n  ('regression skill cap #1',\n   [291, [288, 328, 330, 340], [50, 50, 0, 0, 0, 50, 0, 1, 50, 0, 50]],\n   {'skill': 300, 'ups': 9}),\n  ('regression skill cap #2',\n   [291, [289, 309, 330, 340], [0, 0, 1, 1, 1, 50, 0, 1, 1, 1]],\n   {'skill': 300, 'ups': 9}),\n  ('partial repair boundary #1',\n   [278, [271, 282, 330, 340], [0, 0, 50, 50, 50, 1, 0, 50, 1, 1, 50, 1]],\n   {'skill': 290, 'ups': 12}),\n  ('regression skill cap #3',\n   [296, [288, 306, 330, 340], [50, 1, 50, 1, 0, 50, 1]],\n   {'skill': 300, 'ups': 4}),\n  ('exactly at learn level #1', [50, [50, 60, 70, 80], [0]], {'skill': 51, 'ups': 1}),\n  ('gray recipe roll zero #1', [90, [50, 60, 70, 80], [0, 0]], {'skill': 90, 'ups': 0}),\n  ('control #1', [23, [8, 14, 23, 38], [75]], {'skill': 23, 'ups': 0})],\n [('at cap #1', [299, [200, 250, 275, 320], [0, 0]], {'skill': 300, 'ups': 1}),\n  ('regression skill cap #1',\n   [296, [288, 306, 330, 340], [50, 1, 50, 1, 0, 50, 1]],\n   {'skill': 300, 'ups': 4}),\n  ('regression skill cap #2',\n   [293, [292, 315, 330, 340], [0, 50, 1, 50, 50, 50, 1, 0, 50]],\n   {'skill': 300, 'ups': 7}),\n  ('partial repair boundary #1',\n   [283, [277, 302, 330, 340], [1, 1, 1, 50, 0, 0, 0, 50, 1, 1]],\n   {'skill': 293, 'ups': 10}),\n  ('regression skill cap #3',\n   [295, [291, 301, 330, 340], [50, 50, 1, 1, 1, 0, 50, 1, 0, 1, 0]],\n   {'skill': 300, 'ups': 5}),\n  ('exactly at learn level #1', [50, [50, 60, 70, 80], [0]], {'skill': 51, 'ups': 1}),\n  ('gray recipe roll zero #1', [90, [50, 60, 70, 80], [0, 0]], {'skill': 90, 'ups': 0}),\n  ('control #1', [23, [8, 14, 23, 38], [75]], {'skill': 23, 'ups': 0})],\n [('at cap #1', [299, [200, 250, 275, 320], [0, 0]], {'skill': 300, 'ups': 1}),\n  ('regression skill cap #1',\n   [295, [291, 301, 330, 340], [50, 50, 1, 1, 1, 0, 50, 1, 0, 1, 0]],\n   {'skill': 300, 'ups': 5}),\n  ('fault site skill cap #1',\n   [299, [292, 308, 330, 340], [50, 1, 1, 0, 1, 0, 1, 1]],\n   {'skill': 300, 'ups': 1}),\n  ('partial repair boundary #1',\n   [287, [281, 296, 330, 340], [1, 1, 50, 0, 0, 0, 50, 1, 1, 50, 0]],\n   {'skill': 298, 'ups': 11}),\n  ('partial repair boundary #2',\n   [293, [288, 298, 330, 340], [50, 0, 50, 0, 0, 50]],\n   {'skill': 299, 'ups': 6}),\n  ('exactly at learn level #1', [50, [50, 60, 70, 80], [0]], {'skill': 51, 'ups': 1}),\n  ('gray recipe roll zero #1', [90, [50, 60, 70, 80], [0, 0]], {'skill': 90, 'ups': 0}),\n  ('control #1', [84, [64, 70, 80, 85], [0, 99, 75, 25, 25, 99, 75, 0]], {'skill': 85, 'ups': 1})],\n [('at cap #1', [299, [200, 250, 275, 320], [0, 0]], {'skill': 300, 'ups': 1}),\n  ('regression skill cap #1',\n   [292, [286, 325, 330, 340], [50, 1, 50, 0, 50, 0, 0, 50, 1]],\n   {'skill': 300, 'ups': 8}),\n  ('fault site skill cap #1',\n   [299, [270, 285, 297, 302], [24, 24, 74, 24, 47, 0, 99]],\n   {'skill': 300, 'ups': 1}),\n  ('partial repair boundary #1',\n   [293, [288, 298, 330, 340], [50, 0, 50, 0, 0, 50]],\n   {'skill': 299, 'ups': 6}),\n  ('partial repair boundary #2',\n   [286, [281, 305, 330, 340], [50, 1, 1, 0, 50, 0, 50, 0, 0]],\n   {'skill': 295, 'ups': 9}),\n  ('exactly at learn level #1', [50, [50, 60, 70, 80], [0]], {'skill': 51, 'ups': 1}),\n  ('gray recipe roll zero #1', [90, [50, 60, 70, 80], [0, 0]], {'skill': 90, 'ups': 0}),\n  ('control #1', [289, [288, 314, 330, 340], [50, 0, 50, 0, 0]], {'skill': 294, 'ups': 5})]]\nfor label, args, expected in cases[N-1]:\n    check(label, solve(*args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"}},"limitations":"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.","method":"Deterministic executable model with adversarial boundary fixtures.","provenance":{"created_by":"Failure Map","dependencies":"Python standard library","family":"w2-game-economy-crafting-balance-profession-skillup-skill-cap","generated_at":"2026-09-29T14:50:47.635223+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"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.","root_cause":"The cap check is strict.","sha256":"b20551ceb4ff0382bd0dc066998f93e19813a60f2dced20abe4792d79b34e1f6","title":"Profession skill-up colors: Skill passes the hard cap · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verified":true,"visibility":"public","verification":{"attempt":{"elapsed_ms":40.359,"exit_code":1,"observations":[{"actual":{"skill":300,"ups":1},"check":"at cap #1","expected":{"skill":300,"ups":1},"passed":true},{"actual":{"skill":300,"ups":1},"check":"fault site skill cap #1","expected":{"skill":300,"ups":1},"passed":true},{"actual":{"skill":296,"ups":5},"check":"regression skill cap #1","expected":{"skill":300,"ups":9},"passed":false},{"actual":{"skill":296,"ups":5},"check":"regression skill cap #2","expected":{"skill":300,"ups":9},"passed":false},{"actual":{"skill":289,"ups":11},"check":"partial repair boundary #1","expected":{"skill":290,"ups":12},"passed":false},{"actual":{"skill":51,"ups":1},"check":"exactly at learn level #1","expected":{"skill":51,"ups":1},"passed":true},{"actual":{"skill":90,"ups":0},"check":"gray recipe roll zero #1","expected":{"skill":90,"ups":0},"passed":true},{"actual":{"skill":23,"ups":0},"check":"control #1","expected":{"skill":23,"ups":0},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"at cap #1\", \"actual\": {\"skill\": 300, \"ups\": 1}, \"expected\": {\"skill\": 300, \"ups\": 1}, \"passed\": true}, {\"check\": \"fault site skill cap #1\", \"actual\": {\"skill\": 300, \"ups\": 1}, \"expected\": {\"skill\": 300, \"ups\": 1}, \"passed\": true}, {\"check\": \"regression skill cap #1\", \"actual\": {\"skill\": 296, \"ups\": 5}, \"expected\": {\"skill\": 300, \"ups\": 9}, \"passed\": false}, {\"check\": \"regression skill cap #2\", \"actual\": {\"skill\": 296, \"ups\": 5}, \"expected\": {\"skill\": 300, \"ups\": 9}, \"passed\": false}, {\"check\": \"partial repair boundary #1\", \"actual\": {\"skill\": 289, \"ups\": 11}, \"expected\": {\"skill\": 290, \"ups\": 12}, \"passed\": false}, {\"check\": \"exactly at learn level #1\", \"actual\": {\"skill\": 51, \"ups\": 1}, \"expected\": {\"skill\": 51, \"ups\": 1}, \"passed\": true}, {\"check\": \"gray recipe roll zero #1\", \"actual\": {\"skill\": 90, \"ups\": 0}, \"expected\": {\"skill\": 90, \"ups\": 0}, \"passed\": true}, {\"check\": \"control #1\", \"actual\": {\"skill\": 23, \"ups\": 0}, \"expected\": {\"skill\": 23, \"ups\": 0}, \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":40.884,"exit_code":1,"observations":[{"actual":{"skill":301,"ups":2},"check":"at cap #1","expected":{"skill":300,"ups":1},"passed":false},{"actual":{"skill":301,"ups":2},"check":"fault site skill cap #1","expected":{"skill":300,"ups":1},"passed":false},{"actual":{"skill":301,"ups":10},"check":"regression skill cap #1","expected":{"skill":300,"ups":9},"passed":false},{"actual":{"skill":301,"ups":10},"check":"regression skill cap #2","expected":{"skill":300,"ups":9},"passed":false},{"actual":{"skill":290,"ups":12},"check":"partial repair boundary #1","expected":{"skill":290,"ups":12},"passed":true},{"actual":{"skill":51,"ups":1},"check":"exactly at learn level #1","expected":{"skill":51,"ups":1},"passed":true},{"actual":{"skill":90,"ups":0},"check":"gray recipe roll zero #1","expected":{"skill":90,"ups":0},"passed":true},{"actual":{"skill":23,"ups":0},"check":"control #1","expected":{"skill":23,"ups":0},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"at cap #1\", \"actual\": {\"skill\": 301, \"ups\": 2}, \"expected\": {\"skill\": 300, \"ups\": 1}, \"passed\": false}, {\"check\": \"fault site skill cap #1\", \"actual\": {\"skill\": 301, \"ups\": 2}, \"expected\": {\"skill\": 300, \"ups\": 1}, \"passed\": false}, {\"check\": \"regression skill cap #1\", \"actual\": {\"skill\": 301, \"ups\": 10}, \"expected\": {\"skill\": 300, \"ups\": 9}, \"passed\": false}, {\"check\": \"regression skill cap #2\", \"actual\": {\"skill\": 301, \"ups\": 10}, \"expected\": {\"skill\": 300, \"ups\": 9}, \"passed\": false}, {\"check\": \"partial repair boundary #1\", \"actual\": {\"skill\": 290, \"ups\": 12}, \"expected\": {\"skill\": 290, \"ups\": 12}, \"passed\": true}, {\"check\": \"exactly at learn level #1\", \"actual\": {\"skill\": 51, \"ups\": 1}, \"expected\": {\"skill\": 51, \"ups\": 1}, \"passed\": true}, {\"check\": \"gray recipe roll zero #1\", \"actual\": {\"skill\": 90, \"ups\": 0}, \"expected\": {\"skill\": 90, \"ups\": 0}, \"passed\": true}, {\"check\": \"control #1\", \"actual\": {\"skill\": 23, \"ups\": 0}, \"expected\": {\"skill\": 23, \"ups\": 0}, \"passed\": true}], \"passed\": false}\n"}},"member_only":{"stages":["fixed"],"fields":["implementations.fixed","verification.fixed","harness","repair"],"note":"The verified repair, its recorded checks, the repair description, and the scoring harness are available to members."}}