{"abstract":"After the scope closes, writes through one closure are invisible to its sibling.","category":"Bytecode virtual machines","checks":7,"contract":"A register/stack VM with open and closed upvalues. [\"local\", v] pushes a slot; [\"set\", s, v] and [\"get\", s] access slots; [\"closure\", id, [slots]] captures slots, reusing the existing open upvalue for a slot so closures share variables; [\"uset\"/\"uget\", id, k, (v)] access the k-th upvalue, going to the stack slot while open and to the upvalue's own cell once closed; [\"close\", level] closes every open upvalue whose slot >= level (copying the slot value) and truncates the stack to level. Accessing a vanished slot appends \"dangling-slot\" and stops.","evaluation_group":"w2-bytecode-virtual-machines-closure-upvalues","failed_approach":"Deduplicating only within the closure being created still splits sharing between closures.","family":"w2-bytecode-virtual-machines-closure-upvalues-open-upvalue-sharing","id":"FA-90076","implementations":{"attempt":{"sha256":"a2907520ec2252f957dd8596b105ce9c828f42ccad66d550ca084e095f88e530","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(events):\n    stack = []\n    open_uv = []\n    closures = {}\n    out = []\n    try:\n        for ev in events:\n            op = ev[0]\n            if op == 'local':\n                stack.append(ev[1])\n            elif op == 'set':\n                stack[ev[1]] = ev[2]\n            elif op == 'get':\n                out.append(stack[ev[1]])\n            elif op == 'closure':\n                ups = []\n                for s in ev[2]:\n                    uv = next((u for u in ups if u['slot'] == s), None)\n                    if uv is None:\n                        uv = {'slot': s, 'open': True, 'value': None}\n                        open_uv.append(uv)\n                    ups.append(uv)\n                closures[ev[1]] = ups\n            elif op == 'uset':\n                uv = closures[ev[1]][ev[2]]\n                if uv['open']:\n                    stack[uv['slot']] = ev[3]\n                else:\n                    uv['value'] = ev[3]\n            elif op == 'uget':\n                uv = closures[ev[1]][ev[2]]\n                out.append(stack[uv['slot']] if uv['open'] else uv['value'])\n            elif op == 'close':\n                level = ev[1]\n                for uv in open_uv:\n                    if uv['slot'] >= level:\n                        uv['value'] = stack[uv['slot']]\n                        uv['open'] = False\n                open_uv = [u for u in open_uv if u['open']]\n                del stack[level:]\n    except IndexError:\n        out.append('dangling-slot')\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = [[('two closures share one open upvalue',\n   ([['local', 10],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 6],\n     ['uget', 'g', 0],\n     ['get', 1]],),\n   [6, 6]),\n  ('closing a scope keeps closures linked',\n   ([['local', 10],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 6],\n     ['uget', 'g', 0],\n     ['get', 1],\n     ['close', 1],\n     ['uset', 'g', 0, 0],\n     ['uget', 'f', 1]],),\n   [6, 6, 0]),\n  ('regression: new local reusing a closed slot',\n   ([['local', 10],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 6],\n     ['uget', 'g', 0],\n     ['get', 1],\n     ['close', 1],\n     ['uset', 'g', 0, 0],\n     ['uget', 'f', 1],\n     ['local', 78],\n     ['closure', 'h', [1]],\n     ['uget', 'h', 0],\n     ['uget', 'f', 1]],),\n   [6, 6, 0, 78, 0]),\n  ('open upvalue tracks later stack writes',\n   ([['local', 10],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 6],\n     ['uget', 'g', 0],\n     ['get', 1],\n     ['close', 1],\n     ['uset', 'g', 0, 0],\n     ['uget', 'f', 1],\n     ['local', 78],\n     ['closure', 'h', [1]],\n     ['uget', 'h', 0],\n     ['uget', 'f', 1],\n     ['uget', 'f', 0],\n     ['set', 0, 3],\n     ['uget', 'f', 0],\n     ['close', 0],\n     ['uget', 'h', 0]],),\n   [6, 6, 0, 78, 0, 10, 3, 78]),\n  ('slot reuse after closing everything',\n   ([['local', 10],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 6],\n     ['uget', 'g', 0],\n     ['get', 1],\n     ['close', 1],\n     ['uset', 'g', 0, 0],\n     ['uget', 'f', 1],\n     ['local', 78],\n     ['closure', 'h', [1]],\n     ['uget', 'h', 0],\n     ['uget', 'f', 1],\n     ['uget', 'f', 0],\n     ['set', 0, 3],\n     ['uget', 'f', 0],\n     ['close', 0],\n     ['uget', 'h', 0],\n     ['local', 109],\n     ['closure', 'k', [0]],\n     ['uget', 'k', 0],\n     ['uget', 'f', 0],\n     ['get', 0]],),\n   [6, 6, 0, 78, 0, 10, 3, 78, 109, 3, 109]),\n  ('closure over only the outer local',\n   ([['local', 1], ['closure', 'c', [0]], ['close', 0], ['local', 2], ['uget', 'c', 0], ['get', 0]],),\n   [1, 2]),\n  ('control: plain locals', ([['local', 1], ['local', 2], ['set', 1, 4], ['get', 1], ['get', 0]],), [4, 1])],\n [('two closures share one open upvalue',\n   ([['local', 20],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 7],\n     ['uget', 'g', 0],\n     ['get', 1]],),\n   [7, 7]),\n  ('closing a scope keeps closures linked',\n   ([['local', 20],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 7],\n     ['uget', 'g', 0],\n     ['get', 1],\n     ['close', 1],\n     ['uset', 'g', 0, 0],\n     ['uget', 'f', 1]],),\n   [7, 7, 0]),\n  ('regression: new local reusing a closed slot',\n   ([['local', 20],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 7],\n     ['uget', 'g', 0],\n     ['get', 1],\n     ['close', 1],\n     ['uset', 'g', 0, 0],\n     ['uget', 'f', 1],\n     ['local', 79],\n     ['closure', 'h', [1]],\n     ['uget', 'h', 0],\n     ['uget', 'f', 1]],),\n   [7, 7, 0, 79, 0]),\n  ('open upvalue tracks later stack writes',\n   ([['local', 20],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 7],\n     ['uget', 'g', 0],\n     ['get', 1],\n     ['close', 1],\n     ['uset', 'g', 0, 0],\n     ['uget', 'f', 1],\n     ['local', 79],\n     ['closure', 'h', [1]],\n     ['uget', 'h', 0],\n     ['uget', 'f', 1],\n     ['uget', 'f', 0],\n     ['set', 0, 6],\n     ['uget', 'f', 0],\n     ['close', 0],\n     ['uget', 'h', 0]],),\n   [7, 7, 0, 79, 0, 20, 6, 79]),\n  ('slot reuse after closing everything',\n   ([['local', 20],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 7],\n     ['uget', 'g', 0],\n     ['get', 1],\n     ['close', 1],\n     ['uset', 'g', 0, 0],\n     ['uget', 'f', 1],\n     ['local', 79],\n     ['closure', 'h', [1]],\n     ['uget', 'h', 0],\n     ['uget', 'f', 1],\n     ['uget', 'f', 0],\n     ['set', 0, 6],\n     ['uget', 'f', 0],\n     ['close', 0],\n     ['uget', 'h', 0],\n     ['local', 109],\n     ['closure', 'k', [0]],\n     ['uget', 'k', 0],\n     ['uget', 'f', 0],\n     ['get', 0]],),\n   [7, 7, 0, 79, 0, 20, 6, 79, 109, 6, 109]),\n  ('closure over only the outer local',\n   ([['local', 2], ['closure', 'c', [0]], ['close', 0], ['local', 2], ['uget', 'c', 0], ['get', 0]],),\n   [2, 2]),\n  ('control: plain locals', ([['local', 2], ['local', 2], ['set', 1, 4], ['get', 1], ['get', 0]],), [4, 2])],\n [('two closures share one open upvalue',\n   ([['local', 30],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 8],\n     ['uget', 'g', 0],\n     ['get', 1]],),\n   [8, 8]),\n  ('closing a scope keeps closures linked',\n   ([['local', 30],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 8],\n     ['uget', 'g', 0],\n     ['get', 1],\n     ['close', 1],\n     ['uset', 'g', 0, 0],\n     ['uget', 'f', 1]],),\n   [8, 8, 0]),\n  ('regression: new local reusing a closed slot',\n   ([['local', 30],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 8],\n     ['uget', 'g', 0],\n     ['get', 1],\n     ['close', 1],\n     ['uset', 'g', 0, 0],\n     ['uget', 'f', 1],\n     ['local', 80],\n     ['closure', 'h', [1]],\n     ['uget', 'h', 0],\n     ['uget', 'f', 1]],),\n   [8, 8, 0, 80, 0]),\n  ('open upvalue tracks later stack writes',\n   ([['local', 30],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 8],\n     ['uget', 'g', 0],\n     ['get', 1],\n     ['close', 1],\n     ['uset', 'g', 0, 0],\n     ['uget', 'f', 1],\n     ['local', 80],\n     ['closure', 'h', [1]],\n     ['uget', 'h', 0],\n     ['uget', 'f', 1],\n     ['uget', 'f', 0],\n     ['set', 0, 9],\n     ['uget', 'f', 0],\n     ['close', 0],\n     ['uget', 'h', 0]],),\n   [8, 8, 0, 80, 0, 30, 9, 80]),\n  ('slot reuse after closing everything',\n   ([['local', 30],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 8],\n     ['uget', 'g', 0],\n     ['get', 1],\n     ['close', 1],\n     ['uset', 'g', 0, 0],\n     ['uget', 'f', 1],\n     ['local', 80],\n     ['closure', 'h', [1]],\n     ['uget', 'h', 0],\n     ['uget', 'f', 1],\n     ['uget', 'f', 0],\n     ['set', 0, 9],\n     ['uget', 'f', 0],\n     ['close', 0],\n     ['uget', 'h', 0],\n     ['local', 109],\n     ['closure', 'k', [0]],\n     ['uget', 'k', 0],\n     ['uget', 'f', 0],\n     ['get', 0]],),\n   [8, 8, 0, 80, 0, 30, 9, 80, 109, 9, 109]),\n  ('closure over only the outer local',\n   ([['local', 3], ['closure', 'c', [0]], ['close', 0], ['local', 2], ['uget', 'c', 0], ['get', 0]],),\n   [3, 2]),\n  ('control: plain locals', ([['local', 3], ['local', 2], ['set', 1, 4], ['get', 1], ['get', 0]],), [4, 3])],\n [('two closures share one open upvalue',\n   ([['local', 40],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 9],\n     ['uget', 'g', 0],\n     ['get', 1]],),\n   [9, 9]),\n  ('closing a scope keeps closures linked',\n   ([['local', 40],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 9],\n     ['uget', 'g', 0],\n     ['get', 1],\n     ['close', 1],\n     ['uset', 'g', 0, 0],\n     ['uget', 'f', 1]],),\n   [9, 9, 0]),\n  ('regression: new local reusing a closed slot',\n   ([['local', 40],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 9],\n     ['uget', 'g', 0],\n     ['get', 1],\n     ['close', 1],\n     ['uset', 'g', 0, 0],\n     ['uget', 'f', 1],\n     ['local', 81],\n     ['closure', 'h', [1]],\n     ['uget', 'h', 0],\n     ['uget', 'f', 1]],),\n   [9, 9, 0, 81, 0]),\n  ('open upvalue tracks later stack writes',\n   ([['local', 40],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 9],\n     ['uget', 'g', 0],\n     ['get', 1],\n     ['close', 1],\n     ['uset', 'g', 0, 0],\n     ['uget', 'f', 1],\n     ['local', 81],\n     ['closure', 'h', [1]],\n     ['uget', 'h', 0],\n     ['uget', 'f', 1],\n     ['uget', 'f', 0],\n     ['set', 0, 12],\n     ['uget', 'f', 0],\n     ['close', 0],\n     ['uget', 'h', 0]],),\n   [9, 9, 0, 81, 0, 40, 12, 81]),\n  ('slot reuse after closing everything',\n   ([['local', 40],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 9],\n     ['uget', 'g', 0],\n     ['get', 1],\n     ['close', 1],\n     ['uset', 'g', 0, 0],\n     ['uget', 'f', 1],\n     ['local', 81],\n     ['closure', 'h', [1]],\n     ['uget', 'h', 0],\n     ['uget', 'f', 1],\n     ['uget', 'f', 0],\n     ['set', 0, 12],\n     ['uget', 'f', 0],\n     ['close', 0],\n     ['uget', 'h', 0],\n     ['local', 109],\n     ['closure', 'k', [0]],\n     ['uget', 'k', 0],\n     ['uget', 'f', 0],\n     ['get', 0]],),\n   [9, 9, 0, 81, 0, 40, 12, 81, 109, 12, 109]),\n  ('closure over only the outer local',\n   ([['local', 4], ['closure', 'c', [0]], ['close', 0], ['local', 2], ['uget', 'c', 0], ['get', 0]],),\n   [4, 2]),\n  ('control: plain locals', ([['local', 4], ['local', 2], ['set', 1, 4], ['get', 1], ['get', 0]],), [4, 4])],\n [('two closures share one open upvalue',\n   ([['local', 50],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 10],\n     ['uget', 'g', 0],\n     ['get', 1]],),\n   [10, 10]),\n  ('closing a scope keeps closures linked',\n   ([['local', 50],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 10],\n     ['uget', 'g', 0],\n     ['get', 1],\n     ['close', 1],\n     ['uset', 'g', 0, 0],\n     ['uget', 'f', 1]],),\n   [10, 10, 0]),\n  ('regression: new local reusing a closed slot',\n   ([['local', 50],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 10],\n     ['uget', 'g', 0],\n     ['get', 1],\n     ['close', 1],\n     ['uset', 'g', 0, 0],\n     ['uget', 'f', 1],\n     ['local', 82],\n     ['closure', 'h', [1]],\n     ['uget', 'h', 0],\n     ['uget', 'f', 1]],),\n   [10, 10, 0, 82, 0]),\n  ('open upvalue tracks later stack writes',\n   ([['local', 50],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 10],\n     ['uget', 'g', 0],\n     ['get', 1],\n     ['close', 1],\n     ['uset', 'g', 0, 0],\n     ['uget', 'f', 1],\n     ['local', 82],\n     ['closure', 'h', [1]],\n     ['uget', 'h', 0],\n     ['uget', 'f', 1],\n     ['uget', 'f', 0],\n     ['set', 0, 15],\n     ['uget', 'f', 0],\n     ['close', 0],\n     ['uget', 'h', 0]],),\n   [10, 10, 0, 82, 0, 50, 15, 82]),\n  ('slot reuse after closing everything',\n   ([['local', 50],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 10],\n     ['uget', 'g', 0],\n     ['get', 1],\n     ['close', 1],\n     ['uset', 'g', 0, 0],\n     ['uget', 'f', 1],\n     ['local', 82],\n     ['closure', 'h', [1]],\n     ['uget', 'h', 0],\n     ['uget', 'f', 1],\n     ['uget', 'f', 0],\n     ['set', 0, 15],\n     ['uget', 'f', 0],\n     ['close', 0],\n     ['uget', 'h', 0],\n     ['local', 109],\n     ['closure', 'k', [0]],\n     ['uget', 'k', 0],\n     ['uget', 'f', 0],\n     ['get', 0]],),\n   [10, 10, 0, 82, 0, 50, 15, 82, 109, 15, 109]),\n  ('closure over only the outer local',\n   ([['local', 5], ['closure', 'c', [0]], ['close', 0], ['local', 2], ['uget', 'c', 0], ['get', 0]],),\n   [5, 2]),\n  ('control: plain locals', ([['local', 5], ['local', 2], ['set', 1, 4], ['get', 1], ['get', 0]],), [4, 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":"09ae715b1030372b5604893b278c02ab6f17004d0954b854dc3ed42ff5b5ee5d","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(events):\n    stack = []\n    open_uv = []\n    closures = {}\n    out = []\n    try:\n        for ev in events:\n            op = ev[0]\n            if op == 'local':\n                stack.append(ev[1])\n            elif op == 'set':\n                stack[ev[1]] = ev[2]\n            elif op == 'get':\n                out.append(stack[ev[1]])\n            elif op == 'closure':\n                ups = []\n                for s in ev[2]:\n                    uv = None\n                    if uv is None:\n                        uv = {'slot': s, 'open': True, 'value': None}\n                        open_uv.append(uv)\n                    ups.append(uv)\n                closures[ev[1]] = ups\n            elif op == 'uset':\n                uv = closures[ev[1]][ev[2]]\n                if uv['open']:\n                    stack[uv['slot']] = ev[3]\n                else:\n                    uv['value'] = ev[3]\n            elif op == 'uget':\n                uv = closures[ev[1]][ev[2]]\n                out.append(stack[uv['slot']] if uv['open'] else uv['value'])\n            elif op == 'close':\n                level = ev[1]\n                for uv in open_uv:\n                    if uv['slot'] >= level:\n                        uv['value'] = stack[uv['slot']]\n                        uv['open'] = False\n                open_uv = [u for u in open_uv if u['open']]\n                del stack[level:]\n    except IndexError:\n        out.append('dangling-slot')\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = [[('two closures share one open upvalue',\n   ([['local', 10],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 6],\n     ['uget', 'g', 0],\n     ['get', 1]],),\n   [6, 6]),\n  ('closing a scope keeps closures linked',\n   ([['local', 10],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 6],\n     ['uget', 'g', 0],\n     ['get', 1],\n     ['close', 1],\n     ['uset', 'g', 0, 0],\n     ['uget', 'f', 1]],),\n   [6, 6, 0]),\n  ('regression: new local reusing a closed slot',\n   ([['local', 10],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 6],\n     ['uget', 'g', 0],\n     ['get', 1],\n     ['close', 1],\n     ['uset', 'g', 0, 0],\n     ['uget', 'f', 1],\n     ['local', 78],\n     ['closure', 'h', [1]],\n     ['uget', 'h', 0],\n     ['uget', 'f', 1]],),\n   [6, 6, 0, 78, 0]),\n  ('open upvalue tracks later stack writes',\n   ([['local', 10],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 6],\n     ['uget', 'g', 0],\n     ['get', 1],\n     ['close', 1],\n     ['uset', 'g', 0, 0],\n     ['uget', 'f', 1],\n     ['local', 78],\n     ['closure', 'h', [1]],\n     ['uget', 'h', 0],\n     ['uget', 'f', 1],\n     ['uget', 'f', 0],\n     ['set', 0, 3],\n     ['uget', 'f', 0],\n     ['close', 0],\n     ['uget', 'h', 0]],),\n   [6, 6, 0, 78, 0, 10, 3, 78]),\n  ('slot reuse after closing everything',\n   ([['local', 10],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 6],\n     ['uget', 'g', 0],\n     ['get', 1],\n     ['close', 1],\n     ['uset', 'g', 0, 0],\n     ['uget', 'f', 1],\n     ['local', 78],\n     ['closure', 'h', [1]],\n     ['uget', 'h', 0],\n     ['uget', 'f', 1],\n     ['uget', 'f', 0],\n     ['set', 0, 3],\n     ['uget', 'f', 0],\n     ['close', 0],\n     ['uget', 'h', 0],\n     ['local', 109],\n     ['closure', 'k', [0]],\n     ['uget', 'k', 0],\n     ['uget', 'f', 0],\n     ['get', 0]],),\n   [6, 6, 0, 78, 0, 10, 3, 78, 109, 3, 109]),\n  ('closure over only the outer local',\n   ([['local', 1], ['closure', 'c', [0]], ['close', 0], ['local', 2], ['uget', 'c', 0], ['get', 0]],),\n   [1, 2]),\n  ('control: plain locals', ([['local', 1], ['local', 2], ['set', 1, 4], ['get', 1], ['get', 0]],), [4, 1])],\n [('two closures share one open upvalue',\n   ([['local', 20],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 7],\n     ['uget', 'g', 0],\n     ['get', 1]],),\n   [7, 7]),\n  ('closing a scope keeps closures linked',\n   ([['local', 20],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 7],\n     ['uget', 'g', 0],\n     ['get', 1],\n     ['close', 1],\n     ['uset', 'g', 0, 0],\n     ['uget', 'f', 1]],),\n   [7, 7, 0]),\n  ('regression: new local reusing a closed slot',\n   ([['local', 20],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 7],\n     ['uget', 'g', 0],\n     ['get', 1],\n     ['close', 1],\n     ['uset', 'g', 0, 0],\n     ['uget', 'f', 1],\n     ['local', 79],\n     ['closure', 'h', [1]],\n     ['uget', 'h', 0],\n     ['uget', 'f', 1]],),\n   [7, 7, 0, 79, 0]),\n  ('open upvalue tracks later stack writes',\n   ([['local', 20],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 7],\n     ['uget', 'g', 0],\n     ['get', 1],\n     ['close', 1],\n     ['uset', 'g', 0, 0],\n     ['uget', 'f', 1],\n     ['local', 79],\n     ['closure', 'h', [1]],\n     ['uget', 'h', 0],\n     ['uget', 'f', 1],\n     ['uget', 'f', 0],\n     ['set', 0, 6],\n     ['uget', 'f', 0],\n     ['close', 0],\n     ['uget', 'h', 0]],),\n   [7, 7, 0, 79, 0, 20, 6, 79]),\n  ('slot reuse after closing everything',\n   ([['local', 20],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 7],\n     ['uget', 'g', 0],\n     ['get', 1],\n     ['close', 1],\n     ['uset', 'g', 0, 0],\n     ['uget', 'f', 1],\n     ['local', 79],\n     ['closure', 'h', [1]],\n     ['uget', 'h', 0],\n     ['uget', 'f', 1],\n     ['uget', 'f', 0],\n     ['set', 0, 6],\n     ['uget', 'f', 0],\n     ['close', 0],\n     ['uget', 'h', 0],\n     ['local', 109],\n     ['closure', 'k', [0]],\n     ['uget', 'k', 0],\n     ['uget', 'f', 0],\n     ['get', 0]],),\n   [7, 7, 0, 79, 0, 20, 6, 79, 109, 6, 109]),\n  ('closure over only the outer local',\n   ([['local', 2], ['closure', 'c', [0]], ['close', 0], ['local', 2], ['uget', 'c', 0], ['get', 0]],),\n   [2, 2]),\n  ('control: plain locals', ([['local', 2], ['local', 2], ['set', 1, 4], ['get', 1], ['get', 0]],), [4, 2])],\n [('two closures share one open upvalue',\n   ([['local', 30],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 8],\n     ['uget', 'g', 0],\n     ['get', 1]],),\n   [8, 8]),\n  ('closing a scope keeps closures linked',\n   ([['local', 30],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 8],\n     ['uget', 'g', 0],\n     ['get', 1],\n     ['close', 1],\n     ['uset', 'g', 0, 0],\n     ['uget', 'f', 1]],),\n   [8, 8, 0]),\n  ('regression: new local reusing a closed slot',\n   ([['local', 30],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 8],\n     ['uget', 'g', 0],\n     ['get', 1],\n     ['close', 1],\n     ['uset', 'g', 0, 0],\n     ['uget', 'f', 1],\n     ['local', 80],\n     ['closure', 'h', [1]],\n     ['uget', 'h', 0],\n     ['uget', 'f', 1]],),\n   [8, 8, 0, 80, 0]),\n  ('open upvalue tracks later stack writes',\n   ([['local', 30],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 8],\n     ['uget', 'g', 0],\n     ['get', 1],\n     ['close', 1],\n     ['uset', 'g', 0, 0],\n     ['uget', 'f', 1],\n     ['local', 80],\n     ['closure', 'h', [1]],\n     ['uget', 'h', 0],\n     ['uget', 'f', 1],\n     ['uget', 'f', 0],\n     ['set', 0, 9],\n     ['uget', 'f', 0],\n     ['close', 0],\n     ['uget', 'h', 0]],),\n   [8, 8, 0, 80, 0, 30, 9, 80]),\n  ('slot reuse after closing everything',\n   ([['local', 30],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 8],\n     ['uget', 'g', 0],\n     ['get', 1],\n     ['close', 1],\n     ['uset', 'g', 0, 0],\n     ['uget', 'f', 1],\n     ['local', 80],\n     ['closure', 'h', [1]],\n     ['uget', 'h', 0],\n     ['uget', 'f', 1],\n     ['uget', 'f', 0],\n     ['set', 0, 9],\n     ['uget', 'f', 0],\n     ['close', 0],\n     ['uget', 'h', 0],\n     ['local', 109],\n     ['closure', 'k', [0]],\n     ['uget', 'k', 0],\n     ['uget', 'f', 0],\n     ['get', 0]],),\n   [8, 8, 0, 80, 0, 30, 9, 80, 109, 9, 109]),\n  ('closure over only the outer local',\n   ([['local', 3], ['closure', 'c', [0]], ['close', 0], ['local', 2], ['uget', 'c', 0], ['get', 0]],),\n   [3, 2]),\n  ('control: plain locals', ([['local', 3], ['local', 2], ['set', 1, 4], ['get', 1], ['get', 0]],), [4, 3])],\n [('two closures share one open upvalue',\n   ([['local', 40],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 9],\n     ['uget', 'g', 0],\n     ['get', 1]],),\n   [9, 9]),\n  ('closing a scope keeps closures linked',\n   ([['local', 40],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 9],\n     ['uget', 'g', 0],\n     ['get', 1],\n     ['close', 1],\n     ['uset', 'g', 0, 0],\n     ['uget', 'f', 1]],),\n   [9, 9, 0]),\n  ('regression: new local reusing a closed slot',\n   ([['local', 40],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 9],\n     ['uget', 'g', 0],\n     ['get', 1],\n     ['close', 1],\n     ['uset', 'g', 0, 0],\n     ['uget', 'f', 1],\n     ['local', 81],\n     ['closure', 'h', [1]],\n     ['uget', 'h', 0],\n     ['uget', 'f', 1]],),\n   [9, 9, 0, 81, 0]),\n  ('open upvalue tracks later stack writes',\n   ([['local', 40],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 9],\n     ['uget', 'g', 0],\n     ['get', 1],\n     ['close', 1],\n     ['uset', 'g', 0, 0],\n     ['uget', 'f', 1],\n     ['local', 81],\n     ['closure', 'h', [1]],\n     ['uget', 'h', 0],\n     ['uget', 'f', 1],\n     ['uget', 'f', 0],\n     ['set', 0, 12],\n     ['uget', 'f', 0],\n     ['close', 0],\n     ['uget', 'h', 0]],),\n   [9, 9, 0, 81, 0, 40, 12, 81]),\n  ('slot reuse after closing everything',\n   ([['local', 40],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 9],\n     ['uget', 'g', 0],\n     ['get', 1],\n     ['close', 1],\n     ['uset', 'g', 0, 0],\n     ['uget', 'f', 1],\n     ['local', 81],\n     ['closure', 'h', [1]],\n     ['uget', 'h', 0],\n     ['uget', 'f', 1],\n     ['uget', 'f', 0],\n     ['set', 0, 12],\n     ['uget', 'f', 0],\n     ['close', 0],\n     ['uget', 'h', 0],\n     ['local', 109],\n     ['closure', 'k', [0]],\n     ['uget', 'k', 0],\n     ['uget', 'f', 0],\n     ['get', 0]],),\n   [9, 9, 0, 81, 0, 40, 12, 81, 109, 12, 109]),\n  ('closure over only the outer local',\n   ([['local', 4], ['closure', 'c', [0]], ['close', 0], ['local', 2], ['uget', 'c', 0], ['get', 0]],),\n   [4, 2]),\n  ('control: plain locals', ([['local', 4], ['local', 2], ['set', 1, 4], ['get', 1], ['get', 0]],), [4, 4])],\n [('two closures share one open upvalue',\n   ([['local', 50],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 10],\n     ['uget', 'g', 0],\n     ['get', 1]],),\n   [10, 10]),\n  ('closing a scope keeps closures linked',\n   ([['local', 50],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 10],\n     ['uget', 'g', 0],\n     ['get', 1],\n     ['close', 1],\n     ['uset', 'g', 0, 0],\n     ['uget', 'f', 1]],),\n   [10, 10, 0]),\n  ('regression: new local reusing a closed slot',\n   ([['local', 50],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 10],\n     ['uget', 'g', 0],\n     ['get', 1],\n     ['close', 1],\n     ['uset', 'g', 0, 0],\n     ['uget', 'f', 1],\n     ['local', 82],\n     ['closure', 'h', [1]],\n     ['uget', 'h', 0],\n     ['uget', 'f', 1]],),\n   [10, 10, 0, 82, 0]),\n  ('open upvalue tracks later stack writes',\n   ([['local', 50],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 10],\n     ['uget', 'g', 0],\n     ['get', 1],\n     ['close', 1],\n     ['uset', 'g', 0, 0],\n     ['uget', 'f', 1],\n     ['local', 82],\n     ['closure', 'h', [1]],\n     ['uget', 'h', 0],\n     ['uget', 'f', 1],\n     ['uget', 'f', 0],\n     ['set', 0, 15],\n     ['uget', 'f', 0],\n     ['close', 0],\n     ['uget', 'h', 0]],),\n   [10, 10, 0, 82, 0, 50, 15, 82]),\n  ('slot reuse after closing everything',\n   ([['local', 50],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 10],\n     ['uget', 'g', 0],\n     ['get', 1],\n     ['close', 1],\n     ['uset', 'g', 0, 0],\n     ['uget', 'f', 1],\n     ['local', 82],\n     ['closure', 'h', [1]],\n     ['uget', 'h', 0],\n     ['uget', 'f', 1],\n     ['uget', 'f', 0],\n     ['set', 0, 15],\n     ['uget', 'f', 0],\n     ['close', 0],\n     ['uget', 'h', 0],\n     ['local', 109],\n     ['closure', 'k', [0]],\n     ['uget', 'k', 0],\n     ['uget', 'f', 0],\n     ['get', 0]],),\n   [10, 10, 0, 82, 0, 50, 15, 82, 109, 15, 109]),\n  ('closure over only the outer local',\n   ([['local', 5], ['closure', 'c', [0]], ['close', 0], ['local', 2], ['uget', 'c', 0], ['get', 0]],),\n   [5, 2]),\n  ('control: plain locals', ([['local', 5], ['local', 2], ['set', 1, 4], ['get', 1], ['get', 0]],), [4, 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":"b40f53a6d9e9da906a69be80b4a5a5cfe135df9463b5c13c1b0f134eeb6c0f3b","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(events):\n    stack = []\n    open_uv = []\n    closures = {}\n    out = []\n    try:\n        for ev in events:\n            op = ev[0]\n            if op == 'local':\n                stack.append(ev[1])\n            elif op == 'set':\n                stack[ev[1]] = ev[2]\n            elif op == 'get':\n                out.append(stack[ev[1]])\n            elif op == 'closure':\n                ups = []\n                for s in ev[2]:\n                    uv = next((u for u in open_uv if u['slot'] == s), None)\n                    if uv is None:\n                        uv = {'slot': s, 'open': True, 'value': None}\n                        open_uv.append(uv)\n                    ups.append(uv)\n                closures[ev[1]] = ups\n            elif op == 'uset':\n                uv = closures[ev[1]][ev[2]]\n                if uv['open']:\n                    stack[uv['slot']] = ev[3]\n                else:\n                    uv['value'] = ev[3]\n            elif op == 'uget':\n                uv = closures[ev[1]][ev[2]]\n                out.append(stack[uv['slot']] if uv['open'] else uv['value'])\n            elif op == 'close':\n                level = ev[1]\n                for uv in open_uv:\n                    if uv['slot'] >= level:\n                        uv['value'] = stack[uv['slot']]\n                        uv['open'] = False\n                open_uv = [u for u in open_uv if u['open']]\n                del stack[level:]\n    except IndexError:\n        out.append('dangling-slot')\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = [[('two closures share one open upvalue',\n   ([['local', 10],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 6],\n     ['uget', 'g', 0],\n     ['get', 1]],),\n   [6, 6]),\n  ('closing a scope keeps closures linked',\n   ([['local', 10],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 6],\n     ['uget', 'g', 0],\n     ['get', 1],\n     ['close', 1],\n     ['uset', 'g', 0, 0],\n     ['uget', 'f', 1]],),\n   [6, 6, 0]),\n  ('regression: new local reusing a closed slot',\n   ([['local', 10],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 6],\n     ['uget', 'g', 0],\n     ['get', 1],\n     ['close', 1],\n     ['uset', 'g', 0, 0],\n     ['uget', 'f', 1],\n     ['local', 78],\n     ['closure', 'h', [1]],\n     ['uget', 'h', 0],\n     ['uget', 'f', 1]],),\n   [6, 6, 0, 78, 0]),\n  ('open upvalue tracks later stack writes',\n   ([['local', 10],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 6],\n     ['uget', 'g', 0],\n     ['get', 1],\n     ['close', 1],\n     ['uset', 'g', 0, 0],\n     ['uget', 'f', 1],\n     ['local', 78],\n     ['closure', 'h', [1]],\n     ['uget', 'h', 0],\n     ['uget', 'f', 1],\n     ['uget', 'f', 0],\n     ['set', 0, 3],\n     ['uget', 'f', 0],\n     ['close', 0],\n     ['uget', 'h', 0]],),\n   [6, 6, 0, 78, 0, 10, 3, 78]),\n  ('slot reuse after closing everything',\n   ([['local', 10],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 6],\n     ['uget', 'g', 0],\n     ['get', 1],\n     ['close', 1],\n     ['uset', 'g', 0, 0],\n     ['uget', 'f', 1],\n     ['local', 78],\n     ['closure', 'h', [1]],\n     ['uget', 'h', 0],\n     ['uget', 'f', 1],\n     ['uget', 'f', 0],\n     ['set', 0, 3],\n     ['uget', 'f', 0],\n     ['close', 0],\n     ['uget', 'h', 0],\n     ['local', 109],\n     ['closure', 'k', [0]],\n     ['uget', 'k', 0],\n     ['uget', 'f', 0],\n     ['get', 0]],),\n   [6, 6, 0, 78, 0, 10, 3, 78, 109, 3, 109]),\n  ('closure over only the outer local',\n   ([['local', 1], ['closure', 'c', [0]], ['close', 0], ['local', 2], ['uget', 'c', 0], ['get', 0]],),\n   [1, 2]),\n  ('control: plain locals', ([['local', 1], ['local', 2], ['set', 1, 4], ['get', 1], ['get', 0]],), [4, 1])],\n [('two closures share one open upvalue',\n   ([['local', 20],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 7],\n     ['uget', 'g', 0],\n     ['get', 1]],),\n   [7, 7]),\n  ('closing a scope keeps closures linked',\n   ([['local', 20],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 7],\n     ['uget', 'g', 0],\n     ['get', 1],\n     ['close', 1],\n     ['uset', 'g', 0, 0],\n     ['uget', 'f', 1]],),\n   [7, 7, 0]),\n  ('regression: new local reusing a closed slot',\n   ([['local', 20],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 7],\n     ['uget', 'g', 0],\n     ['get', 1],\n     ['close', 1],\n     ['uset', 'g', 0, 0],\n     ['uget', 'f', 1],\n     ['local', 79],\n     ['closure', 'h', [1]],\n     ['uget', 'h', 0],\n     ['uget', 'f', 1]],),\n   [7, 7, 0, 79, 0]),\n  ('open upvalue tracks later stack writes',\n   ([['local', 20],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 7],\n     ['uget', 'g', 0],\n     ['get', 1],\n     ['close', 1],\n     ['uset', 'g', 0, 0],\n     ['uget', 'f', 1],\n     ['local', 79],\n     ['closure', 'h', [1]],\n     ['uget', 'h', 0],\n     ['uget', 'f', 1],\n     ['uget', 'f', 0],\n     ['set', 0, 6],\n     ['uget', 'f', 0],\n     ['close', 0],\n     ['uget', 'h', 0]],),\n   [7, 7, 0, 79, 0, 20, 6, 79]),\n  ('slot reuse after closing everything',\n   ([['local', 20],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 7],\n     ['uget', 'g', 0],\n     ['get', 1],\n     ['close', 1],\n     ['uset', 'g', 0, 0],\n     ['uget', 'f', 1],\n     ['local', 79],\n     ['closure', 'h', [1]],\n     ['uget', 'h', 0],\n     ['uget', 'f', 1],\n     ['uget', 'f', 0],\n     ['set', 0, 6],\n     ['uget', 'f', 0],\n     ['close', 0],\n     ['uget', 'h', 0],\n     ['local', 109],\n     ['closure', 'k', [0]],\n     ['uget', 'k', 0],\n     ['uget', 'f', 0],\n     ['get', 0]],),\n   [7, 7, 0, 79, 0, 20, 6, 79, 109, 6, 109]),\n  ('closure over only the outer local',\n   ([['local', 2], ['closure', 'c', [0]], ['close', 0], ['local', 2], ['uget', 'c', 0], ['get', 0]],),\n   [2, 2]),\n  ('control: plain locals', ([['local', 2], ['local', 2], ['set', 1, 4], ['get', 1], ['get', 0]],), [4, 2])],\n [('two closures share one open upvalue',\n   ([['local', 30],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 8],\n     ['uget', 'g', 0],\n     ['get', 1]],),\n   [8, 8]),\n  ('closing a scope keeps closures linked',\n   ([['local', 30],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 8],\n     ['uget', 'g', 0],\n     ['get', 1],\n     ['close', 1],\n     ['uset', 'g', 0, 0],\n     ['uget', 'f', 1]],),\n   [8, 8, 0]),\n  ('regression: new local reusing a closed slot',\n   ([['local', 30],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 8],\n     ['uget', 'g', 0],\n     ['get', 1],\n     ['close', 1],\n     ['uset', 'g', 0, 0],\n     ['uget', 'f', 1],\n     ['local', 80],\n     ['closure', 'h', [1]],\n     ['uget', 'h', 0],\n     ['uget', 'f', 1]],),\n   [8, 8, 0, 80, 0]),\n  ('open upvalue tracks later stack writes',\n   ([['local', 30],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 8],\n     ['uget', 'g', 0],\n     ['get', 1],\n     ['close', 1],\n     ['uset', 'g', 0, 0],\n     ['uget', 'f', 1],\n     ['local', 80],\n     ['closure', 'h', [1]],\n     ['uget', 'h', 0],\n     ['uget', 'f', 1],\n     ['uget', 'f', 0],\n     ['set', 0, 9],\n     ['uget', 'f', 0],\n     ['close', 0],\n     ['uget', 'h', 0]],),\n   [8, 8, 0, 80, 0, 30, 9, 80]),\n  ('slot reuse after closing everything',\n   ([['local', 30],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 8],\n     ['uget', 'g', 0],\n     ['get', 1],\n     ['close', 1],\n     ['uset', 'g', 0, 0],\n     ['uget', 'f', 1],\n     ['local', 80],\n     ['closure', 'h', [1]],\n     ['uget', 'h', 0],\n     ['uget', 'f', 1],\n     ['uget', 'f', 0],\n     ['set', 0, 9],\n     ['uget', 'f', 0],\n     ['close', 0],\n     ['uget', 'h', 0],\n     ['local', 109],\n     ['closure', 'k', [0]],\n     ['uget', 'k', 0],\n     ['uget', 'f', 0],\n     ['get', 0]],),\n   [8, 8, 0, 80, 0, 30, 9, 80, 109, 9, 109]),\n  ('closure over only the outer local',\n   ([['local', 3], ['closure', 'c', [0]], ['close', 0], ['local', 2], ['uget', 'c', 0], ['get', 0]],),\n   [3, 2]),\n  ('control: plain locals', ([['local', 3], ['local', 2], ['set', 1, 4], ['get', 1], ['get', 0]],), [4, 3])],\n [('two closures share one open upvalue',\n   ([['local', 40],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 9],\n     ['uget', 'g', 0],\n     ['get', 1]],),\n   [9, 9]),\n  ('closing a scope keeps closures linked',\n   ([['local', 40],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 9],\n     ['uget', 'g', 0],\n     ['get', 1],\n     ['close', 1],\n     ['uset', 'g', 0, 0],\n     ['uget', 'f', 1]],),\n   [9, 9, 0]),\n  ('regression: new local reusing a closed slot',\n   ([['local', 40],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 9],\n     ['uget', 'g', 0],\n     ['get', 1],\n     ['close', 1],\n     ['uset', 'g', 0, 0],\n     ['uget', 'f', 1],\n     ['local', 81],\n     ['closure', 'h', [1]],\n     ['uget', 'h', 0],\n     ['uget', 'f', 1]],),\n   [9, 9, 0, 81, 0]),\n  ('open upvalue tracks later stack writes',\n   ([['local', 40],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 9],\n     ['uget', 'g', 0],\n     ['get', 1],\n     ['close', 1],\n     ['uset', 'g', 0, 0],\n     ['uget', 'f', 1],\n     ['local', 81],\n     ['closure', 'h', [1]],\n     ['uget', 'h', 0],\n     ['uget', 'f', 1],\n     ['uget', 'f', 0],\n     ['set', 0, 12],\n     ['uget', 'f', 0],\n     ['close', 0],\n     ['uget', 'h', 0]],),\n   [9, 9, 0, 81, 0, 40, 12, 81]),\n  ('slot reuse after closing everything',\n   ([['local', 40],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 9],\n     ['uget', 'g', 0],\n     ['get', 1],\n     ['close', 1],\n     ['uset', 'g', 0, 0],\n     ['uget', 'f', 1],\n     ['local', 81],\n     ['closure', 'h', [1]],\n     ['uget', 'h', 0],\n     ['uget', 'f', 1],\n     ['uget', 'f', 0],\n     ['set', 0, 12],\n     ['uget', 'f', 0],\n     ['close', 0],\n     ['uget', 'h', 0],\n     ['local', 109],\n     ['closure', 'k', [0]],\n     ['uget', 'k', 0],\n     ['uget', 'f', 0],\n     ['get', 0]],),\n   [9, 9, 0, 81, 0, 40, 12, 81, 109, 12, 109]),\n  ('closure over only the outer local',\n   ([['local', 4], ['closure', 'c', [0]], ['close', 0], ['local', 2], ['uget', 'c', 0], ['get', 0]],),\n   [4, 2]),\n  ('control: plain locals', ([['local', 4], ['local', 2], ['set', 1, 4], ['get', 1], ['get', 0]],), [4, 4])],\n [('two closures share one open upvalue',\n   ([['local', 50],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 10],\n     ['uget', 'g', 0],\n     ['get', 1]],),\n   [10, 10]),\n  ('closing a scope keeps closures linked',\n   ([['local', 50],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 10],\n     ['uget', 'g', 0],\n     ['get', 1],\n     ['close', 1],\n     ['uset', 'g', 0, 0],\n     ['uget', 'f', 1]],),\n   [10, 10, 0]),\n  ('regression: new local reusing a closed slot',\n   ([['local', 50],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 10],\n     ['uget', 'g', 0],\n     ['get', 1],\n     ['close', 1],\n     ['uset', 'g', 0, 0],\n     ['uget', 'f', 1],\n     ['local', 82],\n     ['closure', 'h', [1]],\n     ['uget', 'h', 0],\n     ['uget', 'f', 1]],),\n   [10, 10, 0, 82, 0]),\n  ('open upvalue tracks later stack writes',\n   ([['local', 50],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 10],\n     ['uget', 'g', 0],\n     ['get', 1],\n     ['close', 1],\n     ['uset', 'g', 0, 0],\n     ['uget', 'f', 1],\n     ['local', 82],\n     ['closure', 'h', [1]],\n     ['uget', 'h', 0],\n     ['uget', 'f', 1],\n     ['uget', 'f', 0],\n     ['set', 0, 15],\n     ['uget', 'f', 0],\n     ['close', 0],\n     ['uget', 'h', 0]],),\n   [10, 10, 0, 82, 0, 50, 15, 82]),\n  ('slot reuse after closing everything',\n   ([['local', 50],\n     ['local', 0],\n     ['closure', 'f', [0, 1]],\n     ['closure', 'g', [1]],\n     ['uset', 'f', 1, 10],\n     ['uget', 'g', 0],\n     ['get', 1],\n     ['close', 1],\n     ['uset', 'g', 0, 0],\n     ['uget', 'f', 1],\n     ['local', 82],\n     ['closure', 'h', [1]],\n     ['uget', 'h', 0],\n     ['uget', 'f', 1],\n     ['uget', 'f', 0],\n     ['set', 0, 15],\n     ['uget', 'f', 0],\n     ['close', 0],\n     ['uget', 'h', 0],\n     ['local', 109],\n     ['closure', 'k', [0]],\n     ['uget', 'k', 0],\n     ['uget', 'f', 0],\n     ['get', 0]],),\n   [10, 10, 0, 82, 0, 50, 15, 82, 109, 15, 109]),\n  ('closure over only the outer local',\n   ([['local', 5], ['closure', 'c', [0]], ['close', 0], ['local', 2], ['uget', 'c', 0], ['get', 0]],),\n   [5, 2]),\n  ('control: plain locals', ([['local', 5], ['local', 2], ['set', 1, 4], ['get', 1], ['get', 0]],), [4, 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":"A deterministic, bounded teaching model of one bytecode virtual machine mechanism with a stipulated instruction encoding; it is not a production VM and claims no conformance to any real specification. 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-bytecode-virtual-machines-closure-upvalues-open-upvalue-sharing","generated_at":"2026-09-29T14:51:23.309270+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Closure capture and upvalue closing are subtle lifetime transitions in register-based VMs.","repair":"Reuse the open upvalue already registered for that stack slot.","root_cause":"Closure creation never looks up the existing open upvalue for the slot.","sha256":"a84367206e5dced02fac84e37d579c6c814cc32bd9a5a8e5222210761e0a84ac","title":"Upvalues: each closure gets a private copy of a captured local · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":41.609,"exit_code":1,"observations":[{"actual":[6,6],"check":"two closures share one open upvalue","expected":[6,6],"passed":true},{"actual":[6,6,6],"check":"closing a scope keeps closures linked","expected":[6,6,0],"passed":false},{"actual":[6,6,6,78,6],"check":"regression: new local reusing a closed slot","expected":[6,6,0,78,0],"passed":false},{"actual":[6,6,6,78,6,10,3,78],"check":"open upvalue tracks later stack writes","expected":[6,6,0,78,0,10,3,78],"passed":false},{"actual":[6,6,6,78,6,10,3,78,109,3,109],"check":"slot reuse after closing everything","expected":[6,6,0,78,0,10,3,78,109,3,109],"passed":false},{"actual":[1,2],"check":"closure over only the outer local","expected":[1,2],"passed":true},{"actual":[4,1],"check":"control: plain locals","expected":[4,1],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"two closures share one open upvalue\", \"actual\": [6, 6], \"expected\": [6, 6], \"passed\": true}, {\"check\": \"closing a scope keeps closures linked\", \"actual\": [6, 6, 6], \"expected\": [6, 6, 0], \"passed\": false}, {\"check\": \"regression: new local reusing a closed slot\", \"actual\": [6, 6, 6, 78, 6], \"expected\": [6, 6, 0, 78, 0], \"passed\": false}, {\"check\": \"open upvalue tracks later stack writes\", \"actual\": [6, 6, 6, 78, 6, 10, 3, 78], \"expected\": [6, 6, 0, 78, 0, 10, 3, 78], \"passed\": false}, {\"check\": \"slot reuse after closing everything\", \"actual\": [6, 6, 6, 78, 6, 10, 3, 78, 109, 3, 109], \"expected\": [6, 6, 0, 78, 0, 10, 3, 78, 109, 3, 109], \"passed\": false}, {\"check\": \"closure over only the outer local\", \"actual\": [1, 2], \"expected\": [1, 2], \"passed\": true}, {\"check\": \"control: plain locals\", \"actual\": [4, 1], \"expected\": [4, 1], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":43.28,"exit_code":1,"observations":[{"actual":[6,6],"check":"two closures share one open upvalue","expected":[6,6],"passed":true},{"actual":[6,6,6],"check":"closing a scope keeps closures linked","expected":[6,6,0],"passed":false},{"actual":[6,6,6,78,6],"check":"regression: new local reusing a closed slot","expected":[6,6,0,78,0],"passed":false},{"actual":[6,6,6,78,6,10,3,78],"check":"open upvalue tracks later stack writes","expected":[6,6,0,78,0,10,3,78],"passed":false},{"actual":[6,6,6,78,6,10,3,78,109,3,109],"check":"slot reuse after closing everything","expected":[6,6,0,78,0,10,3,78,109,3,109],"passed":false},{"actual":[1,2],"check":"closure over only the outer local","expected":[1,2],"passed":true},{"actual":[4,1],"check":"control: plain locals","expected":[4,1],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"two closures share one open upvalue\", \"actual\": [6, 6], \"expected\": [6, 6], \"passed\": true}, {\"check\": \"closing a scope keeps closures linked\", \"actual\": [6, 6, 6], \"expected\": [6, 6, 0], \"passed\": false}, {\"check\": \"regression: new local reusing a closed slot\", \"actual\": [6, 6, 6, 78, 6], \"expected\": [6, 6, 0, 78, 0], \"passed\": false}, {\"check\": \"open upvalue tracks later stack writes\", \"actual\": [6, 6, 6, 78, 6, 10, 3, 78], \"expected\": [6, 6, 0, 78, 0, 10, 3, 78], \"passed\": false}, {\"check\": \"slot reuse after closing everything\", \"actual\": [6, 6, 6, 78, 6, 10, 3, 78, 109, 3, 109], \"expected\": [6, 6, 0, 78, 0, 10, 3, 78, 109, 3, 109], \"passed\": false}, {\"check\": \"closure over only the outer local\", \"actual\": [1, 2], \"expected\": [1, 2], \"passed\": true}, {\"check\": \"control: plain locals\", \"actual\": [4, 1], \"expected\": [4, 1], \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":41.527,"exit_code":0,"observations":[{"actual":[6,6],"check":"two closures share one open upvalue","expected":[6,6],"passed":true},{"actual":[6,6,0],"check":"closing a scope keeps closures linked","expected":[6,6,0],"passed":true},{"actual":[6,6,0,78,0],"check":"regression: new local reusing a closed slot","expected":[6,6,0,78,0],"passed":true},{"actual":[6,6,0,78,0,10,3,78],"check":"open upvalue tracks later stack writes","expected":[6,6,0,78,0,10,3,78],"passed":true},{"actual":[6,6,0,78,0,10,3,78,109,3,109],"check":"slot reuse after closing everything","expected":[6,6,0,78,0,10,3,78,109,3,109],"passed":true},{"actual":[1,2],"check":"closure over only the outer local","expected":[1,2],"passed":true},{"actual":[4,1],"check":"control: plain locals","expected":[4,1],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"two closures share one open upvalue\", \"actual\": [6, 6], \"expected\": [6, 6], \"passed\": true}, {\"check\": \"closing a scope keeps closures linked\", \"actual\": [6, 6, 0], \"expected\": [6, 6, 0], \"passed\": true}, {\"check\": \"regression: new local reusing a closed slot\", \"actual\": [6, 6, 0, 78, 0], \"expected\": [6, 6, 0, 78, 0], \"passed\": true}, {\"check\": \"open upvalue tracks later stack writes\", \"actual\": [6, 6, 0, 78, 0, 10, 3, 78], \"expected\": [6, 6, 0, 78, 0, 10, 3, 78], \"passed\": true}, {\"check\": \"slot reuse after closing everything\", \"actual\": [6, 6, 0, 78, 0, 10, 3, 78, 109, 3, 109], \"expected\": [6, 6, 0, 78, 0, 10, 3, 78, 109, 3, 109], \"passed\": true}, {\"check\": \"closure over only the outer local\", \"actual\": [1, 2], \"expected\": [1, 2], \"passed\": true}, {\"check\": \"control: plain locals\", \"actual\": [4, 1], \"expected\": [4, 1], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}