{"abstract":"A freshly learned recipe reports skill too low.","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.","evaluation_group":"w2-game-economy-crafting-balance-profession-skillup","failed_approach":"The shifted test lets a crafter one point short craft.","family":"w2-game-economy-crafting-balance-profession-skillup-learn-gate","id":"FA-86231","implementations":{"attempt":{"sha256":"7792098d1d96ca1a8baaafb074cbfbd165a5eed1e17c3051a098089de91b3e66","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 + 1 < 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 = [[('exactly at learn level #1', [50, [50, 60, 70, 80], [0]], {'skill': 51, 'ups': 1}),\n  ('fault site learn gate #1', [118, [118, 118, 123, 131], [75, 0, 66, 99, 25]], {'skill': 121, 'ups': 3}),\n  ('fault site learn gate #2', [61, [61, 73, 84, 94], [75, 74]], {'skill': 63, 'ups': 2}),\n  ('partial repair boundary #1',\n   [135, [136, 138, 140, 143], [25, 25, 25, 7, 25, 0, 25, 25]],\n   {'skill': 135, 'ups': 0, 'error': 'too low'}),\n  ('partial repair boundary #2',\n   [79, [80, 91, 104, 106], [16, 74]],\n   {'skill': 79, 'ups': 0, 'error': 'too low'}),\n  ('at cap #1', [299, [200, 250, 275, 320], [0, 0]], {'skill': 300, '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 [('exactly at learn level #1', [50, [50, 60, 70, 80], [0]], {'skill': 51, 'ups': 1}),\n  ('fault site learn gate #1', [61, [61, 73, 84, 94], [75, 74]], {'skill': 63, 'ups': 2}),\n  ('fault site learn gate #2', [203, [203, 209, 219, 219], [13, 14]], {'skill': 205, 'ups': 2}),\n  ('partial repair boundary #1',\n   [32, [33, 46, 61, 75], [0, 0, 25, 0, 6]],\n   {'skill': 32, 'ups': 0, 'error': 'too low'}),\n  ('partial repair boundary #2', [75, [76, 79, 94, 104], [75]], {'skill': 75, 'ups': 0, 'error': 'too low'}),\n  ('at cap #1', [299, [200, 250, 275, 320], [0, 0]], {'skill': 300, '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 [('exactly at learn level #1', [50, [50, 60, 70, 80], [0]], {'skill': 51, 'ups': 1}),\n  ('fault site learn gate #1',\n   [90, [90, 94, 100, 110], [24, 74, 24, 24, 75, 75, 74]],\n   {'skill': 95, 'ups': 5}),\n  ('fault site learn gate #2',\n   [273, [273, 284, 330, 340], [0, 1, 50, 1, 0, 0, 1, 0, 50, 0, 50]],\n   {'skill': 284, 'ups': 11}),\n  ('partial repair boundary #1',\n   [9, [10, 12, 12, 19], [25, 99, 75, 99, 75, 56, 20, 75]],\n   {'skill': 9, 'ups': 0, 'error': 'too low'}),\n  ('partial repair boundary #2',\n   [28, [29, 34, 49, 62], [75, 74, 25, 99, 24, 24, 0, 64]],\n   {'skill': 28, 'ups': 0, 'error': 'too low'}),\n  ('at cap #1', [299, [200, 250, 275, 320], [0, 0]], {'skill': 300, '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 [('exactly at learn level #1', [50, [50, 60, 70, 80], [0]], {'skill': 51, 'ups': 1}),\n  ('fault site learn gate #1', [64, [64, 79, 92, 99], [25, 75, 24, 74]], {'skill': 68, 'ups': 4}),\n  ('fault site learn gate #2',\n   [191, [191, 196, 208, 220], [99, 75, 74, 25, 74, 25, 0]],\n   {'skill': 198, 'ups': 7}),\n  ('partial repair boundary #1',\n   [73, [74, 82, 84, 85], [13, 75, 47, 24, 25, 25]],\n   {'skill': 73, 'ups': 0, 'error': 'too low'}),\n  ('partial repair boundary #2',\n   [210, [211, 216, 231, 243], [74, 74, 24]],\n   {'skill': 210, 'ups': 0, 'error': 'too low'}),\n  ('at cap #1', [299, [200, 250, 275, 320], [0, 0]], {'skill': 300, '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 [('exactly at learn level #1', [50, [50, 60, 70, 80], [0]], {'skill': 51, 'ups': 1}),\n  ('fault site learn gate #1', [218, [218, 220, 224, 239], [74, 99]], {'skill': 220, 'ups': 2}),\n  ('fault site learn gate #2', [265, [265, 266, 266, 277], [0, 75, 0, 0, 24]], {'skill': 269, 'ups': 4}),\n  ('partial repair boundary #1',\n   [65, [66, 71, 77, 79], [24, 24, 0, 24, 99, 25, 74, 0]],\n   {'skill': 65, 'ups': 0, 'error': 'too low'}),\n  ('partial repair boundary #2',\n   [16, [17, 28, 39, 44], [25, 24]],\n   {'skill': 16, 'ups': 0, 'error': 'too low'}),\n  ('at cap #1', [299, [200, 250, 275, 320], [0, 0]], {'skill': 300, '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":"7147e56bb66a08d4e011faa767d442cfa1f9403f6fcc23304bc129c9dc2c65b6","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 = [[('exactly at learn level #1', [50, [50, 60, 70, 80], [0]], {'skill': 51, 'ups': 1}),\n  ('fault site learn gate #1', [118, [118, 118, 123, 131], [75, 0, 66, 99, 25]], {'skill': 121, 'ups': 3}),\n  ('fault site learn gate #2', [61, [61, 73, 84, 94], [75, 74]], {'skill': 63, 'ups': 2}),\n  ('partial repair boundary #1',\n   [135, [136, 138, 140, 143], [25, 25, 25, 7, 25, 0, 25, 25]],\n   {'skill': 135, 'ups': 0, 'error': 'too low'}),\n  ('partial repair boundary #2',\n   [79, [80, 91, 104, 106], [16, 74]],\n   {'skill': 79, 'ups': 0, 'error': 'too low'}),\n  ('at cap #1', [299, [200, 250, 275, 320], [0, 0]], {'skill': 300, '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 [('exactly at learn level #1', [50, [50, 60, 70, 80], [0]], {'skill': 51, 'ups': 1}),\n  ('fault site learn gate #1', [61, [61, 73, 84, 94], [75, 74]], {'skill': 63, 'ups': 2}),\n  ('fault site learn gate #2', [203, [203, 209, 219, 219], [13, 14]], {'skill': 205, 'ups': 2}),\n  ('partial repair boundary #1',\n   [32, [33, 46, 61, 75], [0, 0, 25, 0, 6]],\n   {'skill': 32, 'ups': 0, 'error': 'too low'}),\n  ('partial repair boundary #2', [75, [76, 79, 94, 104], [75]], {'skill': 75, 'ups': 0, 'error': 'too low'}),\n  ('at cap #1', [299, [200, 250, 275, 320], [0, 0]], {'skill': 300, '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 [('exactly at learn level #1', [50, [50, 60, 70, 80], [0]], {'skill': 51, 'ups': 1}),\n  ('fault site learn gate #1',\n   [90, [90, 94, 100, 110], [24, 74, 24, 24, 75, 75, 74]],\n   {'skill': 95, 'ups': 5}),\n  ('fault site learn gate #2',\n   [273, [273, 284, 330, 340], [0, 1, 50, 1, 0, 0, 1, 0, 50, 0, 50]],\n   {'skill': 284, 'ups': 11}),\n  ('partial repair boundary #1',\n   [9, [10, 12, 12, 19], [25, 99, 75, 99, 75, 56, 20, 75]],\n   {'skill': 9, 'ups': 0, 'error': 'too low'}),\n  ('partial repair boundary #2',\n   [28, [29, 34, 49, 62], [75, 74, 25, 99, 24, 24, 0, 64]],\n   {'skill': 28, 'ups': 0, 'error': 'too low'}),\n  ('at cap #1', [299, [200, 250, 275, 320], [0, 0]], {'skill': 300, '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 [('exactly at learn level #1', [50, [50, 60, 70, 80], [0]], {'skill': 51, 'ups': 1}),\n  ('fault site learn gate #1', [64, [64, 79, 92, 99], [25, 75, 24, 74]], {'skill': 68, 'ups': 4}),\n  ('fault site learn gate #2',\n   [191, [191, 196, 208, 220], [99, 75, 74, 25, 74, 25, 0]],\n   {'skill': 198, 'ups': 7}),\n  ('partial repair boundary #1',\n   [73, [74, 82, 84, 85], [13, 75, 47, 24, 25, 25]],\n   {'skill': 73, 'ups': 0, 'error': 'too low'}),\n  ('partial repair boundary #2',\n   [210, [211, 216, 231, 243], [74, 74, 24]],\n   {'skill': 210, 'ups': 0, 'error': 'too low'}),\n  ('at cap #1', [299, [200, 250, 275, 320], [0, 0]], {'skill': 300, '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 [('exactly at learn level #1', [50, [50, 60, 70, 80], [0]], {'skill': 51, 'ups': 1}),\n  ('fault site learn gate #1', [218, [218, 220, 224, 239], [74, 99]], {'skill': 220, 'ups': 2}),\n  ('fault site learn gate #2', [265, [265, 266, 266, 277], [0, 75, 0, 0, 24]], {'skill': 269, 'ups': 4}),\n  ('partial repair boundary #1',\n   [65, [66, 71, 77, 79], [24, 24, 0, 24, 99, 25, 74, 0]],\n   {'skill': 65, 'ups': 0, 'error': 'too low'}),\n  ('partial repair boundary #2',\n   [16, [17, 28, 39, 44], [25, 24]],\n   {'skill': 16, 'ups': 0, 'error': 'too low'}),\n  ('at cap #1', [299, [200, 250, 275, 320], [0, 0]], {'skill': 300, '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"},"fixed":{"sha256":"2886bbb3054faf8dc67c201d379e37fa9388645e12198c439eb10a3a260e5115","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 = [[('exactly at learn level #1', [50, [50, 60, 70, 80], [0]], {'skill': 51, 'ups': 1}),\n  ('fault site learn gate #1', [118, [118, 118, 123, 131], [75, 0, 66, 99, 25]], {'skill': 121, 'ups': 3}),\n  ('fault site learn gate #2', [61, [61, 73, 84, 94], [75, 74]], {'skill': 63, 'ups': 2}),\n  ('partial repair boundary #1',\n   [135, [136, 138, 140, 143], [25, 25, 25, 7, 25, 0, 25, 25]],\n   {'skill': 135, 'ups': 0, 'error': 'too low'}),\n  ('partial repair boundary #2',\n   [79, [80, 91, 104, 106], [16, 74]],\n   {'skill': 79, 'ups': 0, 'error': 'too low'}),\n  ('at cap #1', [299, [200, 250, 275, 320], [0, 0]], {'skill': 300, '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 [('exactly at learn level #1', [50, [50, 60, 70, 80], [0]], {'skill': 51, 'ups': 1}),\n  ('fault site learn gate #1', [61, [61, 73, 84, 94], [75, 74]], {'skill': 63, 'ups': 2}),\n  ('fault site learn gate #2', [203, [203, 209, 219, 219], [13, 14]], {'skill': 205, 'ups': 2}),\n  ('partial repair boundary #1',\n   [32, [33, 46, 61, 75], [0, 0, 25, 0, 6]],\n   {'skill': 32, 'ups': 0, 'error': 'too low'}),\n  ('partial repair boundary #2', [75, [76, 79, 94, 104], [75]], {'skill': 75, 'ups': 0, 'error': 'too low'}),\n  ('at cap #1', [299, [200, 250, 275, 320], [0, 0]], {'skill': 300, '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 [('exactly at learn level #1', [50, [50, 60, 70, 80], [0]], {'skill': 51, 'ups': 1}),\n  ('fault site learn gate #1',\n   [90, [90, 94, 100, 110], [24, 74, 24, 24, 75, 75, 74]],\n   {'skill': 95, 'ups': 5}),\n  ('fault site learn gate #2',\n   [273, [273, 284, 330, 340], [0, 1, 50, 1, 0, 0, 1, 0, 50, 0, 50]],\n   {'skill': 284, 'ups': 11}),\n  ('partial repair boundary #1',\n   [9, [10, 12, 12, 19], [25, 99, 75, 99, 75, 56, 20, 75]],\n   {'skill': 9, 'ups': 0, 'error': 'too low'}),\n  ('partial repair boundary #2',\n   [28, [29, 34, 49, 62], [75, 74, 25, 99, 24, 24, 0, 64]],\n   {'skill': 28, 'ups': 0, 'error': 'too low'}),\n  ('at cap #1', [299, [200, 250, 275, 320], [0, 0]], {'skill': 300, '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 [('exactly at learn level #1', [50, [50, 60, 70, 80], [0]], {'skill': 51, 'ups': 1}),\n  ('fault site learn gate #1', [64, [64, 79, 92, 99], [25, 75, 24, 74]], {'skill': 68, 'ups': 4}),\n  ('fault site learn gate #2',\n   [191, [191, 196, 208, 220], [99, 75, 74, 25, 74, 25, 0]],\n   {'skill': 198, 'ups': 7}),\n  ('partial repair boundary #1',\n   [73, [74, 82, 84, 85], [13, 75, 47, 24, 25, 25]],\n   {'skill': 73, 'ups': 0, 'error': 'too low'}),\n  ('partial repair boundary #2',\n   [210, [211, 216, 231, 243], [74, 74, 24]],\n   {'skill': 210, 'ups': 0, 'error': 'too low'}),\n  ('at cap #1', [299, [200, 250, 275, 320], [0, 0]], {'skill': 300, '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 [('exactly at learn level #1', [50, [50, 60, 70, 80], [0]], {'skill': 51, 'ups': 1}),\n  ('fault site learn gate #1', [218, [218, 220, 224, 239], [74, 99]], {'skill': 220, 'ups': 2}),\n  ('fault site learn gate #2', [265, [265, 266, 266, 277], [0, 75, 0, 0, 24]], {'skill': 269, 'ups': 4}),\n  ('partial repair boundary #1',\n   [65, [66, 71, 77, 79], [24, 24, 0, 24, 99, 25, 74, 0]],\n   {'skill': 65, 'ups': 0, 'error': 'too low'}),\n  ('partial repair boundary #2',\n   [16, [17, 28, 39, 44], [25, 24]],\n   {'skill': 16, 'ups': 0, 'error': 'too low'}),\n  ('at cap #1', [299, [200, 250, 275, 320], [0, 0]], {'skill': 300, '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-learn-gate","generated_at":"2026-09-29T14:50:47.634808+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.","repair":"Restore `if skill < learn:` at the learn gate step.","root_cause":"The learn gate is inclusive of the learn level.","sha256":"16559f2e84b6b16937666c62aaa2fedacacbf11a410584aa969a3b2c4151cdd6","title":"Profession skill-up colors: Recipe cannot be crafted at its learn level · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":42.809,"exit_code":1,"observations":[{"actual":{"skill":51,"ups":1},"check":"exactly at learn level #1","expected":{"skill":51,"ups":1},"passed":true},{"actual":{"skill":121,"ups":3},"check":"fault site learn gate #1","expected":{"skill":121,"ups":3},"passed":true},{"actual":{"skill":63,"ups":2},"check":"fault site learn gate #2","expected":{"skill":63,"ups":2},"passed":true},{"actual":{"skill":141,"ups":6},"check":"partial repair boundary #1","expected":{"error":"too low","skill":135,"ups":0},"passed":false},{"actual":{"skill":81,"ups":2},"check":"partial repair boundary #2","expected":{"error":"too low","skill":79,"ups":0},"passed":false},{"actual":{"skill":300,"ups":1},"check":"at cap #1","expected":{"skill":300,"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\": \"exactly at learn level #1\", \"actual\": {\"skill\": 51, \"ups\": 1}, \"expected\": {\"skill\": 51, \"ups\": 1}, \"passed\": true}, {\"check\": \"fault site learn gate #1\", \"actual\": {\"skill\": 121, \"ups\": 3}, \"expected\": {\"skill\": 121, \"ups\": 3}, \"passed\": true}, {\"check\": \"fault site learn gate #2\", \"actual\": {\"skill\": 63, \"ups\": 2}, \"expected\": {\"skill\": 63, \"ups\": 2}, \"passed\": true}, {\"check\": \"partial repair boundary #1\", \"actual\": {\"skill\": 141, \"ups\": 6}, \"expected\": {\"skill\": 135, \"ups\": 0, \"error\": \"too low\"}, \"passed\": false}, {\"check\": \"partial repair boundary #2\", \"actual\": {\"skill\": 81, \"ups\": 2}, \"expected\": {\"skill\": 79, \"ups\": 0, \"error\": \"too low\"}, \"passed\": false}, {\"check\": \"at cap #1\", \"actual\": {\"skill\": 300, \"ups\": 1}, \"expected\": {\"skill\": 300, \"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":41.565,"exit_code":1,"observations":[{"actual":{"error":"too low","skill":50,"ups":0},"check":"exactly at learn level #1","expected":{"skill":51,"ups":1},"passed":false},{"actual":{"error":"too low","skill":118,"ups":0},"check":"fault site learn gate #1","expected":{"skill":121,"ups":3},"passed":false},{"actual":{"error":"too low","skill":61,"ups":0},"check":"fault site learn gate #2","expected":{"skill":63,"ups":2},"passed":false},{"actual":{"error":"too low","skill":135,"ups":0},"check":"partial repair boundary #1","expected":{"error":"too low","skill":135,"ups":0},"passed":true},{"actual":{"error":"too low","skill":79,"ups":0},"check":"partial repair boundary #2","expected":{"error":"too low","skill":79,"ups":0},"passed":true},{"actual":{"skill":300,"ups":1},"check":"at cap #1","expected":{"skill":300,"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\": \"exactly at learn level #1\", \"actual\": {\"skill\": 50, \"ups\": 0, \"error\": \"too low\"}, \"expected\": {\"skill\": 51, \"ups\": 1}, \"passed\": false}, {\"check\": \"fault site learn gate #1\", \"actual\": {\"skill\": 118, \"ups\": 0, \"error\": \"too low\"}, \"expected\": {\"skill\": 121, \"ups\": 3}, \"passed\": false}, {\"check\": \"fault site learn gate #2\", \"actual\": {\"skill\": 61, \"ups\": 0, \"error\": \"too low\"}, \"expected\": {\"skill\": 63, \"ups\": 2}, \"passed\": false}, {\"check\": \"partial repair boundary #1\", \"actual\": {\"skill\": 135, \"ups\": 0, \"error\": \"too low\"}, \"expected\": {\"skill\": 135, \"ups\": 0, \"error\": \"too low\"}, \"passed\": true}, {\"check\": \"partial repair boundary #2\", \"actual\": {\"skill\": 79, \"ups\": 0, \"error\": \"too low\"}, \"expected\": {\"skill\": 79, \"ups\": 0, \"error\": \"too low\"}, \"passed\": true}, {\"check\": \"at cap #1\", \"actual\": {\"skill\": 300, \"ups\": 1}, \"expected\": {\"skill\": 300, \"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"},"fixed":{"elapsed_ms":40.666,"exit_code":0,"observations":[{"actual":{"skill":51,"ups":1},"check":"exactly at learn level #1","expected":{"skill":51,"ups":1},"passed":true},{"actual":{"skill":121,"ups":3},"check":"fault site learn gate #1","expected":{"skill":121,"ups":3},"passed":true},{"actual":{"skill":63,"ups":2},"check":"fault site learn gate #2","expected":{"skill":63,"ups":2},"passed":true},{"actual":{"error":"too low","skill":135,"ups":0},"check":"partial repair boundary #1","expected":{"error":"too low","skill":135,"ups":0},"passed":true},{"actual":{"error":"too low","skill":79,"ups":0},"check":"partial repair boundary #2","expected":{"error":"too low","skill":79,"ups":0},"passed":true},{"actual":{"skill":300,"ups":1},"check":"at cap #1","expected":{"skill":300,"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":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"exactly at learn level #1\", \"actual\": {\"skill\": 51, \"ups\": 1}, \"expected\": {\"skill\": 51, \"ups\": 1}, \"passed\": true}, {\"check\": \"fault site learn gate #1\", \"actual\": {\"skill\": 121, \"ups\": 3}, \"expected\": {\"skill\": 121, \"ups\": 3}, \"passed\": true}, {\"check\": \"fault site learn gate #2\", \"actual\": {\"skill\": 63, \"ups\": 2}, \"expected\": {\"skill\": 63, \"ups\": 2}, \"passed\": true}, {\"check\": \"partial repair boundary #1\", \"actual\": {\"skill\": 135, \"ups\": 0, \"error\": \"too low\"}, \"expected\": {\"skill\": 135, \"ups\": 0, \"error\": \"too low\"}, \"passed\": true}, {\"check\": \"partial repair boundary #2\", \"actual\": {\"skill\": 79, \"ups\": 0, \"error\": \"too low\"}, \"expected\": {\"skill\": 79, \"ups\": 0, \"error\": \"too low\"}, \"passed\": true}, {\"check\": \"at cap #1\", \"actual\": {\"skill\": 300, \"ups\": 1}, \"expected\": {\"skill\": 300, \"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\": true}\n"}},"verified":true,"visibility":"public"}