{"abstract":"Items are protected by a phantom scroll and protection count goes negative.","category":"Game economy crafting balance","checks":8,"contract":"Success chance (percent) from level L: [100,100,100,90,80,70,60,50,40,30][L]; max level 10. A roll r (0..99) succeeds when r < chance. Failure at L <= 5 keeps the level; at L >= 6 consumes a protection if one is left (level kept); otherwise L 6..7 downgrades by one and L >= 8 breaks the item. Rolls stop being consumed once the item is at max level or broken; used counts consumed rolls.","evaluation_group":"w2-game-economy-crafting-balance-enchant-ladder","failed_approach":"Requiring two scrolls wastes the last scroll and lets the item degrade.","family":"w2-game-economy-crafting-balance-enchant-ladder-protection-availability","id":"FA-86036","implementations":{"attempt":{"sha256":"fb8c2680d7d0bee35e48dd623a52c7a3c6055caee138b3f2759bd2651538b981","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(level, rolls, protections):\n    chance = [100, 100, 100, 90, 80, 70, 60, 50, 40, 30]\n    used = 0\n    broken = False\n    for r in rolls:\n        if level >= 10 or broken:\n            break\n        used += 1\n        if r < chance[level]:\n            level += 1\n        elif level >= 6:\n            if protections > 1:\n                protections -= 1\n            elif level >= 8:\n                broken = True\n            else:\n                level -= 1\n    return {'level': level, 'broken': broken, 'protections': protections, 'used': used}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = [[('break at eight #1', [8, [95, 0], 0], {'level': 8, 'broken': True, 'protections': 0, 'used': 1}),\n  ('protected downgrade #1', [6, [70, 70], 1], {'level': 5, 'broken': False, 'protections': 0, 'used': 2}),\n  ('regression protection availability #1',\n   [9, [39, 30, 99, 29, 59, 99, 0], 1],\n   {'level': 9, 'broken': True, 'protections': 0, 'used': 2}),\n  ('fault site protection availability #1',\n   [9, [99, 30], 0],\n   {'level': 9, 'broken': True, 'protections': 0, 'used': 1}),\n  ('regression protection availability #2',\n   [8, [49, 40, 59], 2],\n   {'level': 8, 'broken': True, 'protections': 0, 'used': 3}),\n  ('regression protection availability #3',\n   [8, [89, 89], 1],\n   {'level': 8, 'broken': True, 'protections': 0, 'used': 2}),\n  ('boundary roll equals chance #1',\n   [4, [80], 0],\n   {'level': 4, 'broken': False, 'protections': 0, 'used': 1}),\n  ('control #1', [10, [90, 49, 29], 0], {'level': 10, 'broken': False, 'protections': 0, 'used': 0})],\n [('protected downgrade #1', [6, [70, 70], 1], {'level': 5, 'broken': False, 'protections': 0, 'used': 2}),\n  ('regression protection availability #1',\n   [9, [39, 30, 99, 29, 59, 99, 0], 1],\n   {'level': 9, 'broken': True, 'protections': 0, 'used': 2}),\n  ('fault site protection availability #1',\n   [9, [99, 30], 0],\n   {'level': 9, 'broken': True, 'protections': 0, 'used': 1}),\n  ('regression protection availability #2',\n   [8, [49, 40, 59], 2],\n   {'level': 8, 'broken': True, 'protections': 0, 'used': 3}),\n  ('regression protection availability #3',\n   [8, [89, 89], 1],\n   {'level': 8, 'broken': True, 'protections': 0, 'used': 2}),\n  ('boundary roll equals chance #1',\n   [4, [80], 0],\n   {'level': 4, 'broken': False, 'protections': 0, 'used': 1}),\n  ('control #1',\n   [0, [0, 30, 89, 99, 60, 0, 59, 59], 2],\n   {'level': 7, 'broken': False, 'protections': 2, 'used': 8}),\n  ('control #2',\n   [10, [34, 29, 90, 63, 0, 60, 59], 0],\n   {'level': 10, 'broken': False, 'protections': 0, 'used': 0})],\n [('break at eight #1', [8, [95, 0], 0], {'level': 8, 'broken': True, 'protections': 0, 'used': 1}),\n  ('protected downgrade #1', [6, [70, 70], 1], {'level': 5, 'broken': False, 'protections': 0, 'used': 2}),\n  ('fault site protection availability #1',\n   [9, [50, 40, 50, 0, 40, 29, 0], 0],\n   {'level': 9, 'broken': True, 'protections': 0, 'used': 1}),\n  ('regression protection availability #1',\n   [8, [49, 40, 59], 2],\n   {'level': 8, 'broken': True, 'protections': 0, 'used': 3}),\n  ('regression protection availability #2',\n   [6, [40, 99, 50, 50, 29, 60], 1],\n   {'level': 8, 'broken': True, 'protections': 0, 'used': 6}),\n  ('regression protection availability #3',\n   [8, [49, 29, 59, 0], 1],\n   {'level': 9, 'broken': True, 'protections': 0, 'used': 3}),\n  ('boundary roll equals chance #1',\n   [4, [80], 0],\n   {'level': 4, 'broken': False, 'protections': 0, 'used': 1}),\n  ('control #1',\n   [0, [0, 30, 89, 99, 60, 0, 59, 59], 2],\n   {'level': 7, 'broken': False, 'protections': 2, 'used': 8})],\n [('protected downgrade #1', [6, [70, 70], 1], {'level': 5, 'broken': False, 'protections': 0, 'used': 2}),\n  ('regression protection availability #1',\n   [8, [89, 89], 1],\n   {'level': 8, 'broken': True, 'protections': 0, 'used': 2}),\n  ('fault site protection availability #1',\n   [6, [59, 50, 99, 50], 0],\n   {'level': 6, 'broken': False, 'protections': 0, 'used': 4}),\n  ('regression protection availability #2',\n   [9, [89, 89, 89, 60, 0, 30, 40, 90], 1],\n   {'level': 9, 'broken': True, 'protections': 0, 'used': 2}),\n  ('regression protection availability #3',\n   [6, [47, 29, 60, 59, 39, 49, 59, 30], 2],\n   {'level': 9, 'broken': True, 'protections': 0, 'used': 6}),\n  ('boundary roll equals chance #1',\n   [4, [80], 0],\n   {'level': 4, 'broken': False, 'protections': 0, 'used': 1}),\n  ('control #1', [0, [39, 49, 29, 0, 89], 0], {'level': 4, 'broken': False, 'protections': 0, 'used': 5}),\n  ('control #2', [10, [29], 2], {'level': 10, 'broken': False, 'protections': 2, 'used': 0})],\n [('break at eight #1', [8, [95, 0], 0], {'level': 8, 'broken': True, 'protections': 0, 'used': 1}),\n  ('protected downgrade #1', [6, [70, 70], 1], {'level': 5, 'broken': False, 'protections': 0, 'used': 2}),\n  ('regression protection availability #1',\n   [6, [40, 99, 50, 50, 29, 60], 1],\n   {'level': 8, 'broken': True, 'protections': 0, 'used': 6}),\n  ('fault site protection availability #1',\n   [9, [30, 90, 40], 0],\n   {'level': 9, 'broken': True, 'protections': 0, 'used': 1}),\n  ('partial repair boundary #1',\n   [8, [90, 90, 29, 29, 50, 99, 60, 60], 2],\n   {'level': 10, 'broken': False, 'protections': 0, 'used': 4}),\n  ('regression protection availability #2',\n   [8, [49, 89, 60, 90, 39, 0, 89, 90], 2],\n   {'level': 8, 'broken': True, 'protections': 0, 'used': 3}),\n  ('boundary roll equals chance #1',\n   [4, [80], 0],\n   {'level': 4, 'broken': False, 'protections': 0, 'used': 1}),\n  ('control #1', [8, [0, 0, 99, 40, 89], 0], {'level': 10, 'broken': False, 'protections': 0, 'used': 2})]]\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":"4aece093236962100f5df31dacb994c3a821fe7b4dc815e5a13602e48ea6e0fd","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(level, rolls, protections):\n    chance = [100, 100, 100, 90, 80, 70, 60, 50, 40, 30]\n    used = 0\n    broken = False\n    for r in rolls:\n        if level >= 10 or broken:\n            break\n        used += 1\n        if r < chance[level]:\n            level += 1\n        elif level >= 6:\n            if protections >= 0:\n                protections -= 1\n            elif level >= 8:\n                broken = True\n            else:\n                level -= 1\n    return {'level': level, 'broken': broken, 'protections': protections, 'used': used}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = [[('break at eight #1', [8, [95, 0], 0], {'level': 8, 'broken': True, 'protections': 0, 'used': 1}),\n  ('protected downgrade #1', [6, [70, 70], 1], {'level': 5, 'broken': False, 'protections': 0, 'used': 2}),\n  ('regression protection availability #1',\n   [9, [39, 30, 99, 29, 59, 99, 0], 1],\n   {'level': 9, 'broken': True, 'protections': 0, 'used': 2}),\n  ('fault site protection availability #1',\n   [9, [99, 30], 0],\n   {'level': 9, 'broken': True, 'protections': 0, 'used': 1}),\n  ('regression protection availability #2',\n   [8, [49, 40, 59], 2],\n   {'level': 8, 'broken': True, 'protections': 0, 'used': 3}),\n  ('regression protection availability #3',\n   [8, [89, 89], 1],\n   {'level': 8, 'broken': True, 'protections': 0, 'used': 2}),\n  ('boundary roll equals chance #1',\n   [4, [80], 0],\n   {'level': 4, 'broken': False, 'protections': 0, 'used': 1}),\n  ('control #1', [10, [90, 49, 29], 0], {'level': 10, 'broken': False, 'protections': 0, 'used': 0})],\n [('protected downgrade #1', [6, [70, 70], 1], {'level': 5, 'broken': False, 'protections': 0, 'used': 2}),\n  ('regression protection availability #1',\n   [9, [39, 30, 99, 29, 59, 99, 0], 1],\n   {'level': 9, 'broken': True, 'protections': 0, 'used': 2}),\n  ('fault site protection availability #1',\n   [9, [99, 30], 0],\n   {'level': 9, 'broken': True, 'protections': 0, 'used': 1}),\n  ('regression protection availability #2',\n   [8, [49, 40, 59], 2],\n   {'level': 8, 'broken': True, 'protections': 0, 'used': 3}),\n  ('regression protection availability #3',\n   [8, [89, 89], 1],\n   {'level': 8, 'broken': True, 'protections': 0, 'used': 2}),\n  ('boundary roll equals chance #1',\n   [4, [80], 0],\n   {'level': 4, 'broken': False, 'protections': 0, 'used': 1}),\n  ('control #1',\n   [0, [0, 30, 89, 99, 60, 0, 59, 59], 2],\n   {'level': 7, 'broken': False, 'protections': 2, 'used': 8}),\n  ('control #2',\n   [10, [34, 29, 90, 63, 0, 60, 59], 0],\n   {'level': 10, 'broken': False, 'protections': 0, 'used': 0})],\n [('break at eight #1', [8, [95, 0], 0], {'level': 8, 'broken': True, 'protections': 0, 'used': 1}),\n  ('protected downgrade #1', [6, [70, 70], 1], {'level': 5, 'broken': False, 'protections': 0, 'used': 2}),\n  ('fault site protection availability #1',\n   [9, [50, 40, 50, 0, 40, 29, 0], 0],\n   {'level': 9, 'broken': True, 'protections': 0, 'used': 1}),\n  ('regression protection availability #1',\n   [8, [49, 40, 59], 2],\n   {'level': 8, 'broken': True, 'protections': 0, 'used': 3}),\n  ('regression protection availability #2',\n   [6, [40, 99, 50, 50, 29, 60], 1],\n   {'level': 8, 'broken': True, 'protections': 0, 'used': 6}),\n  ('regression protection availability #3',\n   [8, [49, 29, 59, 0], 1],\n   {'level': 9, 'broken': True, 'protections': 0, 'used': 3}),\n  ('boundary roll equals chance #1',\n   [4, [80], 0],\n   {'level': 4, 'broken': False, 'protections': 0, 'used': 1}),\n  ('control #1',\n   [0, [0, 30, 89, 99, 60, 0, 59, 59], 2],\n   {'level': 7, 'broken': False, 'protections': 2, 'used': 8})],\n [('protected downgrade #1', [6, [70, 70], 1], {'level': 5, 'broken': False, 'protections': 0, 'used': 2}),\n  ('regression protection availability #1',\n   [8, [89, 89], 1],\n   {'level': 8, 'broken': True, 'protections': 0, 'used': 2}),\n  ('fault site protection availability #1',\n   [6, [59, 50, 99, 50], 0],\n   {'level': 6, 'broken': False, 'protections': 0, 'used': 4}),\n  ('regression protection availability #2',\n   [9, [89, 89, 89, 60, 0, 30, 40, 90], 1],\n   {'level': 9, 'broken': True, 'protections': 0, 'used': 2}),\n  ('regression protection availability #3',\n   [6, [47, 29, 60, 59, 39, 49, 59, 30], 2],\n   {'level': 9, 'broken': True, 'protections': 0, 'used': 6}),\n  ('boundary roll equals chance #1',\n   [4, [80], 0],\n   {'level': 4, 'broken': False, 'protections': 0, 'used': 1}),\n  ('control #1', [0, [39, 49, 29, 0, 89], 0], {'level': 4, 'broken': False, 'protections': 0, 'used': 5}),\n  ('control #2', [10, [29], 2], {'level': 10, 'broken': False, 'protections': 2, 'used': 0})],\n [('break at eight #1', [8, [95, 0], 0], {'level': 8, 'broken': True, 'protections': 0, 'used': 1}),\n  ('protected downgrade #1', [6, [70, 70], 1], {'level': 5, 'broken': False, 'protections': 0, 'used': 2}),\n  ('regression protection availability #1',\n   [6, [40, 99, 50, 50, 29, 60], 1],\n   {'level': 8, 'broken': True, 'protections': 0, 'used': 6}),\n  ('fault site protection availability #1',\n   [9, [30, 90, 40], 0],\n   {'level': 9, 'broken': True, 'protections': 0, 'used': 1}),\n  ('partial repair boundary #1',\n   [8, [90, 90, 29, 29, 50, 99, 60, 60], 2],\n   {'level': 10, 'broken': False, 'protections': 0, 'used': 4}),\n  ('regression protection availability #2',\n   [8, [49, 89, 60, 90, 39, 0, 89, 90], 2],\n   {'level': 8, 'broken': True, 'protections': 0, 'used': 3}),\n  ('boundary roll equals chance #1',\n   [4, [80], 0],\n   {'level': 4, 'broken': False, 'protections': 0, 'used': 1}),\n  ('control #1', [8, [0, 0, 99, 40, 89], 0], {'level': 10, 'broken': False, 'protections': 0, 'used': 2})]]\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":"0e1e6c32a16a702686fa1e022e5ed6b3c25cf61cbddbe120322ca8b940436302","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(level, rolls, protections):\n    chance = [100, 100, 100, 90, 80, 70, 60, 50, 40, 30]\n    used = 0\n    broken = False\n    for r in rolls:\n        if level >= 10 or broken:\n            break\n        used += 1\n        if r < chance[level]:\n            level += 1\n        elif level >= 6:\n            if protections > 0:\n                protections -= 1\n            elif level >= 8:\n                broken = True\n            else:\n                level -= 1\n    return {'level': level, 'broken': broken, 'protections': protections, 'used': used}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = [[('break at eight #1', [8, [95, 0], 0], {'level': 8, 'broken': True, 'protections': 0, 'used': 1}),\n  ('protected downgrade #1', [6, [70, 70], 1], {'level': 5, 'broken': False, 'protections': 0, 'used': 2}),\n  ('regression protection availability #1',\n   [9, [39, 30, 99, 29, 59, 99, 0], 1],\n   {'level': 9, 'broken': True, 'protections': 0, 'used': 2}),\n  ('fault site protection availability #1',\n   [9, [99, 30], 0],\n   {'level': 9, 'broken': True, 'protections': 0, 'used': 1}),\n  ('regression protection availability #2',\n   [8, [49, 40, 59], 2],\n   {'level': 8, 'broken': True, 'protections': 0, 'used': 3}),\n  ('regression protection availability #3',\n   [8, [89, 89], 1],\n   {'level': 8, 'broken': True, 'protections': 0, 'used': 2}),\n  ('boundary roll equals chance #1',\n   [4, [80], 0],\n   {'level': 4, 'broken': False, 'protections': 0, 'used': 1}),\n  ('control #1', [10, [90, 49, 29], 0], {'level': 10, 'broken': False, 'protections': 0, 'used': 0})],\n [('protected downgrade #1', [6, [70, 70], 1], {'level': 5, 'broken': False, 'protections': 0, 'used': 2}),\n  ('regression protection availability #1',\n   [9, [39, 30, 99, 29, 59, 99, 0], 1],\n   {'level': 9, 'broken': True, 'protections': 0, 'used': 2}),\n  ('fault site protection availability #1',\n   [9, [99, 30], 0],\n   {'level': 9, 'broken': True, 'protections': 0, 'used': 1}),\n  ('regression protection availability #2',\n   [8, [49, 40, 59], 2],\n   {'level': 8, 'broken': True, 'protections': 0, 'used': 3}),\n  ('regression protection availability #3',\n   [8, [89, 89], 1],\n   {'level': 8, 'broken': True, 'protections': 0, 'used': 2}),\n  ('boundary roll equals chance #1',\n   [4, [80], 0],\n   {'level': 4, 'broken': False, 'protections': 0, 'used': 1}),\n  ('control #1',\n   [0, [0, 30, 89, 99, 60, 0, 59, 59], 2],\n   {'level': 7, 'broken': False, 'protections': 2, 'used': 8}),\n  ('control #2',\n   [10, [34, 29, 90, 63, 0, 60, 59], 0],\n   {'level': 10, 'broken': False, 'protections': 0, 'used': 0})],\n [('break at eight #1', [8, [95, 0], 0], {'level': 8, 'broken': True, 'protections': 0, 'used': 1}),\n  ('protected downgrade #1', [6, [70, 70], 1], {'level': 5, 'broken': False, 'protections': 0, 'used': 2}),\n  ('fault site protection availability #1',\n   [9, [50, 40, 50, 0, 40, 29, 0], 0],\n   {'level': 9, 'broken': True, 'protections': 0, 'used': 1}),\n  ('regression protection availability #1',\n   [8, [49, 40, 59], 2],\n   {'level': 8, 'broken': True, 'protections': 0, 'used': 3}),\n  ('regression protection availability #2',\n   [6, [40, 99, 50, 50, 29, 60], 1],\n   {'level': 8, 'broken': True, 'protections': 0, 'used': 6}),\n  ('regression protection availability #3',\n   [8, [49, 29, 59, 0], 1],\n   {'level': 9, 'broken': True, 'protections': 0, 'used': 3}),\n  ('boundary roll equals chance #1',\n   [4, [80], 0],\n   {'level': 4, 'broken': False, 'protections': 0, 'used': 1}),\n  ('control #1',\n   [0, [0, 30, 89, 99, 60, 0, 59, 59], 2],\n   {'level': 7, 'broken': False, 'protections': 2, 'used': 8})],\n [('protected downgrade #1', [6, [70, 70], 1], {'level': 5, 'broken': False, 'protections': 0, 'used': 2}),\n  ('regression protection availability #1',\n   [8, [89, 89], 1],\n   {'level': 8, 'broken': True, 'protections': 0, 'used': 2}),\n  ('fault site protection availability #1',\n   [6, [59, 50, 99, 50], 0],\n   {'level': 6, 'broken': False, 'protections': 0, 'used': 4}),\n  ('regression protection availability #2',\n   [9, [89, 89, 89, 60, 0, 30, 40, 90], 1],\n   {'level': 9, 'broken': True, 'protections': 0, 'used': 2}),\n  ('regression protection availability #3',\n   [6, [47, 29, 60, 59, 39, 49, 59, 30], 2],\n   {'level': 9, 'broken': True, 'protections': 0, 'used': 6}),\n  ('boundary roll equals chance #1',\n   [4, [80], 0],\n   {'level': 4, 'broken': False, 'protections': 0, 'used': 1}),\n  ('control #1', [0, [39, 49, 29, 0, 89], 0], {'level': 4, 'broken': False, 'protections': 0, 'used': 5}),\n  ('control #2', [10, [29], 2], {'level': 10, 'broken': False, 'protections': 2, 'used': 0})],\n [('break at eight #1', [8, [95, 0], 0], {'level': 8, 'broken': True, 'protections': 0, 'used': 1}),\n  ('protected downgrade #1', [6, [70, 70], 1], {'level': 5, 'broken': False, 'protections': 0, 'used': 2}),\n  ('regression protection availability #1',\n   [6, [40, 99, 50, 50, 29, 60], 1],\n   {'level': 8, 'broken': True, 'protections': 0, 'used': 6}),\n  ('fault site protection availability #1',\n   [9, [30, 90, 40], 0],\n   {'level': 9, 'broken': True, 'protections': 0, 'used': 1}),\n  ('partial repair boundary #1',\n   [8, [90, 90, 29, 29, 50, 99, 60, 60], 2],\n   {'level': 10, 'broken': False, 'protections': 0, 'used': 4}),\n  ('regression protection availability #2',\n   [8, [49, 89, 60, 90, 39, 0, 89, 90], 2],\n   {'level': 8, 'broken': True, 'protections': 0, 'used': 3}),\n  ('boundary roll equals chance #1',\n   [4, [80], 0],\n   {'level': 4, 'broken': False, 'protections': 0, 'used': 1}),\n  ('control #1', [8, [0, 0, 99, 40, 89], 0], {'level': 10, 'broken': False, 'protections': 0, 'used': 2})]]\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-enchant-ladder-protection-availability","generated_at":"2026-09-29T14:50:45.792895+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 protections > 0:` at the protection availability step.","root_cause":"The protection check admits zero remaining scrolls.","sha256":"a813647e65d49d420932194a2425aa22ca59c2c51b28bea4b36653945d13c562","title":"Enchantment upgrade ladder: Protection is consumed when none remain · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":40.27,"exit_code":1,"observations":[{"actual":{"broken":true,"level":8,"protections":0,"used":1},"check":"break at eight #1","expected":{"broken":true,"level":8,"protections":0,"used":1},"passed":true},{"actual":{"broken":false,"level":5,"protections":1,"used":2},"check":"protected downgrade #1","expected":{"broken":false,"level":5,"protections":0,"used":2},"passed":false},{"actual":{"broken":true,"level":9,"protections":1,"used":1},"check":"regression protection availability #1","expected":{"broken":true,"level":9,"protections":0,"used":2},"passed":false},{"actual":{"broken":true,"level":9,"protections":0,"used":1},"check":"fault site protection availability #1","expected":{"broken":true,"level":9,"protections":0,"used":1},"passed":true},{"actual":{"broken":true,"level":8,"protections":1,"used":2},"check":"regression protection availability #2","expected":{"broken":true,"level":8,"protections":0,"used":3},"passed":false},{"actual":{"broken":true,"level":8,"protections":1,"used":1},"check":"regression protection availability #3","expected":{"broken":true,"level":8,"protections":0,"used":2},"passed":false},{"actual":{"broken":false,"level":4,"protections":0,"used":1},"check":"boundary roll equals chance #1","expected":{"broken":false,"level":4,"protections":0,"used":1},"passed":true},{"actual":{"broken":false,"level":10,"protections":0,"used":0},"check":"control #1","expected":{"broken":false,"level":10,"protections":0,"used":0},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"break at eight #1\", \"actual\": {\"level\": 8, \"broken\": true, \"protections\": 0, \"used\": 1}, \"expected\": {\"level\": 8, \"broken\": true, \"protections\": 0, \"used\": 1}, \"passed\": true}, {\"check\": \"protected downgrade #1\", \"actual\": {\"level\": 5, \"broken\": false, \"protections\": 1, \"used\": 2}, \"expected\": {\"level\": 5, \"broken\": false, \"protections\": 0, \"used\": 2}, \"passed\": false}, {\"check\": \"regression protection availability #1\", \"actual\": {\"level\": 9, \"broken\": true, \"protections\": 1, \"used\": 1}, \"expected\": {\"level\": 9, \"broken\": true, \"protections\": 0, \"used\": 2}, \"passed\": false}, {\"check\": \"fault site protection availability #1\", \"actual\": {\"level\": 9, \"broken\": true, \"protections\": 0, \"used\": 1}, \"expected\": {\"level\": 9, \"broken\": true, \"protections\": 0, \"used\": 1}, \"passed\": true}, {\"check\": \"regression protection availability #2\", \"actual\": {\"level\": 8, \"broken\": true, \"protections\": 1, \"used\": 2}, \"expected\": {\"level\": 8, \"broken\": true, \"protections\": 0, \"used\": 3}, \"passed\": false}, {\"check\": \"regression protection availability #3\", \"actual\": {\"level\": 8, \"broken\": true, \"protections\": 1, \"used\": 1}, \"expected\": {\"level\": 8, \"broken\": true, \"protections\": 0, \"used\": 2}, \"passed\": false}, {\"check\": \"boundary roll equals chance #1\", \"actual\": {\"level\": 4, \"broken\": false, \"protections\": 0, \"used\": 1}, \"expected\": {\"level\": 4, \"broken\": false, \"protections\": 0, \"used\": 1}, \"passed\": true}, {\"check\": \"control #1\", \"actual\": {\"level\": 10, \"broken\": false, \"protections\": 0, \"used\": 0}, \"expected\": {\"level\": 10, \"broken\": false, \"protections\": 0, \"used\": 0}, \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":37.555,"exit_code":1,"observations":[{"actual":{"broken":false,"level":9,"protections":-1,"used":2},"check":"break at eight #1","expected":{"broken":true,"level":8,"protections":0,"used":1},"passed":false},{"actual":{"broken":false,"level":6,"protections":-1,"used":2},"check":"protected downgrade #1","expected":{"broken":false,"level":5,"protections":0,"used":2},"passed":false},{"actual":{"broken":true,"level":9,"protections":-1,"used":3},"check":"regression protection availability #1","expected":{"broken":true,"level":9,"protections":0,"used":2},"passed":false},{"actual":{"broken":true,"level":9,"protections":-1,"used":2},"check":"fault site protection availability #1","expected":{"broken":true,"level":9,"protections":0,"used":1},"passed":false},{"actual":{"broken":false,"level":8,"protections":-1,"used":3},"check":"regression protection availability #2","expected":{"broken":true,"level":8,"protections":0,"used":3},"passed":false},{"actual":{"broken":false,"level":8,"protections":-1,"used":2},"check":"regression protection availability #3","expected":{"broken":true,"level":8,"protections":0,"used":2},"passed":false},{"actual":{"broken":false,"level":4,"protections":0,"used":1},"check":"boundary roll equals chance #1","expected":{"broken":false,"level":4,"protections":0,"used":1},"passed":true},{"actual":{"broken":false,"level":10,"protections":0,"used":0},"check":"control #1","expected":{"broken":false,"level":10,"protections":0,"used":0},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"break at eight #1\", \"actual\": {\"level\": 9, \"broken\": false, \"protections\": -1, \"used\": 2}, \"expected\": {\"level\": 8, \"broken\": true, \"protections\": 0, \"used\": 1}, \"passed\": false}, {\"check\": \"protected downgrade #1\", \"actual\": {\"level\": 6, \"broken\": false, \"protections\": -1, \"used\": 2}, \"expected\": {\"level\": 5, \"broken\": false, \"protections\": 0, \"used\": 2}, \"passed\": false}, {\"check\": \"regression protection availability #1\", \"actual\": {\"level\": 9, \"broken\": true, \"protections\": -1, \"used\": 3}, \"expected\": {\"level\": 9, \"broken\": true, \"protections\": 0, \"used\": 2}, \"passed\": false}, {\"check\": \"fault site protection availability #1\", \"actual\": {\"level\": 9, \"broken\": true, \"protections\": -1, \"used\": 2}, \"expected\": {\"level\": 9, \"broken\": true, \"protections\": 0, \"used\": 1}, \"passed\": false}, {\"check\": \"regression protection availability #2\", \"actual\": {\"level\": 8, \"broken\": false, \"protections\": -1, \"used\": 3}, \"expected\": {\"level\": 8, \"broken\": true, \"protections\": 0, \"used\": 3}, \"passed\": false}, {\"check\": \"regression protection availability #3\", \"actual\": {\"level\": 8, \"broken\": false, \"protections\": -1, \"used\": 2}, \"expected\": {\"level\": 8, \"broken\": true, \"protections\": 0, \"used\": 2}, \"passed\": false}, {\"check\": \"boundary roll equals chance #1\", \"actual\": {\"level\": 4, \"broken\": false, \"protections\": 0, \"used\": 1}, \"expected\": {\"level\": 4, \"broken\": false, \"protections\": 0, \"used\": 1}, \"passed\": true}, {\"check\": \"control #1\", \"actual\": {\"level\": 10, \"broken\": false, \"protections\": 0, \"used\": 0}, \"expected\": {\"level\": 10, \"broken\": false, \"protections\": 0, \"used\": 0}, \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":40.231,"exit_code":0,"observations":[{"actual":{"broken":true,"level":8,"protections":0,"used":1},"check":"break at eight #1","expected":{"broken":true,"level":8,"protections":0,"used":1},"passed":true},{"actual":{"broken":false,"level":5,"protections":0,"used":2},"check":"protected downgrade #1","expected":{"broken":false,"level":5,"protections":0,"used":2},"passed":true},{"actual":{"broken":true,"level":9,"protections":0,"used":2},"check":"regression protection availability #1","expected":{"broken":true,"level":9,"protections":0,"used":2},"passed":true},{"actual":{"broken":true,"level":9,"protections":0,"used":1},"check":"fault site protection availability #1","expected":{"broken":true,"level":9,"protections":0,"used":1},"passed":true},{"actual":{"broken":true,"level":8,"protections":0,"used":3},"check":"regression protection availability #2","expected":{"broken":true,"level":8,"protections":0,"used":3},"passed":true},{"actual":{"broken":true,"level":8,"protections":0,"used":2},"check":"regression protection availability #3","expected":{"broken":true,"level":8,"protections":0,"used":2},"passed":true},{"actual":{"broken":false,"level":4,"protections":0,"used":1},"check":"boundary roll equals chance #1","expected":{"broken":false,"level":4,"protections":0,"used":1},"passed":true},{"actual":{"broken":false,"level":10,"protections":0,"used":0},"check":"control #1","expected":{"broken":false,"level":10,"protections":0,"used":0},"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"break at eight #1\", \"actual\": {\"level\": 8, \"broken\": true, \"protections\": 0, \"used\": 1}, \"expected\": {\"level\": 8, \"broken\": true, \"protections\": 0, \"used\": 1}, \"passed\": true}, {\"check\": \"protected downgrade #1\", \"actual\": {\"level\": 5, \"broken\": false, \"protections\": 0, \"used\": 2}, \"expected\": {\"level\": 5, \"broken\": false, \"protections\": 0, \"used\": 2}, \"passed\": true}, {\"check\": \"regression protection availability #1\", \"actual\": {\"level\": 9, \"broken\": true, \"protections\": 0, \"used\": 2}, \"expected\": {\"level\": 9, \"broken\": true, \"protections\": 0, \"used\": 2}, \"passed\": true}, {\"check\": \"fault site protection availability #1\", \"actual\": {\"level\": 9, \"broken\": true, \"protections\": 0, \"used\": 1}, \"expected\": {\"level\": 9, \"broken\": true, \"protections\": 0, \"used\": 1}, \"passed\": true}, {\"check\": \"regression protection availability #2\", \"actual\": {\"level\": 8, \"broken\": true, \"protections\": 0, \"used\": 3}, \"expected\": {\"level\": 8, \"broken\": true, \"protections\": 0, \"used\": 3}, \"passed\": true}, {\"check\": \"regression protection availability #3\", \"actual\": {\"level\": 8, \"broken\": true, \"protections\": 0, \"used\": 2}, \"expected\": {\"level\": 8, \"broken\": true, \"protections\": 0, \"used\": 2}, \"passed\": true}, {\"check\": \"boundary roll equals chance #1\", \"actual\": {\"level\": 4, \"broken\": false, \"protections\": 0, \"used\": 1}, \"expected\": {\"level\": 4, \"broken\": false, \"protections\": 0, \"used\": 1}, \"passed\": true}, {\"check\": \"control #1\", \"actual\": {\"level\": 10, \"broken\": false, \"protections\": 0, \"used\": 0}, \"expected\": {\"level\": 10, \"broken\": false, \"protections\": 0, \"used\": 0}, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}