{"abstract":"Dead objects from the previous cycle are resurrected when the parity flips back to their stale mark.","category":"Garbage collector invariants","checks":6,"contract":"Mark bits flip meaning every cycle: an object is live when its mark equals epoch % 2. Initially every object has mark 0 at epoch 0. gc live_ids: finish sweeping every unswept page, advance the epoch, set the mark of each listed live object to the new parity, and mark all pages unswept. alloc id page: sweep the page first if it is unswept, then create the object with the current parity. finish sweeps the remaining pages. Sweeping a page removes objects whose mark differs from the current parity and logs [page, removed]. Return the sweep log and surviving objects per page.","evaluation_group":"w2-garbage-collector-invariants-mark-parity-sweeping","failed_approach":"Dropping the unswept list skips those pages instead of sweeping them.","family":"w2-garbage-collector-invariants-mark-parity-sweeping-sweep-completion-before-flip","id":"FA-90666","implementations":{"attempt":{"sha256":"e788824d25054c1f19dc811775daaa96d201c0633414fa90b1669ea9eab86076","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(pages, events):\n    pages = {p: dict(v) for p, v in pages.items()}\n    epoch = 0\n    unswept = []\n    log = []\n    def sweep(p):\n        parity = epoch % 2\n        dead = sorted(o for o, m in pages[p].items() if m != parity)\n        for o in dead:\n            del pages[p][o]\n        log.append([p, dead])\n        unswept.remove(p)\n    for ev in events:\n        if ev[0] == 'gc':\n            unswept.clear()\n            epoch += 1\n            for p in pages:\n                for o in pages[p]:\n                    if o in ev[1]:\n                        pages[p][o] = epoch % 2\n            unswept = sorted(pages)\n        elif ev[0] == 'alloc':\n            if ev[2] in unswept:\n                sweep(ev[2])\n            pages[ev[2]][ev[1]] = epoch % 2\n        else:\n            while unswept:\n                sweep(unswept[0])\n    return {'log': log, 'pages': {str(p): sorted(v) for p, v in sorted(pages.items())}}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = [[('regression: lazy sweep before allocation',\n   ({1: {'a1': 0, 'b1': 0, 'c1': 0}, 2: {'d1': 0, 'e1': 0}},\n    [['gc', ['a1', 'd1']], ['alloc', 'x1', 1], ['finish']]),\n   {'log': [[1, ['b1', 'c1']], [2, ['e1']]], 'pages': {'1': ['a1', 'x1'], '2': ['d1']}}),\n  ('second cycle with an unswept page',\n   ({1: {'a1': 0, 'b1': 0, 'c1': 0}, 2: {'d1': 0, 'e1': 0}},\n    [['gc', ['a1', 'd1']], ['alloc', 'x1', 1], ['gc', ['a1']], ['finish']]),\n   {'log': [[1, ['b1', 'c1']], [2, ['e1']], [1, ['x1']], [2, ['d1']]], 'pages': {'1': ['a1'], '2': []}}),\n  ('allocation after sweeping dies next cycle',\n   ({1: {'a1': 0, 'b1': 0, 'c1': 0}, 2: {'d1': 0, 'e1': 0}},\n    [['gc', ['a1']], ['finish'], ['alloc', 'y1', 2], ['gc', ['a1']], ['finish']]),\n   {'log': [[1, ['b1', 'c1']], [2, ['d1', 'e1']], [1, []], [2, ['y1']]], 'pages': {'1': ['a1'], '2': []}}),\n  ('allocation into an unswept page mid-cycle',\n   ({1: {'a1': 0, 'b1': 0, 'c1': 0}, 2: {'d1': 0, 'e1': 0}},\n    [['gc', ['b1', 'e1']], ['alloc', 'y1', 2], ['alloc', 'x1', 1], ['gc', ['x1', 'y1']], ['finish']]),\n   {'log': [[2, ['d1']], [1, ['a1', 'c1']], [1, ['b1']], [2, ['e1']]], 'pages': {'1': ['x1'], '2': ['y1']}}),\n  ('three cycles',\n   ({1: {'a1': 0, 'b1': 0, 'c1': 0}, 2: {'d1': 0, 'e1': 0}},\n    [['gc', ['a1', 'b1', 'd1']], ['gc', ['a1', 'd1']], ['gc', ['d1']], ['finish']]),\n   {'log': [[1, ['c1']], [2, ['e1']], [1, ['b1']], [2, []], [1, ['a1']], [2, []]],\n    'pages': {'1': [], '2': ['d1']}}),\n  ('control: everything live',\n   ({1: {'a1': 0, 'b1': 0, 'c1': 0}, 2: {'d1': 0, 'e1': 0}},\n    [['gc', ['a1', 'b1', 'c1', 'd1', 'e1']], ['finish']]),\n   {'log': [[1, []], [2, []]], 'pages': {'1': ['a1', 'b1', 'c1'], '2': ['d1', 'e1']}})],\n [('regression: lazy sweep before allocation',\n   ({1: {'a2': 0, 'b2': 0, 'c2': 0}, 2: {'d2': 0, 'e2': 0}},\n    [['gc', ['a2', 'd2']], ['alloc', 'x2', 1], ['finish']]),\n   {'log': [[1, ['b2', 'c2']], [2, ['e2']]], 'pages': {'1': ['a2', 'x2'], '2': ['d2']}}),\n  ('second cycle with an unswept page',\n   ({1: {'a2': 0, 'b2': 0, 'c2': 0}, 2: {'d2': 0, 'e2': 0}},\n    [['gc', ['a2', 'd2']], ['alloc', 'x2', 1], ['gc', ['a2']], ['finish']]),\n   {'log': [[1, ['b2', 'c2']], [2, ['e2']], [1, ['x2']], [2, ['d2']]], 'pages': {'1': ['a2'], '2': []}}),\n  ('allocation after sweeping dies next cycle',\n   ({1: {'a2': 0, 'b2': 0, 'c2': 0}, 2: {'d2': 0, 'e2': 0}},\n    [['gc', ['a2']], ['finish'], ['alloc', 'y2', 2], ['gc', ['a2']], ['finish']]),\n   {'log': [[1, ['b2', 'c2']], [2, ['d2', 'e2']], [1, []], [2, ['y2']]], 'pages': {'1': ['a2'], '2': []}}),\n  ('allocation into an unswept page mid-cycle',\n   ({1: {'a2': 0, 'b2': 0, 'c2': 0}, 2: {'d2': 0, 'e2': 0}},\n    [['gc', ['b2', 'e2']], ['alloc', 'y2', 2], ['alloc', 'x2', 1], ['gc', ['x2', 'y2']], ['finish']]),\n   {'log': [[2, ['d2']], [1, ['a2', 'c2']], [1, ['b2']], [2, ['e2']]], 'pages': {'1': ['x2'], '2': ['y2']}}),\n  ('three cycles',\n   ({1: {'a2': 0, 'b2': 0, 'c2': 0}, 2: {'d2': 0, 'e2': 0}},\n    [['gc', ['a2', 'b2', 'd2']], ['gc', ['a2', 'd2']], ['gc', ['d2']], ['finish']]),\n   {'log': [[1, ['c2']], [2, ['e2']], [1, ['b2']], [2, []], [1, ['a2']], [2, []]],\n    'pages': {'1': [], '2': ['d2']}}),\n  ('control: everything live',\n   ({1: {'a2': 0, 'b2': 0, 'c2': 0}, 2: {'d2': 0, 'e2': 0}},\n    [['gc', ['a2', 'b2', 'c2', 'd2', 'e2']], ['finish']]),\n   {'log': [[1, []], [2, []]], 'pages': {'1': ['a2', 'b2', 'c2'], '2': ['d2', 'e2']}})],\n [('regression: lazy sweep before allocation',\n   ({1: {'a3': 0, 'b3': 0, 'c3': 0}, 2: {'d3': 0, 'e3': 0}},\n    [['gc', ['a3', 'd3']], ['alloc', 'x3', 1], ['finish']]),\n   {'log': [[1, ['b3', 'c3']], [2, ['e3']]], 'pages': {'1': ['a3', 'x3'], '2': ['d3']}}),\n  ('second cycle with an unswept page',\n   ({1: {'a3': 0, 'b3': 0, 'c3': 0}, 2: {'d3': 0, 'e3': 0}},\n    [['gc', ['a3', 'd3']], ['alloc', 'x3', 1], ['gc', ['a3']], ['finish']]),\n   {'log': [[1, ['b3', 'c3']], [2, ['e3']], [1, ['x3']], [2, ['d3']]], 'pages': {'1': ['a3'], '2': []}}),\n  ('allocation after sweeping dies next cycle',\n   ({1: {'a3': 0, 'b3': 0, 'c3': 0}, 2: {'d3': 0, 'e3': 0}},\n    [['gc', ['a3']], ['finish'], ['alloc', 'y3', 2], ['gc', ['a3']], ['finish']]),\n   {'log': [[1, ['b3', 'c3']], [2, ['d3', 'e3']], [1, []], [2, ['y3']]], 'pages': {'1': ['a3'], '2': []}}),\n  ('allocation into an unswept page mid-cycle',\n   ({1: {'a3': 0, 'b3': 0, 'c3': 0}, 2: {'d3': 0, 'e3': 0}},\n    [['gc', ['b3', 'e3']], ['alloc', 'y3', 2], ['alloc', 'x3', 1], ['gc', ['x3', 'y3']], ['finish']]),\n   {'log': [[2, ['d3']], [1, ['a3', 'c3']], [1, ['b3']], [2, ['e3']]], 'pages': {'1': ['x3'], '2': ['y3']}}),\n  ('three cycles',\n   ({1: {'a3': 0, 'b3': 0, 'c3': 0}, 2: {'d3': 0, 'e3': 0}},\n    [['gc', ['a3', 'b3', 'd3']], ['gc', ['a3', 'd3']], ['gc', ['d3']], ['finish']]),\n   {'log': [[1, ['c3']], [2, ['e3']], [1, ['b3']], [2, []], [1, ['a3']], [2, []]],\n    'pages': {'1': [], '2': ['d3']}}),\n  ('control: everything live',\n   ({1: {'a3': 0, 'b3': 0, 'c3': 0}, 2: {'d3': 0, 'e3': 0}},\n    [['gc', ['a3', 'b3', 'c3', 'd3', 'e3']], ['finish']]),\n   {'log': [[1, []], [2, []]], 'pages': {'1': ['a3', 'b3', 'c3'], '2': ['d3', 'e3']}})],\n [('regression: lazy sweep before allocation',\n   ({1: {'a4': 0, 'b4': 0, 'c4': 0}, 2: {'d4': 0, 'e4': 0}},\n    [['gc', ['a4', 'd4']], ['alloc', 'x4', 1], ['finish']]),\n   {'log': [[1, ['b4', 'c4']], [2, ['e4']]], 'pages': {'1': ['a4', 'x4'], '2': ['d4']}}),\n  ('second cycle with an unswept page',\n   ({1: {'a4': 0, 'b4': 0, 'c4': 0}, 2: {'d4': 0, 'e4': 0}},\n    [['gc', ['a4', 'd4']], ['alloc', 'x4', 1], ['gc', ['a4']], ['finish']]),\n   {'log': [[1, ['b4', 'c4']], [2, ['e4']], [1, ['x4']], [2, ['d4']]], 'pages': {'1': ['a4'], '2': []}}),\n  ('allocation after sweeping dies next cycle',\n   ({1: {'a4': 0, 'b4': 0, 'c4': 0}, 2: {'d4': 0, 'e4': 0}},\n    [['gc', ['a4']], ['finish'], ['alloc', 'y4', 2], ['gc', ['a4']], ['finish']]),\n   {'log': [[1, ['b4', 'c4']], [2, ['d4', 'e4']], [1, []], [2, ['y4']]], 'pages': {'1': ['a4'], '2': []}}),\n  ('allocation into an unswept page mid-cycle',\n   ({1: {'a4': 0, 'b4': 0, 'c4': 0}, 2: {'d4': 0, 'e4': 0}},\n    [['gc', ['b4', 'e4']], ['alloc', 'y4', 2], ['alloc', 'x4', 1], ['gc', ['x4', 'y4']], ['finish']]),\n   {'log': [[2, ['d4']], [1, ['a4', 'c4']], [1, ['b4']], [2, ['e4']]], 'pages': {'1': ['x4'], '2': ['y4']}}),\n  ('three cycles',\n   ({1: {'a4': 0, 'b4': 0, 'c4': 0}, 2: {'d4': 0, 'e4': 0}},\n    [['gc', ['a4', 'b4', 'd4']], ['gc', ['a4', 'd4']], ['gc', ['d4']], ['finish']]),\n   {'log': [[1, ['c4']], [2, ['e4']], [1, ['b4']], [2, []], [1, ['a4']], [2, []]],\n    'pages': {'1': [], '2': ['d4']}}),\n  ('control: everything live',\n   ({1: {'a4': 0, 'b4': 0, 'c4': 0}, 2: {'d4': 0, 'e4': 0}},\n    [['gc', ['a4', 'b4', 'c4', 'd4', 'e4']], ['finish']]),\n   {'log': [[1, []], [2, []]], 'pages': {'1': ['a4', 'b4', 'c4'], '2': ['d4', 'e4']}})],\n [('regression: lazy sweep before allocation',\n   ({1: {'a5': 0, 'b5': 0, 'c5': 0}, 2: {'d5': 0, 'e5': 0}},\n    [['gc', ['a5', 'd5']], ['alloc', 'x5', 1], ['finish']]),\n   {'log': [[1, ['b5', 'c5']], [2, ['e5']]], 'pages': {'1': ['a5', 'x5'], '2': ['d5']}}),\n  ('second cycle with an unswept page',\n   ({1: {'a5': 0, 'b5': 0, 'c5': 0}, 2: {'d5': 0, 'e5': 0}},\n    [['gc', ['a5', 'd5']], ['alloc', 'x5', 1], ['gc', ['a5']], ['finish']]),\n   {'log': [[1, ['b5', 'c5']], [2, ['e5']], [1, ['x5']], [2, ['d5']]], 'pages': {'1': ['a5'], '2': []}}),\n  ('allocation after sweeping dies next cycle',\n   ({1: {'a5': 0, 'b5': 0, 'c5': 0}, 2: {'d5': 0, 'e5': 0}},\n    [['gc', ['a5']], ['finish'], ['alloc', 'y5', 2], ['gc', ['a5']], ['finish']]),\n   {'log': [[1, ['b5', 'c5']], [2, ['d5', 'e5']], [1, []], [2, ['y5']]], 'pages': {'1': ['a5'], '2': []}}),\n  ('allocation into an unswept page mid-cycle',\n   ({1: {'a5': 0, 'b5': 0, 'c5': 0}, 2: {'d5': 0, 'e5': 0}},\n    [['gc', ['b5', 'e5']], ['alloc', 'y5', 2], ['alloc', 'x5', 1], ['gc', ['x5', 'y5']], ['finish']]),\n   {'log': [[2, ['d5']], [1, ['a5', 'c5']], [1, ['b5']], [2, ['e5']]], 'pages': {'1': ['x5'], '2': ['y5']}}),\n  ('three cycles',\n   ({1: {'a5': 0, 'b5': 0, 'c5': 0}, 2: {'d5': 0, 'e5': 0}},\n    [['gc', ['a5', 'b5', 'd5']], ['gc', ['a5', 'd5']], ['gc', ['d5']], ['finish']]),\n   {'log': [[1, ['c5']], [2, ['e5']], [1, ['b5']], [2, []], [1, ['a5']], [2, []]],\n    'pages': {'1': [], '2': ['d5']}}),\n  ('control: everything live',\n   ({1: {'a5': 0, 'b5': 0, 'c5': 0}, 2: {'d5': 0, 'e5': 0}},\n    [['gc', ['a5', 'b5', 'c5', 'd5', 'e5']], ['finish']]),\n   {'log': [[1, []], [2, []]], 'pages': {'1': ['a5', 'b5', 'c5'], '2': ['d5', 'e5']}})]]\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":"7c7c5499bb579a132259b4c3a3a9e731b8389792eb38d485b8693d2fd5df3055","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(pages, events):\n    pages = {p: dict(v) for p, v in pages.items()}\n    epoch = 0\n    unswept = []\n    log = []\n    def sweep(p):\n        parity = epoch % 2\n        dead = sorted(o for o, m in pages[p].items() if m != parity)\n        for o in dead:\n            del pages[p][o]\n        log.append([p, dead])\n        unswept.remove(p)\n    for ev in events:\n        if ev[0] == 'gc':\n            epoch += 1\n            for p in pages:\n                for o in pages[p]:\n                    if o in ev[1]:\n                        pages[p][o] = epoch % 2\n            unswept = sorted(pages)\n        elif ev[0] == 'alloc':\n            if ev[2] in unswept:\n                sweep(ev[2])\n            pages[ev[2]][ev[1]] = epoch % 2\n        else:\n            while unswept:\n                sweep(unswept[0])\n    return {'log': log, 'pages': {str(p): sorted(v) for p, v in sorted(pages.items())}}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = [[('regression: lazy sweep before allocation',\n   ({1: {'a1': 0, 'b1': 0, 'c1': 0}, 2: {'d1': 0, 'e1': 0}},\n    [['gc', ['a1', 'd1']], ['alloc', 'x1', 1], ['finish']]),\n   {'log': [[1, ['b1', 'c1']], [2, ['e1']]], 'pages': {'1': ['a1', 'x1'], '2': ['d1']}}),\n  ('second cycle with an unswept page',\n   ({1: {'a1': 0, 'b1': 0, 'c1': 0}, 2: {'d1': 0, 'e1': 0}},\n    [['gc', ['a1', 'd1']], ['alloc', 'x1', 1], ['gc', ['a1']], ['finish']]),\n   {'log': [[1, ['b1', 'c1']], [2, ['e1']], [1, ['x1']], [2, ['d1']]], 'pages': {'1': ['a1'], '2': []}}),\n  ('allocation after sweeping dies next cycle',\n   ({1: {'a1': 0, 'b1': 0, 'c1': 0}, 2: {'d1': 0, 'e1': 0}},\n    [['gc', ['a1']], ['finish'], ['alloc', 'y1', 2], ['gc', ['a1']], ['finish']]),\n   {'log': [[1, ['b1', 'c1']], [2, ['d1', 'e1']], [1, []], [2, ['y1']]], 'pages': {'1': ['a1'], '2': []}}),\n  ('allocation into an unswept page mid-cycle',\n   ({1: {'a1': 0, 'b1': 0, 'c1': 0}, 2: {'d1': 0, 'e1': 0}},\n    [['gc', ['b1', 'e1']], ['alloc', 'y1', 2], ['alloc', 'x1', 1], ['gc', ['x1', 'y1']], ['finish']]),\n   {'log': [[2, ['d1']], [1, ['a1', 'c1']], [1, ['b1']], [2, ['e1']]], 'pages': {'1': ['x1'], '2': ['y1']}}),\n  ('three cycles',\n   ({1: {'a1': 0, 'b1': 0, 'c1': 0}, 2: {'d1': 0, 'e1': 0}},\n    [['gc', ['a1', 'b1', 'd1']], ['gc', ['a1', 'd1']], ['gc', ['d1']], ['finish']]),\n   {'log': [[1, ['c1']], [2, ['e1']], [1, ['b1']], [2, []], [1, ['a1']], [2, []]],\n    'pages': {'1': [], '2': ['d1']}}),\n  ('control: everything live',\n   ({1: {'a1': 0, 'b1': 0, 'c1': 0}, 2: {'d1': 0, 'e1': 0}},\n    [['gc', ['a1', 'b1', 'c1', 'd1', 'e1']], ['finish']]),\n   {'log': [[1, []], [2, []]], 'pages': {'1': ['a1', 'b1', 'c1'], '2': ['d1', 'e1']}})],\n [('regression: lazy sweep before allocation',\n   ({1: {'a2': 0, 'b2': 0, 'c2': 0}, 2: {'d2': 0, 'e2': 0}},\n    [['gc', ['a2', 'd2']], ['alloc', 'x2', 1], ['finish']]),\n   {'log': [[1, ['b2', 'c2']], [2, ['e2']]], 'pages': {'1': ['a2', 'x2'], '2': ['d2']}}),\n  ('second cycle with an unswept page',\n   ({1: {'a2': 0, 'b2': 0, 'c2': 0}, 2: {'d2': 0, 'e2': 0}},\n    [['gc', ['a2', 'd2']], ['alloc', 'x2', 1], ['gc', ['a2']], ['finish']]),\n   {'log': [[1, ['b2', 'c2']], [2, ['e2']], [1, ['x2']], [2, ['d2']]], 'pages': {'1': ['a2'], '2': []}}),\n  ('allocation after sweeping dies next cycle',\n   ({1: {'a2': 0, 'b2': 0, 'c2': 0}, 2: {'d2': 0, 'e2': 0}},\n    [['gc', ['a2']], ['finish'], ['alloc', 'y2', 2], ['gc', ['a2']], ['finish']]),\n   {'log': [[1, ['b2', 'c2']], [2, ['d2', 'e2']], [1, []], [2, ['y2']]], 'pages': {'1': ['a2'], '2': []}}),\n  ('allocation into an unswept page mid-cycle',\n   ({1: {'a2': 0, 'b2': 0, 'c2': 0}, 2: {'d2': 0, 'e2': 0}},\n    [['gc', ['b2', 'e2']], ['alloc', 'y2', 2], ['alloc', 'x2', 1], ['gc', ['x2', 'y2']], ['finish']]),\n   {'log': [[2, ['d2']], [1, ['a2', 'c2']], [1, ['b2']], [2, ['e2']]], 'pages': {'1': ['x2'], '2': ['y2']}}),\n  ('three cycles',\n   ({1: {'a2': 0, 'b2': 0, 'c2': 0}, 2: {'d2': 0, 'e2': 0}},\n    [['gc', ['a2', 'b2', 'd2']], ['gc', ['a2', 'd2']], ['gc', ['d2']], ['finish']]),\n   {'log': [[1, ['c2']], [2, ['e2']], [1, ['b2']], [2, []], [1, ['a2']], [2, []]],\n    'pages': {'1': [], '2': ['d2']}}),\n  ('control: everything live',\n   ({1: {'a2': 0, 'b2': 0, 'c2': 0}, 2: {'d2': 0, 'e2': 0}},\n    [['gc', ['a2', 'b2', 'c2', 'd2', 'e2']], ['finish']]),\n   {'log': [[1, []], [2, []]], 'pages': {'1': ['a2', 'b2', 'c2'], '2': ['d2', 'e2']}})],\n [('regression: lazy sweep before allocation',\n   ({1: {'a3': 0, 'b3': 0, 'c3': 0}, 2: {'d3': 0, 'e3': 0}},\n    [['gc', ['a3', 'd3']], ['alloc', 'x3', 1], ['finish']]),\n   {'log': [[1, ['b3', 'c3']], [2, ['e3']]], 'pages': {'1': ['a3', 'x3'], '2': ['d3']}}),\n  ('second cycle with an unswept page',\n   ({1: {'a3': 0, 'b3': 0, 'c3': 0}, 2: {'d3': 0, 'e3': 0}},\n    [['gc', ['a3', 'd3']], ['alloc', 'x3', 1], ['gc', ['a3']], ['finish']]),\n   {'log': [[1, ['b3', 'c3']], [2, ['e3']], [1, ['x3']], [2, ['d3']]], 'pages': {'1': ['a3'], '2': []}}),\n  ('allocation after sweeping dies next cycle',\n   ({1: {'a3': 0, 'b3': 0, 'c3': 0}, 2: {'d3': 0, 'e3': 0}},\n    [['gc', ['a3']], ['finish'], ['alloc', 'y3', 2], ['gc', ['a3']], ['finish']]),\n   {'log': [[1, ['b3', 'c3']], [2, ['d3', 'e3']], [1, []], [2, ['y3']]], 'pages': {'1': ['a3'], '2': []}}),\n  ('allocation into an unswept page mid-cycle',\n   ({1: {'a3': 0, 'b3': 0, 'c3': 0}, 2: {'d3': 0, 'e3': 0}},\n    [['gc', ['b3', 'e3']], ['alloc', 'y3', 2], ['alloc', 'x3', 1], ['gc', ['x3', 'y3']], ['finish']]),\n   {'log': [[2, ['d3']], [1, ['a3', 'c3']], [1, ['b3']], [2, ['e3']]], 'pages': {'1': ['x3'], '2': ['y3']}}),\n  ('three cycles',\n   ({1: {'a3': 0, 'b3': 0, 'c3': 0}, 2: {'d3': 0, 'e3': 0}},\n    [['gc', ['a3', 'b3', 'd3']], ['gc', ['a3', 'd3']], ['gc', ['d3']], ['finish']]),\n   {'log': [[1, ['c3']], [2, ['e3']], [1, ['b3']], [2, []], [1, ['a3']], [2, []]],\n    'pages': {'1': [], '2': ['d3']}}),\n  ('control: everything live',\n   ({1: {'a3': 0, 'b3': 0, 'c3': 0}, 2: {'d3': 0, 'e3': 0}},\n    [['gc', ['a3', 'b3', 'c3', 'd3', 'e3']], ['finish']]),\n   {'log': [[1, []], [2, []]], 'pages': {'1': ['a3', 'b3', 'c3'], '2': ['d3', 'e3']}})],\n [('regression: lazy sweep before allocation',\n   ({1: {'a4': 0, 'b4': 0, 'c4': 0}, 2: {'d4': 0, 'e4': 0}},\n    [['gc', ['a4', 'd4']], ['alloc', 'x4', 1], ['finish']]),\n   {'log': [[1, ['b4', 'c4']], [2, ['e4']]], 'pages': {'1': ['a4', 'x4'], '2': ['d4']}}),\n  ('second cycle with an unswept page',\n   ({1: {'a4': 0, 'b4': 0, 'c4': 0}, 2: {'d4': 0, 'e4': 0}},\n    [['gc', ['a4', 'd4']], ['alloc', 'x4', 1], ['gc', ['a4']], ['finish']]),\n   {'log': [[1, ['b4', 'c4']], [2, ['e4']], [1, ['x4']], [2, ['d4']]], 'pages': {'1': ['a4'], '2': []}}),\n  ('allocation after sweeping dies next cycle',\n   ({1: {'a4': 0, 'b4': 0, 'c4': 0}, 2: {'d4': 0, 'e4': 0}},\n    [['gc', ['a4']], ['finish'], ['alloc', 'y4', 2], ['gc', ['a4']], ['finish']]),\n   {'log': [[1, ['b4', 'c4']], [2, ['d4', 'e4']], [1, []], [2, ['y4']]], 'pages': {'1': ['a4'], '2': []}}),\n  ('allocation into an unswept page mid-cycle',\n   ({1: {'a4': 0, 'b4': 0, 'c4': 0}, 2: {'d4': 0, 'e4': 0}},\n    [['gc', ['b4', 'e4']], ['alloc', 'y4', 2], ['alloc', 'x4', 1], ['gc', ['x4', 'y4']], ['finish']]),\n   {'log': [[2, ['d4']], [1, ['a4', 'c4']], [1, ['b4']], [2, ['e4']]], 'pages': {'1': ['x4'], '2': ['y4']}}),\n  ('three cycles',\n   ({1: {'a4': 0, 'b4': 0, 'c4': 0}, 2: {'d4': 0, 'e4': 0}},\n    [['gc', ['a4', 'b4', 'd4']], ['gc', ['a4', 'd4']], ['gc', ['d4']], ['finish']]),\n   {'log': [[1, ['c4']], [2, ['e4']], [1, ['b4']], [2, []], [1, ['a4']], [2, []]],\n    'pages': {'1': [], '2': ['d4']}}),\n  ('control: everything live',\n   ({1: {'a4': 0, 'b4': 0, 'c4': 0}, 2: {'d4': 0, 'e4': 0}},\n    [['gc', ['a4', 'b4', 'c4', 'd4', 'e4']], ['finish']]),\n   {'log': [[1, []], [2, []]], 'pages': {'1': ['a4', 'b4', 'c4'], '2': ['d4', 'e4']}})],\n [('regression: lazy sweep before allocation',\n   ({1: {'a5': 0, 'b5': 0, 'c5': 0}, 2: {'d5': 0, 'e5': 0}},\n    [['gc', ['a5', 'd5']], ['alloc', 'x5', 1], ['finish']]),\n   {'log': [[1, ['b5', 'c5']], [2, ['e5']]], 'pages': {'1': ['a5', 'x5'], '2': ['d5']}}),\n  ('second cycle with an unswept page',\n   ({1: {'a5': 0, 'b5': 0, 'c5': 0}, 2: {'d5': 0, 'e5': 0}},\n    [['gc', ['a5', 'd5']], ['alloc', 'x5', 1], ['gc', ['a5']], ['finish']]),\n   {'log': [[1, ['b5', 'c5']], [2, ['e5']], [1, ['x5']], [2, ['d5']]], 'pages': {'1': ['a5'], '2': []}}),\n  ('allocation after sweeping dies next cycle',\n   ({1: {'a5': 0, 'b5': 0, 'c5': 0}, 2: {'d5': 0, 'e5': 0}},\n    [['gc', ['a5']], ['finish'], ['alloc', 'y5', 2], ['gc', ['a5']], ['finish']]),\n   {'log': [[1, ['b5', 'c5']], [2, ['d5', 'e5']], [1, []], [2, ['y5']]], 'pages': {'1': ['a5'], '2': []}}),\n  ('allocation into an unswept page mid-cycle',\n   ({1: {'a5': 0, 'b5': 0, 'c5': 0}, 2: {'d5': 0, 'e5': 0}},\n    [['gc', ['b5', 'e5']], ['alloc', 'y5', 2], ['alloc', 'x5', 1], ['gc', ['x5', 'y5']], ['finish']]),\n   {'log': [[2, ['d5']], [1, ['a5', 'c5']], [1, ['b5']], [2, ['e5']]], 'pages': {'1': ['x5'], '2': ['y5']}}),\n  ('three cycles',\n   ({1: {'a5': 0, 'b5': 0, 'c5': 0}, 2: {'d5': 0, 'e5': 0}},\n    [['gc', ['a5', 'b5', 'd5']], ['gc', ['a5', 'd5']], ['gc', ['d5']], ['finish']]),\n   {'log': [[1, ['c5']], [2, ['e5']], [1, ['b5']], [2, []], [1, ['a5']], [2, []]],\n    'pages': {'1': [], '2': ['d5']}}),\n  ('control: everything live',\n   ({1: {'a5': 0, 'b5': 0, 'c5': 0}, 2: {'d5': 0, 'e5': 0}},\n    [['gc', ['a5', 'b5', 'c5', 'd5', 'e5']], ['finish']]),\n   {'log': [[1, []], [2, []]], 'pages': {'1': ['a5', 'b5', 'c5'], '2': ['d5', 'e5']}})]]\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":"3989f345faac8e5d4a3e8453177b8da08df056b696809a696dbbe7299c539123","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(pages, events):\n    pages = {p: dict(v) for p, v in pages.items()}\n    epoch = 0\n    unswept = []\n    log = []\n    def sweep(p):\n        parity = epoch % 2\n        dead = sorted(o for o, m in pages[p].items() if m != parity)\n        for o in dead:\n            del pages[p][o]\n        log.append([p, dead])\n        unswept.remove(p)\n    for ev in events:\n        if ev[0] == 'gc':\n            while unswept:\n                sweep(unswept[0])\n            epoch += 1\n            for p in pages:\n                for o in pages[p]:\n                    if o in ev[1]:\n                        pages[p][o] = epoch % 2\n            unswept = sorted(pages)\n        elif ev[0] == 'alloc':\n            if ev[2] in unswept:\n                sweep(ev[2])\n            pages[ev[2]][ev[1]] = epoch % 2\n        else:\n            while unswept:\n                sweep(unswept[0])\n    return {'log': log, 'pages': {str(p): sorted(v) for p, v in sorted(pages.items())}}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = [[('regression: lazy sweep before allocation',\n   ({1: {'a1': 0, 'b1': 0, 'c1': 0}, 2: {'d1': 0, 'e1': 0}},\n    [['gc', ['a1', 'd1']], ['alloc', 'x1', 1], ['finish']]),\n   {'log': [[1, ['b1', 'c1']], [2, ['e1']]], 'pages': {'1': ['a1', 'x1'], '2': ['d1']}}),\n  ('second cycle with an unswept page',\n   ({1: {'a1': 0, 'b1': 0, 'c1': 0}, 2: {'d1': 0, 'e1': 0}},\n    [['gc', ['a1', 'd1']], ['alloc', 'x1', 1], ['gc', ['a1']], ['finish']]),\n   {'log': [[1, ['b1', 'c1']], [2, ['e1']], [1, ['x1']], [2, ['d1']]], 'pages': {'1': ['a1'], '2': []}}),\n  ('allocation after sweeping dies next cycle',\n   ({1: {'a1': 0, 'b1': 0, 'c1': 0}, 2: {'d1': 0, 'e1': 0}},\n    [['gc', ['a1']], ['finish'], ['alloc', 'y1', 2], ['gc', ['a1']], ['finish']]),\n   {'log': [[1, ['b1', 'c1']], [2, ['d1', 'e1']], [1, []], [2, ['y1']]], 'pages': {'1': ['a1'], '2': []}}),\n  ('allocation into an unswept page mid-cycle',\n   ({1: {'a1': 0, 'b1': 0, 'c1': 0}, 2: {'d1': 0, 'e1': 0}},\n    [['gc', ['b1', 'e1']], ['alloc', 'y1', 2], ['alloc', 'x1', 1], ['gc', ['x1', 'y1']], ['finish']]),\n   {'log': [[2, ['d1']], [1, ['a1', 'c1']], [1, ['b1']], [2, ['e1']]], 'pages': {'1': ['x1'], '2': ['y1']}}),\n  ('three cycles',\n   ({1: {'a1': 0, 'b1': 0, 'c1': 0}, 2: {'d1': 0, 'e1': 0}},\n    [['gc', ['a1', 'b1', 'd1']], ['gc', ['a1', 'd1']], ['gc', ['d1']], ['finish']]),\n   {'log': [[1, ['c1']], [2, ['e1']], [1, ['b1']], [2, []], [1, ['a1']], [2, []]],\n    'pages': {'1': [], '2': ['d1']}}),\n  ('control: everything live',\n   ({1: {'a1': 0, 'b1': 0, 'c1': 0}, 2: {'d1': 0, 'e1': 0}},\n    [['gc', ['a1', 'b1', 'c1', 'd1', 'e1']], ['finish']]),\n   {'log': [[1, []], [2, []]], 'pages': {'1': ['a1', 'b1', 'c1'], '2': ['d1', 'e1']}})],\n [('regression: lazy sweep before allocation',\n   ({1: {'a2': 0, 'b2': 0, 'c2': 0}, 2: {'d2': 0, 'e2': 0}},\n    [['gc', ['a2', 'd2']], ['alloc', 'x2', 1], ['finish']]),\n   {'log': [[1, ['b2', 'c2']], [2, ['e2']]], 'pages': {'1': ['a2', 'x2'], '2': ['d2']}}),\n  ('second cycle with an unswept page',\n   ({1: {'a2': 0, 'b2': 0, 'c2': 0}, 2: {'d2': 0, 'e2': 0}},\n    [['gc', ['a2', 'd2']], ['alloc', 'x2', 1], ['gc', ['a2']], ['finish']]),\n   {'log': [[1, ['b2', 'c2']], [2, ['e2']], [1, ['x2']], [2, ['d2']]], 'pages': {'1': ['a2'], '2': []}}),\n  ('allocation after sweeping dies next cycle',\n   ({1: {'a2': 0, 'b2': 0, 'c2': 0}, 2: {'d2': 0, 'e2': 0}},\n    [['gc', ['a2']], ['finish'], ['alloc', 'y2', 2], ['gc', ['a2']], ['finish']]),\n   {'log': [[1, ['b2', 'c2']], [2, ['d2', 'e2']], [1, []], [2, ['y2']]], 'pages': {'1': ['a2'], '2': []}}),\n  ('allocation into an unswept page mid-cycle',\n   ({1: {'a2': 0, 'b2': 0, 'c2': 0}, 2: {'d2': 0, 'e2': 0}},\n    [['gc', ['b2', 'e2']], ['alloc', 'y2', 2], ['alloc', 'x2', 1], ['gc', ['x2', 'y2']], ['finish']]),\n   {'log': [[2, ['d2']], [1, ['a2', 'c2']], [1, ['b2']], [2, ['e2']]], 'pages': {'1': ['x2'], '2': ['y2']}}),\n  ('three cycles',\n   ({1: {'a2': 0, 'b2': 0, 'c2': 0}, 2: {'d2': 0, 'e2': 0}},\n    [['gc', ['a2', 'b2', 'd2']], ['gc', ['a2', 'd2']], ['gc', ['d2']], ['finish']]),\n   {'log': [[1, ['c2']], [2, ['e2']], [1, ['b2']], [2, []], [1, ['a2']], [2, []]],\n    'pages': {'1': [], '2': ['d2']}}),\n  ('control: everything live',\n   ({1: {'a2': 0, 'b2': 0, 'c2': 0}, 2: {'d2': 0, 'e2': 0}},\n    [['gc', ['a2', 'b2', 'c2', 'd2', 'e2']], ['finish']]),\n   {'log': [[1, []], [2, []]], 'pages': {'1': ['a2', 'b2', 'c2'], '2': ['d2', 'e2']}})],\n [('regression: lazy sweep before allocation',\n   ({1: {'a3': 0, 'b3': 0, 'c3': 0}, 2: {'d3': 0, 'e3': 0}},\n    [['gc', ['a3', 'd3']], ['alloc', 'x3', 1], ['finish']]),\n   {'log': [[1, ['b3', 'c3']], [2, ['e3']]], 'pages': {'1': ['a3', 'x3'], '2': ['d3']}}),\n  ('second cycle with an unswept page',\n   ({1: {'a3': 0, 'b3': 0, 'c3': 0}, 2: {'d3': 0, 'e3': 0}},\n    [['gc', ['a3', 'd3']], ['alloc', 'x3', 1], ['gc', ['a3']], ['finish']]),\n   {'log': [[1, ['b3', 'c3']], [2, ['e3']], [1, ['x3']], [2, ['d3']]], 'pages': {'1': ['a3'], '2': []}}),\n  ('allocation after sweeping dies next cycle',\n   ({1: {'a3': 0, 'b3': 0, 'c3': 0}, 2: {'d3': 0, 'e3': 0}},\n    [['gc', ['a3']], ['finish'], ['alloc', 'y3', 2], ['gc', ['a3']], ['finish']]),\n   {'log': [[1, ['b3', 'c3']], [2, ['d3', 'e3']], [1, []], [2, ['y3']]], 'pages': {'1': ['a3'], '2': []}}),\n  ('allocation into an unswept page mid-cycle',\n   ({1: {'a3': 0, 'b3': 0, 'c3': 0}, 2: {'d3': 0, 'e3': 0}},\n    [['gc', ['b3', 'e3']], ['alloc', 'y3', 2], ['alloc', 'x3', 1], ['gc', ['x3', 'y3']], ['finish']]),\n   {'log': [[2, ['d3']], [1, ['a3', 'c3']], [1, ['b3']], [2, ['e3']]], 'pages': {'1': ['x3'], '2': ['y3']}}),\n  ('three cycles',\n   ({1: {'a3': 0, 'b3': 0, 'c3': 0}, 2: {'d3': 0, 'e3': 0}},\n    [['gc', ['a3', 'b3', 'd3']], ['gc', ['a3', 'd3']], ['gc', ['d3']], ['finish']]),\n   {'log': [[1, ['c3']], [2, ['e3']], [1, ['b3']], [2, []], [1, ['a3']], [2, []]],\n    'pages': {'1': [], '2': ['d3']}}),\n  ('control: everything live',\n   ({1: {'a3': 0, 'b3': 0, 'c3': 0}, 2: {'d3': 0, 'e3': 0}},\n    [['gc', ['a3', 'b3', 'c3', 'd3', 'e3']], ['finish']]),\n   {'log': [[1, []], [2, []]], 'pages': {'1': ['a3', 'b3', 'c3'], '2': ['d3', 'e3']}})],\n [('regression: lazy sweep before allocation',\n   ({1: {'a4': 0, 'b4': 0, 'c4': 0}, 2: {'d4': 0, 'e4': 0}},\n    [['gc', ['a4', 'd4']], ['alloc', 'x4', 1], ['finish']]),\n   {'log': [[1, ['b4', 'c4']], [2, ['e4']]], 'pages': {'1': ['a4', 'x4'], '2': ['d4']}}),\n  ('second cycle with an unswept page',\n   ({1: {'a4': 0, 'b4': 0, 'c4': 0}, 2: {'d4': 0, 'e4': 0}},\n    [['gc', ['a4', 'd4']], ['alloc', 'x4', 1], ['gc', ['a4']], ['finish']]),\n   {'log': [[1, ['b4', 'c4']], [2, ['e4']], [1, ['x4']], [2, ['d4']]], 'pages': {'1': ['a4'], '2': []}}),\n  ('allocation after sweeping dies next cycle',\n   ({1: {'a4': 0, 'b4': 0, 'c4': 0}, 2: {'d4': 0, 'e4': 0}},\n    [['gc', ['a4']], ['finish'], ['alloc', 'y4', 2], ['gc', ['a4']], ['finish']]),\n   {'log': [[1, ['b4', 'c4']], [2, ['d4', 'e4']], [1, []], [2, ['y4']]], 'pages': {'1': ['a4'], '2': []}}),\n  ('allocation into an unswept page mid-cycle',\n   ({1: {'a4': 0, 'b4': 0, 'c4': 0}, 2: {'d4': 0, 'e4': 0}},\n    [['gc', ['b4', 'e4']], ['alloc', 'y4', 2], ['alloc', 'x4', 1], ['gc', ['x4', 'y4']], ['finish']]),\n   {'log': [[2, ['d4']], [1, ['a4', 'c4']], [1, ['b4']], [2, ['e4']]], 'pages': {'1': ['x4'], '2': ['y4']}}),\n  ('three cycles',\n   ({1: {'a4': 0, 'b4': 0, 'c4': 0}, 2: {'d4': 0, 'e4': 0}},\n    [['gc', ['a4', 'b4', 'd4']], ['gc', ['a4', 'd4']], ['gc', ['d4']], ['finish']]),\n   {'log': [[1, ['c4']], [2, ['e4']], [1, ['b4']], [2, []], [1, ['a4']], [2, []]],\n    'pages': {'1': [], '2': ['d4']}}),\n  ('control: everything live',\n   ({1: {'a4': 0, 'b4': 0, 'c4': 0}, 2: {'d4': 0, 'e4': 0}},\n    [['gc', ['a4', 'b4', 'c4', 'd4', 'e4']], ['finish']]),\n   {'log': [[1, []], [2, []]], 'pages': {'1': ['a4', 'b4', 'c4'], '2': ['d4', 'e4']}})],\n [('regression: lazy sweep before allocation',\n   ({1: {'a5': 0, 'b5': 0, 'c5': 0}, 2: {'d5': 0, 'e5': 0}},\n    [['gc', ['a5', 'd5']], ['alloc', 'x5', 1], ['finish']]),\n   {'log': [[1, ['b5', 'c5']], [2, ['e5']]], 'pages': {'1': ['a5', 'x5'], '2': ['d5']}}),\n  ('second cycle with an unswept page',\n   ({1: {'a5': 0, 'b5': 0, 'c5': 0}, 2: {'d5': 0, 'e5': 0}},\n    [['gc', ['a5', 'd5']], ['alloc', 'x5', 1], ['gc', ['a5']], ['finish']]),\n   {'log': [[1, ['b5', 'c5']], [2, ['e5']], [1, ['x5']], [2, ['d5']]], 'pages': {'1': ['a5'], '2': []}}),\n  ('allocation after sweeping dies next cycle',\n   ({1: {'a5': 0, 'b5': 0, 'c5': 0}, 2: {'d5': 0, 'e5': 0}},\n    [['gc', ['a5']], ['finish'], ['alloc', 'y5', 2], ['gc', ['a5']], ['finish']]),\n   {'log': [[1, ['b5', 'c5']], [2, ['d5', 'e5']], [1, []], [2, ['y5']]], 'pages': {'1': ['a5'], '2': []}}),\n  ('allocation into an unswept page mid-cycle',\n   ({1: {'a5': 0, 'b5': 0, 'c5': 0}, 2: {'d5': 0, 'e5': 0}},\n    [['gc', ['b5', 'e5']], ['alloc', 'y5', 2], ['alloc', 'x5', 1], ['gc', ['x5', 'y5']], ['finish']]),\n   {'log': [[2, ['d5']], [1, ['a5', 'c5']], [1, ['b5']], [2, ['e5']]], 'pages': {'1': ['x5'], '2': ['y5']}}),\n  ('three cycles',\n   ({1: {'a5': 0, 'b5': 0, 'c5': 0}, 2: {'d5': 0, 'e5': 0}},\n    [['gc', ['a5', 'b5', 'd5']], ['gc', ['a5', 'd5']], ['gc', ['d5']], ['finish']]),\n   {'log': [[1, ['c5']], [2, ['e5']], [1, ['b5']], [2, []], [1, ['a5']], [2, []]],\n    'pages': {'1': [], '2': ['d5']}}),\n  ('control: everything live',\n   ({1: {'a5': 0, 'b5': 0, 'c5': 0}, 2: {'d5': 0, 'e5': 0}},\n    [['gc', ['a5', 'b5', 'c5', 'd5', 'e5']], ['finish']]),\n   {'log': [[1, []], [2, []]], 'pages': {'1': ['a5', 'b5', 'c5'], '2': ['d5', 'e5']}})]]\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 garbage-collector mechanism with stipulated rules; it is not a production collector and claims no conformance to any particular runtime. 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-garbage-collector-invariants-mark-parity-sweeping-sweep-completion-before-flip","generated_at":"2026-09-29T14:51:28.965911+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Flipping mark polarity avoids clearing mark bits but makes sweep ordering and allocation colour critical.","repair":"Sweep every remaining page before advancing the epoch.","root_cause":"A new cycle flips the parity without finishing the lazy sweep of the previous one.","sha256":"23c14721dc6622f4e70f0776901b9fb0774013fb62c9ac3657e18c82059dc0b0","title":"Mark parity: new cycle starts with pages left unswept · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":42.233,"exit_code":1,"observations":[{"actual":{"log":[[1,["b1","c1"]],[2,["e1"]]],"pages":{"1":["a1","x1"],"2":["d1"]}},"check":"regression: lazy sweep before allocation","expected":{"log":[[1,["b1","c1"]],[2,["e1"]]],"pages":{"1":["a1","x1"],"2":["d1"]}},"passed":true},{"actual":{"log":[[1,["b1","c1"]],[1,["x1"]],[2,["d1"]]],"pages":{"1":["a1"],"2":["e1"]}},"check":"second cycle with an unswept page","expected":{"log":[[1,["b1","c1"]],[2,["e1"]],[1,["x1"]],[2,["d1"]]],"pages":{"1":["a1"],"2":[]}},"passed":false},{"actual":{"log":[[1,["b1","c1"]],[2,["d1","e1"]],[1,[]],[2,["y1"]]],"pages":{"1":["a1"],"2":[]}},"check":"allocation after sweeping dies next cycle","expected":{"log":[[1,["b1","c1"]],[2,["d1","e1"]],[1,[]],[2,["y1"]]],"pages":{"1":["a1"],"2":[]}},"passed":true},{"actual":{"log":[[2,["d1"]],[1,["a1","c1"]],[1,["b1"]],[2,["e1"]]],"pages":{"1":["x1"],"2":["y1"]}},"check":"allocation into an unswept page mid-cycle","expected":{"log":[[2,["d1"]],[1,["a1","c1"]],[1,["b1"]],[2,["e1"]]],"pages":{"1":["x1"],"2":["y1"]}},"passed":true},{"actual":{"log":[[1,["a1","c1"]],[2,["e1"]]],"pages":{"1":["b1"],"2":["d1"]}},"check":"three cycles","expected":{"log":[[1,["c1"]],[2,["e1"]],[1,["b1"]],[2,[]],[1,["a1"]],[2,[]]],"pages":{"1":[],"2":["d1"]}},"passed":false},{"actual":{"log":[[1,[]],[2,[]]],"pages":{"1":["a1","b1","c1"],"2":["d1","e1"]}},"check":"control: everything live","expected":{"log":[[1,[]],[2,[]]],"pages":{"1":["a1","b1","c1"],"2":["d1","e1"]}},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: lazy sweep before allocation\", \"actual\": {\"log\": [[1, [\"b1\", \"c1\"]], [2, [\"e1\"]]], \"pages\": {\"1\": [\"a1\", \"x1\"], \"2\": [\"d1\"]}}, \"expected\": {\"log\": [[1, [\"b1\", \"c1\"]], [2, [\"e1\"]]], \"pages\": {\"1\": [\"a1\", \"x1\"], \"2\": [\"d1\"]}}, \"passed\": true}, {\"check\": \"second cycle with an unswept page\", \"actual\": {\"log\": [[1, [\"b1\", \"c1\"]], [1, [\"x1\"]], [2, [\"d1\"]]], \"pages\": {\"1\": [\"a1\"], \"2\": [\"e1\"]}}, \"expected\": {\"log\": [[1, [\"b1\", \"c1\"]], [2, [\"e1\"]], [1, [\"x1\"]], [2, [\"d1\"]]], \"pages\": {\"1\": [\"a1\"], \"2\": []}}, \"passed\": false}, {\"check\": \"allocation after sweeping dies next cycle\", \"actual\": {\"log\": [[1, [\"b1\", \"c1\"]], [2, [\"d1\", \"e1\"]], [1, []], [2, [\"y1\"]]], \"pages\": {\"1\": [\"a1\"], \"2\": []}}, \"expected\": {\"log\": [[1, [\"b1\", \"c1\"]], [2, [\"d1\", \"e1\"]], [1, []], [2, [\"y1\"]]], \"pages\": {\"1\": [\"a1\"], \"2\": []}}, \"passed\": true}, {\"check\": \"allocation into an unswept page mid-cycle\", \"actual\": {\"log\": [[2, [\"d1\"]], [1, [\"a1\", \"c1\"]], [1, [\"b1\"]], [2, [\"e1\"]]], \"pages\": {\"1\": [\"x1\"], \"2\": [\"y1\"]}}, \"expected\": {\"log\": [[2, [\"d1\"]], [1, [\"a1\", \"c1\"]], [1, [\"b1\"]], [2, [\"e1\"]]], \"pages\": {\"1\": [\"x1\"], \"2\": [\"y1\"]}}, \"passed\": true}, {\"check\": \"three cycles\", \"actual\": {\"log\": [[1, [\"a1\", \"c1\"]], [2, [\"e1\"]]], \"pages\": {\"1\": [\"b1\"], \"2\": [\"d1\"]}}, \"expected\": {\"log\": [[1, [\"c1\"]], [2, [\"e1\"]], [1, [\"b1\"]], [2, []], [1, [\"a1\"]], [2, []]], \"pages\": {\"1\": [], \"2\": [\"d1\"]}}, \"passed\": false}, {\"check\": \"control: everything live\", \"actual\": {\"log\": [[1, []], [2, []]], \"pages\": {\"1\": [\"a1\", \"b1\", \"c1\"], \"2\": [\"d1\", \"e1\"]}}, \"expected\": {\"log\": [[1, []], [2, []]], \"pages\": {\"1\": [\"a1\", \"b1\", \"c1\"], \"2\": [\"d1\", \"e1\"]}}, \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":43.705,"exit_code":1,"observations":[{"actual":{"log":[[1,["b1","c1"]],[2,["e1"]]],"pages":{"1":["a1","x1"],"2":["d1"]}},"check":"regression: lazy sweep before allocation","expected":{"log":[[1,["b1","c1"]],[2,["e1"]]],"pages":{"1":["a1","x1"],"2":["d1"]}},"passed":true},{"actual":{"log":[[1,["b1","c1"]],[1,["x1"]],[2,["d1"]]],"pages":{"1":["a1"],"2":["e1"]}},"check":"second cycle with an unswept page","expected":{"log":[[1,["b1","c1"]],[2,["e1"]],[1,["x1"]],[2,["d1"]]],"pages":{"1":["a1"],"2":[]}},"passed":false},{"actual":{"log":[[1,["b1","c1"]],[2,["d1","e1"]],[1,[]],[2,["y1"]]],"pages":{"1":["a1"],"2":[]}},"check":"allocation after sweeping dies next cycle","expected":{"log":[[1,["b1","c1"]],[2,["d1","e1"]],[1,[]],[2,["y1"]]],"pages":{"1":["a1"],"2":[]}},"passed":true},{"actual":{"log":[[2,["d1"]],[1,["a1","c1"]],[1,["b1"]],[2,["e1"]]],"pages":{"1":["x1"],"2":["y1"]}},"check":"allocation into an unswept page mid-cycle","expected":{"log":[[2,["d1"]],[1,["a1","c1"]],[1,["b1"]],[2,["e1"]]],"pages":{"1":["x1"],"2":["y1"]}},"passed":true},{"actual":{"log":[[1,["a1","c1"]],[2,["e1"]]],"pages":{"1":["b1"],"2":["d1"]}},"check":"three cycles","expected":{"log":[[1,["c1"]],[2,["e1"]],[1,["b1"]],[2,[]],[1,["a1"]],[2,[]]],"pages":{"1":[],"2":["d1"]}},"passed":false},{"actual":{"log":[[1,[]],[2,[]]],"pages":{"1":["a1","b1","c1"],"2":["d1","e1"]}},"check":"control: everything live","expected":{"log":[[1,[]],[2,[]]],"pages":{"1":["a1","b1","c1"],"2":["d1","e1"]}},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: lazy sweep before allocation\", \"actual\": {\"log\": [[1, [\"b1\", \"c1\"]], [2, [\"e1\"]]], \"pages\": {\"1\": [\"a1\", \"x1\"], \"2\": [\"d1\"]}}, \"expected\": {\"log\": [[1, [\"b1\", \"c1\"]], [2, [\"e1\"]]], \"pages\": {\"1\": [\"a1\", \"x1\"], \"2\": [\"d1\"]}}, \"passed\": true}, {\"check\": \"second cycle with an unswept page\", \"actual\": {\"log\": [[1, [\"b1\", \"c1\"]], [1, [\"x1\"]], [2, [\"d1\"]]], \"pages\": {\"1\": [\"a1\"], \"2\": [\"e1\"]}}, \"expected\": {\"log\": [[1, [\"b1\", \"c1\"]], [2, [\"e1\"]], [1, [\"x1\"]], [2, [\"d1\"]]], \"pages\": {\"1\": [\"a1\"], \"2\": []}}, \"passed\": false}, {\"check\": \"allocation after sweeping dies next cycle\", \"actual\": {\"log\": [[1, [\"b1\", \"c1\"]], [2, [\"d1\", \"e1\"]], [1, []], [2, [\"y1\"]]], \"pages\": {\"1\": [\"a1\"], \"2\": []}}, \"expected\": {\"log\": [[1, [\"b1\", \"c1\"]], [2, [\"d1\", \"e1\"]], [1, []], [2, [\"y1\"]]], \"pages\": {\"1\": [\"a1\"], \"2\": []}}, \"passed\": true}, {\"check\": \"allocation into an unswept page mid-cycle\", \"actual\": {\"log\": [[2, [\"d1\"]], [1, [\"a1\", \"c1\"]], [1, [\"b1\"]], [2, [\"e1\"]]], \"pages\": {\"1\": [\"x1\"], \"2\": [\"y1\"]}}, \"expected\": {\"log\": [[2, [\"d1\"]], [1, [\"a1\", \"c1\"]], [1, [\"b1\"]], [2, [\"e1\"]]], \"pages\": {\"1\": [\"x1\"], \"2\": [\"y1\"]}}, \"passed\": true}, {\"check\": \"three cycles\", \"actual\": {\"log\": [[1, [\"a1\", \"c1\"]], [2, [\"e1\"]]], \"pages\": {\"1\": [\"b1\"], \"2\": [\"d1\"]}}, \"expected\": {\"log\": [[1, [\"c1\"]], [2, [\"e1\"]], [1, [\"b1\"]], [2, []], [1, [\"a1\"]], [2, []]], \"pages\": {\"1\": [], \"2\": [\"d1\"]}}, \"passed\": false}, {\"check\": \"control: everything live\", \"actual\": {\"log\": [[1, []], [2, []]], \"pages\": {\"1\": [\"a1\", \"b1\", \"c1\"], \"2\": [\"d1\", \"e1\"]}}, \"expected\": {\"log\": [[1, []], [2, []]], \"pages\": {\"1\": [\"a1\", \"b1\", \"c1\"], \"2\": [\"d1\", \"e1\"]}}, \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":40.179,"exit_code":0,"observations":[{"actual":{"log":[[1,["b1","c1"]],[2,["e1"]]],"pages":{"1":["a1","x1"],"2":["d1"]}},"check":"regression: lazy sweep before allocation","expected":{"log":[[1,["b1","c1"]],[2,["e1"]]],"pages":{"1":["a1","x1"],"2":["d1"]}},"passed":true},{"actual":{"log":[[1,["b1","c1"]],[2,["e1"]],[1,["x1"]],[2,["d1"]]],"pages":{"1":["a1"],"2":[]}},"check":"second cycle with an unswept page","expected":{"log":[[1,["b1","c1"]],[2,["e1"]],[1,["x1"]],[2,["d1"]]],"pages":{"1":["a1"],"2":[]}},"passed":true},{"actual":{"log":[[1,["b1","c1"]],[2,["d1","e1"]],[1,[]],[2,["y1"]]],"pages":{"1":["a1"],"2":[]}},"check":"allocation after sweeping dies next cycle","expected":{"log":[[1,["b1","c1"]],[2,["d1","e1"]],[1,[]],[2,["y1"]]],"pages":{"1":["a1"],"2":[]}},"passed":true},{"actual":{"log":[[2,["d1"]],[1,["a1","c1"]],[1,["b1"]],[2,["e1"]]],"pages":{"1":["x1"],"2":["y1"]}},"check":"allocation into an unswept page mid-cycle","expected":{"log":[[2,["d1"]],[1,["a1","c1"]],[1,["b1"]],[2,["e1"]]],"pages":{"1":["x1"],"2":["y1"]}},"passed":true},{"actual":{"log":[[1,["c1"]],[2,["e1"]],[1,["b1"]],[2,[]],[1,["a1"]],[2,[]]],"pages":{"1":[],"2":["d1"]}},"check":"three cycles","expected":{"log":[[1,["c1"]],[2,["e1"]],[1,["b1"]],[2,[]],[1,["a1"]],[2,[]]],"pages":{"1":[],"2":["d1"]}},"passed":true},{"actual":{"log":[[1,[]],[2,[]]],"pages":{"1":["a1","b1","c1"],"2":["d1","e1"]}},"check":"control: everything live","expected":{"log":[[1,[]],[2,[]]],"pages":{"1":["a1","b1","c1"],"2":["d1","e1"]}},"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: lazy sweep before allocation\", \"actual\": {\"log\": [[1, [\"b1\", \"c1\"]], [2, [\"e1\"]]], \"pages\": {\"1\": [\"a1\", \"x1\"], \"2\": [\"d1\"]}}, \"expected\": {\"log\": [[1, [\"b1\", \"c1\"]], [2, [\"e1\"]]], \"pages\": {\"1\": [\"a1\", \"x1\"], \"2\": [\"d1\"]}}, \"passed\": true}, {\"check\": \"second cycle with an unswept page\", \"actual\": {\"log\": [[1, [\"b1\", \"c1\"]], [2, [\"e1\"]], [1, [\"x1\"]], [2, [\"d1\"]]], \"pages\": {\"1\": [\"a1\"], \"2\": []}}, \"expected\": {\"log\": [[1, [\"b1\", \"c1\"]], [2, [\"e1\"]], [1, [\"x1\"]], [2, [\"d1\"]]], \"pages\": {\"1\": [\"a1\"], \"2\": []}}, \"passed\": true}, {\"check\": \"allocation after sweeping dies next cycle\", \"actual\": {\"log\": [[1, [\"b1\", \"c1\"]], [2, [\"d1\", \"e1\"]], [1, []], [2, [\"y1\"]]], \"pages\": {\"1\": [\"a1\"], \"2\": []}}, \"expected\": {\"log\": [[1, [\"b1\", \"c1\"]], [2, [\"d1\", \"e1\"]], [1, []], [2, [\"y1\"]]], \"pages\": {\"1\": [\"a1\"], \"2\": []}}, \"passed\": true}, {\"check\": \"allocation into an unswept page mid-cycle\", \"actual\": {\"log\": [[2, [\"d1\"]], [1, [\"a1\", \"c1\"]], [1, [\"b1\"]], [2, [\"e1\"]]], \"pages\": {\"1\": [\"x1\"], \"2\": [\"y1\"]}}, \"expected\": {\"log\": [[2, [\"d1\"]], [1, [\"a1\", \"c1\"]], [1, [\"b1\"]], [2, [\"e1\"]]], \"pages\": {\"1\": [\"x1\"], \"2\": [\"y1\"]}}, \"passed\": true}, {\"check\": \"three cycles\", \"actual\": {\"log\": [[1, [\"c1\"]], [2, [\"e1\"]], [1, [\"b1\"]], [2, []], [1, [\"a1\"]], [2, []]], \"pages\": {\"1\": [], \"2\": [\"d1\"]}}, \"expected\": {\"log\": [[1, [\"c1\"]], [2, [\"e1\"]], [1, [\"b1\"]], [2, []], [1, [\"a1\"]], [2, []]], \"pages\": {\"1\": [], \"2\": [\"d1\"]}}, \"passed\": true}, {\"check\": \"control: everything live\", \"actual\": {\"log\": [[1, []], [2, []]], \"pages\": {\"1\": [\"a1\", \"b1\", \"c1\"], \"2\": [\"d1\", \"e1\"]}}, \"expected\": {\"log\": [[1, []], [2, []]], \"pages\": {\"1\": [\"a1\", \"b1\", \"c1\"], \"2\": [\"d1\", \"e1\"]}}, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}