{"abstract":"A blue key opens red doors, validating unsolvable dungeons.","category":"Procedural level generation constraints","checks":8,"contract":"rooms maps room -> keys lying there; edges [a, b, lock] are two-way doors, lock None or a key colour. Keys are never consumed. Starting in start, repeatedly pick up keys in visited rooms and walk through doors that are open or whose key is held, until nothing changes. Returns {solvable: goal visited, keys: sorted keys held, visited: count}.","evaluation_group":"w2-procedural-level-generation-constraints-key-lock","failed_approach":"Requiring the key in the adjacent room ignores keys carried from elsewhere.","family":"w2-procedural-level-generation-constraints-key-lock-lock-matching","id":"FA-86411","implementations":{"attempt":{"sha256":"4c25d1e6d322b9d6fd2c9b838748bfd079c2feed3aa43e1e7bfe8919f5b90cec","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(rooms, edges, start, goal):\n    have = set()\n    seen = {start}\n    changed = True\n    while changed:\n        changed = False\n        for r in list(seen):\n            for k in rooms.get(r, []):\n                if k not in have:\n                    have.add(k)\n                    changed = True\n        for a, b, lock in edges:\n            for u, v in ((a, b), (b, a)):\n                if u in seen and v not in seen and (lock is None or lock in rooms.get(u, [])):\n                    seen.add(v)\n                    changed = True\n    return {'solvable': goal in seen, 'keys': sorted(have), 'visited': len(seen)}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = [[('wrong colour #1',\n   [{'r0': ['blue']}, [['r0', 'r1', 'red']], 'r0', 'r1'],\n   {'solvable': False, 'keys': ['blue'], 'visited': 1}),\n  ('fault site lock matching #1',\n   [{'r0': ['gold'], 'r1': ['red'], 'r2': ['gold']},\n    [['r0', 'r1', 'red'], ['r2', 'r1', 'red'], ['r0', 'r2', None]],\n    'r0',\n    'r2'],\n   {'solvable': True, 'keys': ['gold'], 'visited': 2}),\n  ('fault site lock matching #2',\n   [{'r0': ['red'], 'r3': ['gold']},\n    [['r4', 'r2', None], ['r0', 'r1', 'blue'], ['r2', 'r0', None], ['r2', 'r3', 'gold']],\n    'r0',\n    'r4'],\n   {'solvable': True, 'keys': ['red'], 'visited': 3}),\n  ('partial repair boundary #1',\n   [{'r0': ['gold'], 'r2': ['blue']},\n    [['r2', 'r1', 'gold'],\n     ['r3', 'r1', 'blue'],\n     ['r1', 'r3', None],\n     ['r1', 'r0', None],\n     ['r2', 'r3', 'blue']],\n    'r0',\n    'r3'],\n   {'solvable': True, 'keys': ['blue', 'gold'], 'visited': 4}),\n  ('partial repair boundary #2',\n   [{'r0': ['red'], 'r1': ['gold'], 'r4': ['gold'], 'r5': ['blue'], 'r6': ['red']},\n    [['r1', 'r2', 'blue'],\n     ['r0', 'r2', 'red'],\n     ['r0', 'r1', 'blue'],\n     ['r3', 'r6', 'gold'],\n     ['r4', 'r0', None],\n     ['r3', 'r2', 'blue'],\n     ['r2', 'r5', None]],\n    'r0',\n    'r6'],\n   {'solvable': True, 'keys': ['blue', 'gold', 'red'], 'visited': 7}),\n  ('reverse listed door #1',\n   [{}, [['r1', 'r0', None]], 'r0', 'r1'],\n   {'solvable': True, 'keys': [], 'visited': 2}),\n  ('key behind first door #1',\n   [{'r1': ['red']}, [['r1', 'r2', 'red'], ['r0', 'r1', None]], 'r0', 'r2'],\n   {'solvable': True, 'keys': ['red'], 'visited': 3}),\n  ('control #1', [{}, [['r0', 'r1', 'blue']], 'r0', 'r1'], {'solvable': False, 'keys': [], 'visited': 1})],\n [('wrong colour #1',\n   [{'r0': ['blue']}, [['r0', 'r1', 'red']], 'r0', 'r1'],\n   {'solvable': False, 'keys': ['blue'], 'visited': 1}),\n  ('fault site lock matching #1',\n   [{'r0': ['red'], 'r3': ['gold']},\n    [['r4', 'r2', None], ['r0', 'r1', 'blue'], ['r2', 'r0', None], ['r2', 'r3', 'gold']],\n    'r0',\n    'r4'],\n   {'solvable': True, 'keys': ['red'], 'visited': 3}),\n  ('regression lock matching #1',\n   [{'r3': ['blue'], 'r4': ['gold']},\n    [['r4', 'r1', 'blue'],\n     ['r5', 'r3', None],\n     ['r5', 'r4', 'red'],\n     ['r1', 'r0', 'gold'],\n     ['r0', 'r2', 'blue'],\n     ['r4', 'r0', None],\n     ['r3', 'r2', None]],\n    'r0',\n    'r4'],\n   {'solvable': True, 'keys': ['gold'], 'visited': 3}),\n  ('regression lock matching #2',\n   [{'r1': ['red'], 'r4': ['blue'], 'r6': ['gold']},\n    [['r1', 'r0', 'blue'],\n     ['r2', 'r6', 'blue'],\n     ['r5', 'r4', None],\n     ['r0', 'r2', 'gold'],\n     ['r1', 'r3', None],\n     ['r0', 'r4', None]],\n    'r0',\n    'r5'],\n   {'solvable': True, 'keys': ['blue', 'red'], 'visited': 5}),\n  ('partial repair boundary #1',\n   [{'r2': ['gold'], 'r3': ['red']},\n    [['r2', 'r0', None], ['r2', 'r4', 'gold'], ['r5', 'r4', None], ['r3', 'r2', None], ['r0', 'r1', 'gold']],\n    'r0',\n    'r1'],\n   {'solvable': True, 'keys': ['gold', 'red'], 'visited': 6}),\n  ('reverse listed door #1',\n   [{}, [['r1', 'r0', None]], 'r0', 'r1'],\n   {'solvable': True, 'keys': [], 'visited': 2}),\n  ('key behind first door #1',\n   [{'r1': ['red']}, [['r1', 'r2', 'red'], ['r0', 'r1', None]], 'r0', 'r2'],\n   {'solvable': True, 'keys': ['red'], 'visited': 3}),\n  ('control #1', [{}, [['r0', 'r1', 'blue']], 'r0', 'r1'], {'solvable': False, 'keys': [], 'visited': 1})],\n [('wrong colour #1',\n   [{'r0': ['blue']}, [['r0', 'r1', 'red']], 'r0', 'r1'],\n   {'solvable': False, 'keys': ['blue'], 'visited': 1}),\n  ('fault site lock matching #1',\n   [{'r0': ['blue'], 'r3': ['red']},\n    [['r1', 'r0', None],\n     ['r5', 'r3', None],\n     ['r1', 'r2', 'red'],\n     ['r3', 'r2', 'red'],\n     ['r0', 'r4', 'gold'],\n     ['r3', 'r1', None],\n     ['r0', 'r5', 'gold']],\n    'r0',\n    'r5'],\n   {'solvable': True, 'keys': ['blue', 'red'], 'visited': 5}),\n  ('regression lock matching #1',\n   [{'r1': ['red'], 'r4': ['blue'], 'r6': ['gold']},\n    [['r1', 'r0', 'blue'],\n     ['r2', 'r6', 'blue'],\n     ['r5', 'r4', None],\n     ['r0', 'r2', 'gold'],\n     ['r1', 'r3', None],\n     ['r0', 'r4', None]],\n    'r0',\n    'r5'],\n   {'solvable': True, 'keys': ['blue', 'red'], 'visited': 5}),\n  ('partial repair boundary #1',\n   [{'r2': ['gold'], 'r3': ['red']},\n    [['r2', 'r0', None], ['r2', 'r4', 'gold'], ['r5', 'r4', None], ['r3', 'r2', None], ['r0', 'r1', 'gold']],\n    'r0',\n    'r1'],\n   {'solvable': True, 'keys': ['gold', 'red'], 'visited': 6}),\n  ('partial repair boundary #2',\n   [{'r0': ['red'], 'r1': ['gold'], 'r2': ['red']},\n    [['r0', 'r3', 'gold'],\n     ['r2', 'r0', 'red'],\n     ['r0', 'r1', 'gold'],\n     ['r0', 'r4', None],\n     ['r0', 'r1', 'red']],\n    'r0',\n    'r3'],\n   {'solvable': True, 'keys': ['gold', 'red'], 'visited': 5}),\n  ('reverse listed door #1',\n   [{}, [['r1', 'r0', None]], 'r0', 'r1'],\n   {'solvable': True, 'keys': [], 'visited': 2}),\n  ('key behind first door #1',\n   [{'r1': ['red']}, [['r1', 'r2', 'red'], ['r0', 'r1', None]], 'r0', 'r2'],\n   {'solvable': True, 'keys': ['red'], 'visited': 3}),\n  ('control #1', [{}, [['r0', 'r1', 'blue']], 'r0', 'r1'], {'solvable': False, 'keys': [], 'visited': 1})],\n [('wrong colour #1',\n   [{'r0': ['blue']}, [['r0', 'r1', 'red']], 'r0', 'r1'],\n   {'solvable': False, 'keys': ['blue'], 'visited': 1}),\n  ('fault site lock matching #1',\n   [{'r0': ['blue'], 'r1': ['red']}, [['r0', 'r1', 'red']], 'r0', 'r1'],\n   {'solvable': False, 'keys': ['blue'], 'visited': 1}),\n  ('fault site lock matching #2',\n   [{'r0': ['gold'], 'r2': ['gold'], 'r3': ['red'], 'r4': ['red']},\n    [['r0', 'r1', None],\n     ['r1', 'r2', 'blue'],\n     ['r6', 'r1', None],\n     ['r5', 'r0', 'blue'],\n     ['r3', 'r2', 'gold'],\n     ['r4', 'r0', None]],\n    'r0',\n    'r3'],\n   {'solvable': False, 'keys': ['gold', 'red'], 'visited': 4}),\n  ('regression lock matching #1',\n   [{'r0': ['blue'], 'r3': ['blue']},\n    [['r3', 'r4', None],\n     ['r1', 'r2', 'gold'],\n     ['r1', 'r0', 'blue'],\n     ['r1', 'r5', 'gold'],\n     ['r3', 'r4', 'red'],\n     ['r1', 'r3', 'blue']],\n    'r0',\n    'r1'],\n   {'solvable': True, 'keys': ['blue'], 'visited': 4}),\n  ('partial repair boundary #1',\n   [{'r0': ['blue']},\n    [['r2', 'r0', 'red'], ['r1', 'r0', 'red'], ['r0', 'r1', 'blue'], ['r1', 'r2', 'blue']],\n    'r0',\n    'r1'],\n   {'solvable': True, 'keys': ['blue'], 'visited': 3}),\n  ('reverse listed door #1',\n   [{}, [['r1', 'r0', None]], 'r0', 'r1'],\n   {'solvable': True, 'keys': [], 'visited': 2}),\n  ('key behind first door #1',\n   [{'r1': ['red']}, [['r1', 'r2', 'red'], ['r0', 'r1', None]], 'r0', 'r2'],\n   {'solvable': True, 'keys': ['red'], 'visited': 3}),\n  ('control #1',\n   [{'r4': ['red']},\n    [['r3', 'r1', 'gold'], ['r3', 'r4', 'blue'], ['r2', 'r1', None], ['r1', 'r0', None]],\n    'r0',\n    'r3'],\n   {'solvable': False, 'keys': [], 'visited': 3})],\n [('wrong colour #1',\n   [{'r0': ['blue']}, [['r0', 'r1', 'red']], 'r0', 'r1'],\n   {'solvable': False, 'keys': ['blue'], 'visited': 1}),\n  ('fault site lock matching #1',\n   [{'r0': ['blue'], 'r2': ['red'], 'r3': ['blue'], 'r4': ['blue']},\n    [['r3', 'r2', 'red'], ['r4', 'r0', None], ['r1', 'r2', 'red'], ['r1', 'r0', None]],\n    'r0',\n    'r3'],\n   {'solvable': False, 'keys': ['blue'], 'visited': 3}),\n  ('regression lock matching #1',\n   [{'r0': ['blue'], 'r3': ['blue']},\n    [['r3', 'r4', None],\n     ['r1', 'r2', 'gold'],\n     ['r1', 'r0', 'blue'],\n     ['r1', 'r5', 'gold'],\n     ['r3', 'r4', 'red'],\n     ['r1', 'r3', 'blue']],\n    'r0',\n    'r1'],\n   {'solvable': True, 'keys': ['blue'], 'visited': 4}),\n  ('partial repair boundary #1',\n   [{'r0': ['blue'], 'r2': ['blue'], 'r3': ['gold'], 'r4': ['gold']},\n    [['r2', 'r0', None],\n     ['r1', 'r0', 'blue'],\n     ['r2', 'r4', 'blue'],\n     ['r0', 'r3', None],\n     ['r5', 'r1', 'gold']],\n    'r0',\n    'r4'],\n   {'solvable': True, 'keys': ['blue', 'gold'], 'visited': 6}),\n  ('partial repair boundary #2',\n   [{'r1': ['blue'], 'r2': ['gold'], 'r4': ['red']},\n    [['r2', 'r0', None], ['r1', 'r0', None], ['r1', 'r4', None], ['r1', 'r3', None], ['r3', 'r5', 'gold']],\n    'r0',\n    'r1'],\n   {'solvable': True, 'keys': ['blue', 'gold', 'red'], 'visited': 6}),\n  ('reverse listed door #1',\n   [{}, [['r1', 'r0', None]], 'r0', 'r1'],\n   {'solvable': True, 'keys': [], 'visited': 2}),\n  ('key behind first door #1',\n   [{'r1': ['red']}, [['r1', 'r2', 'red'], ['r0', 'r1', None]], 'r0', 'r2'],\n   {'solvable': True, 'keys': ['red'], 'visited': 3}),\n  ('control #1',\n   [{'r0': ['red']}, [['r0', 'r1', None]], 'r0', 'r1'],\n   {'solvable': True, 'keys': ['red'], 'visited': 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":"01ffdee0b666cf9bf86238fb24106addb47e19ff13a100cdc689e8a659370a0e","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(rooms, edges, start, goal):\n    have = set()\n    seen = {start}\n    changed = True\n    while changed:\n        changed = False\n        for r in list(seen):\n            for k in rooms.get(r, []):\n                if k not in have:\n                    have.add(k)\n                    changed = True\n        for a, b, lock in edges:\n            for u, v in ((a, b), (b, a)):\n                if u in seen and v not in seen and (lock is None or bool(have)):\n                    seen.add(v)\n                    changed = True\n    return {'solvable': goal in seen, 'keys': sorted(have), 'visited': len(seen)}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = [[('wrong colour #1',\n   [{'r0': ['blue']}, [['r0', 'r1', 'red']], 'r0', 'r1'],\n   {'solvable': False, 'keys': ['blue'], 'visited': 1}),\n  ('fault site lock matching #1',\n   [{'r0': ['gold'], 'r1': ['red'], 'r2': ['gold']},\n    [['r0', 'r1', 'red'], ['r2', 'r1', 'red'], ['r0', 'r2', None]],\n    'r0',\n    'r2'],\n   {'solvable': True, 'keys': ['gold'], 'visited': 2}),\n  ('fault site lock matching #2',\n   [{'r0': ['red'], 'r3': ['gold']},\n    [['r4', 'r2', None], ['r0', 'r1', 'blue'], ['r2', 'r0', None], ['r2', 'r3', 'gold']],\n    'r0',\n    'r4'],\n   {'solvable': True, 'keys': ['red'], 'visited': 3}),\n  ('partial repair boundary #1',\n   [{'r0': ['gold'], 'r2': ['blue']},\n    [['r2', 'r1', 'gold'],\n     ['r3', 'r1', 'blue'],\n     ['r1', 'r3', None],\n     ['r1', 'r0', None],\n     ['r2', 'r3', 'blue']],\n    'r0',\n    'r3'],\n   {'solvable': True, 'keys': ['blue', 'gold'], 'visited': 4}),\n  ('partial repair boundary #2',\n   [{'r0': ['red'], 'r1': ['gold'], 'r4': ['gold'], 'r5': ['blue'], 'r6': ['red']},\n    [['r1', 'r2', 'blue'],\n     ['r0', 'r2', 'red'],\n     ['r0', 'r1', 'blue'],\n     ['r3', 'r6', 'gold'],\n     ['r4', 'r0', None],\n     ['r3', 'r2', 'blue'],\n     ['r2', 'r5', None]],\n    'r0',\n    'r6'],\n   {'solvable': True, 'keys': ['blue', 'gold', 'red'], 'visited': 7}),\n  ('reverse listed door #1',\n   [{}, [['r1', 'r0', None]], 'r0', 'r1'],\n   {'solvable': True, 'keys': [], 'visited': 2}),\n  ('key behind first door #1',\n   [{'r1': ['red']}, [['r1', 'r2', 'red'], ['r0', 'r1', None]], 'r0', 'r2'],\n   {'solvable': True, 'keys': ['red'], 'visited': 3}),\n  ('control #1', [{}, [['r0', 'r1', 'blue']], 'r0', 'r1'], {'solvable': False, 'keys': [], 'visited': 1})],\n [('wrong colour #1',\n   [{'r0': ['blue']}, [['r0', 'r1', 'red']], 'r0', 'r1'],\n   {'solvable': False, 'keys': ['blue'], 'visited': 1}),\n  ('fault site lock matching #1',\n   [{'r0': ['red'], 'r3': ['gold']},\n    [['r4', 'r2', None], ['r0', 'r1', 'blue'], ['r2', 'r0', None], ['r2', 'r3', 'gold']],\n    'r0',\n    'r4'],\n   {'solvable': True, 'keys': ['red'], 'visited': 3}),\n  ('regression lock matching #1',\n   [{'r3': ['blue'], 'r4': ['gold']},\n    [['r4', 'r1', 'blue'],\n     ['r5', 'r3', None],\n     ['r5', 'r4', 'red'],\n     ['r1', 'r0', 'gold'],\n     ['r0', 'r2', 'blue'],\n     ['r4', 'r0', None],\n     ['r3', 'r2', None]],\n    'r0',\n    'r4'],\n   {'solvable': True, 'keys': ['gold'], 'visited': 3}),\n  ('regression lock matching #2',\n   [{'r1': ['red'], 'r4': ['blue'], 'r6': ['gold']},\n    [['r1', 'r0', 'blue'],\n     ['r2', 'r6', 'blue'],\n     ['r5', 'r4', None],\n     ['r0', 'r2', 'gold'],\n     ['r1', 'r3', None],\n     ['r0', 'r4', None]],\n    'r0',\n    'r5'],\n   {'solvable': True, 'keys': ['blue', 'red'], 'visited': 5}),\n  ('partial repair boundary #1',\n   [{'r2': ['gold'], 'r3': ['red']},\n    [['r2', 'r0', None], ['r2', 'r4', 'gold'], ['r5', 'r4', None], ['r3', 'r2', None], ['r0', 'r1', 'gold']],\n    'r0',\n    'r1'],\n   {'solvable': True, 'keys': ['gold', 'red'], 'visited': 6}),\n  ('reverse listed door #1',\n   [{}, [['r1', 'r0', None]], 'r0', 'r1'],\n   {'solvable': True, 'keys': [], 'visited': 2}),\n  ('key behind first door #1',\n   [{'r1': ['red']}, [['r1', 'r2', 'red'], ['r0', 'r1', None]], 'r0', 'r2'],\n   {'solvable': True, 'keys': ['red'], 'visited': 3}),\n  ('control #1', [{}, [['r0', 'r1', 'blue']], 'r0', 'r1'], {'solvable': False, 'keys': [], 'visited': 1})],\n [('wrong colour #1',\n   [{'r0': ['blue']}, [['r0', 'r1', 'red']], 'r0', 'r1'],\n   {'solvable': False, 'keys': ['blue'], 'visited': 1}),\n  ('fault site lock matching #1',\n   [{'r0': ['blue'], 'r3': ['red']},\n    [['r1', 'r0', None],\n     ['r5', 'r3', None],\n     ['r1', 'r2', 'red'],\n     ['r3', 'r2', 'red'],\n     ['r0', 'r4', 'gold'],\n     ['r3', 'r1', None],\n     ['r0', 'r5', 'gold']],\n    'r0',\n    'r5'],\n   {'solvable': True, 'keys': ['blue', 'red'], 'visited': 5}),\n  ('regression lock matching #1',\n   [{'r1': ['red'], 'r4': ['blue'], 'r6': ['gold']},\n    [['r1', 'r0', 'blue'],\n     ['r2', 'r6', 'blue'],\n     ['r5', 'r4', None],\n     ['r0', 'r2', 'gold'],\n     ['r1', 'r3', None],\n     ['r0', 'r4', None]],\n    'r0',\n    'r5'],\n   {'solvable': True, 'keys': ['blue', 'red'], 'visited': 5}),\n  ('partial repair boundary #1',\n   [{'r2': ['gold'], 'r3': ['red']},\n    [['r2', 'r0', None], ['r2', 'r4', 'gold'], ['r5', 'r4', None], ['r3', 'r2', None], ['r0', 'r1', 'gold']],\n    'r0',\n    'r1'],\n   {'solvable': True, 'keys': ['gold', 'red'], 'visited': 6}),\n  ('partial repair boundary #2',\n   [{'r0': ['red'], 'r1': ['gold'], 'r2': ['red']},\n    [['r0', 'r3', 'gold'],\n     ['r2', 'r0', 'red'],\n     ['r0', 'r1', 'gold'],\n     ['r0', 'r4', None],\n     ['r0', 'r1', 'red']],\n    'r0',\n    'r3'],\n   {'solvable': True, 'keys': ['gold', 'red'], 'visited': 5}),\n  ('reverse listed door #1',\n   [{}, [['r1', 'r0', None]], 'r0', 'r1'],\n   {'solvable': True, 'keys': [], 'visited': 2}),\n  ('key behind first door #1',\n   [{'r1': ['red']}, [['r1', 'r2', 'red'], ['r0', 'r1', None]], 'r0', 'r2'],\n   {'solvable': True, 'keys': ['red'], 'visited': 3}),\n  ('control #1', [{}, [['r0', 'r1', 'blue']], 'r0', 'r1'], {'solvable': False, 'keys': [], 'visited': 1})],\n [('wrong colour #1',\n   [{'r0': ['blue']}, [['r0', 'r1', 'red']], 'r0', 'r1'],\n   {'solvable': False, 'keys': ['blue'], 'visited': 1}),\n  ('fault site lock matching #1',\n   [{'r0': ['blue'], 'r1': ['red']}, [['r0', 'r1', 'red']], 'r0', 'r1'],\n   {'solvable': False, 'keys': ['blue'], 'visited': 1}),\n  ('fault site lock matching #2',\n   [{'r0': ['gold'], 'r2': ['gold'], 'r3': ['red'], 'r4': ['red']},\n    [['r0', 'r1', None],\n     ['r1', 'r2', 'blue'],\n     ['r6', 'r1', None],\n     ['r5', 'r0', 'blue'],\n     ['r3', 'r2', 'gold'],\n     ['r4', 'r0', None]],\n    'r0',\n    'r3'],\n   {'solvable': False, 'keys': ['gold', 'red'], 'visited': 4}),\n  ('regression lock matching #1',\n   [{'r0': ['blue'], 'r3': ['blue']},\n    [['r3', 'r4', None],\n     ['r1', 'r2', 'gold'],\n     ['r1', 'r0', 'blue'],\n     ['r1', 'r5', 'gold'],\n     ['r3', 'r4', 'red'],\n     ['r1', 'r3', 'blue']],\n    'r0',\n    'r1'],\n   {'solvable': True, 'keys': ['blue'], 'visited': 4}),\n  ('partial repair boundary #1',\n   [{'r0': ['blue']},\n    [['r2', 'r0', 'red'], ['r1', 'r0', 'red'], ['r0', 'r1', 'blue'], ['r1', 'r2', 'blue']],\n    'r0',\n    'r1'],\n   {'solvable': True, 'keys': ['blue'], 'visited': 3}),\n  ('reverse listed door #1',\n   [{}, [['r1', 'r0', None]], 'r0', 'r1'],\n   {'solvable': True, 'keys': [], 'visited': 2}),\n  ('key behind first door #1',\n   [{'r1': ['red']}, [['r1', 'r2', 'red'], ['r0', 'r1', None]], 'r0', 'r2'],\n   {'solvable': True, 'keys': ['red'], 'visited': 3}),\n  ('control #1',\n   [{'r4': ['red']},\n    [['r3', 'r1', 'gold'], ['r3', 'r4', 'blue'], ['r2', 'r1', None], ['r1', 'r0', None]],\n    'r0',\n    'r3'],\n   {'solvable': False, 'keys': [], 'visited': 3})],\n [('wrong colour #1',\n   [{'r0': ['blue']}, [['r0', 'r1', 'red']], 'r0', 'r1'],\n   {'solvable': False, 'keys': ['blue'], 'visited': 1}),\n  ('fault site lock matching #1',\n   [{'r0': ['blue'], 'r2': ['red'], 'r3': ['blue'], 'r4': ['blue']},\n    [['r3', 'r2', 'red'], ['r4', 'r0', None], ['r1', 'r2', 'red'], ['r1', 'r0', None]],\n    'r0',\n    'r3'],\n   {'solvable': False, 'keys': ['blue'], 'visited': 3}),\n  ('regression lock matching #1',\n   [{'r0': ['blue'], 'r3': ['blue']},\n    [['r3', 'r4', None],\n     ['r1', 'r2', 'gold'],\n     ['r1', 'r0', 'blue'],\n     ['r1', 'r5', 'gold'],\n     ['r3', 'r4', 'red'],\n     ['r1', 'r3', 'blue']],\n    'r0',\n    'r1'],\n   {'solvable': True, 'keys': ['blue'], 'visited': 4}),\n  ('partial repair boundary #1',\n   [{'r0': ['blue'], 'r2': ['blue'], 'r3': ['gold'], 'r4': ['gold']},\n    [['r2', 'r0', None],\n     ['r1', 'r0', 'blue'],\n     ['r2', 'r4', 'blue'],\n     ['r0', 'r3', None],\n     ['r5', 'r1', 'gold']],\n    'r0',\n    'r4'],\n   {'solvable': True, 'keys': ['blue', 'gold'], 'visited': 6}),\n  ('partial repair boundary #2',\n   [{'r1': ['blue'], 'r2': ['gold'], 'r4': ['red']},\n    [['r2', 'r0', None], ['r1', 'r0', None], ['r1', 'r4', None], ['r1', 'r3', None], ['r3', 'r5', 'gold']],\n    'r0',\n    'r1'],\n   {'solvable': True, 'keys': ['blue', 'gold', 'red'], 'visited': 6}),\n  ('reverse listed door #1',\n   [{}, [['r1', 'r0', None]], 'r0', 'r1'],\n   {'solvable': True, 'keys': [], 'visited': 2}),\n  ('key behind first door #1',\n   [{'r1': ['red']}, [['r1', 'r2', 'red'], ['r0', 'r1', None]], 'r0', 'r2'],\n   {'solvable': True, 'keys': ['red'], 'visited': 3}),\n  ('control #1',\n   [{'r0': ['red']}, [['r0', 'r1', None]], 'r0', 'r1'],\n   {'solvable': True, 'keys': ['red'], 'visited': 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":"9db0a04543d8cab646e48b6a52513e2d98308fec71c6b90b9f5a7663f9602f08","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(rooms, edges, start, goal):\n    have = set()\n    seen = {start}\n    changed = True\n    while changed:\n        changed = False\n        for r in list(seen):\n            for k in rooms.get(r, []):\n                if k not in have:\n                    have.add(k)\n                    changed = True\n        for a, b, lock in edges:\n            for u, v in ((a, b), (b, a)):\n                if u in seen and v not in seen and (lock is None or lock in have):\n                    seen.add(v)\n                    changed = True\n    return {'solvable': goal in seen, 'keys': sorted(have), 'visited': len(seen)}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = [[('wrong colour #1',\n   [{'r0': ['blue']}, [['r0', 'r1', 'red']], 'r0', 'r1'],\n   {'solvable': False, 'keys': ['blue'], 'visited': 1}),\n  ('fault site lock matching #1',\n   [{'r0': ['gold'], 'r1': ['red'], 'r2': ['gold']},\n    [['r0', 'r1', 'red'], ['r2', 'r1', 'red'], ['r0', 'r2', None]],\n    'r0',\n    'r2'],\n   {'solvable': True, 'keys': ['gold'], 'visited': 2}),\n  ('fault site lock matching #2',\n   [{'r0': ['red'], 'r3': ['gold']},\n    [['r4', 'r2', None], ['r0', 'r1', 'blue'], ['r2', 'r0', None], ['r2', 'r3', 'gold']],\n    'r0',\n    'r4'],\n   {'solvable': True, 'keys': ['red'], 'visited': 3}),\n  ('partial repair boundary #1',\n   [{'r0': ['gold'], 'r2': ['blue']},\n    [['r2', 'r1', 'gold'],\n     ['r3', 'r1', 'blue'],\n     ['r1', 'r3', None],\n     ['r1', 'r0', None],\n     ['r2', 'r3', 'blue']],\n    'r0',\n    'r3'],\n   {'solvable': True, 'keys': ['blue', 'gold'], 'visited': 4}),\n  ('partial repair boundary #2',\n   [{'r0': ['red'], 'r1': ['gold'], 'r4': ['gold'], 'r5': ['blue'], 'r6': ['red']},\n    [['r1', 'r2', 'blue'],\n     ['r0', 'r2', 'red'],\n     ['r0', 'r1', 'blue'],\n     ['r3', 'r6', 'gold'],\n     ['r4', 'r0', None],\n     ['r3', 'r2', 'blue'],\n     ['r2', 'r5', None]],\n    'r0',\n    'r6'],\n   {'solvable': True, 'keys': ['blue', 'gold', 'red'], 'visited': 7}),\n  ('reverse listed door #1',\n   [{}, [['r1', 'r0', None]], 'r0', 'r1'],\n   {'solvable': True, 'keys': [], 'visited': 2}),\n  ('key behind first door #1',\n   [{'r1': ['red']}, [['r1', 'r2', 'red'], ['r0', 'r1', None]], 'r0', 'r2'],\n   {'solvable': True, 'keys': ['red'], 'visited': 3}),\n  ('control #1', [{}, [['r0', 'r1', 'blue']], 'r0', 'r1'], {'solvable': False, 'keys': [], 'visited': 1})],\n [('wrong colour #1',\n   [{'r0': ['blue']}, [['r0', 'r1', 'red']], 'r0', 'r1'],\n   {'solvable': False, 'keys': ['blue'], 'visited': 1}),\n  ('fault site lock matching #1',\n   [{'r0': ['red'], 'r3': ['gold']},\n    [['r4', 'r2', None], ['r0', 'r1', 'blue'], ['r2', 'r0', None], ['r2', 'r3', 'gold']],\n    'r0',\n    'r4'],\n   {'solvable': True, 'keys': ['red'], 'visited': 3}),\n  ('regression lock matching #1',\n   [{'r3': ['blue'], 'r4': ['gold']},\n    [['r4', 'r1', 'blue'],\n     ['r5', 'r3', None],\n     ['r5', 'r4', 'red'],\n     ['r1', 'r0', 'gold'],\n     ['r0', 'r2', 'blue'],\n     ['r4', 'r0', None],\n     ['r3', 'r2', None]],\n    'r0',\n    'r4'],\n   {'solvable': True, 'keys': ['gold'], 'visited': 3}),\n  ('regression lock matching #2',\n   [{'r1': ['red'], 'r4': ['blue'], 'r6': ['gold']},\n    [['r1', 'r0', 'blue'],\n     ['r2', 'r6', 'blue'],\n     ['r5', 'r4', None],\n     ['r0', 'r2', 'gold'],\n     ['r1', 'r3', None],\n     ['r0', 'r4', None]],\n    'r0',\n    'r5'],\n   {'solvable': True, 'keys': ['blue', 'red'], 'visited': 5}),\n  ('partial repair boundary #1',\n   [{'r2': ['gold'], 'r3': ['red']},\n    [['r2', 'r0', None], ['r2', 'r4', 'gold'], ['r5', 'r4', None], ['r3', 'r2', None], ['r0', 'r1', 'gold']],\n    'r0',\n    'r1'],\n   {'solvable': True, 'keys': ['gold', 'red'], 'visited': 6}),\n  ('reverse listed door #1',\n   [{}, [['r1', 'r0', None]], 'r0', 'r1'],\n   {'solvable': True, 'keys': [], 'visited': 2}),\n  ('key behind first door #1',\n   [{'r1': ['red']}, [['r1', 'r2', 'red'], ['r0', 'r1', None]], 'r0', 'r2'],\n   {'solvable': True, 'keys': ['red'], 'visited': 3}),\n  ('control #1', [{}, [['r0', 'r1', 'blue']], 'r0', 'r1'], {'solvable': False, 'keys': [], 'visited': 1})],\n [('wrong colour #1',\n   [{'r0': ['blue']}, [['r0', 'r1', 'red']], 'r0', 'r1'],\n   {'solvable': False, 'keys': ['blue'], 'visited': 1}),\n  ('fault site lock matching #1',\n   [{'r0': ['blue'], 'r3': ['red']},\n    [['r1', 'r0', None],\n     ['r5', 'r3', None],\n     ['r1', 'r2', 'red'],\n     ['r3', 'r2', 'red'],\n     ['r0', 'r4', 'gold'],\n     ['r3', 'r1', None],\n     ['r0', 'r5', 'gold']],\n    'r0',\n    'r5'],\n   {'solvable': True, 'keys': ['blue', 'red'], 'visited': 5}),\n  ('regression lock matching #1',\n   [{'r1': ['red'], 'r4': ['blue'], 'r6': ['gold']},\n    [['r1', 'r0', 'blue'],\n     ['r2', 'r6', 'blue'],\n     ['r5', 'r4', None],\n     ['r0', 'r2', 'gold'],\n     ['r1', 'r3', None],\n     ['r0', 'r4', None]],\n    'r0',\n    'r5'],\n   {'solvable': True, 'keys': ['blue', 'red'], 'visited': 5}),\n  ('partial repair boundary #1',\n   [{'r2': ['gold'], 'r3': ['red']},\n    [['r2', 'r0', None], ['r2', 'r4', 'gold'], ['r5', 'r4', None], ['r3', 'r2', None], ['r0', 'r1', 'gold']],\n    'r0',\n    'r1'],\n   {'solvable': True, 'keys': ['gold', 'red'], 'visited': 6}),\n  ('partial repair boundary #2',\n   [{'r0': ['red'], 'r1': ['gold'], 'r2': ['red']},\n    [['r0', 'r3', 'gold'],\n     ['r2', 'r0', 'red'],\n     ['r0', 'r1', 'gold'],\n     ['r0', 'r4', None],\n     ['r0', 'r1', 'red']],\n    'r0',\n    'r3'],\n   {'solvable': True, 'keys': ['gold', 'red'], 'visited': 5}),\n  ('reverse listed door #1',\n   [{}, [['r1', 'r0', None]], 'r0', 'r1'],\n   {'solvable': True, 'keys': [], 'visited': 2}),\n  ('key behind first door #1',\n   [{'r1': ['red']}, [['r1', 'r2', 'red'], ['r0', 'r1', None]], 'r0', 'r2'],\n   {'solvable': True, 'keys': ['red'], 'visited': 3}),\n  ('control #1', [{}, [['r0', 'r1', 'blue']], 'r0', 'r1'], {'solvable': False, 'keys': [], 'visited': 1})],\n [('wrong colour #1',\n   [{'r0': ['blue']}, [['r0', 'r1', 'red']], 'r0', 'r1'],\n   {'solvable': False, 'keys': ['blue'], 'visited': 1}),\n  ('fault site lock matching #1',\n   [{'r0': ['blue'], 'r1': ['red']}, [['r0', 'r1', 'red']], 'r0', 'r1'],\n   {'solvable': False, 'keys': ['blue'], 'visited': 1}),\n  ('fault site lock matching #2',\n   [{'r0': ['gold'], 'r2': ['gold'], 'r3': ['red'], 'r4': ['red']},\n    [['r0', 'r1', None],\n     ['r1', 'r2', 'blue'],\n     ['r6', 'r1', None],\n     ['r5', 'r0', 'blue'],\n     ['r3', 'r2', 'gold'],\n     ['r4', 'r0', None]],\n    'r0',\n    'r3'],\n   {'solvable': False, 'keys': ['gold', 'red'], 'visited': 4}),\n  ('regression lock matching #1',\n   [{'r0': ['blue'], 'r3': ['blue']},\n    [['r3', 'r4', None],\n     ['r1', 'r2', 'gold'],\n     ['r1', 'r0', 'blue'],\n     ['r1', 'r5', 'gold'],\n     ['r3', 'r4', 'red'],\n     ['r1', 'r3', 'blue']],\n    'r0',\n    'r1'],\n   {'solvable': True, 'keys': ['blue'], 'visited': 4}),\n  ('partial repair boundary #1',\n   [{'r0': ['blue']},\n    [['r2', 'r0', 'red'], ['r1', 'r0', 'red'], ['r0', 'r1', 'blue'], ['r1', 'r2', 'blue']],\n    'r0',\n    'r1'],\n   {'solvable': True, 'keys': ['blue'], 'visited': 3}),\n  ('reverse listed door #1',\n   [{}, [['r1', 'r0', None]], 'r0', 'r1'],\n   {'solvable': True, 'keys': [], 'visited': 2}),\n  ('key behind first door #1',\n   [{'r1': ['red']}, [['r1', 'r2', 'red'], ['r0', 'r1', None]], 'r0', 'r2'],\n   {'solvable': True, 'keys': ['red'], 'visited': 3}),\n  ('control #1',\n   [{'r4': ['red']},\n    [['r3', 'r1', 'gold'], ['r3', 'r4', 'blue'], ['r2', 'r1', None], ['r1', 'r0', None]],\n    'r0',\n    'r3'],\n   {'solvable': False, 'keys': [], 'visited': 3})],\n [('wrong colour #1',\n   [{'r0': ['blue']}, [['r0', 'r1', 'red']], 'r0', 'r1'],\n   {'solvable': False, 'keys': ['blue'], 'visited': 1}),\n  ('fault site lock matching #1',\n   [{'r0': ['blue'], 'r2': ['red'], 'r3': ['blue'], 'r4': ['blue']},\n    [['r3', 'r2', 'red'], ['r4', 'r0', None], ['r1', 'r2', 'red'], ['r1', 'r0', None]],\n    'r0',\n    'r3'],\n   {'solvable': False, 'keys': ['blue'], 'visited': 3}),\n  ('regression lock matching #1',\n   [{'r0': ['blue'], 'r3': ['blue']},\n    [['r3', 'r4', None],\n     ['r1', 'r2', 'gold'],\n     ['r1', 'r0', 'blue'],\n     ['r1', 'r5', 'gold'],\n     ['r3', 'r4', 'red'],\n     ['r1', 'r3', 'blue']],\n    'r0',\n    'r1'],\n   {'solvable': True, 'keys': ['blue'], 'visited': 4}),\n  ('partial repair boundary #1',\n   [{'r0': ['blue'], 'r2': ['blue'], 'r3': ['gold'], 'r4': ['gold']},\n    [['r2', 'r0', None],\n     ['r1', 'r0', 'blue'],\n     ['r2', 'r4', 'blue'],\n     ['r0', 'r3', None],\n     ['r5', 'r1', 'gold']],\n    'r0',\n    'r4'],\n   {'solvable': True, 'keys': ['blue', 'gold'], 'visited': 6}),\n  ('partial repair boundary #2',\n   [{'r1': ['blue'], 'r2': ['gold'], 'r4': ['red']},\n    [['r2', 'r0', None], ['r1', 'r0', None], ['r1', 'r4', None], ['r1', 'r3', None], ['r3', 'r5', 'gold']],\n    'r0',\n    'r1'],\n   {'solvable': True, 'keys': ['blue', 'gold', 'red'], 'visited': 6}),\n  ('reverse listed door #1',\n   [{}, [['r1', 'r0', None]], 'r0', 'r1'],\n   {'solvable': True, 'keys': [], 'visited': 2}),\n  ('key behind first door #1',\n   [{'r1': ['red']}, [['r1', 'r2', 'red'], ['r0', 'r1', None]], 'r0', 'r2'],\n   {'solvable': True, 'keys': ['red'], 'visited': 3}),\n  ('control #1',\n   [{'r0': ['red']}, [['r0', 'r1', None]], 'r0', 'r1'],\n   {'solvable': True, 'keys': ['red'], 'visited': 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-procedural-level-generation-constraints-key-lock-lock-matching","generated_at":"2026-09-29T14:50:49.326854+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Procedural generators silently emit unplayable or unfair levels when a single constraint check uses the wrong boundary, axis, neighborhood or update order; the defect is visible in exact generated geometry.","repair":"Restore `(lock is None or lock in have)` at the lock matching step.","root_cause":"The lock test only checks that some key is held.","sha256":"a8871eb7a02d6ff3bfdd262d64addbafaf9faa5543cf77562ec1db58fe7e3e7b","title":"Key and lock solvability: Any key opens any lock · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":43.074,"exit_code":1,"observations":[{"actual":{"keys":["blue"],"solvable":false,"visited":1},"check":"wrong colour #1","expected":{"keys":["blue"],"solvable":false,"visited":1},"passed":true},{"actual":{"keys":["gold"],"solvable":true,"visited":2},"check":"fault site lock matching #1","expected":{"keys":["gold"],"solvable":true,"visited":2},"passed":true},{"actual":{"keys":["red"],"solvable":true,"visited":3},"check":"fault site lock matching #2","expected":{"keys":["red"],"solvable":true,"visited":3},"passed":true},{"actual":{"keys":["gold"],"solvable":true,"visited":3},"check":"partial repair boundary #1","expected":{"keys":["blue","gold"],"solvable":true,"visited":4},"passed":false},{"actual":{"keys":["blue","gold","red"],"solvable":false,"visited":4},"check":"partial repair boundary #2","expected":{"keys":["blue","gold","red"],"solvable":true,"visited":7},"passed":false},{"actual":{"keys":[],"solvable":true,"visited":2},"check":"reverse listed door #1","expected":{"keys":[],"solvable":true,"visited":2},"passed":true},{"actual":{"keys":["red"],"solvable":true,"visited":3},"check":"key behind first door #1","expected":{"keys":["red"],"solvable":true,"visited":3},"passed":true},{"actual":{"keys":[],"solvable":false,"visited":1},"check":"control #1","expected":{"keys":[],"solvable":false,"visited":1},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"wrong colour #1\", \"actual\": {\"solvable\": false, \"keys\": [\"blue\"], \"visited\": 1}, \"expected\": {\"solvable\": false, \"keys\": [\"blue\"], \"visited\": 1}, \"passed\": true}, {\"check\": \"fault site lock matching #1\", \"actual\": {\"solvable\": true, \"keys\": [\"gold\"], \"visited\": 2}, \"expected\": {\"solvable\": true, \"keys\": [\"gold\"], \"visited\": 2}, \"passed\": true}, {\"check\": \"fault site lock matching #2\", \"actual\": {\"solvable\": true, \"keys\": [\"red\"], \"visited\": 3}, \"expected\": {\"solvable\": true, \"keys\": [\"red\"], \"visited\": 3}, \"passed\": true}, {\"check\": \"partial repair boundary #1\", \"actual\": {\"solvable\": true, \"keys\": [\"gold\"], \"visited\": 3}, \"expected\": {\"solvable\": true, \"keys\": [\"blue\", \"gold\"], \"visited\": 4}, \"passed\": false}, {\"check\": \"partial repair boundary #2\", \"actual\": {\"solvable\": false, \"keys\": [\"blue\", \"gold\", \"red\"], \"visited\": 4}, \"expected\": {\"solvable\": true, \"keys\": [\"blue\", \"gold\", \"red\"], \"visited\": 7}, \"passed\": false}, {\"check\": \"reverse listed door #1\", \"actual\": {\"solvable\": true, \"keys\": [], \"visited\": 2}, \"expected\": {\"solvable\": true, \"keys\": [], \"visited\": 2}, \"passed\": true}, {\"check\": \"key behind first door #1\", \"actual\": {\"solvable\": true, \"keys\": [\"red\"], \"visited\": 3}, \"expected\": {\"solvable\": true, \"keys\": [\"red\"], \"visited\": 3}, \"passed\": true}, {\"check\": \"control #1\", \"actual\": {\"solvable\": false, \"keys\": [], \"visited\": 1}, \"expected\": {\"solvable\": false, \"keys\": [], \"visited\": 1}, \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":40.459,"exit_code":1,"observations":[{"actual":{"keys":["blue"],"solvable":true,"visited":2},"check":"wrong colour #1","expected":{"keys":["blue"],"solvable":false,"visited":1},"passed":false},{"actual":{"keys":["gold","red"],"solvable":true,"visited":3},"check":"fault site lock matching #1","expected":{"keys":["gold"],"solvable":true,"visited":2},"passed":false},{"actual":{"keys":["gold","red"],"solvable":true,"visited":5},"check":"fault site lock matching #2","expected":{"keys":["red"],"solvable":true,"visited":3},"passed":false},{"actual":{"keys":["blue","gold"],"solvable":true,"visited":4},"check":"partial repair boundary #1","expected":{"keys":["blue","gold"],"solvable":true,"visited":4},"passed":true},{"actual":{"keys":["blue","gold","red"],"solvable":true,"visited":7},"check":"partial repair boundary #2","expected":{"keys":["blue","gold","red"],"solvable":true,"visited":7},"passed":true},{"actual":{"keys":[],"solvable":true,"visited":2},"check":"reverse listed door #1","expected":{"keys":[],"solvable":true,"visited":2},"passed":true},{"actual":{"keys":["red"],"solvable":true,"visited":3},"check":"key behind first door #1","expected":{"keys":["red"],"solvable":true,"visited":3},"passed":true},{"actual":{"keys":[],"solvable":false,"visited":1},"check":"control #1","expected":{"keys":[],"solvable":false,"visited":1},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"wrong colour #1\", \"actual\": {\"solvable\": true, \"keys\": [\"blue\"], \"visited\": 2}, \"expected\": {\"solvable\": false, \"keys\": [\"blue\"], \"visited\": 1}, \"passed\": false}, {\"check\": \"fault site lock matching #1\", \"actual\": {\"solvable\": true, \"keys\": [\"gold\", \"red\"], \"visited\": 3}, \"expected\": {\"solvable\": true, \"keys\": [\"gold\"], \"visited\": 2}, \"passed\": false}, {\"check\": \"fault site lock matching #2\", \"actual\": {\"solvable\": true, \"keys\": [\"gold\", \"red\"], \"visited\": 5}, \"expected\": {\"solvable\": true, \"keys\": [\"red\"], \"visited\": 3}, \"passed\": false}, {\"check\": \"partial repair boundary #1\", \"actual\": {\"solvable\": true, \"keys\": [\"blue\", \"gold\"], \"visited\": 4}, \"expected\": {\"solvable\": true, \"keys\": [\"blue\", \"gold\"], \"visited\": 4}, \"passed\": true}, {\"check\": \"partial repair boundary #2\", \"actual\": {\"solvable\": true, \"keys\": [\"blue\", \"gold\", \"red\"], \"visited\": 7}, \"expected\": {\"solvable\": true, \"keys\": [\"blue\", \"gold\", \"red\"], \"visited\": 7}, \"passed\": true}, {\"check\": \"reverse listed door #1\", \"actual\": {\"solvable\": true, \"keys\": [], \"visited\": 2}, \"expected\": {\"solvable\": true, \"keys\": [], \"visited\": 2}, \"passed\": true}, {\"check\": \"key behind first door #1\", \"actual\": {\"solvable\": true, \"keys\": [\"red\"], \"visited\": 3}, \"expected\": {\"solvable\": true, \"keys\": [\"red\"], \"visited\": 3}, \"passed\": true}, {\"check\": \"control #1\", \"actual\": {\"solvable\": false, \"keys\": [], \"visited\": 1}, \"expected\": {\"solvable\": false, \"keys\": [], \"visited\": 1}, \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":39.107,"exit_code":0,"observations":[{"actual":{"keys":["blue"],"solvable":false,"visited":1},"check":"wrong colour #1","expected":{"keys":["blue"],"solvable":false,"visited":1},"passed":true},{"actual":{"keys":["gold"],"solvable":true,"visited":2},"check":"fault site lock matching #1","expected":{"keys":["gold"],"solvable":true,"visited":2},"passed":true},{"actual":{"keys":["red"],"solvable":true,"visited":3},"check":"fault site lock matching #2","expected":{"keys":["red"],"solvable":true,"visited":3},"passed":true},{"actual":{"keys":["blue","gold"],"solvable":true,"visited":4},"check":"partial repair boundary #1","expected":{"keys":["blue","gold"],"solvable":true,"visited":4},"passed":true},{"actual":{"keys":["blue","gold","red"],"solvable":true,"visited":7},"check":"partial repair boundary #2","expected":{"keys":["blue","gold","red"],"solvable":true,"visited":7},"passed":true},{"actual":{"keys":[],"solvable":true,"visited":2},"check":"reverse listed door #1","expected":{"keys":[],"solvable":true,"visited":2},"passed":true},{"actual":{"keys":["red"],"solvable":true,"visited":3},"check":"key behind first door #1","expected":{"keys":["red"],"solvable":true,"visited":3},"passed":true},{"actual":{"keys":[],"solvable":false,"visited":1},"check":"control #1","expected":{"keys":[],"solvable":false,"visited":1},"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"wrong colour #1\", \"actual\": {\"solvable\": false, \"keys\": [\"blue\"], \"visited\": 1}, \"expected\": {\"solvable\": false, \"keys\": [\"blue\"], \"visited\": 1}, \"passed\": true}, {\"check\": \"fault site lock matching #1\", \"actual\": {\"solvable\": true, \"keys\": [\"gold\"], \"visited\": 2}, \"expected\": {\"solvable\": true, \"keys\": [\"gold\"], \"visited\": 2}, \"passed\": true}, {\"check\": \"fault site lock matching #2\", \"actual\": {\"solvable\": true, \"keys\": [\"red\"], \"visited\": 3}, \"expected\": {\"solvable\": true, \"keys\": [\"red\"], \"visited\": 3}, \"passed\": true}, {\"check\": \"partial repair boundary #1\", \"actual\": {\"solvable\": true, \"keys\": [\"blue\", \"gold\"], \"visited\": 4}, \"expected\": {\"solvable\": true, \"keys\": [\"blue\", \"gold\"], \"visited\": 4}, \"passed\": true}, {\"check\": \"partial repair boundary #2\", \"actual\": {\"solvable\": true, \"keys\": [\"blue\", \"gold\", \"red\"], \"visited\": 7}, \"expected\": {\"solvable\": true, \"keys\": [\"blue\", \"gold\", \"red\"], \"visited\": 7}, \"passed\": true}, {\"check\": \"reverse listed door #1\", \"actual\": {\"solvable\": true, \"keys\": [], \"visited\": 2}, \"expected\": {\"solvable\": true, \"keys\": [], \"visited\": 2}, \"passed\": true}, {\"check\": \"key behind first door #1\", \"actual\": {\"solvable\": true, \"keys\": [\"red\"], \"visited\": 3}, \"expected\": {\"solvable\": true, \"keys\": [\"red\"], \"visited\": 3}, \"passed\": true}, {\"check\": \"control #1\", \"actual\": {\"solvable\": false, \"keys\": [], \"visited\": 1}, \"expected\": {\"solvable\": false, \"keys\": [], \"visited\": 1}, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}