{"abstract":"With GOGC=100 the next goal equals the live heap, so collections run back to back.","category":"Garbage collector invariants","checks":7,"contract":"GOGC-style pacing starting at 100 percent with goal = min_heap. alloc b adds b to the heap and to live bytes and triggers a collection when collection is enabled (percentage >= 0) and heap >= goal: the heap shrinks to the live bytes, which become the marked size, and goal = max(marked + marked * pct // 100, min_heap). drop b turns b live bytes into garbage. setgc p changes the percentage (-1 disables) and, unless disabled, recomputes the goal from the last marked size. Return the heap sizes at which collections triggered, the final goal and heap.","evaluation_group":"w2-garbage-collector-invariants-heap-goal-pacing","failed_approach":"Integer-dividing the percentage first turns 50 percent growth into none.","family":"w2-garbage-collector-invariants-heap-goal-pacing-growth-base","id":"FA-90486","implementations":{"attempt":{"sha256":"ad529cdcf33f9ea253eb358bd6e7699d9c42ceed24a22f7b067c4d20de79ad04","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(events, min_heap):\n    gogc = 100\n    live = 0\n    marked = 0\n    heap = 0\n    goal = min_heap\n    gcs = []\n    for ev in events:\n        if ev[0] == 'alloc':\n            heap += ev[1]\n            live += ev[1]\n            if gogc >= 0 and heap >= goal:\n                gcs.append(heap)\n                heap = live\n                marked = live\n                goal = max(live * (1 + gogc // 100), min_heap)\n        elif ev[0] == 'drop':\n            live -= ev[1]\n        else:\n            gogc = ev[1]\n            if gogc >= 0:\n                goal = max(marked + marked * gogc // 100, min_heap)\n    return {'gcs': gcs, 'goal': goal, 'heap': heap}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = [[('regression: heap reaching the goal exactly',\n   ([['alloc', 55], ['alloc', 55], ['drop', 30], ['alloc', 25]], 110),\n   {'gcs': [110], 'goal': 220, 'heap': 135}),\n  ('goal grows with live heap',\n   ([['alloc', 330], ['drop', 110], ['alloc', 220], ['alloc', 10]], 110),\n   {'gcs': [330], 'goal': 660, 'heap': 560}),\n  ('fractional growth percentage',\n   ([['setgc', 50], ['alloc', 220], ['alloc', 111]], 110),\n   {'gcs': [220, 331], 'goal': 496, 'heap': 331}),\n  ('collector disabled then zero percent',\n   ([['setgc', -1], ['alloc', 330], ['setgc', 0], ['alloc', 1], ['alloc', 1]], 110),\n   {'gcs': [331, 332], 'goal': 332, 'heap': 332}),\n  ('goal recomputed from last marked heap',\n   ([['alloc', 220], ['drop', 110], ['alloc', 10], ['setgc', 200], ['alloc', 330], ['alloc', 110]], 110),\n   {'gcs': [220, 670], 'goal': 1680, 'heap': 560}),\n  ('small live heap uses the minimum goal',\n   ([['alloc', 110],\n     ['drop', 110],\n     ['alloc', 109],\n     ['drop', 109],\n     ['alloc', 1],\n     ['alloc', 5],\n     ['alloc', 104]],\n    110),\n   {'gcs': [110, 220, 110], 'goal': 220, 'heap': 110}),\n  ('control: no allocation', ([['setgc', 50]], 110), {'gcs': [], 'goal': 110, 'heap': 0})],\n [('regression: heap reaching the goal exactly',\n   ([['alloc', 60], ['alloc', 60], ['drop', 30], ['alloc', 25]], 120),\n   {'gcs': [120], 'goal': 240, 'heap': 145}),\n  ('goal grows with live heap',\n   ([['alloc', 360], ['drop', 120], ['alloc', 240], ['alloc', 10]], 120),\n   {'gcs': [360], 'goal': 720, 'heap': 610}),\n  ('fractional growth percentage',\n   ([['setgc', 50], ['alloc', 240], ['alloc', 121]], 120),\n   {'gcs': [240, 361], 'goal': 541, 'heap': 361}),\n  ('collector disabled then zero percent',\n   ([['setgc', -1], ['alloc', 360], ['setgc', 0], ['alloc', 1], ['alloc', 1]], 120),\n   {'gcs': [361, 362], 'goal': 362, 'heap': 362}),\n  ('goal recomputed from last marked heap',\n   ([['alloc', 240], ['drop', 120], ['alloc', 10], ['setgc', 200], ['alloc', 360], ['alloc', 120]], 120),\n   {'gcs': [240, 730], 'goal': 1830, 'heap': 610}),\n  ('small live heap uses the minimum goal',\n   ([['alloc', 120],\n     ['drop', 120],\n     ['alloc', 119],\n     ['drop', 119],\n     ['alloc', 1],\n     ['alloc', 5],\n     ['alloc', 114]],\n    120),\n   {'gcs': [120, 240, 120], 'goal': 240, 'heap': 120}),\n  ('control: no allocation', ([['setgc', 50]], 120), {'gcs': [], 'goal': 120, 'heap': 0})],\n [('regression: heap reaching the goal exactly',\n   ([['alloc', 65], ['alloc', 65], ['drop', 30], ['alloc', 25]], 130),\n   {'gcs': [130], 'goal': 260, 'heap': 155}),\n  ('goal grows with live heap',\n   ([['alloc', 390], ['drop', 130], ['alloc', 260], ['alloc', 10]], 130),\n   {'gcs': [390], 'goal': 780, 'heap': 660}),\n  ('fractional growth percentage',\n   ([['setgc', 50], ['alloc', 260], ['alloc', 131]], 130),\n   {'gcs': [260, 391], 'goal': 586, 'heap': 391}),\n  ('collector disabled then zero percent',\n   ([['setgc', -1], ['alloc', 390], ['setgc', 0], ['alloc', 1], ['alloc', 1]], 130),\n   {'gcs': [391, 392], 'goal': 392, 'heap': 392}),\n  ('goal recomputed from last marked heap',\n   ([['alloc', 260], ['drop', 130], ['alloc', 10], ['setgc', 200], ['alloc', 390], ['alloc', 130]], 130),\n   {'gcs': [260, 790], 'goal': 1980, 'heap': 660}),\n  ('small live heap uses the minimum goal',\n   ([['alloc', 130],\n     ['drop', 130],\n     ['alloc', 129],\n     ['drop', 129],\n     ['alloc', 1],\n     ['alloc', 5],\n     ['alloc', 124]],\n    130),\n   {'gcs': [130, 260, 130], 'goal': 260, 'heap': 130}),\n  ('control: no allocation', ([['setgc', 50]], 130), {'gcs': [], 'goal': 130, 'heap': 0})],\n [('regression: heap reaching the goal exactly',\n   ([['alloc', 70], ['alloc', 70], ['drop', 30], ['alloc', 25]], 140),\n   {'gcs': [140], 'goal': 280, 'heap': 165}),\n  ('goal grows with live heap',\n   ([['alloc', 420], ['drop', 140], ['alloc', 280], ['alloc', 10]], 140),\n   {'gcs': [420], 'goal': 840, 'heap': 710}),\n  ('fractional growth percentage',\n   ([['setgc', 50], ['alloc', 280], ['alloc', 141]], 140),\n   {'gcs': [280, 421], 'goal': 631, 'heap': 421}),\n  ('collector disabled then zero percent',\n   ([['setgc', -1], ['alloc', 420], ['setgc', 0], ['alloc', 1], ['alloc', 1]], 140),\n   {'gcs': [421, 422], 'goal': 422, 'heap': 422}),\n  ('goal recomputed from last marked heap',\n   ([['alloc', 280], ['drop', 140], ['alloc', 10], ['setgc', 200], ['alloc', 420], ['alloc', 140]], 140),\n   {'gcs': [280, 850], 'goal': 2130, 'heap': 710}),\n  ('small live heap uses the minimum goal',\n   ([['alloc', 140],\n     ['drop', 140],\n     ['alloc', 139],\n     ['drop', 139],\n     ['alloc', 1],\n     ['alloc', 5],\n     ['alloc', 134]],\n    140),\n   {'gcs': [140, 280, 140], 'goal': 280, 'heap': 140}),\n  ('control: no allocation', ([['setgc', 50]], 140), {'gcs': [], 'goal': 140, 'heap': 0})],\n [('regression: heap reaching the goal exactly',\n   ([['alloc', 75], ['alloc', 75], ['drop', 30], ['alloc', 25]], 150),\n   {'gcs': [150], 'goal': 300, 'heap': 175}),\n  ('goal grows with live heap',\n   ([['alloc', 450], ['drop', 150], ['alloc', 300], ['alloc', 10]], 150),\n   {'gcs': [450], 'goal': 900, 'heap': 760}),\n  ('fractional growth percentage',\n   ([['setgc', 50], ['alloc', 300], ['alloc', 151]], 150),\n   {'gcs': [300, 451], 'goal': 676, 'heap': 451}),\n  ('collector disabled then zero percent',\n   ([['setgc', -1], ['alloc', 450], ['setgc', 0], ['alloc', 1], ['alloc', 1]], 150),\n   {'gcs': [451, 452], 'goal': 452, 'heap': 452}),\n  ('goal recomputed from last marked heap',\n   ([['alloc', 300], ['drop', 150], ['alloc', 10], ['setgc', 200], ['alloc', 450], ['alloc', 150]], 150),\n   {'gcs': [300, 910], 'goal': 2280, 'heap': 760}),\n  ('small live heap uses the minimum goal',\n   ([['alloc', 150],\n     ['drop', 150],\n     ['alloc', 149],\n     ['drop', 149],\n     ['alloc', 1],\n     ['alloc', 5],\n     ['alloc', 144]],\n    150),\n   {'gcs': [150, 300, 150], 'goal': 300, 'heap': 150}),\n  ('control: no allocation', ([['setgc', 50]], 150), {'gcs': [], 'goal': 150, 'heap': 0})]]\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":"37e878b31e012db6f76a49f74c9398a04e5928b548be743b254b51b559514046","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(events, min_heap):\n    gogc = 100\n    live = 0\n    marked = 0\n    heap = 0\n    goal = min_heap\n    gcs = []\n    for ev in events:\n        if ev[0] == 'alloc':\n            heap += ev[1]\n            live += ev[1]\n            if gogc >= 0 and heap >= goal:\n                gcs.append(heap)\n                heap = live\n                marked = live\n                goal = max(live * gogc // 100, min_heap)\n        elif ev[0] == 'drop':\n            live -= ev[1]\n        else:\n            gogc = ev[1]\n            if gogc >= 0:\n                goal = max(marked + marked * gogc // 100, min_heap)\n    return {'gcs': gcs, 'goal': goal, 'heap': heap}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = [[('regression: heap reaching the goal exactly',\n   ([['alloc', 55], ['alloc', 55], ['drop', 30], ['alloc', 25]], 110),\n   {'gcs': [110], 'goal': 220, 'heap': 135}),\n  ('goal grows with live heap',\n   ([['alloc', 330], ['drop', 110], ['alloc', 220], ['alloc', 10]], 110),\n   {'gcs': [330], 'goal': 660, 'heap': 560}),\n  ('fractional growth percentage',\n   ([['setgc', 50], ['alloc', 220], ['alloc', 111]], 110),\n   {'gcs': [220, 331], 'goal': 496, 'heap': 331}),\n  ('collector disabled then zero percent',\n   ([['setgc', -1], ['alloc', 330], ['setgc', 0], ['alloc', 1], ['alloc', 1]], 110),\n   {'gcs': [331, 332], 'goal': 332, 'heap': 332}),\n  ('goal recomputed from last marked heap',\n   ([['alloc', 220], ['drop', 110], ['alloc', 10], ['setgc', 200], ['alloc', 330], ['alloc', 110]], 110),\n   {'gcs': [220, 670], 'goal': 1680, 'heap': 560}),\n  ('small live heap uses the minimum goal',\n   ([['alloc', 110],\n     ['drop', 110],\n     ['alloc', 109],\n     ['drop', 109],\n     ['alloc', 1],\n     ['alloc', 5],\n     ['alloc', 104]],\n    110),\n   {'gcs': [110, 220, 110], 'goal': 220, 'heap': 110}),\n  ('control: no allocation', ([['setgc', 50]], 110), {'gcs': [], 'goal': 110, 'heap': 0})],\n [('regression: heap reaching the goal exactly',\n   ([['alloc', 60], ['alloc', 60], ['drop', 30], ['alloc', 25]], 120),\n   {'gcs': [120], 'goal': 240, 'heap': 145}),\n  ('goal grows with live heap',\n   ([['alloc', 360], ['drop', 120], ['alloc', 240], ['alloc', 10]], 120),\n   {'gcs': [360], 'goal': 720, 'heap': 610}),\n  ('fractional growth percentage',\n   ([['setgc', 50], ['alloc', 240], ['alloc', 121]], 120),\n   {'gcs': [240, 361], 'goal': 541, 'heap': 361}),\n  ('collector disabled then zero percent',\n   ([['setgc', -1], ['alloc', 360], ['setgc', 0], ['alloc', 1], ['alloc', 1]], 120),\n   {'gcs': [361, 362], 'goal': 362, 'heap': 362}),\n  ('goal recomputed from last marked heap',\n   ([['alloc', 240], ['drop', 120], ['alloc', 10], ['setgc', 200], ['alloc', 360], ['alloc', 120]], 120),\n   {'gcs': [240, 730], 'goal': 1830, 'heap': 610}),\n  ('small live heap uses the minimum goal',\n   ([['alloc', 120],\n     ['drop', 120],\n     ['alloc', 119],\n     ['drop', 119],\n     ['alloc', 1],\n     ['alloc', 5],\n     ['alloc', 114]],\n    120),\n   {'gcs': [120, 240, 120], 'goal': 240, 'heap': 120}),\n  ('control: no allocation', ([['setgc', 50]], 120), {'gcs': [], 'goal': 120, 'heap': 0})],\n [('regression: heap reaching the goal exactly',\n   ([['alloc', 65], ['alloc', 65], ['drop', 30], ['alloc', 25]], 130),\n   {'gcs': [130], 'goal': 260, 'heap': 155}),\n  ('goal grows with live heap',\n   ([['alloc', 390], ['drop', 130], ['alloc', 260], ['alloc', 10]], 130),\n   {'gcs': [390], 'goal': 780, 'heap': 660}),\n  ('fractional growth percentage',\n   ([['setgc', 50], ['alloc', 260], ['alloc', 131]], 130),\n   {'gcs': [260, 391], 'goal': 586, 'heap': 391}),\n  ('collector disabled then zero percent',\n   ([['setgc', -1], ['alloc', 390], ['setgc', 0], ['alloc', 1], ['alloc', 1]], 130),\n   {'gcs': [391, 392], 'goal': 392, 'heap': 392}),\n  ('goal recomputed from last marked heap',\n   ([['alloc', 260], ['drop', 130], ['alloc', 10], ['setgc', 200], ['alloc', 390], ['alloc', 130]], 130),\n   {'gcs': [260, 790], 'goal': 1980, 'heap': 660}),\n  ('small live heap uses the minimum goal',\n   ([['alloc', 130],\n     ['drop', 130],\n     ['alloc', 129],\n     ['drop', 129],\n     ['alloc', 1],\n     ['alloc', 5],\n     ['alloc', 124]],\n    130),\n   {'gcs': [130, 260, 130], 'goal': 260, 'heap': 130}),\n  ('control: no allocation', ([['setgc', 50]], 130), {'gcs': [], 'goal': 130, 'heap': 0})],\n [('regression: heap reaching the goal exactly',\n   ([['alloc', 70], ['alloc', 70], ['drop', 30], ['alloc', 25]], 140),\n   {'gcs': [140], 'goal': 280, 'heap': 165}),\n  ('goal grows with live heap',\n   ([['alloc', 420], ['drop', 140], ['alloc', 280], ['alloc', 10]], 140),\n   {'gcs': [420], 'goal': 840, 'heap': 710}),\n  ('fractional growth percentage',\n   ([['setgc', 50], ['alloc', 280], ['alloc', 141]], 140),\n   {'gcs': [280, 421], 'goal': 631, 'heap': 421}),\n  ('collector disabled then zero percent',\n   ([['setgc', -1], ['alloc', 420], ['setgc', 0], ['alloc', 1], ['alloc', 1]], 140),\n   {'gcs': [421, 422], 'goal': 422, 'heap': 422}),\n  ('goal recomputed from last marked heap',\n   ([['alloc', 280], ['drop', 140], ['alloc', 10], ['setgc', 200], ['alloc', 420], ['alloc', 140]], 140),\n   {'gcs': [280, 850], 'goal': 2130, 'heap': 710}),\n  ('small live heap uses the minimum goal',\n   ([['alloc', 140],\n     ['drop', 140],\n     ['alloc', 139],\n     ['drop', 139],\n     ['alloc', 1],\n     ['alloc', 5],\n     ['alloc', 134]],\n    140),\n   {'gcs': [140, 280, 140], 'goal': 280, 'heap': 140}),\n  ('control: no allocation', ([['setgc', 50]], 140), {'gcs': [], 'goal': 140, 'heap': 0})],\n [('regression: heap reaching the goal exactly',\n   ([['alloc', 75], ['alloc', 75], ['drop', 30], ['alloc', 25]], 150),\n   {'gcs': [150], 'goal': 300, 'heap': 175}),\n  ('goal grows with live heap',\n   ([['alloc', 450], ['drop', 150], ['alloc', 300], ['alloc', 10]], 150),\n   {'gcs': [450], 'goal': 900, 'heap': 760}),\n  ('fractional growth percentage',\n   ([['setgc', 50], ['alloc', 300], ['alloc', 151]], 150),\n   {'gcs': [300, 451], 'goal': 676, 'heap': 451}),\n  ('collector disabled then zero percent',\n   ([['setgc', -1], ['alloc', 450], ['setgc', 0], ['alloc', 1], ['alloc', 1]], 150),\n   {'gcs': [451, 452], 'goal': 452, 'heap': 452}),\n  ('goal recomputed from last marked heap',\n   ([['alloc', 300], ['drop', 150], ['alloc', 10], ['setgc', 200], ['alloc', 450], ['alloc', 150]], 150),\n   {'gcs': [300, 910], 'goal': 2280, 'heap': 760}),\n  ('small live heap uses the minimum goal',\n   ([['alloc', 150],\n     ['drop', 150],\n     ['alloc', 149],\n     ['drop', 149],\n     ['alloc', 1],\n     ['alloc', 5],\n     ['alloc', 144]],\n    150),\n   {'gcs': [150, 300, 150], 'goal': 300, 'heap': 150}),\n  ('control: no allocation', ([['setgc', 50]], 150), {'gcs': [], 'goal': 150, 'heap': 0})]]\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":"5395f4c4d9801b7ec7294bd530511772d826ee600e9d6016b2993249d762f12d","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(events, min_heap):\n    gogc = 100\n    live = 0\n    marked = 0\n    heap = 0\n    goal = min_heap\n    gcs = []\n    for ev in events:\n        if ev[0] == 'alloc':\n            heap += ev[1]\n            live += ev[1]\n            if gogc >= 0 and heap >= goal:\n                gcs.append(heap)\n                heap = live\n                marked = live\n                goal = max(live + live * gogc // 100, min_heap)\n        elif ev[0] == 'drop':\n            live -= ev[1]\n        else:\n            gogc = ev[1]\n            if gogc >= 0:\n                goal = max(marked + marked * gogc // 100, min_heap)\n    return {'gcs': gcs, 'goal': goal, 'heap': heap}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = [[('regression: heap reaching the goal exactly',\n   ([['alloc', 55], ['alloc', 55], ['drop', 30], ['alloc', 25]], 110),\n   {'gcs': [110], 'goal': 220, 'heap': 135}),\n  ('goal grows with live heap',\n   ([['alloc', 330], ['drop', 110], ['alloc', 220], ['alloc', 10]], 110),\n   {'gcs': [330], 'goal': 660, 'heap': 560}),\n  ('fractional growth percentage',\n   ([['setgc', 50], ['alloc', 220], ['alloc', 111]], 110),\n   {'gcs': [220, 331], 'goal': 496, 'heap': 331}),\n  ('collector disabled then zero percent',\n   ([['setgc', -1], ['alloc', 330], ['setgc', 0], ['alloc', 1], ['alloc', 1]], 110),\n   {'gcs': [331, 332], 'goal': 332, 'heap': 332}),\n  ('goal recomputed from last marked heap',\n   ([['alloc', 220], ['drop', 110], ['alloc', 10], ['setgc', 200], ['alloc', 330], ['alloc', 110]], 110),\n   {'gcs': [220, 670], 'goal': 1680, 'heap': 560}),\n  ('small live heap uses the minimum goal',\n   ([['alloc', 110],\n     ['drop', 110],\n     ['alloc', 109],\n     ['drop', 109],\n     ['alloc', 1],\n     ['alloc', 5],\n     ['alloc', 104]],\n    110),\n   {'gcs': [110, 220, 110], 'goal': 220, 'heap': 110}),\n  ('control: no allocation', ([['setgc', 50]], 110), {'gcs': [], 'goal': 110, 'heap': 0})],\n [('regression: heap reaching the goal exactly',\n   ([['alloc', 60], ['alloc', 60], ['drop', 30], ['alloc', 25]], 120),\n   {'gcs': [120], 'goal': 240, 'heap': 145}),\n  ('goal grows with live heap',\n   ([['alloc', 360], ['drop', 120], ['alloc', 240], ['alloc', 10]], 120),\n   {'gcs': [360], 'goal': 720, 'heap': 610}),\n  ('fractional growth percentage',\n   ([['setgc', 50], ['alloc', 240], ['alloc', 121]], 120),\n   {'gcs': [240, 361], 'goal': 541, 'heap': 361}),\n  ('collector disabled then zero percent',\n   ([['setgc', -1], ['alloc', 360], ['setgc', 0], ['alloc', 1], ['alloc', 1]], 120),\n   {'gcs': [361, 362], 'goal': 362, 'heap': 362}),\n  ('goal recomputed from last marked heap',\n   ([['alloc', 240], ['drop', 120], ['alloc', 10], ['setgc', 200], ['alloc', 360], ['alloc', 120]], 120),\n   {'gcs': [240, 730], 'goal': 1830, 'heap': 610}),\n  ('small live heap uses the minimum goal',\n   ([['alloc', 120],\n     ['drop', 120],\n     ['alloc', 119],\n     ['drop', 119],\n     ['alloc', 1],\n     ['alloc', 5],\n     ['alloc', 114]],\n    120),\n   {'gcs': [120, 240, 120], 'goal': 240, 'heap': 120}),\n  ('control: no allocation', ([['setgc', 50]], 120), {'gcs': [], 'goal': 120, 'heap': 0})],\n [('regression: heap reaching the goal exactly',\n   ([['alloc', 65], ['alloc', 65], ['drop', 30], ['alloc', 25]], 130),\n   {'gcs': [130], 'goal': 260, 'heap': 155}),\n  ('goal grows with live heap',\n   ([['alloc', 390], ['drop', 130], ['alloc', 260], ['alloc', 10]], 130),\n   {'gcs': [390], 'goal': 780, 'heap': 660}),\n  ('fractional growth percentage',\n   ([['setgc', 50], ['alloc', 260], ['alloc', 131]], 130),\n   {'gcs': [260, 391], 'goal': 586, 'heap': 391}),\n  ('collector disabled then zero percent',\n   ([['setgc', -1], ['alloc', 390], ['setgc', 0], ['alloc', 1], ['alloc', 1]], 130),\n   {'gcs': [391, 392], 'goal': 392, 'heap': 392}),\n  ('goal recomputed from last marked heap',\n   ([['alloc', 260], ['drop', 130], ['alloc', 10], ['setgc', 200], ['alloc', 390], ['alloc', 130]], 130),\n   {'gcs': [260, 790], 'goal': 1980, 'heap': 660}),\n  ('small live heap uses the minimum goal',\n   ([['alloc', 130],\n     ['drop', 130],\n     ['alloc', 129],\n     ['drop', 129],\n     ['alloc', 1],\n     ['alloc', 5],\n     ['alloc', 124]],\n    130),\n   {'gcs': [130, 260, 130], 'goal': 260, 'heap': 130}),\n  ('control: no allocation', ([['setgc', 50]], 130), {'gcs': [], 'goal': 130, 'heap': 0})],\n [('regression: heap reaching the goal exactly',\n   ([['alloc', 70], ['alloc', 70], ['drop', 30], ['alloc', 25]], 140),\n   {'gcs': [140], 'goal': 280, 'heap': 165}),\n  ('goal grows with live heap',\n   ([['alloc', 420], ['drop', 140], ['alloc', 280], ['alloc', 10]], 140),\n   {'gcs': [420], 'goal': 840, 'heap': 710}),\n  ('fractional growth percentage',\n   ([['setgc', 50], ['alloc', 280], ['alloc', 141]], 140),\n   {'gcs': [280, 421], 'goal': 631, 'heap': 421}),\n  ('collector disabled then zero percent',\n   ([['setgc', -1], ['alloc', 420], ['setgc', 0], ['alloc', 1], ['alloc', 1]], 140),\n   {'gcs': [421, 422], 'goal': 422, 'heap': 422}),\n  ('goal recomputed from last marked heap',\n   ([['alloc', 280], ['drop', 140], ['alloc', 10], ['setgc', 200], ['alloc', 420], ['alloc', 140]], 140),\n   {'gcs': [280, 850], 'goal': 2130, 'heap': 710}),\n  ('small live heap uses the minimum goal',\n   ([['alloc', 140],\n     ['drop', 140],\n     ['alloc', 139],\n     ['drop', 139],\n     ['alloc', 1],\n     ['alloc', 5],\n     ['alloc', 134]],\n    140),\n   {'gcs': [140, 280, 140], 'goal': 280, 'heap': 140}),\n  ('control: no allocation', ([['setgc', 50]], 140), {'gcs': [], 'goal': 140, 'heap': 0})],\n [('regression: heap reaching the goal exactly',\n   ([['alloc', 75], ['alloc', 75], ['drop', 30], ['alloc', 25]], 150),\n   {'gcs': [150], 'goal': 300, 'heap': 175}),\n  ('goal grows with live heap',\n   ([['alloc', 450], ['drop', 150], ['alloc', 300], ['alloc', 10]], 150),\n   {'gcs': [450], 'goal': 900, 'heap': 760}),\n  ('fractional growth percentage',\n   ([['setgc', 50], ['alloc', 300], ['alloc', 151]], 150),\n   {'gcs': [300, 451], 'goal': 676, 'heap': 451}),\n  ('collector disabled then zero percent',\n   ([['setgc', -1], ['alloc', 450], ['setgc', 0], ['alloc', 1], ['alloc', 1]], 150),\n   {'gcs': [451, 452], 'goal': 452, 'heap': 452}),\n  ('goal recomputed from last marked heap',\n   ([['alloc', 300], ['drop', 150], ['alloc', 10], ['setgc', 200], ['alloc', 450], ['alloc', 150]], 150),\n   {'gcs': [300, 910], 'goal': 2280, 'heap': 760}),\n  ('small live heap uses the minimum goal',\n   ([['alloc', 150],\n     ['drop', 150],\n     ['alloc', 149],\n     ['drop', 149],\n     ['alloc', 1],\n     ['alloc', 5],\n     ['alloc', 144]],\n    150),\n   {'gcs': [150, 300, 150], 'goal': 300, 'heap': 150}),\n  ('control: no allocation', ([['setgc', 50]], 150), {'gcs': [], 'goal': 150, 'heap': 0})]]\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-heap-goal-pacing-growth-base","generated_at":"2026-09-29T14:51:27.131238+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Collector pacing decides when collections run; off-by-one or base errors change memory footprint.","repair":"Goal = marked + marked * pct // 100.","root_cause":"The goal is the growth allowance alone, without the marked heap it grows from.","sha256":"dc2a4ec2250c8bc5cf5dd2fef449a786a1a1b650174976434b9cc60e98afccda","title":"Heap pacing: goal counts only the growth allowance · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":43.759,"exit_code":1,"observations":[{"actual":{"gcs":[110],"goal":220,"heap":135},"check":"regression: heap reaching the goal exactly","expected":{"gcs":[110],"goal":220,"heap":135},"passed":true},{"actual":{"gcs":[330],"goal":660,"heap":560},"check":"goal grows with live heap","expected":{"gcs":[330],"goal":660,"heap":560},"passed":true},{"actual":{"gcs":[220,331],"goal":331,"heap":331},"check":"fractional growth percentage","expected":{"gcs":[220,331],"goal":496,"heap":331},"passed":false},{"actual":{"gcs":[331,332],"goal":332,"heap":332},"check":"collector disabled then zero percent","expected":{"gcs":[331,332],"goal":332,"heap":332},"passed":true},{"actual":{"gcs":[220,670],"goal":1680,"heap":560},"check":"goal recomputed from last marked heap","expected":{"gcs":[220,670],"goal":1680,"heap":560},"passed":true},{"actual":{"gcs":[110,220,110],"goal":220,"heap":110},"check":"small live heap uses the minimum goal","expected":{"gcs":[110,220,110],"goal":220,"heap":110},"passed":true},{"actual":{"gcs":[],"goal":110,"heap":0},"check":"control: no allocation","expected":{"gcs":[],"goal":110,"heap":0},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: heap reaching the goal exactly\", \"actual\": {\"gcs\": [110], \"goal\": 220, \"heap\": 135}, \"expected\": {\"gcs\": [110], \"goal\": 220, \"heap\": 135}, \"passed\": true}, {\"check\": \"goal grows with live heap\", \"actual\": {\"gcs\": [330], \"goal\": 660, \"heap\": 560}, \"expected\": {\"gcs\": [330], \"goal\": 660, \"heap\": 560}, \"passed\": true}, {\"check\": \"fractional growth percentage\", \"actual\": {\"gcs\": [220, 331], \"goal\": 331, \"heap\": 331}, \"expected\": {\"gcs\": [220, 331], \"goal\": 496, \"heap\": 331}, \"passed\": false}, {\"check\": \"collector disabled then zero percent\", \"actual\": {\"gcs\": [331, 332], \"goal\": 332, \"heap\": 332}, \"expected\": {\"gcs\": [331, 332], \"goal\": 332, \"heap\": 332}, \"passed\": true}, {\"check\": \"goal recomputed from last marked heap\", \"actual\": {\"gcs\": [220, 670], \"goal\": 1680, \"heap\": 560}, \"expected\": {\"gcs\": [220, 670], \"goal\": 1680, \"heap\": 560}, \"passed\": true}, {\"check\": \"small live heap uses the minimum goal\", \"actual\": {\"gcs\": [110, 220, 110], \"goal\": 220, \"heap\": 110}, \"expected\": {\"gcs\": [110, 220, 110], \"goal\": 220, \"heap\": 110}, \"passed\": true}, {\"check\": \"control: no allocation\", \"actual\": {\"gcs\": [], \"goal\": 110, \"heap\": 0}, \"expected\": {\"gcs\": [], \"goal\": 110, \"heap\": 0}, \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":41.238,"exit_code":1,"observations":[{"actual":{"gcs":[110,135],"goal":110,"heap":105},"check":"regression: heap reaching the goal exactly","expected":{"gcs":[110],"goal":220,"heap":135},"passed":false},{"actual":{"gcs":[330,550,450],"goal":450,"heap":450},"check":"goal grows with live heap","expected":{"gcs":[330],"goal":660,"heap":560},"passed":false},{"actual":{"gcs":[220,331],"goal":165,"heap":331},"check":"fractional growth percentage","expected":{"gcs":[220,331],"goal":496,"heap":331},"passed":false},{"actual":{"gcs":[331,332],"goal":110,"heap":332},"check":"collector disabled then zero percent","expected":{"gcs":[331,332],"goal":332,"heap":332},"passed":false},{"actual":{"gcs":[220,230,450],"goal":900,"heap":560},"check":"goal recomputed from last marked heap","expected":{"gcs":[220,670],"goal":1680,"heap":560},"passed":false},{"actual":{"gcs":[110,219,110,110],"goal":110,"heap":110},"check":"small live heap uses the minimum goal","expected":{"gcs":[110,220,110],"goal":220,"heap":110},"passed":false},{"actual":{"gcs":[],"goal":110,"heap":0},"check":"control: no allocation","expected":{"gcs":[],"goal":110,"heap":0},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: heap reaching the goal exactly\", \"actual\": {\"gcs\": [110, 135], \"goal\": 110, \"heap\": 105}, \"expected\": {\"gcs\": [110], \"goal\": 220, \"heap\": 135}, \"passed\": false}, {\"check\": \"goal grows with live heap\", \"actual\": {\"gcs\": [330, 550, 450], \"goal\": 450, \"heap\": 450}, \"expected\": {\"gcs\": [330], \"goal\": 660, \"heap\": 560}, \"passed\": false}, {\"check\": \"fractional growth percentage\", \"actual\": {\"gcs\": [220, 331], \"goal\": 165, \"heap\": 331}, \"expected\": {\"gcs\": [220, 331], \"goal\": 496, \"heap\": 331}, \"passed\": false}, {\"check\": \"collector disabled then zero percent\", \"actual\": {\"gcs\": [331, 332], \"goal\": 110, \"heap\": 332}, \"expected\": {\"gcs\": [331, 332], \"goal\": 332, \"heap\": 332}, \"passed\": false}, {\"check\": \"goal recomputed from last marked heap\", \"actual\": {\"gcs\": [220, 230, 450], \"goal\": 900, \"heap\": 560}, \"expected\": {\"gcs\": [220, 670], \"goal\": 1680, \"heap\": 560}, \"passed\": false}, {\"check\": \"small live heap uses the minimum goal\", \"actual\": {\"gcs\": [110, 219, 110, 110], \"goal\": 110, \"heap\": 110}, \"expected\": {\"gcs\": [110, 220, 110], \"goal\": 220, \"heap\": 110}, \"passed\": false}, {\"check\": \"control: no allocation\", \"actual\": {\"gcs\": [], \"goal\": 110, \"heap\": 0}, \"expected\": {\"gcs\": [], \"goal\": 110, \"heap\": 0}, \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":40.461,"exit_code":0,"observations":[{"actual":{"gcs":[110],"goal":220,"heap":135},"check":"regression: heap reaching the goal exactly","expected":{"gcs":[110],"goal":220,"heap":135},"passed":true},{"actual":{"gcs":[330],"goal":660,"heap":560},"check":"goal grows with live heap","expected":{"gcs":[330],"goal":660,"heap":560},"passed":true},{"actual":{"gcs":[220,331],"goal":496,"heap":331},"check":"fractional growth percentage","expected":{"gcs":[220,331],"goal":496,"heap":331},"passed":true},{"actual":{"gcs":[331,332],"goal":332,"heap":332},"check":"collector disabled then zero percent","expected":{"gcs":[331,332],"goal":332,"heap":332},"passed":true},{"actual":{"gcs":[220,670],"goal":1680,"heap":560},"check":"goal recomputed from last marked heap","expected":{"gcs":[220,670],"goal":1680,"heap":560},"passed":true},{"actual":{"gcs":[110,220,110],"goal":220,"heap":110},"check":"small live heap uses the minimum goal","expected":{"gcs":[110,220,110],"goal":220,"heap":110},"passed":true},{"actual":{"gcs":[],"goal":110,"heap":0},"check":"control: no allocation","expected":{"gcs":[],"goal":110,"heap":0},"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: heap reaching the goal exactly\", \"actual\": {\"gcs\": [110], \"goal\": 220, \"heap\": 135}, \"expected\": {\"gcs\": [110], \"goal\": 220, \"heap\": 135}, \"passed\": true}, {\"check\": \"goal grows with live heap\", \"actual\": {\"gcs\": [330], \"goal\": 660, \"heap\": 560}, \"expected\": {\"gcs\": [330], \"goal\": 660, \"heap\": 560}, \"passed\": true}, {\"check\": \"fractional growth percentage\", \"actual\": {\"gcs\": [220, 331], \"goal\": 496, \"heap\": 331}, \"expected\": {\"gcs\": [220, 331], \"goal\": 496, \"heap\": 331}, \"passed\": true}, {\"check\": \"collector disabled then zero percent\", \"actual\": {\"gcs\": [331, 332], \"goal\": 332, \"heap\": 332}, \"expected\": {\"gcs\": [331, 332], \"goal\": 332, \"heap\": 332}, \"passed\": true}, {\"check\": \"goal recomputed from last marked heap\", \"actual\": {\"gcs\": [220, 670], \"goal\": 1680, \"heap\": 560}, \"expected\": {\"gcs\": [220, 670], \"goal\": 1680, \"heap\": 560}, \"passed\": true}, {\"check\": \"small live heap uses the minimum goal\", \"actual\": {\"gcs\": [110, 220, 110], \"goal\": 220, \"heap\": 110}, \"expected\": {\"gcs\": [110, 220, 110], \"goal\": 220, \"heap\": 110}, \"passed\": true}, {\"check\": \"control: no allocation\", \"actual\": {\"gcs\": [], \"goal\": 110, \"heap\": 0}, \"expected\": {\"gcs\": [], \"goal\": 110, \"heap\": 0}, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}