{"_id":"@zakkster/lite-gc-profiler","_rev":"28-bf7aa39f165aaab1f054cd454797414b","name":"@zakkster/lite-gc-profiler","dist-tags":{"latest":"1.16.0"},"versions":{"1.0.0":{"name":"@zakkster/lite-gc-profiler","version":"1.0.0","keywords":["profiler","gc","garbage-collection","heap","memory","zero-gc","performance","perf_hooks","regression","lite"],"author":{"name":"Zahary Shinikchiev","email":"shinikchiev@yahoo.com"},"license":"MIT","_id":"@zakkster/lite-gc-profiler@1.0.0","maintainers":[{"name":"zakkster","email":"shinikchiev@yahoo.com"}],"homepage":"https://github.com/PeshoVurtoleta/lite-gc-profiler#readme","bugs":{"url":"https://github.com/PeshoVurtoleta/lite-gc-profiler/issues","email":"shinikchiev@yahoo.com"},"dist":{"shasum":"d0e1dda81965a8a5dea81803ace377c6edc0759d","tarball":"https://registry.npmjs.org/@zakkster/lite-gc-profiler/-/lite-gc-profiler-1.0.0.tgz","fileCount":7,"integrity":"sha512-joV0Q6DTnJpbiqzoVRG19YvPNX498Isg8RTB5FVoMqluUQ8vlCRvTBdv1+SQ744SxACRnSJYbIiUrOuKzITJPw==","signatures":[{"sig":"MEUCICAepi2oP+UROaFmU5JLYBi7M0CYOAoSvVMysk7vCHmfAiEAivAFEvl8JygrQEzi6ME01xnAmTqmLETdNn88akme63U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":29398},"main":"./index.js","type":"module","types":"./index.d.ts","module":"./index.js","engines":{"node":">=18"},"exports":{".":{"node":"./index.js","types":"./index.d.ts","import":"./index.js","default":"./index.js"}},"funding":{"url":"https://github.com/sponsors/PeshoVurtoleta","type":"github"},"gitHead":"1d18388c5d22186642fc0d52867b3eb0446bccb8","scripts":{"test":"node --expose-gc --test","bundle-check":"npx esbuild index.js --bundle --format=esm --outfile=test-bundle.js","prepublishOnly":"npm run test && npm run bundle-check"},"_npmUser":{"name":"zakkster","email":"shinikchiev@yahoo.com"},"repository":{"url":"git+https://gitlab.com/zakkster/lite-gc-profiler.git","type":"git"},"_npmVersion":"11.15.0","description":"Zero-dependency GC and heap profiler that makes the zero-GC claim falsifiable: precise garbage-collection events in node (perf_hooks), a heap-drop heuristic in Chrome, and long-frame anomaly detection everywhere else, with a maxMajor:0 budget gate.","directories":{},"sideEffects":false,"_nodeVersion":"23.5.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/lite-gc-profiler_1.0.0_1783055421262_0.42058186242035944","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@zakkster/lite-gc-profiler","version":"1.1.0","keywords":["profiler","gc","garbage-collection","heap","memory","zero-gc","performance","perf_hooks","regression","gate","ci","baseline","differential","lite"],"author":{"name":"Zahary Shinikchiev","email":"shinikchiev@yahoo.com"},"license":"MIT","_id":"@zakkster/lite-gc-profiler@1.1.0","maintainers":[{"name":"zakkster","email":"shinikchiev@yahoo.com"}],"homepage":"https://github.com/PeshoVurtoleta/lite-gc-profiler#readme","bugs":{"url":"https://github.com/PeshoVurtoleta/lite-gc-profiler/issues","email":"shinikchiev@yahoo.com"},"bin":{"lite-gc-gate":"bin/LiteGcGate.mjs"},"dist":{"shasum":"22d181a69cc9f5ed2266f767bd7a204b672152bb","tarball":"https://registry.npmjs.org/@zakkster/lite-gc-profiler/-/lite-gc-profiler-1.1.0.tgz","fileCount":16,"integrity":"sha512-HG73zEBmC0ZFnI2n9quqHxzfEtYtql3YQDWcKclSwkqVB98kHZJhOLUuh7L+mPFoFqcBO8Aw8umu3T2TwlTBtA==","signatures":[{"sig":"MEQCIATdga1tGKtF7sivRovAqW8A631A4bzcN19m55m73BftAiAFnLbSIJpTHQRmIki6BY38gly92EpMBQlFm58Puvfj/Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":149012},"main":"./Gc.js","type":"module","types":"./Gc.d.ts","module":"./Gc.js","engines":{"node":">=18"},"exports":{".":{"node":"./Gc.js","types":"./Gc.d.ts","import":"./Gc.js","default":"./Gc.js"},"./explain":{"node":"./Explain.js","types":"./Explain.d.ts","import":"./Explain.js","default":"./Explain.js"},"./register":{"node":"./Register.mjs","default":"./Register.mjs"},"./test-helpers":{"node":"./TestHelpers.js","types":"./TestHelpers.d.ts","import":"./TestHelpers.js","default":"./TestHelpers.js"}},"funding":{"url":"https://github.com/sponsors/PeshoVurtoleta","type":"github"},"gitHead":"ee019f3ac33f9f758684e77bfdfdefe0605c95b0","scripts":{"test":"node --expose-gc --test 'test/*.test.mjs' 'test/torture/*.test.mjs'","bundle-check":"npx esbuild Gc.js --bundle --format=esm --outfile=test-bundle.js","prepublishOnly":"npm run test && npm run bundle-check"},"_npmUser":{"name":"zakkster","email":"shinikchiev@yahoo.com"},"repository":{"url":"git+https://gitlab.com/zakkster/lite-gc-profiler.git","type":"git"},"_npmVersion":"11.16.0","description":"Zero-dependency GC and heap profiler that makes the zero-GC claim falsifiable: three-state verdicts, phases, regions, differential and rep-aware gating, baselines, CLI, and explain mode. precise garbage-collection events in node (perf_hooks), a heap-drop ","directories":{},"sideEffects":false,"_nodeVersion":"26.3.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/lite-gc-profiler_1.1.0_1783833323487_0.5176575287351455","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@zakkster/lite-gc-profiler","version":"1.2.0","keywords":["profiler","gc","garbage-collection","heap","memory","zero-gc","performance","perf_hooks","regression","gate","ci","baseline","differential","lite"],"author":{"name":"Zahary Shinikchiev","email":"shinikchiev@yahoo.com"},"license":"MIT","_id":"@zakkster/lite-gc-profiler@1.2.0","maintainers":[{"name":"zakkster","email":"shinikchiev@yahoo.com"}],"homepage":"https://github.com/PeshoVurtoleta/lite-gc-profiler#readme","bugs":{"url":"https://github.com/PeshoVurtoleta/lite-gc-profiler/issues","email":"shinikchiev@yahoo.com"},"bin":{"lite-gc-gate":"bin/LiteGcGate.mjs"},"dist":{"shasum":"56bb6f8244b2d897e5a34ca2c7d92be3c7eaa9c5","tarball":"https://registry.npmjs.org/@zakkster/lite-gc-profiler/-/lite-gc-profiler-1.2.0.tgz","fileCount":16,"integrity":"sha512-JnFkPIMTwHH2lhcz+Ikw18PRB4bKAmiWl/wIYqOyI9NhIux4awQo7v8EagveIVOv3liSoeL5wTxsy10yBDNVAg==","signatures":[{"sig":"MEUCIQCXCLwu9KUmUeZj+I5Crncz1+7oyY7LI6376mODYezdeQIgRLfBAUNkZicxahi/E73YHZ4VZDRhSge2cpnQUa+sF7M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":164733},"main":"./Gc.js","type":"module","types":"./Gc.d.ts","module":"./Gc.js","engines":{"node":">=18"},"exports":{".":{"node":"./Gc.js","types":"./Gc.d.ts","import":"./Gc.js","default":"./Gc.js"},"./explain":{"node":"./Explain.js","types":"./Explain.d.ts","import":"./Explain.js","default":"./Explain.js"},"./register":{"node":"./Register.mjs","default":"./Register.mjs"},"./test-helpers":{"node":"./TestHelpers.js","types":"./TestHelpers.d.ts","import":"./TestHelpers.js","default":"./TestHelpers.js"}},"funding":{"url":"https://github.com/sponsors/PeshoVurtoleta","type":"github"},"gitHead":"7d4a9c1154fd5e74c7282a98489477c2921a447c","scripts":{"test":"node --expose-gc --test 'test/*.test.mjs' 'test/torture/*.test.mjs'","bundle-check":"npx esbuild Gc.js --bundle --format=esm --outfile=test-bundle.js","prepublishOnly":"npm run test && npm run bundle-check"},"_npmUser":{"name":"zakkster","email":"shinikchiev@yahoo.com"},"repository":{"url":"git+https://gitlab.com/zakkster/lite-gc-profiler.git","type":"git"},"_npmVersion":"11.16.0","description":"Zero-dependency GC and heap profiler that makes the zero-GC claim falsifiable: three-state verdicts, phases, regions, differential and rep-aware gating, baselines, CLI, and explain mode. precise garbage-collection events in node (perf_hooks), a heap-drop ","directories":{},"sideEffects":false,"_nodeVersion":"26.3.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/lite-gc-profiler_1.2.0_1784262274238_0.4195133435377174","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@zakkster/lite-gc-profiler","version":"1.3.0","keywords":["profiler","gc","garbage-collection","heap","memory","zero-gc","performance","perf_hooks","regression","gate","ci","baseline","differential","lite"],"author":{"name":"Zahary Shinikchiev","email":"shinikchiev@yahoo.com"},"license":"MIT","_id":"@zakkster/lite-gc-profiler@1.3.0","maintainers":[{"name":"zakkster","email":"shinikchiev@yahoo.com"}],"homepage":"https://github.com/PeshoVurtoleta/lite-gc-profiler#readme","bugs":{"url":"https://github.com/PeshoVurtoleta/lite-gc-profiler/issues","email":"shinikchiev@yahoo.com"},"bin":{"lite-gc-gate":"bin/LiteGcGate.mjs"},"dist":{"shasum":"79db463cfe365d00639eca0683e041a920af9a94","tarball":"https://registry.npmjs.org/@zakkster/lite-gc-profiler/-/lite-gc-profiler-1.3.0.tgz","fileCount":16,"integrity":"sha512-4Dt3kAGAt9mvCeI8FmVOT/iuBoH6th3uC84dsajuRzwJJBo25Qe9JEzUiAjs5bDXhsmMXixNl8hyej6GAPtncA==","signatures":[{"sig":"MEYCIQCYMpczfXsCi64if7Ju+V67XwoiY8gmyhSrIxK038hICQIhAKrkgVeMQb7lPm5g6mDdL9rn/MFeeAHPzgHM2UnJtU0e","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":202965},"main":"./Gc.js","type":"module","types":"./Gc.d.ts","module":"./Gc.js","engines":{"node":">=18"},"exports":{".":{"node":"./Gc.js","types":"./Gc.d.ts","import":"./Gc.js","default":"./Gc.js"},"./explain":{"node":"./Explain.js","types":"./Explain.d.ts","import":"./Explain.js","default":"./Explain.js"},"./register":{"node":"./Register.mjs","default":"./Register.mjs"},"./test-helpers":{"node":"./TestHelpers.js","types":"./TestHelpers.d.ts","import":"./TestHelpers.js","default":"./TestHelpers.js"}},"funding":{"url":"https://github.com/sponsors/PeshoVurtoleta","type":"github"},"gitHead":"36888eef698851f5aafb526d1ac19841656b1fe4","scripts":{"test":"node --expose-gc --test 'test/*.test.mjs' 'test/torture/*.test.mjs'","bundle-check":"npx esbuild Gc.js --bundle --format=esm --outfile=test-bundle.js","prepublishOnly":"npm run test && npm run bundle-check"},"_npmUser":{"name":"zakkster","email":"shinikchiev@yahoo.com"},"repository":{"url":"git+https://gitlab.com/zakkster/lite-gc-profiler.git","type":"git"},"_npmVersion":"11.16.0","description":"Zero-dependency GC and heap profiler that makes the zero-GC claim falsifiable: three-state verdicts, phases, regions, differential and rep-aware gating, baselines, CLI, and explain mode. precise garbage-collection events in node (perf_hooks), a heap-drop ","directories":{},"sideEffects":false,"_nodeVersion":"26.3.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/lite-gc-profiler_1.3.0_1784306869057_0.44257921617552065","host":"s3://npm-registry-packages-npm-production"}},"1.3.1":{"name":"@zakkster/lite-gc-profiler","version":"1.3.1","keywords":["profiler","gc","garbage-collection","heap","memory","zero-gc","performance","perf_hooks","regression","gate","ci","baseline","differential","lite"],"author":{"name":"Zahary Shinikchiev","email":"shinikchiev@yahoo.com"},"license":"MIT","_id":"@zakkster/lite-gc-profiler@1.3.1","maintainers":[{"name":"zakkster","email":"shinikchiev@yahoo.com"}],"homepage":"https://github.com/PeshoVurtoleta/lite-gc-profiler#readme","bugs":{"url":"https://github.com/PeshoVurtoleta/lite-gc-profiler/issues","email":"shinikchiev@yahoo.com"},"bin":{"lite-gc-gate":"bin/LiteGcGate.mjs"},"dist":{"shasum":"a1f92a78c0b9b702e07ff8d7731e84db86ac386c","tarball":"https://registry.npmjs.org/@zakkster/lite-gc-profiler/-/lite-gc-profiler-1.3.1.tgz","fileCount":16,"integrity":"sha512-d2q/sRYE9yalrlwsOZZDwHNNFBRqn/0pEvGfx7vJJiS5F7XunFizLZki0tqX0gGdU+rEh0c5nbhEdNCEyGYXsQ==","signatures":[{"sig":"MEYCIQCRCgZOI/vc+jgwKbH7fn5ngHPSM2Hi7sWuLLAQ9L+g0QIhAI2OWwFb8wlj1pdxGk9J9L5nV/LgQ1X4lHNefmLfZU95","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":205217},"main":"./Gc.js","type":"module","types":"./Gc.d.ts","module":"./Gc.js","engines":{"node":">=18"},"exports":{".":{"node":"./Gc.js","types":"./Gc.d.ts","import":"./Gc.js","default":"./Gc.js"},"./explain":{"node":"./Explain.js","types":"./Explain.d.ts","import":"./Explain.js","default":"./Explain.js"},"./register":{"node":"./Register.mjs","default":"./Register.mjs"},"./test-helpers":{"node":"./TestHelpers.js","types":"./TestHelpers.d.ts","import":"./TestHelpers.js","default":"./TestHelpers.js"}},"funding":{"url":"https://github.com/sponsors/PeshoVurtoleta","type":"github"},"gitHead":"9367de7d44aa385317bdc0b5b5848bea66bff85f","scripts":{"test":"node --expose-gc --test 'test/*.test.mjs' 'test/torture/*.test.mjs'","bundle-check":"npx esbuild Gc.js --bundle --format=esm --outfile=test-bundle.js","prepublishOnly":"npm run test && npm run bundle-check"},"_npmUser":{"name":"zakkster","email":"shinikchiev@yahoo.com"},"repository":{"url":"git+https://gitlab.com/zakkster/lite-gc-profiler.git","type":"git"},"_npmVersion":"11.16.0","description":"Zero-dependency GC and heap profiler that makes the zero-GC claim falsifiable: three-state verdicts, phases, regions, differential and rep-aware gating, baselines, CLI, and explain mode. precise garbage-collection events in node (perf_hooks), a heap-drop ","directories":{},"sideEffects":false,"_nodeVersion":"26.3.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/lite-gc-profiler_1.3.1_1784321049390_0.36057691562343663","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"@zakkster/lite-gc-profiler","version":"1.4.0","keywords":["profiler","gc","garbage-collection","heap","memory","zero-gc","performance","perf_hooks","regression","gate","ci","baseline","differential","lite"],"author":{"name":"Zahary Shinikchiev","email":"shinikchiev@yahoo.com"},"license":"MIT","_id":"@zakkster/lite-gc-profiler@1.4.0","maintainers":[{"name":"zakkster","email":"shinikchiev@yahoo.com"}],"homepage":"https://github.com/PeshoVurtoleta/lite-gc-profiler#readme","bugs":{"url":"https://github.com/PeshoVurtoleta/lite-gc-profiler/issues","email":"shinikchiev@yahoo.com"},"bin":{"lite-gc-gate":"bin/LiteGcGate.mjs"},"dist":{"shasum":"67b16f40921b4ddf42a39a4e2d8316f8313aa552","tarball":"https://registry.npmjs.org/@zakkster/lite-gc-profiler/-/lite-gc-profiler-1.4.0.tgz","fileCount":15,"integrity":"sha512-8Lv4ExTZ9Z+UliILgHckbsXADcXrw7/bSBiY6ys3nLufI/6F9bGVR9sl+aqi/VSt+e5NIduON+4UryGcLte8Hw==","signatures":[{"sig":"MEUCIQDPFlNGF1SKyX6pQx8ASPd2jF9U4vVAywkeFZdRyWP6PQIgf0NS3z7klAOktJF6zhYQjq6wLfBEwg8ueO6g/C0WYoQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":256040},"main":"./Gc.js","type":"module","types":"./Gc.d.ts","module":"./Gc.js","engines":{"node":">=18"},"exports":{".":{"node":"./Gc.js","types":"./Gc.d.ts","import":"./Gc.js","default":"./Gc.js"},"./explain":{"node":"./Explain.js","types":"./Explain.d.ts","import":"./Explain.js","default":"./Explain.js"},"./register":{"node":"./Register.mjs","default":"./Register.mjs"},"./test-helpers":{"node":"./TestHelpers.js","types":"./TestHelpers.d.ts","import":"./TestHelpers.js","default":"./TestHelpers.js"}},"funding":{"url":"https://github.com/sponsors/PeshoVurtoleta","type":"github"},"gitHead":"5b532b22b6de37dfbfb908cbd39feadcaa3d067e","scripts":{"test":"node --expose-gc --test 'test/*.test.mjs' 'test/torture/*.test.mjs'","bundle-check":"npx esbuild Gc.js --bundle --format=esm --outfile=test-bundle.js","prepublishOnly":"npm run test && npm run bundle-check"},"_npmUser":{"name":"zakkster","email":"shinikchiev@yahoo.com"},"repository":{"url":"git+https://gitlab.com/zakkster/lite-gc-profiler.git","type":"git"},"_npmVersion":"11.16.0","description":"Zero-dependency GC and heap profiler that makes the zero-GC claim falsifiable: three-state verdicts, phases, regions, differential and rep-aware gating, baselines, CLI, and explain mode. precise garbage-collection events in node (perf_hooks), a heap-drop ","directories":{},"sideEffects":false,"_nodeVersion":"26.3.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/lite-gc-profiler_1.4.0_1784330483558_0.6540375540730523","host":"s3://npm-registry-packages-npm-production"}},"1.5.0":{"name":"@zakkster/lite-gc-profiler","version":"1.5.0","keywords":["profiler","gc","garbage-collection","heap","memory","zero-gc","performance","perf_hooks","regression","gate","ci","baseline","differential","lite"],"author":{"name":"Zahary Shinikchiev","email":"shinikchiev@yahoo.com"},"license":"MIT","_id":"@zakkster/lite-gc-profiler@1.5.0","maintainers":[{"name":"zakkster","email":"shinikchiev@yahoo.com"}],"homepage":"https://github.com/PeshoVurtoleta/lite-gc-profiler#readme","bugs":{"url":"https://github.com/PeshoVurtoleta/lite-gc-profiler/issues","email":"shinikchiev@yahoo.com"},"bin":{"lite-gc-gate":"bin/LiteGcGate.mjs"},"dist":{"shasum":"e94ace0fab16843f5966cadc802b679d772fad88","tarball":"https://registry.npmjs.org/@zakkster/lite-gc-profiler/-/lite-gc-profiler-1.5.0.tgz","fileCount":16,"integrity":"sha512-YU/GweLOEiYFaSZ/u5itZ7KajidFNoW3j8gaHSN7DMNTjxtsnz2rEnhvoa+lzHWKkNJt515sDqKktMYLfPh4+g==","signatures":[{"sig":"MEUCIQDKfQSoIkd0dMq+qZsEkpnozbpfl1pB/idQWDHOCHggZAIgETUaFiyrpKtvHAG5MzhOrzqscKmw6fbHQPY5SzGT90Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":270644},"main":"./Gc.js","type":"module","types":"./Gc.d.ts","module":"./Gc.js","engines":{"node":">=18"},"exports":{".":{"node":"./Gc.js","types":"./Gc.d.ts","import":"./Gc.js","default":"./Gc.js"},"./explain":{"node":"./Explain.js","types":"./Explain.d.ts","import":"./Explain.js","default":"./Explain.js"},"./register":{"node":"./Register.mjs","default":"./Register.mjs"},"./test-helpers":{"node":"./TestHelpers.js","types":"./TestHelpers.d.ts","import":"./TestHelpers.js","default":"./TestHelpers.js"}},"funding":{"url":"https://github.com/sponsors/PeshoVurtoleta","type":"github"},"gitHead":"deb41261e1a4ddc4ea8cbe0c21b961e19681234a","scripts":{"test":"node --expose-gc --test 'test/*.test.mjs' 'test/torture/*.test.mjs'","bundle-check":"npx esbuild Gc.js --bundle --format=esm --outfile=test-bundle.js","prepublishOnly":"npm run test && npm run bundle-check"},"_npmUser":{"name":"zakkster","email":"shinikchiev@yahoo.com"},"repository":{"url":"git+https://gitlab.com/zakkster/lite-gc-profiler.git","type":"git"},"_npmVersion":"11.16.0","description":"Zero-dependency GC and heap profiler that makes the zero-GC claim falsifiable: three-state verdicts, phases, regions, differential and rep-aware gating, baselines, CLI, and explain mode. precise garbage-collection events in node (perf_hooks), a heap-drop ","directories":{},"sideEffects":false,"_nodeVersion":"26.3.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/lite-gc-profiler_1.5.0_1784361041654_0.678164820668683","host":"s3://npm-registry-packages-npm-production"}},"1.5.1":{"name":"@zakkster/lite-gc-profiler","version":"1.5.1","keywords":["profiler","gc","garbage-collection","heap","memory","zero-gc","performance","perf_hooks","regression","gate","ci","baseline","differential","lite"],"author":{"name":"Zahary Shinikchiev","email":"shinikchiev@yahoo.com"},"license":"MIT","_id":"@zakkster/lite-gc-profiler@1.5.1","maintainers":[{"name":"zakkster","email":"shinikchiev@yahoo.com"}],"homepage":"https://github.com/PeshoVurtoleta/lite-gc-profiler#readme","bugs":{"url":"https://github.com/PeshoVurtoleta/lite-gc-profiler/issues","email":"shinikchiev@yahoo.com"},"bin":{"lite-gc-gate":"bin/LiteGcGate.mjs"},"dist":{"shasum":"8d5876ce2e68cbfbf190ba22f1adb833489127b5","tarball":"https://registry.npmjs.org/@zakkster/lite-gc-profiler/-/lite-gc-profiler-1.5.1.tgz","fileCount":17,"integrity":"sha512-M9EbCYmS4aNqv091R79OjgU5NOd2OvzFsoh3MpaMUWfsaS9H676JVx+5gBFJiLFcRSWfJBwlq5M609MHdj+jew==","signatures":[{"sig":"MEUCIQCtIHy5cCvwhpZ5dqKpUI7RREKrYJxmxCCLT94CJ0fNEgIgD4kN3hI2oNuFBWfO00irRL/czDVaGOtIRsNcWk8ciBU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":299050},"main":"./Gc.js","type":"module","types":"./Gc.d.ts","module":"./Gc.js","engines":{"node":">=18"},"exports":{".":{"node":"./Gc.js","types":"./Gc.d.ts","import":"./Gc.js","default":"./Gc.js"},"./explain":{"node":"./Explain.js","types":"./Explain.d.ts","import":"./Explain.js","default":"./Explain.js"},"./index.js":{"node":"./index.js","types":"./index.d.ts","import":"./index.js","default":"./index.js"},"./register":{"node":"./Register.mjs","default":"./Register.mjs"},"./test-helpers":{"node":"./TestHelpers.js","types":"./TestHelpers.d.ts","import":"./TestHelpers.js","default":"./TestHelpers.js"}},"funding":{"url":"https://github.com/sponsors/PeshoVurtoleta","type":"github"},"gitHead":"3ddde05cbb1920f14a39f749ee1191be3731793e","scripts":{"test":"node --expose-gc --test 'test/*.test.mjs' 'test/torture/*.test.mjs'","bundle-check":"npx esbuild Gc.js --bundle --format=esm --outfile=test-bundle.js","prepublishOnly":"npm run test && npm run bundle-check"},"_npmUser":{"name":"zakkster","email":"shinikchiev@yahoo.com"},"repository":{"url":"git+https://gitlab.com/zakkster/lite-gc-profiler.git","type":"git"},"_npmVersion":"11.16.0","description":"Zero-dependency GC and heap profiler that makes the zero-GC claim falsifiable: three-state verdicts, phases, regions, differential and rep-aware gating, baselines, CLI, and explain mode. precise garbage-collection events in node (perf_hooks), a heap-drop ","directories":{},"sideEffects":false,"_nodeVersion":"26.3.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/lite-gc-profiler_1.5.1_1784365876406_0.5755093550154691","host":"s3://npm-registry-packages-npm-production"}},"1.5.2":{"name":"@zakkster/lite-gc-profiler","version":"1.5.2","keywords":["profiler","gc","garbage-collection","heap","memory","zero-gc","performance","perf_hooks","regression","gate","ci","baseline","differential","lite"],"author":{"name":"Zahary Shinikchiev","email":"shinikchiev@yahoo.com"},"license":"MIT","_id":"@zakkster/lite-gc-profiler@1.5.2","maintainers":[{"name":"zakkster","email":"shinikchiev@yahoo.com"}],"homepage":"https://github.com/PeshoVurtoleta/lite-gc-profiler#readme","bugs":{"url":"https://github.com/PeshoVurtoleta/lite-gc-profiler/issues","email":"shinikchiev@yahoo.com"},"bin":{"lite-gc-gate":"bin/LiteGcGate.mjs"},"dist":{"shasum":"e674109a29ea074191f30d70ae87455e5e0f72d8","tarball":"https://registry.npmjs.org/@zakkster/lite-gc-profiler/-/lite-gc-profiler-1.5.2.tgz","fileCount":17,"integrity":"sha512-+wfDFABnfMC4T//ajhz12VFOfo0hA9Rne1HZf1k63OCgdw84RGfPbrLcI5mfT1YWf85zyOQA/fQC5I4218Yc7A==","signatures":[{"sig":"MEYCIQDLkWtcRx7+ZLXyjiNc3U0WeAAI57Q8cRSqGT0I9lvCNQIhANulWbsZyukFKiho7ItcelOriRz8b1pnZuEBkXP492iy","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":333972},"main":"./Gc.js","type":"module","types":"./Gc.d.ts","module":"./Gc.js","engines":{"node":">=18"},"exports":{".":{"node":"./Gc.js","types":"./Gc.d.ts","import":"./Gc.js","default":"./Gc.js"},"./explain":{"node":"./Explain.js","types":"./Explain.d.ts","import":"./Explain.js","default":"./Explain.js"},"./index.js":{"node":"./index.js","types":"./index.d.ts","import":"./index.js","default":"./index.js"},"./register":{"node":"./Register.mjs","default":"./Register.mjs"},"./test-helpers":{"node":"./TestHelpers.js","types":"./TestHelpers.d.ts","import":"./TestHelpers.js","default":"./TestHelpers.js"}},"funding":{"url":"https://github.com/sponsors/PeshoVurtoleta","type":"github"},"gitHead":"5630a92dc72a6d75807550e2640faf64cfa9d70b","scripts":{"test":"node --expose-gc --test 'test/*.test.mjs' 'test/torture/*.test.mjs'","bundle-check":"npx esbuild Gc.js --bundle --format=esm --outfile=test-bundle.js","prepublishOnly":"npm run test && npm run bundle-check"},"_npmUser":{"name":"zakkster","email":"shinikchiev@yahoo.com"},"repository":{"url":"git+https://gitlab.com/zakkster/lite-gc-profiler.git","type":"git"},"_npmVersion":"11.16.0","description":"Zero-dependency GC and heap profiler that makes the zero-GC claim falsifiable: three-state verdicts, phases, regions, differential and rep-aware gating, baselines, CLI, and explain mode. precise garbage-collection events in node (perf_hooks), a heap-drop ","directories":{},"sideEffects":false,"_nodeVersion":"26.3.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/lite-gc-profiler_1.5.2_1784406689527_0.8534332524486858","host":"s3://npm-registry-packages-npm-production"}},"1.6.0":{"name":"@zakkster/lite-gc-profiler","version":"1.6.0","keywords":["profiler","gc","garbage-collection","heap","memory","zero-gc","performance","perf_hooks","regression","gate","ci","baseline","differential","lite"],"author":{"name":"Zahary Shinikchiev","email":"shinikchiev@yahoo.com"},"license":"MIT","_id":"@zakkster/lite-gc-profiler@1.6.0","maintainers":[{"name":"zakkster","email":"shinikchiev@yahoo.com"}],"homepage":"https://github.com/PeshoVurtoleta/lite-gc-profiler#readme","bugs":{"url":"https://github.com/PeshoVurtoleta/lite-gc-profiler/issues","email":"shinikchiev@yahoo.com"},"bin":{"lite-gc-gate":"bin/LiteGcGate.mjs"},"dist":{"shasum":"77e4609a778bf3c87eda28cc343c3092c595af15","tarball":"https://registry.npmjs.org/@zakkster/lite-gc-profiler/-/lite-gc-profiler-1.6.0.tgz","fileCount":17,"integrity":"sha512-pOXjR19yJ03aIzHSNc4B4r4FCfm5fcxVexaEwJZmzKfahjfYWgjULKcDB4LF/zMpChLcGqfCZ8CEdmdzntVUIQ==","signatures":[{"sig":"MEUCIQC7WkiNBxzt+wP4RNt8VehUZipPbuGpa4NfxYd3+CcotgIgJ9SpJVRhB+UVLxHbrTOIqtanlvYPYvFgUSbkey1/OjU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":369653},"main":"./Gc.js","type":"module","types":"./Gc.d.ts","module":"./Gc.js","engines":{"node":">=18"},"exports":{".":{"node":"./Gc.js","types":"./Gc.d.ts","import":"./Gc.js","default":"./Gc.js"},"./explain":{"node":"./Explain.js","types":"./Explain.d.ts","import":"./Explain.js","default":"./Explain.js"},"./index.js":{"node":"./index.js","types":"./index.d.ts","import":"./index.js","default":"./index.js"},"./register":{"node":"./Register.mjs","default":"./Register.mjs"},"./test-helpers":{"node":"./TestHelpers.js","types":"./TestHelpers.d.ts","import":"./TestHelpers.js","default":"./TestHelpers.js"}},"funding":{"url":"https://github.com/sponsors/PeshoVurtoleta","type":"github"},"gitHead":"4614c2de2e424127f4840b8ba64d290dcc87b663","scripts":{"test":"node --expose-gc --test 'test/*.test.mjs' 'test/torture/*.test.mjs'","bundle-check":"npx esbuild Gc.js --bundle --format=esm --outfile=test-bundle.js","prepublishOnly":"npm run test && npm run bundle-check"},"_npmUser":{"name":"zakkster","email":"shinikchiev@yahoo.com"},"repository":{"url":"git+https://gitlab.com/zakkster/lite-gc-profiler.git","type":"git"},"_npmVersion":"11.16.0","description":"Zero-dependency GC and heap profiler that makes the zero-GC claim falsifiable: three-state verdicts, phases, regions, differential and rep-aware gating, baselines, CLI, and explain mode. precise garbage-collection events in node (perf_hooks), a heap-drop ","directories":{},"sideEffects":false,"_nodeVersion":"26.3.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/lite-gc-profiler_1.6.0_1784418048593_0.5146398409097563","host":"s3://npm-registry-packages-npm-production"}},"1.7.0":{"name":"@zakkster/lite-gc-profiler","version":"1.7.0","keywords":["profiler","gc","garbage-collection","heap","memory","zero-gc","performance","perf_hooks","regression","gate","ci","baseline","differential","lite"],"author":{"name":"Zahary Shinikchiev","email":"shinikchiev@yahoo.com"},"license":"MIT","_id":"@zakkster/lite-gc-profiler@1.7.0","maintainers":[{"name":"zakkster","email":"shinikchiev@yahoo.com"}],"homepage":"https://github.com/PeshoVurtoleta/lite-gc-profiler#readme","bugs":{"url":"https://github.com/PeshoVurtoleta/lite-gc-profiler/issues","email":"shinikchiev@yahoo.com"},"bin":{"lite-gc-gate":"bin/LiteGcGate.mjs"},"dist":{"shasum":"57157d00ea9772162ec9f71215c9c57998db6b5f","tarball":"https://registry.npmjs.org/@zakkster/lite-gc-profiler/-/lite-gc-profiler-1.7.0.tgz","fileCount":18,"integrity":"sha512-3kbw3njo+VMYshJN4DfTRFUqI9VpJrVuFFyIyv9vPhUMGEclPEtFiDpyDcCZNuBWRLlcPTHbocHwwfhIeJIXyA==","signatures":[{"sig":"MEYCIQCBD7OM20r7FJMlW6z++GDdBlUtC2AXx5ywJ7XJfGXemgIhAPS7OKnNKgq68z/AVa5jeEKwpTbky+mXO6p4JBqteW13","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":431390},"main":"./Gc.js","type":"module","types":"./Gc.d.ts","module":"./Gc.js","engines":{"node":">=18"},"exports":{".":{"node":"./Gc.js","types":"./Gc.d.ts","import":"./Gc.js","default":"./Gc.js"},"./explain":{"node":"./Explain.js","types":"./Explain.d.ts","import":"./Explain.js","default":"./Explain.js"},"./index.js":{"node":"./index.js","types":"./index.d.ts","import":"./index.js","default":"./index.js"},"./register":{"node":"./Register.mjs","default":"./Register.mjs"},"./test-helpers":{"node":"./TestHelpers.js","types":"./TestHelpers.d.ts","import":"./TestHelpers.js","default":"./TestHelpers.js"}},"funding":{"url":"https://github.com/sponsors/PeshoVurtoleta","type":"github"},"gitHead":"dae8cba1fe21f7121f89cb1501fb4cc53ca4b35d","scripts":{"test":"node --expose-gc --test 'test/*.test.mjs' 'test/torture/*.test.mjs'","bundle-check":"npx esbuild Gc.js --bundle --format=esm --outfile=test-bundle.js","prepublishOnly":"npm run test && npm run bundle-check"},"_npmUser":{"name":"zakkster","email":"shinikchiev@yahoo.com"},"repository":{"url":"git+https://gitlab.com/zakkster/lite-gc-profiler.git","type":"git"},"_npmVersion":"11.16.0","description":"Zero-dependency GC and heap profiler that makes the zero-GC claim falsifiable: three-state verdicts, phases, regions, differential and rep-aware gating, baselines, CLI, and explain mode. precise garbage-collection events in node (perf_hooks), a heap-drop ","directories":{},"sideEffects":false,"_nodeVersion":"26.3.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/lite-gc-profiler_1.7.0_1784434999119_0.9705466505405731","host":"s3://npm-registry-packages-npm-production"}},"1.8.0":{"name":"@zakkster/lite-gc-profiler","version":"1.8.0","keywords":["profiler","gc","garbage-collection","heap","memory","zero-gc","performance","perf_hooks","regression","gate","ci","baseline","differential","lite"],"author":{"name":"Zahary Shinikchiev","email":"shinikchiev@yahoo.com"},"license":"MIT","_id":"@zakkster/lite-gc-profiler@1.8.0","maintainers":[{"name":"zakkster","email":"shinikchiev@yahoo.com"}],"homepage":"https://github.com/PeshoVurtoleta/lite-gc-profiler#readme","bugs":{"url":"https://github.com/PeshoVurtoleta/lite-gc-profiler/issues","email":"shinikchiev@yahoo.com"},"bin":{"lite-gc-gate":"bin/LiteGcGate.mjs"},"dist":{"shasum":"8496dd32004af5c2c7cbce2303c67c5691e6e9c1","tarball":"https://registry.npmjs.org/@zakkster/lite-gc-profiler/-/lite-gc-profiler-1.8.0.tgz","fileCount":18,"integrity":"sha512-PEbPNJIiuKkcGkKX1eWRWwlH3KkCz7OFR/rP/UV3+ZCxHYOVEyIhajglwVQV7wHOP1zMnIZybc8g45Sabz4SVQ==","signatures":[{"sig":"MEQCICdFV5OYWznO/rzURmhWszUkQoIImn5c5M8EgOCcRUw8AiBVxXReenKR/uwspFyRtHXnyncuD9Ypud24OwhVkiYZbA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":482256},"main":"./Gc.js","type":"module","types":"./Gc.d.ts","module":"./Gc.js","engines":{"node":">=18"},"exports":{".":{"node":"./Gc.js","types":"./Gc.d.ts","import":"./Gc.js","default":"./Gc.js"},"./explain":{"node":"./Explain.js","types":"./Explain.d.ts","import":"./Explain.js","default":"./Explain.js"},"./index.js":{"node":"./index.js","types":"./index.d.ts","import":"./index.js","default":"./index.js"},"./register":{"node":"./Register.mjs","default":"./Register.mjs"},"./test-helpers":{"node":"./TestHelpers.js","types":"./TestHelpers.d.ts","import":"./TestHelpers.js","default":"./TestHelpers.js"}},"funding":{"url":"https://github.com/sponsors/PeshoVurtoleta","type":"github"},"gitHead":"7702a871f6ac82f464e938cec0ea8bce49e8b880","scripts":{"test":"node --expose-gc --test 'test/*.test.mjs' 'test/torture/*.test.mjs'","bundle-check":"npx esbuild Gc.js --bundle --format=esm --outfile=test-bundle.js","test:coverage":"c8 --reporter=lcov --reporter=text node  --expose-gc --test --test-reporter=spec 'test/*.test.mjs' 'test/torture/*.test.mjs'","prepublishOnly":"npm run test && npm run bundle-check"},"_npmUser":{"name":"zakkster","email":"shinikchiev@yahoo.com"},"repository":{"url":"git+https://gitlab.com/zakkster/lite-gc-profiler.git","type":"git"},"_npmVersion":"11.16.0","description":"Zero-dependency GC and heap profiler that makes the zero-GC claim falsifiable: three-state verdicts, phases, regions, differential and rep-aware gating, baselines, CLI, and explain mode. precise garbage-collection events in node (perf_hooks), a heap-drop ","directories":{},"sideEffects":false,"_nodeVersion":"26.3.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","coveralls-next":"^6.0.2"},"_npmOperationalInternal":{"tmp":"tmp/lite-gc-profiler_1.8.0_1784502267157_0.23073547874304978","host":"s3://npm-registry-packages-npm-production"}},"1.9.0":{"name":"@zakkster/lite-gc-profiler","version":"1.9.0","keywords":["profiler","gc","garbage-collection","heap","memory","zero-gc","performance","perf_hooks","regression","gate","ci","baseline","differential","lite"],"author":{"name":"Zahary Shinikchiev","email":"shinikchiev@yahoo.com"},"license":"MIT","_id":"@zakkster/lite-gc-profiler@1.9.0","maintainers":[{"name":"zakkster","email":"shinikchiev@yahoo.com"}],"homepage":"https://github.com/PeshoVurtoleta/lite-gc-profiler#readme","bugs":{"url":"https://github.com/PeshoVurtoleta/lite-gc-profiler/issues","email":"shinikchiev@yahoo.com"},"bin":{"lite-gc-gate":"bin/LiteGcGate.mjs"},"dist":{"shasum":"55755899d27aaea5631b5cf31baec095a350d8b8","tarball":"https://registry.npmjs.org/@zakkster/lite-gc-profiler/-/lite-gc-profiler-1.9.0.tgz","fileCount":18,"integrity":"sha512-ihbwctnDUG1TkioKlVUT37Yg4ftk1lFV/LuiwxHzvSQNPFrFMLyuD82Kh0XBdm+b3HR6yj6NwXWBZLds9xLpKA==","signatures":[{"sig":"MEQCIBmrw5nInOErjZIkGnVugZQw1nXhlqar0ixnyrnrXoYdAiBPRk1DXgXUo2OdKWbKpkCULfsNKRHXLUJl/1ULS78PsQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":507500},"main":"./Gc.js","type":"module","types":"./Gc.d.ts","module":"./Gc.js","engines":{"node":">=18"},"exports":{".":{"node":"./Gc.js","types":"./Gc.d.ts","import":"./Gc.js","default":"./Gc.js"},"./explain":{"node":"./Explain.js","types":"./Explain.d.ts","import":"./Explain.js","default":"./Explain.js"},"./index.js":{"node":"./index.js","types":"./index.d.ts","import":"./index.js","default":"./index.js"},"./register":{"node":"./Register.mjs","default":"./Register.mjs"},"./test-helpers":{"node":"./TestHelpers.js","types":"./TestHelpers.d.ts","import":"./TestHelpers.js","default":"./TestHelpers.js"}},"funding":{"url":"https://github.com/sponsors/PeshoVurtoleta","type":"github"},"gitHead":"fa713db7fed676dff9e6f2f8fdcb3d7cd4731d2c","scripts":{"test":"node --expose-gc --test 'test/*.test.mjs' 'test/torture/*.test.mjs'","coverage":"node --expose-gc --test --experimental-test-coverage --test-coverage-exclude='test/**' --test-coverage-exclude='**/tmp/**' --test-coverage-lines=95 --test-coverage-functions=95 --test-coverage-branches=85 'test/*.test.mjs' 'test/torture/*.test.mjs'","bundle-check":"npx esbuild Gc.js --bundle --format=esm --outfile=test-bundle.js","prepublishOnly":"npm run coverage && npm run bundle-check"},"_npmUser":{"name":"zakkster","email":"shinikchiev@yahoo.com"},"repository":{"url":"git+https://gitlab.com/zakkster/lite-gc-profiler.git","type":"git"},"_npmVersion":"11.16.0","description":"Zero-dependency GC and heap profiler that makes the zero-GC claim falsifiable: three-state verdicts, phases, regions, differential and rep-aware gating, baselines, CLI, and explain mode. precise garbage-collection events in node (perf_hooks), a heap-drop ","directories":{},"sideEffects":false,"_nodeVersion":"26.3.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/lite-gc-profiler_1.9.0_1784523590623_0.565053293343694","host":"s3://npm-registry-packages-npm-production"}},"1.9.1":{"name":"@zakkster/lite-gc-profiler","version":"1.9.1","keywords":["profiler","gc","garbage-collection","heap","memory","zero-gc","performance","perf_hooks","regression","gate","ci","baseline","differential","lite"],"author":{"name":"Zahary Shinikchiev","email":"shinikchiev@yahoo.com"},"license":"MIT","_id":"@zakkster/lite-gc-profiler@1.9.1","maintainers":[{"name":"zakkster","email":"shinikchiev@yahoo.com"}],"homepage":"https://github.com/PeshoVurtoleta/lite-gc-profiler#readme","bugs":{"url":"https://github.com/PeshoVurtoleta/lite-gc-profiler/issues","email":"shinikchiev@yahoo.com"},"bin":{"lite-gc-gate":"bin/LiteGcGate.mjs"},"dist":{"shasum":"6ff36e421cf29b329e6f5ad5ad549ab8d939bc03","tarball":"https://registry.npmjs.org/@zakkster/lite-gc-profiler/-/lite-gc-profiler-1.9.1.tgz","fileCount":19,"integrity":"sha512-Z/ZofBTJd1IjbuKfBWZTEYrzOEOC9/nXzPG9MHIz/RR2nh1BFq7h+SZFBOn9V1XNbEFnxLdvLl5bN178a8Tc2Q==","signatures":[{"sig":"MEYCIQDlPaDvPpvwX70Mc4Qws7Y4t7IMZ2kaF9fWGv4JMaOZ6gIhAMCq5Jly2VbmTGyBhyfxONfDhfjOJLTSvJj7QStMx78L","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":526157},"main":"./Gc.js","type":"module","types":"./Gc.d.ts","module":"./Gc.js","engines":{"node":">=18"},"exports":{".":{"node":"./Gc.js","types":"./Gc.d.ts","import":"./Gc.js","default":"./Gc.js"},"./explain":{"node":"./Explain.js","types":"./Explain.d.ts","import":"./Explain.js","default":"./Explain.js"},"./index.js":{"node":"./index.js","types":"./index.d.ts","import":"./index.js","default":"./index.js"},"./register":{"node":"./Register.mjs","default":"./Register.mjs"},"./test-helpers":{"node":"./TestHelpers.js","types":"./TestHelpers.d.ts","import":"./TestHelpers.js","default":"./TestHelpers.js"}},"funding":{"url":"https://github.com/sponsors/PeshoVurtoleta","type":"github"},"gitHead":"16d45383f12e95be87228ddf920762fd86219227","scripts":{"test":"node --expose-gc --test 'test/*.test.mjs' 'test/torture/*.test.mjs'","coverage":"node --expose-gc --test --experimental-test-coverage --test-coverage-exclude='test/**' --test-coverage-exclude='**/tmp/**' --test-coverage-lines=95 --test-coverage-functions=95 --test-coverage-branches=85 'test/*.test.mjs' 'test/torture/*.test.mjs'","bundle-check":"npx esbuild Gc.js --bundle --format=esm --outfile=test-bundle.js","prepublishOnly":"npm run coverage && npm run bundle-check"},"_npmUser":{"name":"zakkster","email":"shinikchiev@yahoo.com"},"repository":{"url":"git+https://gitlab.com/zakkster/lite-gc-profiler.git","type":"git"},"_npmVersion":"11.16.0","description":"Zero-dependency GC and heap profiler that makes the zero-GC claim falsifiable: three-state verdicts, phases, regions, differential and rep-aware gating, baselines, CLI, and explain mode. precise garbage-collection events in node (perf_hooks), a heap-drop ","directories":{},"sideEffects":false,"_nodeVersion":"26.3.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/lite-gc-profiler_1.9.1_1784582203324_0.628422248270986","host":"s3://npm-registry-packages-npm-production"}},"1.9.2":{"name":"@zakkster/lite-gc-profiler","version":"1.9.2","keywords":["profiler","gc","garbage-collection","heap","memory","zero-gc","performance","perf_hooks","regression","gate","ci","baseline","differential","lite"],"author":{"name":"Zahary Shinikchiev","email":"shinikchiev@yahoo.com"},"license":"MIT","_id":"@zakkster/lite-gc-profiler@1.9.2","maintainers":[{"name":"zakkster","email":"shinikchiev@yahoo.com"}],"homepage":"https://github.com/PeshoVurtoleta/lite-gc-profiler#readme","bugs":{"url":"https://github.com/PeshoVurtoleta/lite-gc-profiler/issues","email":"shinikchiev@yahoo.com"},"bin":{"lite-gc-gate":"bin/LiteGcGate.mjs"},"dist":{"shasum":"d7fce35c205940fe23f0431ea58282c05b3d1806","tarball":"https://registry.npmjs.org/@zakkster/lite-gc-profiler/-/lite-gc-profiler-1.9.2.tgz","fileCount":19,"integrity":"sha512-eXJ7XhtAFqTucfo+qdFxMnpUuB3IstmGMyorfzNgJlbRkIeplde4zQs2SPBa0V+25kx+21u/a0tnE9hX9KYUCg==","signatures":[{"sig":"MEUCIQDz64re1pdd+HX3Lbo+1d3N7fSX7dbO8/GFDS73tDPTzAIgXUH8G2z4jkpHI2t4SYvYGk3aj96vqFvKH7/v7uYsU60=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":541425},"main":"./Gc.js","type":"module","types":"./Gc.d.ts","module":"./Gc.js","engines":{"node":">=18"},"exports":{".":{"node":"./Gc.js","types":"./Gc.d.ts","import":"./Gc.js","default":"./Gc.js"},"./explain":{"node":"./Explain.js","types":"./Explain.d.ts","import":"./Explain.js","default":"./Explain.js"},"./index.js":{"node":"./index.js","types":"./index.d.ts","import":"./index.js","default":"./index.js"},"./register":{"node":"./Register.mjs","default":"./Register.mjs"},"./test-helpers":{"node":"./TestHelpers.js","types":"./TestHelpers.d.ts","import":"./TestHelpers.js","default":"./TestHelpers.js"}},"funding":{"url":"https://github.com/sponsors/PeshoVurtoleta","type":"github"},"gitHead":"4e0b86989a30f618ed1b3b152b1b4b77f85cb85a","scripts":{"test":"node --expose-gc --test 'test/*.test.mjs' 'test/torture/*.test.mjs'","coverage":"node --expose-gc --test --experimental-test-coverage --test-coverage-exclude='test/**' --test-coverage-exclude='**/tmp/**' --test-coverage-lines=95 --test-coverage-functions=95 --test-coverage-branches=85 'test/*.test.mjs' 'test/torture/*.test.mjs'","bundle-check":"npx esbuild Gc.js --bundle --format=esm --outfile=test-bundle.js","prepublishOnly":"npm run coverage && npm run bundle-check"},"_npmUser":{"name":"zakkster","email":"shinikchiev@yahoo.com"},"repository":{"url":"git+https://gitlab.com/zakkster/lite-gc-profiler.git","type":"git"},"_npmVersion":"11.16.0","description":"Zero-dependency GC and heap profiler that makes the zero-GC claim falsifiable: three-state verdicts, phases, regions, differential and rep-aware gating, baselines, CLI, and explain mode. precise garbage-collection events in node (perf_hooks), a heap-drop ","directories":{},"sideEffects":false,"_nodeVersion":"26.3.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/lite-gc-profiler_1.9.2_1784583035234_0.15170191421282597","host":"s3://npm-registry-packages-npm-production"}},"1.10.0":{"name":"@zakkster/lite-gc-profiler","version":"1.10.0","keywords":["profiler","gc","garbage-collection","heap","memory","zero-gc","performance","perf_hooks","regression","gate","ci","baseline","differential","lite"],"author":{"name":"Zahary Shinikchiev","email":"shinikchiev@yahoo.com"},"license":"MIT","_id":"@zakkster/lite-gc-profiler@1.10.0","maintainers":[{"name":"zakkster","email":"shinikchiev@yahoo.com"}],"homepage":"https://github.com/PeshoVurtoleta/lite-gc-profiler#readme","bugs":{"url":"https://github.com/PeshoVurtoleta/lite-gc-profiler/issues","email":"shinikchiev@yahoo.com"},"bin":{"lite-gc-gate":"bin/LiteGcGate.mjs"},"dist":{"shasum":"5d8bf6d0ec86e7d7a6bc4efc574b81b059b0b526","tarball":"https://registry.npmjs.org/@zakkster/lite-gc-profiler/-/lite-gc-profiler-1.10.0.tgz","fileCount":19,"integrity":"sha512-F563xfyTk0vWgXb7OzqQxBgdNGn91KNdveLENa8rt+xmIi9WPw1yypN1voS8GxXvnlo8TDMT5V30Y1j2ovWrKw==","signatures":[{"sig":"MEUCIBaS8mEoD4r5o0b1mv2RV6dZM9EDTAA69Y9R6/TdWyGSAiEAynKhSfNrmiWTBhqUZFVqjmp5L/glPifCTsUCrq00hPo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":573386},"main":"./Gc.js","type":"module","types":"./Gc.d.ts","module":"./Gc.js","engines":{"node":">=18"},"exports":{".":{"node":"./Gc.js","types":"./Gc.d.ts","import":"./Gc.js","default":"./Gc.js"},"./explain":{"node":"./Explain.js","types":"./Explain.d.ts","import":"./Explain.js","default":"./Explain.js"},"./index.js":{"node":"./index.js","types":"./index.d.ts","import":"./index.js","default":"./index.js"},"./register":{"node":"./Register.mjs","default":"./Register.mjs"},"./test-helpers":{"node":"./TestHelpers.js","types":"./TestHelpers.d.ts","import":"./TestHelpers.js","default":"./TestHelpers.js"}},"funding":{"url":"https://github.com/sponsors/PeshoVurtoleta","type":"github"},"gitHead":"af57999e9aa7bf508fad1d12e89101c816898219","scripts":{"test":"node --expose-gc --test 'test/*.test.mjs' 'test/torture/*.test.mjs'","coverage":"node --expose-gc --test --experimental-test-coverage --test-coverage-exclude='test/**' --test-coverage-exclude='**/tmp/**' --test-coverage-lines=95 --test-coverage-functions=95 --test-coverage-branches=85 'test/*.test.mjs' 'test/torture/*.test.mjs'","typecheck":"npx --yes tsc --noEmit --strict Gc.d.ts Explain.d.ts index.d.ts","bundle-check":"npx esbuild Gc.js --bundle --format=esm --outfile=test-bundle.js","prepublishOnly":"npm run coverage && npm run bundle-check"},"_npmUser":{"name":"zakkster","email":"shinikchiev@yahoo.com"},"repository":{"url":"git+https://gitlab.com/zakkster/lite-gc-profiler.git","type":"git"},"_npmVersion":"11.16.0","description":"Zero-dependency GC and heap profiler that makes the zero-GC claim falsifiable: three-state verdicts, phases, regions, differential and rep-aware gating, baselines, CLI, and explain mode. precise garbage-collection events in node (perf_hooks), a heap-drop ","directories":{},"sideEffects":false,"_nodeVersion":"26.3.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/lite-gc-profiler_1.10.0_1784608163885_0.5580923918393228","host":"s3://npm-registry-packages-npm-production"}},"1.10.1":{"name":"@zakkster/lite-gc-profiler","version":"1.10.1","keywords":["profiler","gc","garbage-collection","heap","memory","zero-gc","performance","perf_hooks","regression","gate","ci","baseline","differential","lite"],"author":{"name":"Zahary Shinikchiev","email":"shinikchiev@yahoo.com"},"license":"MIT","_id":"@zakkster/lite-gc-profiler@1.10.1","maintainers":[{"name":"zakkster","email":"shinikchiev@yahoo.com"}],"homepage":"https://github.com/PeshoVurtoleta/lite-gc-profiler#readme","bugs":{"url":"https://github.com/PeshoVurtoleta/lite-gc-profiler/issues","email":"shinikchiev@yahoo.com"},"bin":{"lite-gc-gate":"bin/LiteGcGate.mjs"},"dist":{"shasum":"356f3de17a3e400f9f707a284a2746027c3c3dec","tarball":"https://registry.npmjs.org/@zakkster/lite-gc-profiler/-/lite-gc-profiler-1.10.1.tgz","fileCount":21,"integrity":"sha512-lkHWYcCSZRYXSXUjI9HeT23uHqAGCOCGAMm2O79KggPelAGHzpO0AasOI0sHHITYa7hs/K9S43xvClJxN8kT2A==","signatures":[{"sig":"MEQCIG0fRnZwbfmLy2KaZA5XnWWLchEJnGOpeY/ErEQAOGl1AiASl5UN7ArO6Lavw3JKhBrq7hIDWVWZv4EWiCvbLq+AhA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":578555},"main":"./Gc.js","type":"module","types":"./Gc.d.ts","module":"./Gc.js","engines":{"node":">=18"},"exports":{".":{"node":"./Gc.js","types":"./Gc.d.ts","import":"./Gc.js","default":"./Gc.js"},"./explain":{"node":"./ExplainNode.js","types":"./Explain.d.ts","import":"./ExplainNode.js","browser":"./Explain.js","default":"./Explain.js"},"./index.js":{"node":"./index.js","types":"./index.d.ts","import":"./index.js","default":"./index.js"},"./register":{"node":"./Register.mjs","default":"./Register.mjs"},"./test-helpers":{"node":"./TestHelpers.js","types":"./TestHelpers.d.ts","import":"./TestHelpers.js","default":"./TestHelpers.js"}},"funding":{"url":"https://github.com/sponsors/PeshoVurtoleta","type":"github"},"gitHead":"28bf565a18b522db0b3bfbaab8de3e11c2143016","scripts":{"test":"node --expose-gc --test 'test/*.test.mjs' 'test/torture/*.test.mjs'","coverage":"node --expose-gc --test --experimental-test-coverage --test-coverage-exclude='test/**' --test-coverage-exclude='**/tmp/**' --test-coverage-lines=95 --test-coverage-functions=95 --test-coverage-branches=85 'test/*.test.mjs' 'test/torture/*.test.mjs'","typecheck":"npx --yes tsc --noEmit --strict Gc.d.ts Explain.d.ts index.d.ts","bundle-check":"npx esbuild Gc.js --bundle --format=esm --outfile=test-bundle.js","prepublishOnly":"npm run coverage && npm run bundle-check"},"_npmUser":{"name":"zakkster","email":"shinikchiev@yahoo.com"},"repository":{"url":"git+https://gitlab.com/zakkster/lite-gc-profiler.git","type":"git"},"_npmVersion":"11.16.0","description":"Zero-dependency GC and heap profiler that makes the zero-GC claim falsifiable: three-state verdicts, phases, regions, differential and rep-aware gating, baselines, CLI, and explain mode. precise garbage-collection events in node (perf_hooks), a heap-drop ","directories":{},"sideEffects":false,"_nodeVersion":"26.3.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/lite-gc-profiler_1.10.1_1784611036123_0.8391572800574867","host":"s3://npm-registry-packages-npm-production"}},"1.10.2":{"name":"@zakkster/lite-gc-profiler","version":"1.10.2","keywords":["profiler","gc","garbage-collection","heap","memory","zero-gc","performance","perf_hooks","regression","gate","ci","baseline","differential","lite"],"author":{"name":"Zahary Shinikchiev","email":"shinikchiev@yahoo.com"},"license":"MIT","_id":"@zakkster/lite-gc-profiler@1.10.2","maintainers":[{"name":"zakkster","email":"shinikchiev@yahoo.com"}],"homepage":"https://github.com/PeshoVurtoleta/lite-gc-profiler#readme","bugs":{"url":"https://github.com/PeshoVurtoleta/lite-gc-profiler/issues","email":"shinikchiev@yahoo.com"},"bin":{"lite-gc-gate":"bin/LiteGcGate.mjs"},"dist":{"shasum":"3a8dc238bb29892db3a28cd776080d326d9c7005","tarball":"https://registry.npmjs.org/@zakkster/lite-gc-profiler/-/lite-gc-profiler-1.10.2.tgz","fileCount":21,"integrity":"sha512-WFe6WGfL7PFDnTxXQ2Y+Hh4mGIv+9K8gvup+xKJ6wCOHLYxViphxdZ5RYQcsEeHk672rIpa+vj6EaguWA7ZcUw==","signatures":[{"sig":"MEYCIQDjRW6BvW5lB3vA7lDe+dChZrIABpE7pFcJ28lXqv+BOwIhAMh0lZSnKO3dYyD2n31LOTWJWkZa6wuaki47VNDwfNhj","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":582356},"main":"./Gc.js","type":"module","types":"./Gc.d.ts","module":"./Gc.js","engines":{"node":">=18"},"exports":{".":{"node":"./Gc.js","types":"./Gc.d.ts","import":"./Gc.js","default":"./Gc.js"},"./explain":{"node":"./ExplainNode.js","types":"./Explain.d.ts","import":"./ExplainNode.js","browser":"./Explain.js","default":"./Explain.js"},"./index.js":{"node":"./index.js","types":"./index.d.ts","import":"./index.js","default":"./index.js"},"./register":{"node":"./Register.mjs","default":"./Register.mjs"},"./test-helpers":{"node":"./TestHelpers.js","types":"./TestHelpers.d.ts","import":"./TestHelpers.js","default":"./TestHelpers.js"}},"funding":{"url":"https://github.com/sponsors/PeshoVurtoleta","type":"github"},"gitHead":"9b8200bbe02ab4e8d215d0041ed1130aeaff9fdd","scripts":{"test":"node --expose-gc --test 'test/*.test.mjs' 'test/torture/*.test.mjs'","coverage":"node --expose-gc --test --experimental-test-coverage --test-coverage-exclude='test/**' --test-coverage-exclude='**/tmp/**' --test-coverage-lines=96 --test-coverage-functions=95 --test-coverage-branches=88 'test/*.test.mjs' 'test/torture/*.test.mjs'","typecheck":"npx --yes tsc --noEmit --strict Gc.d.ts Explain.d.ts index.d.ts","bundle-check":"npx esbuild Gc.js --bundle --format=esm --outfile=test-bundle.js","prepublishOnly":"npm run coverage && npm run bundle-check"},"_npmUser":{"name":"zakkster","email":"shinikchiev@yahoo.com"},"repository":{"url":"git+https://gitlab.com/zakkster/lite-gc-profiler.git","type":"git"},"_npmVersion":"11.16.0","description":"Zero-dependency GC and heap profiler that makes the zero-GC claim falsifiable: three-state verdicts, phases, regions, differential and rep-aware gating, baselines, CLI, and explain mode. precise garbage-collection events in node (perf_hooks), a heap-drop ","directories":{},"sideEffects":false,"_nodeVersion":"26.3.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/lite-gc-profiler_1.10.2_1784668056938_0.4603024377923286","host":"s3://npm-registry-packages-npm-production"}},"1.10.3":{"name":"@zakkster/lite-gc-profiler","version":"1.10.3","keywords":["profiler","gc","garbage-collection","heap","memory","zero-gc","performance","perf_hooks","regression","gate","ci","baseline","differential","lite"],"author":{"name":"Zahary Shinikchiev","email":"shinikchiev@yahoo.com"},"license":"MIT","_id":"@zakkster/lite-gc-profiler@1.10.3","maintainers":[{"name":"zakkster","email":"shinikchiev@yahoo.com"}],"homepage":"https://github.com/PeshoVurtoleta/lite-gc-profiler#readme","bugs":{"url":"https://github.com/PeshoVurtoleta/lite-gc-profiler/issues","email":"shinikchiev@yahoo.com"},"bin":{"lite-gc-gate":"bin/LiteGcGate.mjs"},"dist":{"shasum":"68635353c0694f2d6dd9157264806f1b6ab42675","tarball":"https://registry.npmjs.org/@zakkster/lite-gc-profiler/-/lite-gc-profiler-1.10.3.tgz","fileCount":21,"integrity":"sha512-bX0Dkw/xRR+vzZAmHzH5wjIhR2QeQR8ppM5C7Lj3ui5kXvjr9wqsECt6qgykvgZdaEGhsNDoRSGHSlh6Th9Q2w==","signatures":[{"sig":"MEYCIQCgq7O3xK5tUZVb3K9wvf90q0DHB3oO5oKd/AQx3KatSQIhAIwWDXcW+NGnU4YQDr9XPjdhG3l8O7Q/SRrqjb65GFuH","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":584293},"main":"./Gc.js","type":"module","types":"./Gc.d.ts","module":"./Gc.js","engines":{"node":">=18"},"exports":{".":{"node":"./Gc.js","types":"./Gc.d.ts","import":"./Gc.js","default":"./Gc.js"},"./explain":{"node":"./ExplainNode.js","types":"./Explain.d.ts","import":"./ExplainNode.js","browser":"./Explain.js","default":"./Explain.js"},"./index.js":{"node":"./index.js","types":"./index.d.ts","import":"./index.js","default":"./index.js"},"./register":{"node":"./Register.mjs","default":"./Register.mjs"},"./test-helpers":{"node":"./TestHelpers.js","types":"./TestHelpers.d.ts","import":"./TestHelpers.js","default":"./TestHelpers.js"}},"funding":{"url":"https://github.com/sponsors/PeshoVurtoleta","type":"github"},"gitHead":"6c482d9a0bcaa2c0e6111949f7236cca4aa3ef8e","scripts":{"test":"node --expose-gc --test 'test/*.test.mjs' 'test/torture/*.test.mjs'","coverage":"node --expose-gc --test --experimental-test-coverage --test-coverage-exclude='test/**' --test-coverage-exclude='**/tmp/**' --test-coverage-lines=96 --test-coverage-functions=95 --test-coverage-branches=88 'test/*.test.mjs' 'test/torture/*.test.mjs'","typecheck":"npx --yes tsc --noEmit --strict Gc.d.ts Explain.d.ts index.d.ts","bundle-check":"npx esbuild Gc.js --bundle --format=esm --outfile=test-bundle.js","prepublishOnly":"npm run coverage && npm run bundle-check"},"_npmUser":{"name":"zakkster","email":"shinikchiev@yahoo.com"},"repository":{"url":"git+https://gitlab.com/zakkster/lite-gc-profiler.git","type":"git"},"_npmVersion":"11.16.0","description":"Zero-dependency GC and heap profiler that makes the zero-GC claim falsifiable: three-state verdicts, phases, regions, differential and rep-aware gating, baselines, CLI, and explain mode. precise garbage-collection events in node (perf_hooks), a heap-drop ","directories":{},"sideEffects":false,"_nodeVersion":"26.3.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/lite-gc-profiler_1.10.3_1784677426011_0.710018695505336","host":"s3://npm-registry-packages-npm-production"}},"1.11.0":{"name":"@zakkster/lite-gc-profiler","version":"1.11.0","keywords":["profiler","gc","garbage-collection","heap","memory","zero-gc","performance","perf_hooks","regression","gate","ci","baseline","differential","lite"],"author":{"name":"Zahary Shinikchiev","email":"shinikchiev@yahoo.com"},"license":"MIT","_id":"@zakkster/lite-gc-profiler@1.11.0","maintainers":[{"name":"zakkster","email":"shinikchiev@yahoo.com"}],"homepage":"https://github.com/PeshoVurtoleta/lite-gc-profiler#readme","bugs":{"url":"https://github.com/PeshoVurtoleta/lite-gc-profiler/issues","email":"shinikchiev@yahoo.com"},"bin":{"lite-gc-gate":"bin/LiteGcGate.mjs"},"dist":{"shasum":"ce31de2bbc5e51f5c013078dd76b66a993a78b16","tarball":"https://registry.npmjs.org/@zakkster/lite-gc-profiler/-/lite-gc-profiler-1.11.0.tgz","fileCount":21,"integrity":"sha512-u2+k7KZv4e+ogaTAhlRDaSg+gbPUmmUmIbotXGDMxWmPPzWXypOO5sWu8x7JF+RqxCcjdHt+CUTHruNSVxKpgQ==","signatures":[{"sig":"MEYCIQDbSk3DlPVp3nZE1P0hBSGRostPTzb1VXXyp2Vsw3yX2QIhALqkj0PPF2PPdLepWd3/sU8X9JkIDJWKxX79JJdxBFr+","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":610425},"main":"./Gc.js","type":"module","types":"./Gc.d.ts","module":"./Gc.js","engines":{"node":">=18"},"exports":{".":{"node":"./Gc.js","types":"./Gc.d.ts","import":"./Gc.js","default":"./Gc.js"},"./explain":{"node":"./ExplainNode.js","types":"./Explain.d.ts","import":"./ExplainNode.js","browser":"./Explain.js","default":"./Explain.js"},"./index.js":{"node":"./index.js","types":"./index.d.ts","import":"./index.js","default":"./index.js"},"./register":{"node":"./Register.mjs","default":"./Register.mjs"},"./test-helpers":{"node":"./TestHelpers.js","types":"./TestHelpers.d.ts","import":"./TestHelpers.js","default":"./TestHelpers.js"}},"funding":{"url":"https://github.com/sponsors/PeshoVurtoleta","type":"github"},"gitHead":"42a44e13419b0cdbb0184620fb85ddad2229e977","scripts":{"test":"node --expose-gc --test 'test/*.test.mjs' 'test/torture/*.test.mjs'","coverage":"node --expose-gc --test --experimental-test-coverage --test-coverage-exclude='test/**' --test-coverage-exclude='**/tmp/**' --test-coverage-lines=96 --test-coverage-functions=95 --test-coverage-branches=88 'test/*.test.mjs' 'test/torture/*.test.mjs'","typecheck":"npx --yes tsc --noEmit --strict Gc.d.ts Explain.d.ts index.d.ts","bundle-check":"npx esbuild Gc.js --bundle --format=esm --outfile=test-bundle.js","prepublishOnly":"npm run coverage && npm run bundle-check"},"_npmUser":{"name":"zakkster","email":"shinikchiev@yahoo.com"},"repository":{"url":"git+https://gitlab.com/zakkster/lite-gc-profiler.git","type":"git"},"_npmVersion":"11.16.0","description":"Zero-dependency GC and heap profiler that makes the zero-GC claim falsifiable: three-state verdicts, phases, regions, differential and rep-aware gating, baselines, CLI, and explain mode. precise garbage-collection events in node (perf_hooks), a heap-drop ","directories":{},"sideEffects":false,"_nodeVersion":"26.3.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/lite-gc-profiler_1.11.0_1785109581460_0.30509948525087394","host":"s3://npm-registry-packages-npm-production"}},"1.12.0":{"name":"@zakkster/lite-gc-profiler","version":"1.12.0","keywords":["profiler","gc","garbage-collection","heap","memory","zero-gc","performance","perf_hooks","regression","gate","ci","baseline","differential","lite"],"author":{"name":"Zahary Shinikchiev","email":"shinikchiev@yahoo.com"},"license":"MIT","_id":"@zakkster/lite-gc-profiler@1.12.0","maintainers":[{"name":"zakkster","email":"shinikchiev@yahoo.com"}],"homepage":"https://github.com/PeshoVurtoleta/lite-gc-profiler#readme","bugs":{"url":"https://github.com/PeshoVurtoleta/lite-gc-profiler/issues","email":"shinikchiev@yahoo.com"},"bin":{"lite-gc-gate":"bin/LiteGcGate.mjs"},"dist":{"shasum":"8e454c673c38f5f9cd96b3d34be4abf175ab5d77","tarball":"https://registry.npmjs.org/@zakkster/lite-gc-profiler/-/lite-gc-profiler-1.12.0.tgz","fileCount":21,"integrity":"sha512-O68Y2fTwOJ+C+H/OteiIL9iTYXblRXI3vUuUVliYRbZ3a0OGVwmrohPOHxGGSzZ3VxR7+aDnOeR2eD6epJEIdQ==","signatures":[{"sig":"MEUCIHLUH2Vc2yyu99e+LqNX2yWFXi3Xvl6B9FPzfgdqE5DZAiEArX0bXFSwlmTUxnVGYq6UvaMOXUxnNWdaJH7ClvX/Ujg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":627166},"main":"./Gc.js","type":"module","types":"./Gc.d.ts","module":"./Gc.js","engines":{"node":">=18"},"exports":{".":{"node":"./Gc.js","types":"./Gc.d.ts","import":"./Gc.js","default":"./Gc.js"},"./explain":{"node":"./ExplainNode.js","types":"./Explain.d.ts","import":"./ExplainNode.js","browser":"./Explain.js","default":"./Explain.js"},"./index.js":{"node":"./index.js","types":"./index.d.ts","import":"./index.js","default":"./index.js"},"./register":{"node":"./Register.mjs","default":"./Register.mjs"},"./test-helpers":{"node":"./TestHelpers.js","types":"./TestHelpers.d.ts","import":"./TestHelpers.js","default":"./TestHelpers.js"}},"funding":{"url":"https://github.com/sponsors/PeshoVurtoleta","type":"github"},"gitHead":"1e6dc5735d77f43c2e2394e141b150b65ada0142","scripts":{"test":"node --expose-gc --test 'test/*.test.mjs' 'test/torture/*.test.mjs'","coverage":"node --expose-gc --test --experimental-test-coverage --test-coverage-exclude='test/**' --test-coverage-exclude='**/tmp/**' --test-coverage-lines=96 --test-coverage-functions=95 --test-coverage-branches=88 'test/*.test.mjs' 'test/torture/*.test.mjs'","typecheck":"npx --yes tsc --noEmit --strict Gc.d.ts Explain.d.ts index.d.ts","bundle-check":"npx esbuild Gc.js --bundle --format=esm --outfile=test-bundle.js","prepublishOnly":"npm run coverage && npm run bundle-check"},"_npmUser":{"name":"zakkster","email":"shinikchiev@yahoo.com"},"repository":{"url":"git+https://gitlab.com/zakkster/lite-gc-profiler.git","type":"git"},"_npmVersion":"11.16.0","description":"Zero-dependency GC and heap profiler that makes the zero-GC claim falsifiable: three-state verdicts, phases, regions, differential and rep-aware gating, baselines, CLI, and explain mode. precise garbage-collection events in node (perf_hooks), a heap-drop ","directories":{},"sideEffects":false,"_nodeVersion":"26.3.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/lite-gc-profiler_1.12.0_1785191629233_0.9924683676885886","host":"s3://npm-registry-packages-npm-production"}},"1.13.0":{"name":"@zakkster/lite-gc-profiler","version":"1.13.0","keywords":["profiler","gc","garbage-collection","heap","memory","zero-gc","performance","perf_hooks","regression","gate","ci","baseline","differential","lite"],"author":{"name":"Zahary Shinikchiev","email":"shinikchiev@yahoo.com"},"license":"MIT","_id":"@zakkster/lite-gc-profiler@1.13.0","maintainers":[{"name":"zakkster","email":"shinikchiev@yahoo.com"}],"homepage":"https://github.com/PeshoVurtoleta/lite-gc-profiler#readme","bugs":{"url":"https://github.com/PeshoVurtoleta/lite-gc-profiler/issues","email":"shinikchiev@yahoo.com"},"bin":{"lite-gc-gate":"bin/LiteGcGate.mjs"},"dist":{"shasum":"e9ee29ccb362f1df7f261fc07ee3407833bd7c95","tarball":"https://registry.npmjs.org/@zakkster/lite-gc-profiler/-/lite-gc-profiler-1.13.0.tgz","fileCount":21,"integrity":"sha512-YiPglPJdLogb92cSnKMmO8FUvSVETgnApIUNV635Tg432uLqgxF8scoaMUUC0ZASLkTx96/0lib52G2wLgZUSw==","signatures":[{"sig":"MEUCIGFF5QzU5i27/wu3lWJsC2g8zUhzzjFvOJjcbAhP4ccHAiEAjlay9CPF+YEV994I3aMs9Eo61bMEm53Zd69FIHUcNtQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":647682},"main":"./Gc.js","type":"module","types":"./Gc.d.ts","module":"./Gc.js","engines":{"node":">=18"},"exports":{".":{"node":"./Gc.js","types":"./Gc.d.ts","import":"./Gc.js","default":"./Gc.js"},"./explain":{"node":"./ExplainNode.js","types":"./Explain.d.ts","import":"./ExplainNode.js","browser":"./Explain.js","default":"./Explain.js"},"./index.js":{"node":"./index.js","types":"./index.d.ts","import":"./index.js","default":"./index.js"},"./register":{"node":"./Register.mjs","default":"./Register.mjs"},"./test-helpers":{"node":"./TestHelpers.js","types":"./TestHelpers.d.ts","import":"./TestHelpers.js","default":"./TestHelpers.js"}},"funding":{"url":"https://github.com/sponsors/PeshoVurtoleta","type":"github"},"gitHead":"7c701790992bad4380a4ba18aecb24a77c0adb7a","scripts":{"test":"node --expose-gc --test 'test/*.test.mjs' 'test/torture/*.test.mjs'","coverage":"node --expose-gc --test --experimental-test-coverage --test-coverage-exclude='test/**' --test-coverage-exclude='**/tmp/**' --test-coverage-lines=96 --test-coverage-functions=95 --test-coverage-branches=88 'test/*.test.mjs' 'test/torture/*.test.mjs'","typecheck":"npx --yes tsc --noEmit --strict Gc.d.ts Explain.d.ts index.d.ts","bundle-check":"npx esbuild Gc.js --bundle --format=esm --outfile=test-bundle.js","prepublishOnly":"npm run coverage && npm run bundle-check"},"_npmUser":{"name":"zakkster","email":"shinikchiev@yahoo.com"},"repository":{"url":"git+https://gitlab.com/zakkster/lite-gc-profiler.git","type":"git"},"_npmVersion":"11.16.0","description":"Zero-dependency GC and heap profiler that makes the zero-GC claim falsifiable: three-state verdicts, phases, regions, differential and rep-aware gating, baselines, CLI, and explain mode. precise garbage-collection events in node (perf_hooks), a heap-drop ","directories":{},"sideEffects":false,"_nodeVersion":"26.3.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/lite-gc-profiler_1.13.0_1785215103363_0.12838606478659265","host":"s3://npm-registry-packages-npm-production"}},"1.14.0":{"name":"@zakkster/lite-gc-profiler","version":"1.14.0","keywords":["profiler","gc","garbage-collection","heap","memory","zero-gc","performance","perf_hooks","regression","gate","ci","baseline","differential","lite"],"author":{"name":"Zahary Shinikchiev","email":"shinikchiev@yahoo.com"},"license":"MIT","_id":"@zakkster/lite-gc-profiler@1.14.0","maintainers":[{"name":"zakkster","email":"shinikchiev@yahoo.com"}],"homepage":"https://github.com/PeshoVurtoleta/lite-gc-profiler#readme","bugs":{"url":"https://github.com/PeshoVurtoleta/lite-gc-profiler/issues","email":"shinikchiev@yahoo.com"},"bin":{"lite-gc-gate":"bin/LiteGcGate.mjs"},"dist":{"shasum":"52643b7ad13738778ee6323cffe3c4304abbfbf0","tarball":"https://registry.npmjs.org/@zakkster/lite-gc-profiler/-/lite-gc-profiler-1.14.0.tgz","fileCount":21,"integrity":"sha512-KC3SQAOo6JSSJyLjaev31XOOvlYCHkj+1SvMzptIOl5DJBBuL1GrAVmeNuA0ESRW93nm0F8DJ3PDCHqVyQIQjg==","signatures":[{"sig":"MEQCIEJFfO9zx7q4Fb63Vr0SLbRNakhXH6BtRUD+96QuT+obAiBmsQ/SaTAg6D1ONesmembjF0CUDmS2ko0+sSk0O4U3xQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":670661},"main":"./Gc.js","type":"module","types":"./Gc.d.ts","module":"./Gc.js","engines":{"node":">=18"},"exports":{".":{"node":"./Gc.js","types":"./Gc.d.ts","import":"./Gc.js","default":"./Gc.js"},"./explain":{"node":"./ExplainNode.js","types":"./Explain.d.ts","import":"./ExplainNode.js","browser":"./Explain.js","default":"./Explain.js"},"./index.js":{"node":"./index.js","types":"./index.d.ts","import":"./index.js","default":"./index.js"},"./register":{"node":"./Register.mjs","default":"./Register.mjs"},"./test-helpers":{"node":"./TestHelpers.js","types":"./TestHelpers.d.ts","import":"./TestHelpers.js","default":"./TestHelpers.js"}},"funding":{"url":"https://github.com/sponsors/PeshoVurtoleta","type":"github"},"gitHead":"7c701790992bad4380a4ba18aecb24a77c0adb7a","scripts":{"test":"node --expose-gc --test 'test/*.test.mjs' 'test/torture/*.test.mjs'","coverage":"node --expose-gc --test --experimental-test-coverage --test-coverage-exclude='test/**' --test-coverage-exclude='**/tmp/**' --test-coverage-lines=96 --test-coverage-functions=95 --test-coverage-branches=88 'test/*.test.mjs' 'test/torture/*.test.mjs'","typecheck":"npx --yes tsc --noEmit --strict Gc.d.ts Explain.d.ts index.d.ts","bundle-check":"npx esbuild Gc.js --bundle --format=esm --outfile=test-bundle.js","prepublishOnly":"npm run coverage && npm run bundle-check"},"_npmUser":{"name":"zakkster","email":"shinikchiev@yahoo.com"},"repository":{"url":"git+https://gitlab.com/zakkster/lite-gc-profiler.git","type":"git"},"_npmVersion":"11.16.0","description":"Zero-dependency GC and heap profiler that makes the zero-GC claim falsifiable: three-state verdicts, phases, regions, differential and rep-aware gating, baselines, CLI, and explain mode. precise garbage-collection events in node (perf_hooks), a heap-drop ","directories":{},"sideEffects":false,"_nodeVersion":"26.3.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/lite-gc-profiler_1.14.0_1785300014151_0.09458102261998258","host":"s3://npm-registry-packages-npm-production"}},"1.14.1":{"name":"@zakkster/lite-gc-profiler","version":"1.14.1","keywords":["profiler","gc","garbage-collection","heap","memory","zero-gc","performance","perf_hooks","regression","gate","ci","baseline","differential","lite"],"author":{"name":"Zahary Shinikchiev","email":"shinikchiev@yahoo.com"},"license":"MIT","_id":"@zakkster/lite-gc-profiler@1.14.1","maintainers":[{"name":"zakkster","email":"shinikchiev@yahoo.com"}],"homepage":"https://github.com/PeshoVurtoleta/lite-gc-profiler#readme","bugs":{"url":"https://github.com/PeshoVurtoleta/lite-gc-profiler/issues","email":"shinikchiev@yahoo.com"},"bin":{"lite-gc-gate":"bin/LiteGcGate.mjs"},"dist":{"shasum":"3440ffe89896e3d9f9222393aca2e4018b9a322b","tarball":"https://registry.npmjs.org/@zakkster/lite-gc-profiler/-/lite-gc-profiler-1.14.1.tgz","fileCount":21,"integrity":"sha512-NBru9pWI3p/iABdEhwdCg8jIx6VFcJoBSsAhfAZOTx4Y2NFA+vLdOCXQzYPc8At6jUix4H0uiO2MuRddXv0Y3Q==","signatures":[{"sig":"MEYCIQCA3J84lK7B8huQ1NjwtzJqKHc+94yAA1TNajpGWJ1HIwIhAPl26G1GxmIpCsxIjXMQoEwBbl/tfmFLGTjHLVW4UOJ6","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":672884},"main":"./Gc.js","type":"module","types":"./Gc.d.ts","module":"./Gc.js","engines":{"node":">=18"},"exports":{".":{"node":"./Gc.js","types":"./Gc.d.ts","import":"./Gc.js","default":"./Gc.js"},"./explain":{"node":"./ExplainNode.js","types":"./Explain.d.ts","import":"./ExplainNode.js","browser":"./Explain.js","default":"./Explain.js"},"./index.js":{"node":"./index.js","types":"./index.d.ts","import":"./index.js","default":"./index.js"},"./register":{"node":"./Register.mjs","default":"./Register.mjs"},"./test-helpers":{"node":"./TestHelpers.js","types":"./TestHelpers.d.ts","import":"./TestHelpers.js","default":"./TestHelpers.js"}},"funding":{"url":"https://github.com/sponsors/PeshoVurtoleta","type":"github"},"gitHead":"95fcb953c1aff5433a8d27468389aac38d31c717","scripts":{"t":"c8 --reporter=lcov --reporter=text node  --expose-gc --test --test-reporter=spec 'test/*.test.mjs' 'test/torture/*.test.mjs'","test":"node --expose-gc --test 'test/*.test.mjs' 'test/torture/*.test.mjs'","coverage":"node --expose-gc --test --experimental-test-coverage --test-coverage-exclude='test/**' --test-coverage-exclude='**/tmp/**' --test-coverage-lines=96 --test-coverage-functions=95 --test-coverage-branches=88 'test/*.test.mjs' 'test/torture/*.test.mjs'","typecheck":"npx --yes tsc --noEmit --strict Gc.d.ts Explain.d.ts index.d.ts","bundle-check":"npx esbuild Gc.js --bundle --format=esm --outfile=test-bundle.js","prepublishOnly":"npm run coverage && npm run bundle-check"},"_npmUser":{"name":"zakkster","email":"shinikchiev@yahoo.com"},"repository":{"url":"git+https://gitlab.com/zakkster/lite-gc-profiler.git","type":"git"},"_npmVersion":"11.16.0","description":"Zero-dependency GC and heap profiler that makes the zero-GC claim falsifiable: three-state verdicts, phases, regions, differential and rep-aware gating, baselines, CLI, and explain mode. precise garbage-collection events in node (perf_hooks), a heap-drop ","directories":{},"sideEffects":false,"_nodeVersion":"26.3.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","coveralls-next":"^6.0.2"},"_npmOperationalInternal":{"tmp":"tmp/lite-gc-profiler_1.14.1_1785359200842_0.04361397783765519","host":"s3://npm-registry-packages-npm-production"}},"1.14.2":{"name":"@zakkster/lite-gc-profiler","version":"1.14.2","keywords":["profiler","gc","garbage-collection","heap","memory","zero-gc","performance","perf_hooks","regression","gate","ci","baseline","differential","lite"],"author":{"name":"Zahary Shinikchiev","email":"shinikchiev@yahoo.com"},"license":"MIT","_id":"@zakkster/lite-gc-profiler@1.14.2","maintainers":[{"name":"zakkster","email":"shinikchiev@yahoo.com"}],"homepage":"https://github.com/PeshoVurtoleta/lite-gc-profiler#readme","bugs":{"url":"https://github.com/PeshoVurtoleta/lite-gc-profiler/issues","email":"shinikchiev@yahoo.com"},"bin":{"lite-gc-gate":"bin/LiteGcGate.mjs"},"dist":{"shasum":"c31fd949aa69600bb6369d61d8403d282f114205","tarball":"https://registry.npmjs.org/@zakkster/lite-gc-profiler/-/lite-gc-profiler-1.14.2.tgz","fileCount":21,"integrity":"sha512-X0Dvwf9nXciyMpV1Ew0H8xeBFHeLhvC2p+aPQ/DqQR1Z+quIW9gNXLYvVH80NZi8JWKYJI3Y0Fs9vPsV+F8osw==","signatures":[{"sig":"MEYCIQCD8z04i16zDRMrOZJBC9zsJNB6CU2SzpA0HbN3lxD98wIhAOI8Qfhvxb1g5wDF8Qw6/IAwRAxX28rsmQeW7ZRU2tFk","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":682764},"main":"./Gc.js","type":"module","types":"./Gc.d.ts","module":"./Gc.js","engines":{"node":">=18"},"exports":{".":{"node":"./Gc.js","types":"./Gc.d.ts","import":"./Gc.js","default":"./Gc.js"},"./explain":{"node":"./ExplainNode.js","types":"./Explain.d.ts","import":"./ExplainNode.js","browser":"./Explain.js","default":"./Explain.js"},"./index.js":{"node":"./index.js","types":"./index.d.ts","import":"./index.js","default":"./index.js"},"./register":{"node":"./Register.mjs","default":"./Register.mjs"},"./test-helpers":{"node":"./TestHelpers.js","types":"./TestHelpers.d.ts","import":"./TestHelpers.js","default":"./TestHelpers.js"}},"funding":{"url":"https://github.com/sponsors/PeshoVurtoleta","type":"github"},"gitHead":"2ea336a255b99ffab64e59ba3cfef1837700ddfd","scripts":{"test":"node --expose-gc --test 'test/*.test.mjs' 'test/torture/*.test.mjs'","coverage":"node --expose-gc --test --experimental-test-coverage --test-coverage-exclude='test/**' --test-coverage-exclude='**/tmp/**' --test-coverage-lines=96 --test-coverage-functions=95 --test-coverage-branches=88 'test/*.test.mjs' 'test/torture/*.test.mjs'","typecheck":"npx --yes tsc --noEmit --strict Gc.d.ts Explain.d.ts index.d.ts","bundle-check":"npx esbuild Gc.js --bundle --format=esm --outfile=test-bundle.js","prepublishOnly":"npm run coverage && npm run bundle-check"},"_npmUser":{"name":"zakkster","email":"shinikchiev@yahoo.com"},"repository":{"url":"git+https://gitlab.com/zakkster/lite-gc-profiler.git","type":"git"},"_npmVersion":"11.16.0","description":"Zero-dependency GC and heap profiler that makes the zero-GC claim falsifiable: three-state verdicts, phases, regions, differential and rep-aware gating, baselines, CLI, and explain mode. precise garbage-collection events in node (perf_hooks), a heap-drop ","directories":{},"sideEffects":false,"_nodeVersion":"26.3.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/lite-gc-profiler_1.14.2_1785634552875_0.369145231320112","host":"s3://npm-registry-packages-npm-production"}},"1.15.0":{"name":"@zakkster/lite-gc-profiler","version":"1.15.0","keywords":["profiler","gc","garbage-collection","heap","memory","zero-gc","performance","perf_hooks","regression","gate","ci","baseline","differential","lite"],"author":{"name":"Zahary Shinikchiev","email":"shinikchiev@yahoo.com"},"license":"MIT","_id":"@zakkster/lite-gc-profiler@1.15.0","maintainers":[{"name":"zakkster","email":"shinikchiev@yahoo.com"}],"homepage":"https://github.com/PeshoVurtoleta/lite-gc-profiler#readme","bugs":{"url":"https://github.com/PeshoVurtoleta/lite-gc-profiler/issues","email":"shinikchiev@yahoo.com"},"bin":{"lite-gc-gate":"bin/LiteGcGate.mjs"},"dist":{"shasum":"1de94f9f15b89b9174d249b73e49e2ae920c5219","tarball":"https://registry.npmjs.org/@zakkster/lite-gc-profiler/-/lite-gc-profiler-1.15.0.tgz","fileCount":21,"integrity":"sha512-ohpxNX7iTl2INGDTQF/Ks+SNMlTQ3FzurnWBwXyIyd/8xl7NV0QNWLIsmBZRdGHN49UBBWMccr3lBx236zjD2g==","signatures":[{"sig":"MEUCIQDlxapTorcjSBFO6m83ar4A/4muEFmf+kUBUX3fvEH5UQIgElp6q7VVLo/jPwPngd40gbFlo1SCZen8cN0l5PljYUA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":693889},"main":"./Gc.js","type":"module","types":"./Gc.d.ts","module":"./Gc.js","engines":{"node":">=18"},"exports":{".":{"node":"./Gc.js","types":"./Gc.d.ts","import":"./Gc.js","default":"./Gc.js"},"./explain":{"node":"./ExplainNode.js","types":"./Explain.d.ts","import":"./ExplainNode.js","browser":"./Explain.js","default":"./Explain.js"},"./index.js":{"node":"./index.js","types":"./index.d.ts","import":"./index.js","default":"./index.js"},"./register":{"node":"./Register.mjs","default":"./Register.mjs"},"./test-helpers":{"node":"./TestHelpers.js","types":"./TestHelpers.d.ts","import":"./TestHelpers.js","default":"./TestHelpers.js"}},"funding":{"url":"https://github.com/sponsors/PeshoVurtoleta","type":"github"},"gitHead":"d12718f8db972352c5dc628749443328b50dcadb","scripts":{"t":"c8 --reporter=lcov --reporter=text node  --expose-gc --test --test-reporter=spec 'test/*.test.mjs' 'test/torture/*.test.mjs'","test":"node --expose-gc --test 'test/*.test.mjs' 'test/torture/*.test.mjs'","coverage":"node --expose-gc --test --experimental-test-coverage --test-coverage-exclude='test/**' --test-coverage-exclude='**/tmp/**' --test-coverage-lines=96 --test-coverage-functions=95 --test-coverage-branches=88 'test/*.test.mjs' 'test/torture/*.test.mjs'","typecheck":"npx --yes tsc --noEmit --strict Gc.d.ts Explain.d.ts index.d.ts","bundle-check":"npx esbuild Gc.js --bundle --format=esm --outfile=test-bundle.js","prepublishOnly":"npm run coverage && npm run bundle-check"},"_npmUser":{"name":"zakkster","email":"shinikchiev@yahoo.com"},"repository":{"url":"git+https://gitlab.com/zakkster/lite-gc-profiler.git","type":"git"},"_npmVersion":"11.16.0","description":"Zero-dependency GC and heap profiler that makes the zero-GC claim falsifiable: three-state verdicts, phases, regions, differential and rep-aware gating, baselines, CLI, and explain mode. precise garbage-collection events in node (perf_hooks), a heap-drop ","directories":{},"sideEffects":false,"_nodeVersion":"26.3.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/lite-gc-profiler_1.15.0_1785634877775_0.3023369806123346","host":"s3://npm-registry-packages-npm-production"}},"1.15.1":{"name":"@zakkster/lite-gc-profiler","version":"1.15.1","keywords":["profiler","gc","garbage-collection","heap","memory","zero-gc","performance","perf_hooks","regression","gate","ci","baseline","differential","lite"],"author":{"name":"Zahary Shinikchiev","email":"shinikchiev@yahoo.com"},"license":"MIT","_id":"@zakkster/lite-gc-profiler@1.15.1","maintainers":[{"name":"zakkster","email":"shinikchiev@yahoo.com"}],"homepage":"https://github.com/PeshoVurtoleta/lite-gc-profiler#readme","bugs":{"url":"https://github.com/PeshoVurtoleta/lite-gc-profiler/issues","email":"shinikchiev@yahoo.com"},"bin":{"lite-gc-gate":"bin/LiteGcGate.mjs"},"dist":{"shasum":"59395c557b03319eeb309d87c1efe083044339b6","tarball":"https://registry.npmjs.org/@zakkster/lite-gc-profiler/-/lite-gc-profiler-1.15.1.tgz","fileCount":21,"integrity":"sha512-q4RD+fjyzoQ67BF0DLZPKLXOmP2yEtl0QVOvZm7nWCsQvvgdn8iCYNzKZAA31nfT63YIX7qWZSl3D8iL4UyV6g==","signatures":[{"sig":"MEQCIEHpQ06V73/5P4Z0wUo+4gk94RgWf0Pwp6n7OkuDRKOgAiBnhKqoFM9vhkkIh1LmSt1EKOTHUOrS55hWSMYeUV8NJg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":699140},"main":"./Gc.js","type":"module","types":"./Gc.d.ts","module":"./Gc.js","engines":{"node":">=18"},"exports":{".":{"node":"./Gc.js","types":"./Gc.d.ts","import":"./Gc.js","default":"./Gc.js"},"./explain":{"node":"./ExplainNode.js","types":"./Explain.d.ts","import":"./ExplainNode.js","browser":"./Explain.js","default":"./Explain.js"},"./index.js":{"node":"./index.js","types":"./index.d.ts","import":"./index.js","default":"./index.js"},"./register":{"node":"./Register.mjs","default":"./Register.mjs"},"./test-helpers":{"node":"./TestHelpers.js","types":"./TestHelpers.d.ts","import":"./TestHelpers.js","default":"./TestHelpers.js"}},"funding":{"url":"https://github.com/sponsors/PeshoVurtoleta","type":"github"},"gitHead":"04e4185751fd986176c8c8d3b7a4249f6221c798","scripts":{"test":"node --expose-gc --test 'test/*.test.mjs' 'test/torture/*.test.mjs'","coverage":"node --expose-gc --test --experimental-test-coverage --test-coverage-exclude='test/**' --test-coverage-exclude='**/tmp/**' --test-coverage-lines=96 --test-coverage-functions=95 --test-coverage-branches=88 'test/*.test.mjs' 'test/torture/*.test.mjs'","typecheck":"npx --yes tsc --noEmit --strict Gc.d.ts Explain.d.ts index.d.ts","bundle-check":"npx esbuild Gc.js --bundle --format=esm --outfile=test-bundle.js","prepublishOnly":"npm run coverage && npm run bundle-check"},"_npmUser":{"name":"zakkster","email":"shinikchiev@yahoo.com"},"repository":{"url":"git+https://github.com/PeshoVurtoleta/lite-gc-profiler.git","type":"git"},"_npmVersion":"12.0.2","description":"Zero-dependency GC and heap profiler that makes the zero-GC claim falsifiable: three-state verdicts, phases, regions, differential and rep-aware gating, baselines, CLI, and explain mode. precise garbage-collection events in node (perf_hooks), a heap-drop ","directories":{},"sideEffects":false,"_nodeVersion":"26.3.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/lite-gc-profiler_1.15.1_1787032417417_0.7208531891371157","host":"s3://npm-registry-packages-npm-production"}},"1.16.0":{"name":"@zakkster/lite-gc-profiler","version":"1.16.0","description":"Zero-dependency GC and heap profiler that makes the zero-GC claim falsifiable: three-state verdicts, phases, regions, differential and rep-aware gating, baselines, CLI, and explain mode. precise garbage-collection events in node (perf_hooks), a heap-drop ","type":"module","main":"./Gc.js","module":"./Gc.js","types":"./Gc.d.ts","exports":{".":{"types":"./Gc.d.ts","node":"./Gc.js","import":"./Gc.js","default":"./Gc.js"},"./register":{"node":"./Register.mjs","default":"./Register.mjs"},"./test-helpers":{"types":"./TestHelpers.d.ts","node":"./TestHelpers.js","import":"./TestHelpers.js","default":"./TestHelpers.js"},"./index.js":{"types":"./index.d.ts","node":"./index.js","import":"./index.js","default":"./index.js"},"./explain":{"types":"./Explain.d.ts","browser":"./Explain.js","node":"./ExplainNode.js","import":"./ExplainNode.js","default":"./Explain.js"}},"bin":{"lite-gc-gate":"bin/LiteGcGate.mjs"},"sideEffects":false,"scripts":{"test":"node --expose-gc --test 'test/*.test.mjs' 'test/torture/*.test.mjs'","coverage":"node --expose-gc --test --experimental-test-coverage --test-coverage-exclude='test/**' --test-coverage-exclude='**/tmp/**' --test-coverage-lines=96 --test-coverage-functions=95 --test-coverage-branches=88 'test/*.test.mjs' 'test/torture/*.test.mjs'","bundle-check":"npx esbuild Gc.js --bundle --format=esm --outfile=test-bundle.js","prepublishOnly":"npm run coverage && npm run bundle-check","typecheck":"npx --yes tsc --noEmit --strict Gc.d.ts Explain.d.ts index.d.ts"},"keywords":["profiler","gc","garbage-collection","heap","memory","zero-gc","performance","perf_hooks","regression","gate","ci","baseline","differential","lite"],"author":{"name":"Zahary Shinikchiev","email":"shinikchiev@yahoo.com"},"license":"MIT","publishConfig":{"access":"public"},"homepage":"https://github.com/PeshoVurtoleta/lite-gc-profiler#readme","repository":{"type":"git","url":"git+https://github.com/PeshoVurtoleta/lite-gc-profiler.git"},"bugs":{"url":"https://github.com/PeshoVurtoleta/lite-gc-profiler/issues","email":"shinikchiev@yahoo.com"},"engines":{"node":">=18"},"funding":{"type":"github","url":"https://github.com/sponsors/PeshoVurtoleta"},"gitHead":"0336abe6f3b9a5916f73808ace12e79b5dfc3144","_id":"@zakkster/lite-gc-profiler@1.16.0","_nodeVersion":"26.3.1","_npmVersion":"12.0.2","dist":{"integrity":"sha512-TMObsfiVj9dMqUKROSCPIA7RbjvHgXH9Nvh6HpRBTqbrrWUedSfq2L41iD7o5NGg4OdHq7yP+xmbd3SoKJ97tg==","shasum":"3542a5e258885ff79c05117275a98b8f347a2b48","tarball":"https://registry.npmjs.org/@zakkster/lite-gc-profiler/-/lite-gc-profiler-1.16.0.tgz","fileCount":21,"unpackedSize":810488,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDCB4D4cFcdaa1bhJSTEx2L4NHRX6II8KZfVxvb0L3V2QIgfg2dAajuvxaTHcIwK4T/02dAzu4vIWOyFmcxe7tCuFk="}]},"_npmUser":{"name":"zakkster","email":"shinikchiev@yahoo.com"},"directories":{},"maintainers":[{"name":"zakkster","email":"shinikchiev@yahoo.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/lite-gc-profiler_1.16.0_1787537886487_0.30311409428376734"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-03T05:10:21.127Z","modified":"2026-08-24T02:18:06.771Z","1.0.0":"2026-07-03T05:10:21.409Z","1.1.0":"2026-07-12T05:15:23.698Z","1.2.0":"2026-07-17T04:24:34.375Z","1.3.0":"2026-07-17T16:47:49.188Z","1.3.1":"2026-07-17T20:44:09.528Z","1.4.0":"2026-07-17T23:21:23.771Z","1.5.0":"2026-07-18T07:50:41.897Z","1.5.1":"2026-07-18T09:11:16.542Z","1.5.2":"2026-07-18T20:31:29.671Z","1.6.0":"2026-07-18T23:40:48.762Z","1.7.0":"2026-07-19T04:23:19.259Z","1.8.0":"2026-07-19T23:04:27.338Z","1.9.0":"2026-07-20T04:59:50.766Z","1.9.1":"2026-07-20T21:16:43.503Z","1.9.2":"2026-07-20T21:30:35.418Z","1.10.0":"2026-07-21T04:29:24.052Z","1.10.1":"2026-07-21T05:17:16.271Z","1.10.2":"2026-07-21T21:07:37.108Z","1.10.3":"2026-07-21T23:43:46.204Z","1.11.0":"2026-07-26T23:46:21.634Z","1.12.0":"2026-07-27T22:33:49.424Z","1.13.0":"2026-07-28T05:05:03.535Z","1.14.0":"2026-07-29T04:40:14.388Z","1.14.1":"2026-07-29T21:06:41.029Z","1.14.2":"2026-08-02T01:35:53.068Z","1.15.0":"2026-08-02T01:41:17.979Z","1.15.1":"2026-08-18T05:53:37.605Z","1.16.0":"2026-08-24T02:18:06.624Z"},"bugs":{"url":"https://github.com/PeshoVurtoleta/lite-gc-profiler/issues","email":"shinikchiev@yahoo.com"},"author":{"name":"Zahary Shinikchiev","email":"shinikchiev@yahoo.com"},"license":"MIT","homepage":"https://github.com/PeshoVurtoleta/lite-gc-profiler#readme","keywords":["profiler","gc","garbage-collection","heap","memory","zero-gc","performance","perf_hooks","regression","gate","ci","baseline","differential","lite"],"repository":{"type":"git","url":"git+https://github.com/PeshoVurtoleta/lite-gc-profiler.git"},"description":"Zero-dependency GC and heap profiler that makes the zero-GC claim falsifiable: three-state verdicts, phases, regions, differential and rep-aware gating, baselines, CLI, and explain mode. precise garbage-collection events in node (perf_hooks), a heap-drop ","maintainers":[{"name":"zakkster","email":"shinikchiev@yahoo.com"}],"readme":"# @zakkster/lite-gc-profiler\n\n[![npm version](https://img.shields.io/npm/v/@zakkster/lite-gc-profiler.svg?style=for-the-badge&color=latest)](https://www.npmjs.com/package/@zakkster/lite-gc-profiler)\n![Zero-GC](https://img.shields.io/badge/Zero--GC-Hot%20path-00C853?style=for-the-badge&logo=leaf&logoColor=white)\n[![sponsor](https://img.shields.io/badge/sponsor-PeshoVurtoleta-ea4aaa.svg?logo=github)](https://github.com/sponsors/PeshoVurtoleta)\n[![npm bundle size](https://img.shields.io/bundlephobia/minzip/@zakkster/lite-gc-profiler?style=for-the-badge)](https://bundlephobia.com/result?p=@zakkster/lite-gc-profiler)\n[![npm downloads](https://img.shields.io/npm/dm/@zakkster/lite-gc-profiler?style=for-the-badge&color=blue)](https://www.npmjs.com/package/@zakkster/lite-gc-profiler)\n[![npm total downloads](https://img.shields.io/npm/dt/@zakkster/lite-gc-profiler?style=for-the-badge&color=blue)](https://www.npmjs.com/package/@zakkster/lite-gc-profiler)\n![Tree-Shakeable](https://img.shields.io/badge/tree--shakeable-yes-brightgreen)\n[![Coverage Status](https://coveralls.io/repos/github/PeshoVurtoleta/lite-gc-profiler/badge.svg?branch=main)](https://coveralls.io/github/PeshoVurtoleta/lite-gc-profiler?branch=main)\n![Dependencies](https://img.shields.io/badge/dependencies-0-brightgreen)\n[![license](https://img.shields.io/badge/license-MIT-blue)](./LICENSE.txt)\n[![deps](https://img.shields.io/badge/dependencies-0-3fb950)](#install)\n[![types](https://img.shields.io/badge/types-included-3178c6)](./index.d.ts)\n\nZero-dependency GC and heap profiler. It exists to make the **zero-GC claim\nfalsifiable** rather than asserted.\n\n- **node** → precise: perf_hooks `gc` entries (kind + pause duration).\n- **Chrome** → heuristic: `performance.memory` heap sampling (alloc rate, drops).\n- **others** → long-frame anomaly detection only (no heap API).\n\nThe observer receives node-allocated entry lists between frames; the per-frame\nmethods (`sampleHeap`, `markFrame`) allocate nothing.\n\nSingle-file ESM, no dependencies, MIT.\n\n## 60 seconds\n\nInstall, measure, gate. No configuration, no setup file.\n\n```\nnpm i -D @zakkster/lite-gc-profiler\n```\n\n```js\n// save as probe.mjs, run with:  node --expose-gc probe.mjs\nimport { measureOps } from '@zakkster/lite-gc-profiler';\n\nconst kept = [];\nconst leaky = (i) => { kept.push({ id: i }); };   // retains one object per call\nconst clean = (i) => i * 2;                       // retains nothing\n\nconsole.log('leaky:', measureOps(leaky, { ops: 10_000, warmup: 500, stabilize: true }).bytesPerOp);\nconsole.log('clean:', measureOps(clean, { ops: 10_000, warmup: 500, stabilize: true }).bytesPerOp);\n```\n\n```\nleaky: 43.5\nclean: 0.3\n```\n\nYour exact numbers will differ -- pointer compression alone changes object\nwidths between builds -- but the shape holds everywhere: tens of bytes for the\nleak, essentially zero for the clean function.\n\nThat is bytes **retained** per call -- the live-heap difference across two\nforced collections, not bytes allocated. Transient garbage reads as zero,\ncorrectly: the collector's whole job is to make it free.\n\nNow turn the gap into something CI can act on. `assertOps` measures and gates\nin one call -- it takes the function, the rules, then the options:\n\n```js\nimport { assertOps } from '@zakkster/lite-gc-profiler';\n\nassertOps(clean, { maxBytesPerOp: 1 }, { ops: 10_000, warmup: 500, stabilize: true });\n// throws GcBudgetError if it regresses; returns the report if it does not\n```\n\nAnd put the outcome somewhere people see it:\n\n```js\nimport { measureOps, checkOps } from '@zakkster/lite-gc-profiler';\nimport { gateBadge } from '@zakkster/lite-gc-profiler/explain';\n\nconst result = measureOps(clean, { ops: 10_000, warmup: 500, stabilize: true });\nconsole.log(gateBadge(checkOps(result, { maxBytesPerOp: 1 })));\n// gc gate: pass\n```\n\n`gateBadge(report, { format: 'shields-json' })` emits a shields.io endpoint\npayload, and `{ format: 'svg' }` a self-contained badge you can commit.\n\n### Memory the heap gate cannot see (v1.10.0)\n\n`maxAllocRate` gates `heapUsed`. ArrayBuffer backing stores do not live there\n-- they live outside the V8 heap, and `heapUsed` barely moves when they leak.\nMeasured on node 22: **300 retained `Float64Array(4096)` is 9.4 MB of backing\nstore and shifts `heapUsed` by 62 KB. A 152x blind spot.** If your hot path\nowns a preallocated typed-array ring, that is the shape of leak your gate has\nbeen unable to see.\n\n```js\nimport { measureOps, checkNoGc } from '@zakkster/lite-gc-profiler';\n\nconst result = measureOps(pushFrame, { ops: 300, warmup: 50, stabilize: true });\ncheckNoGc(result.summary, {\n    maxAllocRate: 50 * 1024 * 1024,\n    maxArrayBuffersGrowth: 1024 * 1024      // net growth in backing stores\n});\n```\n\nTwo things to know:\n\n- **`stabilize` is required (`true` or its synonym `'deep'`).** As of v1.16.0\n  the two are identical: `stabilize: true` collects twice immediately before\n  EVERY boundary read (warmup, steady-start, steady-end), so it settles the\n  external channel and gates `maxArrayBuffersGrowth` on its own -- `'deep'` no\n  longer buys a deeper anchor. One collection does not reliably reclaim\n  recently-allocated backing stores: the same clean fixture measured -0.20 MB\n  growth on one run and +9.17 MB on the next. Two collections per anchor make\n  the channel deterministic. Without stabilize, `summary.arrayBuffers.settled`\n  is false and the rule reports **inconclusive** rather than a number that\n  flaps.\n- **Node only.** Chrome's `performance.memory` has no external field, and\n  `measureUserAgentSpecificMemory` folds external memory into a total it cannot\n  decompose. On those sources the rule is inconclusive, never `pass`.\n\n`summary.external` carries the wider figure for diagnosis but is **not\ngateable**: it reconciles lazily, and after a window that allocated and\ncorrectly dropped ~12 MB of typed arrays the next window still reported the\nfull ~12 MB. Passing `maxExternalGrowth` throws, and names that measurement.\n\n<!-- GCFORGE F1 SLOT: when the phase-timeline view exists, one screenshot goes\n     here. Per ROADMAP-GCFORGE F1 exit criteria and FINAL roadmap section 4 --\n     it explains the library faster than the next three paragraphs do. Nothing\n     in this package depends on GCForge; this is a one-line change when it\n     lands. -->\n\n**Three verdicts, not two.** `pass` means no violation. `fail` means a budget\nwas exceeded. **`inconclusive` means the gate could not verify** -- and it\nwill never quietly report that as `pass`. If your first run lands there, that\nis working as designed: **[INCONCLUSIVE.md](./INCONCLUSIVE.md)** has the\ntriage table, and nearly every cause has a one-line fix.\n\nNext: [COOKBOOK.md](./COOKBOOK.md) -- nineteen recipes, starting from\n\"just show me a number\".\n\n## The claim, made falsifiable\n\nThe zero-GC claim in a package's README should mean something. This library\ngives it a testable gate: run your workload, ask if any major GC fired, get\nback one of `'pass'`, `'fail'`, or `'inconclusive'`. On runtimes where the\nquestion cannot be honestly answered, the gate refuses to lie.\n\n## Sources\n\nWhich signal is live is either detected from the runtime, or overridden\nexplicitly via `new GcProfiler(cap, { source: ... })`. `cap` is the\npause-ring capacity (default 256, rounded up to a power of two, ceiling\n2**24 -- the ring costs 16 bytes/slot, so larger values throw rather\nthan allocate GB-scale buffers):\n\n- `'gc'` -- node (or any V8 runtime exposing `perf_hooks gc` entries). Precise\n  event kinds and pause durations. Default on node.\n- `'heap'` -- Chrome. Heuristic based on `performance.memory` heap-drop\n  detection. Default on Chrome. Fast enough for per-frame sampling.\n- `'uasm'` -- Chrome, opt-in. Accurate memory measurement via\n  `performance.measureUserAgentSpecificMemory()`. Requires cross-origin\n  isolation (COOP+COEP). Async and coarse; not for per-frame use.\n  Never auto-selected -- cross-origin isolation is a deployment choice.\n- `'none'` -- Firefox, Safari. Frame-anomaly detection only.\n\n### Option and lifecycle hardening (v1.16.0)\n\nAn unknown option key is a caller error, never a silent ignore. The\nconstructor (`heap`, `autoStart`, `source`), every `measure*` lane, both\naggregators, `watchPool` and `startExplainSampling` throw a `TypeError` with a\ndid-you-mean hint on a misspelled key; `measure*` reject `allowInconclusive`\nand `rounds` (the `assert*`/`compare*` wrappers own those and strip them before\ndelegating). `stabilize` accepts only `true`/`false`/`'deep'` (RangeError\notherwise), and an invalid `source` on `measureFrames`/`measureOpsAsync` now\nthrows BEFORE the in-flight guard is taken, so it no longer strands every later\nmeasurement. `destroy()` frees the ring and marks the profiler dead: every\nsubsequent `record`/`sampleHeap`/`sampleUasm`/`markFrame`/`phase`/`enter`/\n`exit`/`summary`/`reset`/`start` throws (`stop()` stays callable). `markFrame`\nthrows `RangeError` on a non-finite or negative `frameMs` (it was silently\ncounted as a 0 ms frame). `heap: false` means \"never auto-read\n`performance.memory`\" -- an explicit `sampleHeap(now, bytes)` is always recorded.\n\n### Opting into `uasm`\n\n```\nconst gc = new GcProfiler(256, { source: 'uasm' });\n\n// Take a few measurements across the workload:\nawait gc.sampleUasm();\nrunHotLoop();\nawait gc.sampleUasm();\nrunHotLoop();\nawait gc.sampleUasm();\n\n// Now summary.uasm.growthRate is bytes/sec across that window,\n// and the gate can verify it:\nassertNoGc(gc.summary(), { maxAllocRate: 1 * 1024 * 1024 });\n```\n\nThrows `RangeError` on construction if the API is unavailable or the page is\nnot cross-origin-isolated. `summary.uasm` is always present, whether or not\nyou opted in -- shape:\n\n```\n{ supported, bytes, peak, firstSample, samples, growthRate,\n  granularityBytes, belowGranularity }\n```\n\n`growthRate` is 0 with a single sample; needs two points for a delta.\n\n#### The granularity floor (v1.9.0)\n\n`measureUserAgentSpecificMemory()` returns **quantized** figures, and the\nquantum is not contractual -- it varies by browser build, by isolate, and by\nwhat else the page is doing. Treating those readings as exact opened the gate\nin both directions:\n\n- **A run of identical readings** reports `growthRate: 0` and used to gate\n  green. But \"every reading was identical\" is equally consistent with real\n  growth finer than the quantum. That is a pass the channel never earned.\n- **A flat workload sitting on a bucket boundary** reports one whole quantum\n  of change between first and last sample. Over a short window that is\n  megabytes per second of growth that never happened, and CI goes red on a\n  workload that allocated nothing.\n\nSo the profiler now measures the channel's resolution *from the channel*:\n\n- `granularityBytes` -- the smallest non-zero step observed between\n  consecutive readings in this window. That is the conservative floor. It is\n  `null`, never `0`, when no step occurred at all: `null` means *not\n  measured*, while a floor of zero bytes would claim perfect resolution.\n- `belowGranularity` -- `true` when the window's net displacement is not\n  resolvable above that floor, either because no floor was measured or\n  because the net change sits inside a single quantum.\n\nWhen `belowGranularity` is true, `maxAllocRate` on `source: 'uasm'` routes to\n**`inconclusive`** with `reason: 'uasm_below_granularity'` -- never `pass`,\nnever `fail`. The same rule holds for `maxExtraAllocRate` on a differential\n(a delta is only as resolvable as its worse side) and for `gateReps` (**any**\nblind rep makes the set unresolvable; resolved reps do not vouch for it).\n\n`growthRate` itself is left as measured, not rewritten to 0. Silently\nreplacing an unresolvable rate with a clean-looking zero is the same move as\naveraging a missing metric as zero, which the dilution guard exists to refuse.\nThe flag carries the doubt; the gate acts on the flag.\n\nThe fix: sample more times, or across a longer window, until the workload\nmoves the channel by more than one quantum. If it never does, the honest\nreading is that `uasm` cannot answer your budget question at that resolution\n-- gate `heap` instead, or widen the budget to something the channel can see.\n\n## Subpaths\n\n| import | node | browser | intended use |\n| --- | :---: | :---: | --- |\n| `@zakkster/lite-gc-profiler` | yes | yes | main API |\n| `@zakkster/lite-gc-profiler/register` | yes | no | preload for auto-attach |\n| `@zakkster/lite-gc-profiler/test-helpers` | yes | no | node:test integration |\n| `@zakkster/lite-gc-profiler/explain` | yes | no | allocator attribution |\n\nNode-only subpaths are additive; the main API stays single-file and\nbrowser-safe.\n\n## Install\n\n```\nnpm install @zakkster/lite-gc-profiler\n```\n\n## Node: precise GC\n\n```js\nimport { GcProfiler, assertNoGc } from '@zakkster/lite-gc-profiler';\n\nconst gc = new GcProfiler().start();\n\nrunHotLoopForAWhile();\n\n// GC entries are delivered asynchronously, so settle before reading.\nawait gc.settle();\n\n// Strict by default: throws GcBudgetError on fail, GcInconclusiveError if\n// the current source cannot verify a rule you set.\nassertNoGc(gc.summary());\ngc.stop();\n```\n\n## Phases: warmup vs steady state\n\n`gc.phase(name)` marks a phase boundary. Everything from the call until the\nnext `phase()` call is attributed to that phase. Phases are linear -- no\nnesting, no explicit exit. The default state before any `phase()` call is\nunattributed (events count toward global stats but no phase).\n\n```js\nconst gc = new GcProfiler().start();\n\ngc.phase('warmup');\nrunWarmupPasses();                    // some collections are fine here\n\ngc.phase('steady');\nrunMeasuredWorkload();                // this window must be clean\n\nawait gc.settle();\n\nassertNoGc(gc.summary(), {\n  phases: {\n    warmup: { maxMajor: 1 },\n    steady: { maxMajor: 0, maxMinor: 0 }\n  }\n});\ngc.stop();\n```\n\nPhases make `maxMinor: 0` a usable claim: ambient allocation during warmup\nno longer contaminates the steady-state verdict.\n\n**Attribution uses each GC event's `startTime`, not the wall clock at record\ntime.** `PerformanceObserver` delivers entries asynchronously; the gate\nbuckets by when the event occurred.\n\nCapacities: 32 unique phases, 1024 boundaries per window. Silent overflow\nof a gating primitive would defeat the purpose, so both throw.\n\n**Scope in v1.1.0:** phases attribute GC events only. `sampleHeap` and\n`markFrame` remain global; per-phase `maxAllocRate` is inconclusive.\n\n## Regions: attributing pauses to code paths\n\nPhases are linear -- warmup, then steady. Regions nest -- you can be inside\n`render` inside `frame` inside `session`. GC events attribute to the innermost\nopen region whose interval contains the event's `startTime`.\n\n```js\nconst gc = new GcProfiler().start();\ngc.enter('frame');\n    gc.enter('input');\n    processInput();\n    gc.exit();\n    gc.enter('render');\n    render();\n    gc.exit();\ngc.exit();\nawait gc.settle();\n\nassertNoGc(gc.summary(), {\n  perRegion: {\n    input:  { maxMajor: 0, maxPauseMs: 1 },\n    render: { maxMajor: 0, maxPauseMs: 4 }\n  }\n});\ngc.stop();\n```\n\nRules follow the same three-state verdict semantics. A region referenced in\n`perRegion` but never entered contributes `inconclusive`. A region-scoped\n`maxAllocRate` is inconclusive in this release -- heap sampling is global,\nper-region heap tracking is a future gate.\n\nCapacities: 32 unique region names, 16 nesting depth, 2048 total intervals.\nThrow on overflow.\n\n### Firing-site vs allocator: what regions actually answer\n\nRegions attribute events to **where the pause fired**, not to **who\nallocated the garbage**. V8 collects when allocation debt crosses a\nthreshold; the debtor may be an earlier region.\n\nConcrete case: `region A` allocates 30 MB, exits cleanly. `region B` opens,\ndoes modest work, and V8's Mark-Sweep-Compact fires during B because the\nthreshold from A's allocations was finally crossed. The gate charges B.\n\nThat's not blame-shifting; it's a truthful answer to a different question.\n\"Which region incurs pauses\" is what users perceive as slowness. \"Which\nregion allocated the pressure\" is the fix -- and that's what Explain mode\nanswers separately.\n\n## Settling: deterministic measurement boundaries\n\n`PerformanceObserver` delivers GC entries asynchronously, in batches, on the\nruntime's schedule. Reading `summary()` immediately after work completes can\nmiss entries that fired but were not yet delivered. The v1.0.0 README worked\naround this with `await new Promise((r) => setTimeout(r, 50))` -- an arbitrary\n50 ms guess.\n\nv1.1.0 replaces the guess with `gc.settle()`:\n\n```js\nconst gc = new GcProfiler().start();\nrunWorkload();\n\nconst { drained, waited } = await gc.settle();\nif (!drained) {\n  // Downgrade any verdict to inconclusive -- the observer queue never quieted,\n  // so summary() may be missing entries.\n}\nassertNoGc(gc.summary());\ngc.stop();\n```\n\nSemantics: `settle()` polls a batch counter each macrotask; after N consecutive\nquiet ticks it declares drained. On timeout it resolves with `drained: false`.\n\nOptions:\n- `quietTicks` (default 2) -- consecutive quiet ticks required.\n- `maxWaitMs` (default 200) -- hard timeout.\n\n`settle()` is a no-op on `source: 'heap'` and `source: 'none'`, and on a\nprofiler that was never `.start()`ed. It resolves immediately with\n`{ drained: true, waited: 0 }`.\n\nThe observer callback gained one integer increment (a batch counter) and\nnothing else; hot-path allocation is unchanged from v1.0.0.\n\n## Browser: heap + frames\n\n```js\nimport { GcProfiler, assertNoGc } from '@zakkster/lite-gc-profiler';\n\nconst gc = new GcProfiler().start();\n\nfunction frame(t) {\n  gc.sampleHeap(t);          // performance.memory in Chrome; no-op elsewhere\n  gc.markFrame(dt);          // frame duration for anomaly detection\n  render();\n  requestAnimationFrame(frame);\n}\nrequestAnimationFrame(frame);\n\n// Later, gate on allocation rate:\nassertNoGc(gc.summary(), { maxAllocRate: 2 * 1024 * 1024 });\n```\n\n## Gate\n\nThe gate returns a three-state verdict: `pass`, `fail`, or `inconclusive`.\nAn `inconclusive` verdict means the current source cannot verify one or more\nof the rules you set -- it is not the same as `pass`, and by default it throws.\nFalsifiability requires that a gate never be silently green when it could not\nactually check what it was asked to check.\n\n```js\nimport { checkNoGc, assertNoGc } from '@zakkster/lite-gc-profiler';\n\nconst report = checkNoGc(gc.summary(), {\n  maxMajor: 0,                     // no full-heap collections (default)\n  maxPauseMs: 4,                   // no single pause over 4 ms\n  maxAllocRate: 2 * 1024 * 1024    // <= 2 MB/s allocation (heap path)\n});\n// report -> {\n//   kind: 'gc',\n//   verdict: 'pass' | 'fail' | 'inconclusive',\n//   ok: boolean,                     // === verdict === 'pass'\n//   violations: [...],\n//   checked: { maxMajor: true, maxPauseMs: true, maxAllocRate: false },\n//   checkedByPhase: {},\n//   checkedByRegion: {},\n//   source: 'gc' | 'heap' | 'none'\n// }\n\nassertNoGc(gc.summary());                                       // strict\nassertNoGc(gc.summary(), rules, { allowInconclusive: true });   // permissive\n```\n\nRules: `maxMajor` (default 0), `maxMinor`, `maxPauseMs`, `maxTotalMs`, `maxAllocRate`.\n\n**Unwatched profilers are inconclusive (v1.16.0).** `summary.gc.observed` is a\nper-channel bit: true only if the GC-event channel was actually watched\n(`start()` attached the observer, or `record()` fed synthetic events). A\nprofiler that engaged the instrument only via `phase()`/`enter()`/`markFrame()`\nnever watched GC, so its event rules route to `inconclusive` reason\n`not_observed` -- they no longer pass against a window nobody watched. A\n`sampleHeap()`-only profiler still answers `maxAllocRate` on its own channel.\n\n**Empty and malformed rules fail closed (v1.16.0).** A rules argument that is\nnot a plain object throws a `TypeError`; an empty `{}` (or all-`undefined`, or\n`{ phases: {} }`) is `inconclusive` reason `no_rules` -- vacuity is not a pass.\nOmit the argument entirely to use the lane default (`{ maxMajor: 0 }`).\n\n### Verifiability matrix\n\nWhich rules each source can actually verify:\n\n| rule            | `gc` (node) | `heap` (Chrome) | `uasm` (Chrome, opt-in) | `none` (Firefox/Safari) |\n| --------------- | :---------: | :-------------: | :---------------------: | :---------------------: |\n| `maxMajor`      |     yes     |       no        |           no            |           no            |\n| `maxMinor`      |     yes     |       no        |           no            |           no            |\n| `maxPauseMs`    |     yes     |       no        |           no            |           no            |\n| `maxTotalMs`    |     yes     |       no        |           no            |           no            |\n| `maxAllocRate`  | needs heap  |   needs heap    |       needs uasm        |           no            |\n\n\"needs heap\" means the rule is verifiable iff `summary.heap.samples >= 2`.\n\"needs uasm\" means the rule is verifiable iff `summary.uasm.samples >= 2`\n(computing a growth rate requires at least two measurements) **and**, since\nv1.9.0, iff those samples actually resolved growth above the channel's own\nquantum -- see the granularity floor above. Feed samples\nwith `gc.sampleHeap(now, process.memoryUsage().heapUsed)` in node, let the\nbrowser path sample `performance.memory` automatically for `heap`, or call\n`await gc.sampleUasm()` a few times per window for `uasm`.\n\nThe matrix is exported as `VERDICT_MATRIX` for tools that want to render it\nor filter rules to the current source.\n\nGot `inconclusive` and not sure what to do? **[INCONCLUSIVE.md](./INCONCLUSIVE.md)**\nis the triage table: every reason code, what it means, and the fix.\n\n### Errors\n\n- `GcBudgetError`         -- thrown from `assertNoGc` on `verdict: 'fail'`.\n- `GcInconclusiveError`   -- thrown from `assertNoGc` on `verdict: 'inconclusive'`\n  unless `{ allowInconclusive: true }`. As of v1.16.0 the escape hatch is\n  honoured only when strictly `=== true`; a truthy string ('false', 'no', '0')\n  from env or JSON no longer silences the throw on any of the 13 assert lanes.\n  Message names the unverifiable rules.\n\nBoth carry `.report` with the full report.\n\n### Per-phase rules\n\nRules accept an optional `phases` map alongside global rules. Each phase's\nrules are evaluated against `summary.phases[name].gc`:\n\n```js\ncheckNoGc(gc.summary(), {\n  maxMajor: 0,                                     // global rule\n  phases: {\n    warmup: { maxMajor: 1 },                       // relaxed for warmup\n    steady: { maxMajor: 0, maxMinor: 0 }           // strict for steady\n  }\n});\n```\n\nA phase referenced in rules but never declared via `profiler.phase(name)` is\ninconclusive. A phase declared but with no events verifies as pass.\n\nThe report grows a `checkedByPhase` map alongside `checked`.\n\n**Snapshot keys.** As of v1.5.2 `summary.phases` and `summary.byRegion`\ndefine their keys with `Object.defineProperty`, so a phase or region named\n`__proto__` lands as a real own key instead of silently setting the\nsnapshot's prototype and disappearing from `Object.keys` and\n`JSON.stringify`. The prototype itself is untouched: reads, iteration,\nspreads, serialization, `deepStrictEqual` and `hasOwnProperty` all behave\nexactly as before.\n\n## Differential: comparing against a control\n\nAbsolute gating fails when the harness itself allocates: any GC caused by\nthe harness gets charged to the candidate, and a real regression drowns in\nthe noise. `compareGc(control, candidate, rules)` gates on the delta\n(candidate - control), not absolute numbers.\n\n```js\nimport { compareGc, assertCompare } from '@zakkster/lite-gc-profiler';\n\nasync function measure(fn) {\n  const gc = new GcProfiler().start();\n  fn();\n  await gc.settle();\n  const s = gc.summary();\n  gc.stop();\n  return s;\n}\n\nconst control = await measure(pooledNoop);       // harness noise baseline\nconst candidate = await measure(myCode);         // candidate under test\n\nassertCompare(control, candidate, {\n  maxExtraMajor: 0,             // no additional majors\n  maxExtraPauseMs: 1,           // no additional pause > 1ms\n  maxExtraAllocRate: 1024 * 1024   // at most 1 MB/s extra\n});\n```\n\nRules: `maxExtraMajor` (default 0), `maxExtraMinor`, `maxExtraPauseMs`,\n`maxExtraTotalMs`, `maxExtraAllocRate`.\n\n**Source mismatch is inconclusive.** If control and candidate come from\ndifferent sources (e.g. one node, one browser), the differential is\nmeaningless and the verdict is `inconclusive` with `reason:\n'source_mismatch'`.\n\n**Unwatched channel is inconclusive (v1.16.0).** If either side's GC-event\nchannel was never watched (`gc.observed === false`) the event deltas route to\n`inconclusive` reason `not_observed` -- both sides are checked, not just the\ncandidate.\n\n**Rule keys are validated (v1.16.0/GC-05).** `compareGc` now rejects an\nungated / wrong-lane / mistyped rule key with a `TypeError` (a `checkNoGc`\nabsolute points at its `maxExtra*` differential, a per-op key points at\n`compareOps`), instead of filtering it through the metric map and silently\nignoring it. Validation runs before the observed/source short-circuits.\n\n**Interleaving contract:** control and candidate should come from interleaved\nreps to absorb machine-mood variance. Combine with `gateReps` (below) to\nenforce it.\n\n## Rep-aware gating: variance and policy\n\nA single run says too little. Many runs say more, but only if you gate on\nthem coherently. `aggregateGc(summaries)` collects reps into a stats block\nper metric; `gateReps(summaries, rules, options?)` applies rules under\nper-rule policies.\n\n```js\nimport { aggregateGc, gateReps, assertReps } from '@zakkster/lite-gc-profiler';\n\nconst reps = [];\nfor (let i = 0; i < 10; i++) {\n  const gc = new GcProfiler().start();\n  runMyCode();\n  await gc.settle();\n  reps.push(gc.summary());\n  gc.stop();\n}\n\nassertReps(reps, {\n  maxMajor: 0,          // strict: no rep may have a major\n  maxPauseMs: 4         // strict: best rep proves 4ms is achievable\n});\n```\n\nPolicies:\n\n- `'all-clean'` -- every rep must satisfy (aggregate uses max).\n  For kind rules (majors, minors), a single dirty rep falsifies the claim.\n- `'best-clean'` -- at least one rep must satisfy (aggregate uses min).\n  For pauses and rates, the best rep proves the clean state is achievable;\n  the rest is machine noise.\n- `'median'` -- median across reps must satisfy.\n- `'quorum-N'` -- at least N reps must individually satisfy.\n\nDefaults:\n\n| rule           | default policy   |\n| -------------- | ---------------- |\n| `maxMajor`     | `all-clean`      |\n| `maxMinor`     | `all-clean`      |\n| `maxPauseMs`   | `best-clean`     |\n| `maxTotalMs`   | `best-clean`     |\n| `maxAllocRate` | `best-clean`     |\n\nOverride per rule via `options.policy`:\n\n```js\nassertReps(reps, { maxMajor: 0, maxPauseMs: 4 }, {\n  policy: {\n    maxMajor: 'quorum-9',\n    maxPauseMs: 'median'\n  }\n});\n```\n\n**Mixed sources across reps -> inconclusive** with `reason: 'mixed_sources'`.\n\nAs of v1.16.0 `gateReps` validates rule keys the same way `checkNoGc` does\n(GC-05) -- an ungated / wrong-lane / mistyped key throws a `TypeError` naming\nthe owning lane instead of being silently dropped. If every rep's GC-event\nchannel was unwatched the set routes to `inconclusive` reason `not_observed`,\nand the `maxAllocRate` heap probe now folds across ALL reps (checkable only\nwhen every rep took >= 2 heap samples), so one sampled rep can no longer\ncertify a set whose blind reps contributed rate 0. `aggregateGc([])` throws.\n\n## Per-op measurement: hot-path primitives\n\n`measureOps`, `assertOps`, and `compareOps` are the shape you want when the\nthing being gated is a *single operation* -- a signal notification, a keyed-\nselector call, a hot-loop tick -- not a whole test file. Same verdict\ndiscipline as the whole-window gate; per-op scale.\n\n```js\nimport { measureOps, assertOps, compareOps } from '@zakkster/lite-gc-profiler';\n\n// Measure: how many bytes per notify?\nconst result = measureOps((i) => signal.set(i), { ops: 10_000, warmup: 500 });\n// result.bytesPerOp, result.opsPerSec, result.summary (full profiler summary)\n// v1.16.0 also on the sync result:\n//   result.bytesPerOpStable   true iff stabilized AND the bracket did not invert\n//   result.bracketInverted    true iff the steady delta was negative (bytesPerOp null)\n//   result.majorsPerKOp, result.minorsPerKOp, result.maxPauseMsPerOp\n//                             per-K rates from summary.phases.steady.gc, so a sync\n//                             result now aggregates to real numbers (was null)\n```\n\n`fn(i)` gets the iteration index. `measureOps` is the **sync** ops\nprimitive; use `measureOpsAsync` (v1.5.0) when your workload awaits.\nInternal `phase()` boundaries quarantine warmup allocations from\nsteady-phase gating; `bytesPerOp` is derived from the steady heap delta\nalone.\n\n### Why `result.summary.phases.steady.gc` reads zero on sync `measureOps`\n\nNode's `PerformanceObserver` -- the mechanism this profiler uses to hear\nGC events -- delivers callbacks on **event-loop turns**. A synchronous\n`measureOps` loop never yields, so the observer's delivery queue never\ngets a turn to fire before `stop()`. The events happened; the observer\nsaw nothing.\n\nThis is why the ops lane exposes only `bytesPerOp` as a rule -- memory\nreadings do not require an observer turn -- and no event-based rules\n(`maxMajorsPerKOp`, `maxMinorsPerKOp`, `maxPauseMsPerOp` are absent\nfrom the sync ops `checkOps` gate for exactly this reason). The rules\nwould be unenforceable on their own primitive.\n\nThe zeros in `result.summary.phases.steady.gc` on a sync `measureOps`\nrun are honest -- \"the observer saw nothing,\" not \"the workload was\nclean.\" If you need GC-event counts under real churn, use `measureOpsAsync`\n(each `await` yields the event loop back to the observer) or\n`measureFrames` (the scheduler yields between frames).\n\n### Gating a per-op limit\n\n```js\n// Throws GcBudgetError if steady-phase bytes-per-notify exceeds 0.\nassertOps(\n  (i) => signal.set(i),\n  { maxBytesPerOp: 0 },\n  { ops: 10_000, warmup: 500 }\n);\n```\n\nFour rule names:\n\n- `maxBytesPerOp` -- heap growth divided by ops\n- `maxMajorsPerKOp` -- major collections per 1000 ops\n- `maxMinorsPerKOp` -- minor collections per 1000 ops\n- `maxPauseMsPerOp` -- total pause milliseconds per op\n\nVerifiability follows the same matrix as whole-window rules -- the memory\nrules need a memory channel (`needsHeap`/`needsUasm`); the event-kind rules\nneed `source: 'gc'` (node). All four appear in the exported `VERDICT_MATRIX`\nwith all four source columns.\n\nThroughput is intentionally reported in the result but not gated. Benchmark\nharnesses have opinions on `opsPerSec`; this package stays in the \"prove\nzero-GC per op\" lane. If you want to fail CI on throughput regressions,\nuse `compareOps` with `maxExtra*PerOp` limits below.\n\n### Noise floor: choosing `ops` for `maxBytesPerOp: 0`\n\nUnder `stabilize: true` (recommended for `maxBytesPerOp: 0` gating) a warm\nclean bracket reads **exactly 0 B** on the steady majority of runs -- two\ncollections immediately before every boundary read leave V8 nothing to box\ninto the delta. Only the first few measurements of a FRESH process still carry\n0.1-2 KB of JIT warm-up residue (an instrument characteristic, not per-op\nretention); a `maxBytesPerOp: 1` budget absorbs it. A NEGATIVE bracket delta\n(the end anchor reading below the start) is no longer clamped to a passing `0`\nas of v1.16.0: it becomes `bytesPerOp: null` + `bracketInverted: true` and the\ngate routes to `inconclusive` reason `bracket_inverted` -- re-run warmed or with\n`stabilize: true` rather than trusting a clamped zero.\n\nRAW (unstabilized, `stabilize: false`) measurement carries a residual noise\nfloor from V8's own loop-bookkeeping (feedback vectors, tier-up allocations,\nincremental marking) -- roughly 500-1200 bytes per loop regardless of `ops`.\nThe per-op floor scales as `noise / ops`:\n\n| `ops` | Approx raw floor | Suggested `maxBytesPerOp` |\n| ---   | ---              | ---                       |\n| 10K+  | < 0.15 B/op      | `0` (reliable)            |\n| 1K+   | < 1.5 B/op       | `2` (recommended)         |\n| <500  | > 3 B/op         | not recommended for `0`   |\n\nV8's residual bookkeeping is orthogonal to the sampling infrastructure\nand can't be eliminated in userland. For strict zero-alloc claims,\nprefer `ops >= 10_000`, or use `stabilize: true` (see the Cold CI\nsection above), which measures retention delta instead of transient churn.\nA raw bracket can also legitimately invert under load -- that is honest, and\nre-running warmed or with `stabilize: true` is the fix.\n\n### Comparing two implementations\n\n```js\n// Primitive form: two results, one report.\nconst control   = measureOps(oldImpl, { ops: 10_000, warmup: 500 });\nconst candidate = measureOps(newImpl, { ops: 10_000, warmup: 500 });\nconst report = compareOps(control, candidate, { maxExtraBytesPerOp: 0 });\n// verdict: 'pass' | 'fail' | 'inconclusive'\n```\n\nConvenience form runs `measureOps` for you with matched opts. As of v1.16.0\nit votes across `rounds` (default 2) interleaved control/candidate\nmeasurements instead of gating a single two-point delta -- at low op counts\nthe control's own churn can rival the signal, so one lucky delta could net a\nreal leak below the gate:\n\n```js\ncompareOps(oldImpl, newImpl, { maxExtraBytesPerOp: 0 },\n    { ops: 10_000, warmup: 500, rounds: 2 });\n```\n\nPer rule: it FAILS only if every voting round fails, PASSES only if every\nvoting round passes, and is `inconclusive` reason `noise_floor` when the\nrounds disagree (a round whose delta is null does not vote; zero votes ->\n`bracket_inverted`). The report gains `rounds` (number run) and `deltas`\n(`{ [rule]: number[] }`, voting-round deltas in run order) so the spread is\nvisible. `rounds` must be a positive integer (RangeError otherwise); the\ndefault `2` DOUBLES the convenience form's wall-clock (four `measureOps`\ncalls). The two-results primitive form is unchanged -- it still gates its\nsingle delta and routes a null delta to `inconclusive`.\n\nSource mismatch between control and candidate yields `inconclusive` with\n`reason: 'source_mismatch'` -- comparing node measurements against Chrome\nmeasurements is never meaningful, and the gate says so instead of pretending.\nIt is detected after the first pair, before any voting.\n\n`assertCompareOps` throws in the same way as `assertOps` -- one call for\nCI, no result-handling boilerplate.\n\n### Cold CI: use `stabilize: true`\n\nWarm-workload measurement (what `measureOps` does by default) is the right\nanswer when the code under test has already run in the process -- typical\nof bench harnesses, integration suites, and interactive dev loops. In a\n**cold CI shard** -- where the first call to `assertCompareOps` is\nliterally the first time V8 has seen these paths -- two effects can\ncollapse a legitimate leak signal to zero:\n\n- JIT tier-up allocation churn inflates the control's `bytesPerOp`,\n  narrowing the delta between control and candidate below the gate\n  threshold.\n- A one-off major GC mid steady-loop compacts `heapUsed` below the\n  start-boundary sample, making the reported delta non-positive. Before\n  v1.16.0 `bytesPerOp` clamped that negative delta to zero, so the retained\n  candidate's leak disappeared into a passing `0`. As of v1.16.0 a negative\n  delta is `bytesPerOp: null` + `bracketInverted: true` and the gate routes to\n  `inconclusive` reason `bracket_inverted` -- the leak can no longer hide behind\n  a clamped zero, but a cold, warm-up-noisy process can now read inconclusive\n  where it once read a lucky pass.\n\n**`stabilize: true`** is the answer to both. It forces two full GCs at each\nsteady-phase boundary, so the bracket does not invert (an inversion under\nstabilize is rare, and re-running is the right move) and `bytesPerOp` reflects\nthe **surviving-allocation delta** (retention) rather than transient allocation\n-- which is precisely why `assertCompareOps` is designed to be called in a cold\nCI shard:\n\n```js\nassertCompareOps(\n    control, candidate,\n    { maxExtraBytesPerOp: 20 },\n    { ops: 1000, warmup: 100, stabilize: true }\n);\n```\n\nRequires `node --expose-gc`; throws `RangeError` at measurement time\notherwise with actionable guidance (\"run: node --expose-gc ...\"). The\nforced-GC events are attributed to a separate `stabilize` phase in the\nsummary so they don't inflate `steady`-phase counters.\n\n**When to use it:**\n\n- Cold-CI shards running per-op gates as their first workload.\n- Any zero-allocation claim where you care about **retention** (\"my\n  signal notification retains zero bytes\") rather than transient churn.\n- `assertCompareOps` in package tests where the answer should be\n  deterministic regardless of test-run order.\n\n**When to skip it:**\n\n- Warmed workloads where you already have deterministic behavior.\n- Runtimes without `--expose-gc` (browser measurements, sandboxed CI).\n- Gates that mix `maxBytesPerOp` with `maxMajorsPerKOp` -- stabilize's\n  forced fulls arrive asynchronously via perf_hooks and typically after\n  `measureOps` returns, so the `stabilize.gc.major` summary counter is\n  unreliable. Use `stabilize:true` for retention gating, `stabilize:false`\n  for GC-event-count gating; picking either separately is honest and\n  correct.\n\n## Per-call assertion: `measureAllocs` and the zero-retention claim\n\n`measureOps` gives you a per-op allocation *rate* from one heap delta across a\nsteady phase. `measureAllocs` gives you a per-call *assertion*: does one call\nretain any bytes at all? The two look similar and answer different questions.\n\n```js\nimport { measureAllocs, assertAllocs } from '@zakkster/lite-gc-profiler';\n\n// The zero-retention claim, as a test.\nassertAllocs(\n  (i) => pool.acquire().release(),      // reuses a slot -> retains nothing\n  { maxBytesPerCall: 0 },\n  { iterations: 5_000, batches: 8 }\n);\n```\n\n**Requires `node --expose-gc`.** The estimator forces a collection at each\nbatch boundary; without one, a per-call figure is a rate wearing an assertion's\nclothes, and this package will not pretend otherwise -- `measureAllocs` throws\nat measurement time when `globalThis.gc` is absent.\n\n### Why min-over-batches\n\nEach batch brackets its `iterations` calls between two forced collections and\ndivides the surviving heap delta by the call count. The reported `bytesPerCall`\nis the **minimum** across `batches` batches, because ambient interference only\never *adds* bytes -- a stray timer, a late incremental mark -- and never\nsubtracts the function's own retention. The floor is therefore the true\nper-call cost, and the min converges on it from above:\n\n```js\nconst r = measureAllocs(leakyNode, { iterations: 2_000, batches: 8 });\n// r.batchBytes    per-batch totals, e.g. noisy [160k, 194k, 202k, 144k, ...]\n// r.bytesPerCall  the min / iterations, e.g. a clean 72\n// r.maxBytesPerCall  the spread, so a jumpy run is visible\n// r.invertedBatches  count of batches whose delta was negative (v1.16.0)\n```\n\nAs of v1.16.0 a batch whose heap delta is NEGATIVE (a collection reclaimed more\nthan the batch allocated) is recorded as `null` in `batchBytes`, counted in\n`invertedBatches`, and EXCLUDED from the min -- excluding an unknown sample can\nonly raise the floor, never fabricate a lower one. The invariant holds:\n`measuredBatches + invertedBatches + (batches null from a non-finite reading)\n=== batches`.\n\n### \"Retained\", precisely\n\n`measureAllocs` measures bytes that **survive a forced collection** --\nallocation the call kept alive. Transient garbage (allocated and immediately\ncollectable) is invisible, because the pre-`after` settle reclaims it before the\nreading. This is not a gap to apologize for: a heap bracket can only see what is\nstill on the heap, and the gating question -- *does this hot-path function leak\nstate per call?* -- is a retention question. A pooled reactive node that reuses\nslots retains 0; a leaky one retains a growing amount. `maxBytesPerCall: 0`\nasserts the former. If you want transient allocation *rate* instead, that is\n`measureOps` with `maxBytesPerOp`.\n\n### One rule\n\n- `maxBytesPerCall` -- per-call retained bytes, the min over batches\n\nVerifiability matches `maxBytesPerOp` in the exported `VERDICT_MATRIX`: it needs\na memory channel (`needsHeap`/`needsUasm`) and is `no` on `source: 'none'`. A\nrun where any batch missed its forced settle reports `settled: false`, and the\ngate routes that to **inconclusive**, never a false pass -- a partial min is not\na floor.\n\n### Attribution: where did it allocate?\n\nWhen `maxBytesPerCall` fails, the next question is *which line*. Opt into\n`{ attribute: true }` and `measureAllocs` runs `node:inspector`'s HeapProfiler\nsampler over the batch loop and names the heaviest allocation sites:\n\n```js\nconst r = measureAllocs(leakyNode, { iterations: 3_000, batches: 6, attribute: true });\n\nr.attribution;\n// {\n//   available: true,\n//   totalSampledBytes: 1_729_864,\n//   nativeBytes: 85_664,\n//   sites: [\n//     { function: 'makeNode', url: 'file:///app/Pool.js', line: 42, selfBytes: 1_470_680, selfPct: 85.0 },\n//     ...\n//   ]\n// }\n```\n\nAnd a `checkAllocs` failure names the top site directly:\n\n```\nbytesPerCall 72.00 > limit 0.00 (min over 6 batches of 3000 calls);\ntop allocation site: makeNode (Pool.js:42) (85% of sampled bytes)\n```\n\nThree things are load-bearing about this design:\n\n- **Attribution never gates.** Sampling is probabilistic, so the top site is a\n  *hint* -- it can never fail a build. `bytesPerCall` and the `maxBytesPerCall`\n  gate are computed from the heap-delta estimator exactly as without\n  `attribute`; the attribution rides alongside. A transient-only workload the\n  sampler saw allocate megabytes still passes `maxBytesPerCall: 0`, because\n  retention, not sampled churn, is what the gate measures.\n- **It degrades, never throws.** `node:inspector` is Node-only and imported\n  lazily. In a browser, a worker, or when another inspector is already attached,\n  attribution reports `{ available: false, reason }` (see INCONCLUSIVE.md) and\n  the number is still valid. `measureAllocs` without `attribute` never touches\n  the inspector, so the common path is unchanged.\n- **The session is born and buried inside the measurement.** One inspector\n  session per attributed call, never pooled across runs, always disconnected --\n  even if the workload throws. Native and Node-internal frames are filtered out\n  of the user sites and summed into `nativeBytes`.\n\nUse `topSites` to change how many sites are kept (default 5).\n\n### `measureAllocs` vs `measureOps`\n\n| | `measureOps` | `measureAllocs` |\n| --- | --- | --- |\n| question | allocation *rate* per op | *retained* bytes per call |\n| estimator | one steady-phase heap delta | min over N forced-settle batches |\n| needs `--expose-gc` | only for `stabilize` | always |\n| sees transient garbage | yes (as rate) | no (settled away) |\n| rule | `maxBytesPerOp` | `maxBytesPerCall` |\n| best for | throughput + rate budgets | the literal `: 0` assertion |\n\n## Per-frame measurement: `measureFrames` and the render-loop lane\n\nThe ops lane answers \"what does one call cost?\" The frame lane answers\n\"how does this behave inside a render loop?\" Different question, different\nnoise floor, different failure modes.\n\n```js\nimport { measureFrames, assertFrames } from '@zakkster/lite-gc-profiler';\n\n// Async -- frames are inherently async, driven by a scheduler.\nconst result = await measureFrames((i) => {\n    updateParticles(i);\n    drawScene();\n}, { frames: 300, warmup: 60 });\n\n// result shape (schema: 'lite-gc-frames/1')\n//   frames: 300, warmupFrames: 60\n//   elapsedMs, fps\n//   bytesPerFrame        // retention slope, null on source='none'\n//   majorsPerKFrame, minorsPerKFrame, maxPauseMsPerFrame\n//   droppedFrames        // frames whose work-time > frameBudgetMs\n//   frameTimes: { p50, p95, p99, max }\n//   asyncResidual        // bytes heap grew past settle() -- smoke detector\n//   source, summary\n```\n\n### The scheduler\n\n`measureFrames` drives a scheduler through `warmup + frames` ticks, one\ncall to your function per tick. Three modes via `opts.scheduler`:\n\n- `'auto'` (default) — uses `requestAnimationFrame` if the runtime has\n  one, otherwise falls back to a self-correcting `setTimeout` polyfill\n  that targets `frameBudgetMs` (default 16.67ms) with drift compensation.\n- `'raf'` — forces raf. Throws a `RangeError` at setup if unavailable —\n  no silent fallback, so the intent is honest.\n- `'polyfill'` — forces the setTimeout pacer.\n- A function `(cb) => handle` — the escape hatch. Deterministic\n  schedulers in tests (e.g. `(cb) => setTimeout(cb, 0)`) run 300 frames\n  in ~150ms instead of ~5s.\n\n### `bytesPerFrame`: retention slope, not two-point delta\n\nThe ops lane uses a two-point heap delta (start vs settled end). For 300+\nsample points across a real render loop, that's the wrong shape — V8\nruns minor GCs mid-window, dropping `heapUsed` sharply between samples.\nA two-point delta would collapse under those drops.\n\nThe frame lane periodically samples the heap (~32 samples across steady),\ndetects the drops (a sample less than 0.8× the previous marks a GC),\nand fits a least-squares slope through the post-drop anchor points. That\ntracks retention accumulating across GC boundaries, robust to V8's\nmid-steady collections. A workload that only churns transient garbage\nconverges to `bytesPerFrame ≈ 0`; a real leak accumulates as a positive\nslope through the post-GC floor.\n\n### The five per-frame rules\n\n```js\nawait assertFrames(renderFrame,\n    {\n        maxBytesPerFrame:     50,       // needsHeap / needsUasm / no on source=none\n        maxMajorsPerKFrame:    1,       // requires source=gc\n        maxMinorsPerKFrame:   10,       // requires source=gc\n        maxPauseMsPerFrame:    4,       // requires source=gc\n        maxDroppedFrames:      3        // source-agnostic\n    },\n    { frames: 300, warmup: 60 }\n);\n```\n\nFour of these mirror the per-op rules' verifiability. The fifth,\n`maxDroppedFrames`, is the first source-agnostic gate in\n`VERDICT_MATRIX` — work-time is measured directly from\n`performance.now()`, no memory channel needed. Users on a runtime with\n`source='none'` (headless without any memory instrumentation) can still\ngate frame drops. That's the shape check that the matrix design\ngeneralizes cleanly.\n\n### `asyncResidual`: the smoke detector\n\nEvery result includes `asyncResidual`: bytes the heap grew *after*\n`gc.settle()` returned. Non-zero means work spawned inside your frame\noutlived the measurement window — a fire-and-forget promise chain, an\nunawaited microtask, a background timer. Not a gate rule in v1.4.0, just\na free signal you can log or assert against directly.\n\n### Comparing frames\n\nSame delta pattern as `compareOps`:\n\n```js\nawait assertCompareFrames(oldRenderer, newRenderer,\n    { maxExtraBytesPerFrame: 20, maxExtraDroppedFrames: 0 },\n    { frames: 300, warmup: 60 }\n);\n```\n\nSource mismatch (control on `gc`, candidate on `none`) yields an\n`inconclusive` verdict, same as everywhere else in the library.\n\n### Attribution honesty: interleaved async is not yet solved\n\nIf your frame function spawns fire-and-forget promises whose allocations\nare attributed by V8's async-context propagation to whichever phase is\ncurrent when the perf_hooks callback delivers the GC event, attribution\ncan drift. For a cooperative frame function (fully awaits its own work),\nattribution is accurate. `asyncResidual` gives the escape signal for the\nuncooperative case. Full interleaved-async attribution — separating\nframe-N's spawned work from frame-N+K's synchronous work — is a\nconcurrency-lane concern for a future release; doing it honestly\nneeds workers.\n\n## Serialized async ops: `measureOpsAsync`\n\nThe ops lane answers \"what does one call cost?\" for synchronous work.\n`measureOpsAsync` answers the same question for async work: signal\nsetters that batch to microtasks, effects committed on a scheduler,\nPreact-Signals reactions, Svelte 5 rune ticks.\n\n```js\nimport { measureOpsAsync, assertOpsAsync } from '@zakkster/lite-gc-profiler';\n\nconst result = await measureOpsAsync(async (i) => {\n    signal.set(i);\n    await scheduler.flush();\n}, { ops: 10_000, warmup: 500 });\n\n// Same rule vocabulary as measureOps -- no new gate types to learn.\nawait assertOpsAsync(async (i) => signal.set(i),\n    { maxBytesPerOp: 5 },\n    { ops: 10_000, warmup: 500 }\n);\n```\n\n### Serialization contract\n\n`measureOpsAsync` awaits `fn(i)` fully before starting `fn(i+1)`. Ops\ndo not overlap under this primitive. What `fn` does inside its own\npromise -- fire-and-forget microtasks, background timers, `queueMicrotask`\nchains -- is `fn`'s problem, surfaced via `asyncResidual` in the result\n(same smoke-detector semantic as the frame lane). Full interleaved-async\nattribution across ops is a v1.6.0+ concurrency-lane concern.\n\n### Stabilize on by default\n\nFollowing the v1.4.0 frame-lane lesson: `measureOpsAsync` is already\nasync, already calls `settle()`, and the marginal cost of two forced\nGCs at steady boundaries is trivial compared to the honesty gain.\n`stabilize: true` is therefore the default whenever `globalThis.gc` is\navailable (node `--expose-gc`). On that path, `bytesPerOp` is the\ncompacted-live-set delta between steady boundaries -- clean workloads\nread ~0, real leaks read their true retention rate, and the reading is\nstable cold-vs-warm.\n\nExplicit opt-out: `stabilize: false` uses a raw two-point delta and\nflags the result `bytesPerOpStable: false`. `stabilize: true` without\n`--expose-gc` throws `RangeError` at setup -- no silent fallback. As of\nv1.16.0 `'deep'` is an accepted synonym of `true` on all three lanes\n(`measureOps`, `measureFrames`, `measureOpsAsync`); the old\n\"stabilize:'deep' is measureOps-only\" RangeError is gone, and any other\n`stabilize` value throws `RangeError`.\n\n### The result shape\n\n```js\n{\n    schema: 'lite-gc-ops-async/1',\n    ops, warmupOps,\n    elapsedMs, opsPerSec,\n    bytesPerOp,          // live-set delta when stabilized, else raw two-point\n    bytesPerOpStable,    // true iff the stabilized path ran\n    majorsPerKOp, minorsPerKOp, maxPauseMsPerOp,\n    asyncResidual,       // bytes heap grew past settle\n    source, summary\n}\n```\n\nSame rule vocabulary as `checkOps`: `maxBytesPerOp`, `maxMajorsPerKOp`,\n`maxMinorsPerKOp`, `maxPauseMsPerOp`. Delta rules for `compareOpsAsync`:\n`maxExtraBytesPerOp`, `maxExtraMajorsPerKOp`, `maxExtraMinorsPerKOp`,\n`maxExtraPauseMsPerOp`.\n\n## Multi-context aggregation: gating across worker heaps\n\nEvery measurement lane above measures **one shared heap in one context**.\nThat's what the \"overlapping measurements throw\" hardening in v1.5.1\nenforces -- all lanes share one heap. But a real workload distributed\nacross N Node worker_threads, or N browser Web Workers, is N heaps, N GC\nobservers, N `PerformanceObserver`s. There is no single shared heap to\nobserve.\n\n`aggregateWorkerReports` takes an array of per-context measurement\nresults and produces a unified aggregate that can be gated against the\nsame rule vocabulary as single-context `measureOps`. Pure aggregation --\nno spawning, no messaging, no perturbation. You bring the workers, the\naggregator handles the semantic.\n\n```js\nimport {\n    aggregateWorkerReports, checkAggregateReport, assertAggregateReport\n} from '@zakkster/lite-gc-profiler';\n```\n\n### Node CI gates: `worker_threads`\n\n```js\nimport { Worker } from 'node:worker_threads';\nimport { fileURLToPath } from 'node:url';\nimport { assertAggregateReport } from '@zakkster/lite-gc-profiler';\n\n// worker.mjs -- runs measureOps on this context's heap and posts the result.\n//\n//   import { measureOps } from '@zakkster/lite-gc-profiler';\n//   import { parentPort } from 'node:worker_threads';\n//   const result = measureOps(hotPath, { ops: 10_000, warmup: 500, stabilize: true });\n//   parentPort.postMessage(result);\n\nconst workerUrl = new URL('./worker.mjs', import.meta.url);\nfunction runOne() {\n    return new Promise((res, rej) => {\n        const w = new Worker(workerUrl);         // inherits --expose-gc from parent\n        w.once('message', (m) => { w.terminate(); res(m); });\n        w.once('error', rej);\n    });\n}\n\nconst reports = await Promise.all([runOne(), runOne(), runOne(), runOne()]);\nassertAggregateReport(reports, { maxBytesPerOp: 5 });\n```\n\nNode worker_threads inherit the parent's `--expose-gc`. Do not pass it\nvia `execArgv` -- Node rejects that with `ERR_WORKER_INVALID_EXEC_ARGV`,\nbecause `--expose-gc` can only be set at top-level process start.\n\n### Browser 60fps: `@zakkster/lite-worker`\n\nFor the browser side, `@zakkster/lite-worker` gives you a zero-GC\nper-frame channel that pairs cleanly with the frame-lane primitive.\nEach worker runs `measureFrames` on its own heap, posts the result\nback over the typed channel (`ctx.post`/`.call`), the main thread\ncollects and aggregates. See the lite-worker README for the transport\ndetails.\n\n### The aggregation semantics\n\nThe aggregator encodes conservative decisions:\n\n- **`bytesPerOp`**: `(total retained bytes across all contexts) / (total\n  ops across all contexts)`. Weighted by ops, so a 1-op context with a\n  huge rate cannot swamp a 1M-op context with a tiny rate. If any\n  context reports `null` or non-finite, the aggregate is `null`.\n- **`bytesPerOpStable`**: logical **AND** across contexts. One context\n  falling back to the raw two-point delta degrades the aggregate flag.\n  A gate cannot be more trustworthy than its least-trustworthy source.\n- **`majorsPerKOp`, `minorsPerKOp`**: ops-weighted rate. Same shape as\n  single-context. As of v1.16.0 a SYNC `measureOps` result carries these\n  per-K rates too (derived from its steady phase), so a sync-ops context\n  aggregates to real numbers instead of diluting the rate to `null`; a\n  hand-built report that OMITS a rate still contributes `null`.\n- **`maxPauseMsPerOp`**: **MAX** across contexts. The worst pause\n  anywhere in the system is the pause the aggregate reports.\n- **`source`**: unanimous or `'mixed'`. A mixed-source aggregate is\n  gated `inconclusive` with `reason: 'source_mismatch'` -- deltas across\n  mixed sources are not comparable.\n\n### Result shape\n\n```js\n{\n    schema: 'lite-gc-ops-multi/1',\n    kind: 'ops-multi',\n    contexts: 4,\n    aggregate: {\n        source: 'gc',\n        totalOps: 40000,\n        bytesPerOp: 3.2,\n        bytesPerOpStable: true,\n        majorsPerKOp: 0.1,\n        minorsPerKOp: 2.4,\n        maxPauseMsPerOp: 3.8\n    },\n    perContext: [ /* the input reports, defensive copy */ ]\n}\n```\n\nPass `{ label }` to `aggregateWorkerReports` / `aggregateFrameReports` and it\nis consumed into `result.label` (v1.16.0).\n\nThe v1.5.1 gate-fail-closed discipline extends to `checkAggregateReport`:\nunknown rule keys throw, non-finite thresholds throw, non-finite aggregate\nmetrics route to `inconclusive` (never `pass`).\n\n### Frames variant: `aggregateFrameReports` (v1.8.0)\n\nThe same shape applies to the render-loop lane. Each context runs\n`measureFrames`, ships its result back, the aggregator produces a\nmulti-frames report.\n\n```js\nimport {\n    aggregateFrameReports, checkAggregateFramesReport, assertAggregateFramesReport\n} from '@zakkster/lite-gc-profiler';\n\nconst reports = await Promise.all(workers.map(runOne));\nassertAggregateFramesReport(reports, {\n    maxBytesPerFrame: 512,\n    maxDroppedFrames: 5\n});\n```\n\nSemantics mirror the ops variant, with three frames-specific decisions:\n\n- **`droppedFrames`**: SUM across contexts (not averaged). Three\n  contexts each dropping one frame is three dropped frames\n  system-wide.\n- **`asyncResidual`**: SUM across contexts. Fire-and-forget growth\n  accumulates.\n- **`frameTimes`**: **deliberately dropped** from the aggregate.\n  Percentiles are not compositional -- a system-wide p95 cannot be\n  reconstructed from per-context summary p95s. `perContext[i]`\n  preserves the per-context distributions for manual inspection.\n\nThe dilution guard from v1.7.1 applies from day one: a missing or\nnon-finite rate metric (`majorsPerKFrame`, `minorsPerKFrame`,\n`maxPauseMsPerFrame`, `droppedFrames`) on ANY context marks the\naggregate metric `null`, routing to `inconclusive` at gate time.\nSilently averaging a missing metric as zero would let an unmeasurable\ncontext read the whole system cleaner than reality.\n\n## Baseline lock: guarding against silent regressions\n\nCI ergonomics: capture a known-good aggregate once, commit it as JSON, gate\nevery future run against it.\n\n```js\nimport { aggregateGc, createBaseline, checkAgainstBaseline } from '@zakkster/lite-gc-profiler';\nimport { readFileSync, writeFileSync } from 'node:fs';\n\n// Once, on a green build:\nconst baseline = createBaseline(aggregateGc(reps));\nwriteFileSync('gc-baseline.json', JSON.stringify(baseline, null, 2));\n\n// Every subsequent build:\nconst baseline = JSON.parse(readFileSync('gc-baseline.json', 'utf8'));\nconst current = aggregateGc(reps);\nconst report = checkAgainstBaseline(current, baseline);\nif (report.verdict === 'fail') { /* regression */ }\nif (report.verdict === 'inconclusive') { /* baseline unusable here */ }\n```\n\n`createBaseline` does not touch the filesystem; it returns a JSON-able\nobject. Users serialize and commit as they see fit.\n\n**Regression semantics:** for each metric, `current.median > baseline.max`\nis a regression. Rationale: allowing current to be as bad as the baseline's\nworst absorbs run-to-run noise on the capture side; a current whose typical\nvalue exceeds even the worst observed baseline is a real regression. As of\nv1.16.0 the compared metric list includes the `uasm` rows already stored by\n`createBaseline`/`ratchetBaseline` (`['uasm','growthRate']`, `['uasm','bytes']`,\n`['uasm','peak']`); `uasm.samples` is deliberately NOT compared -- it measures\neffort, not a regression. A baseline whose GC-event channel was never observed,\nor an aggregate with zero (or zero observed) reps, routes to `inconclusive`\nreason `not_observed`.\n\n**A baseline that cannot verify anything is `inconclusive`, not `pass`**\n(v1.5.2). A comparison counts only when both `current.median` and\n`baseline.max` are finite, so a metric whose baseline value is `NaN`,\n`null` (what `JSON.stringify` writes for `NaN`), or a hand-edited string\nreports `checked: false` rather than silently comparing false against\neverything. If no metric survives -- a truncated baseline file, missing\n`gc`/`heap` groups, schema drift, an empty aggregate -- the verdict is\n`inconclusive` with `reason: 'no_comparable_metrics'`. Regenerate the\nbaseline rather than reaching for `allowInconclusive`.\n\n**Fingerprint check.** `createBaseline` captures a fingerprint of the\nenvironment (node, v8, platform, arch, cpu). Comparing against a baseline\nwhose fingerprint differs from the current environment returns\n`inconclusive` with `reason: 'fingerprint_mismatch'`. In a browser the\nfingerprint is derived from `navigator` (v1.16.0); when none of `userAgent`,\n`userAgentData.platform` or `hardwareConcurrency` is available it carries\n`generic: true`, and two `generic` fingerprints never vouch for each other --\nan informationless fingerprint cannot certify a match.\n\nOverride the fingerprint check explicitly if needed:\n\n```js\ncheckAgainstBaseline(current, baseline, { acceptFingerprintMismatch: true });\n// The report body carries fingerprintMismatchAccepted: true as audit trail.\n```\n\n## CLI: lite-gc-gate\n\nZero-touch gating for any node script:\n\n```\nlite-gc-gate run <script> [options]\n```\n\nEvery value-taking flag (`--reps`/`--config`/`--format`/`--json`/`--baseline`)\nrequires a value; a missing value, a value that is itself flag-shaped, or an\nunknown flag is a usage error (exit 3) -- unknown flags and bad `--format`\nvalues carry a did-you-mean hint (v1.16.0).\n\n| flag | meaning |\n| --- | --- |\n| `--reps N` | Run N times and gate on the aggregate |\n| `--config path` | Load rules and policy from JSON (rules MUST be wrapped: `{\"rules\": {...}}`) |\n| `--format fmt` | `console` \\| `json` \\| `markdown` \\| `github` (validated; default console) |\n| `--json path` | Also write the JSON envelope to this path |\n| `--baseline path` | Check against a baseline JSON file |\n| `--update-baseline` | Write current aggregate as new baseline |\n| `--ratchet` | Tighten `--baseline` toward a passing run (only ever lowers; needs `--baseline`, excludes `--update-baseline`) |\n| `--accept-fingerprint-mismatch` | Allow baseline comparison across fingerprints |\n| `--allow-inconclusive` | Exit 0 instead of 2 on inconclusive (the report still prints its inconclusive banner) |\n\nExit codes (v1.16.0): `0` pass (or inconclusive WITH `--allow-inconclusive`);\n`1` gate FAIL (a real budget failure only; a non-gate crash also surfaces as a\nnon-zero exit); `2` inconclusive (`no_rules`, `not_observed`,\n`bracket_inverted`, or a partial report with reason `process_exit`); `3` config\nor infrastructure error (a usage/parse error, an invalid `--config`, or a gate\n`TypeError`/`RangeError` -- a rule typo or wrong-lane key, surfaced as a message,\nnever a stack trace, never exit 1).\n\nThe target script does not need to know about the profiler. The CLI spawns\nnode with the `./register` preload, which starts a `GcProfiler` at load,\nsettles on `beforeExit`, and writes the summary JSON to a temp path the CLI\nthen reads.\n\n**Config file shape:**\n\n```json\n{\n    \"rules\": { \"maxMajor\": 0, \"maxPauseMs\": 4 },\n    \"policy\": { \"maxMajor\": \"quorum-9\" }\n}\n```\n\nThe document must be a plain object whose top-level keys are a subset of\n`{rules, policy}` (v1.16.0). A document with neither key -- e.g. a bare\n`{\"maxMinor\": 0}` -- is a usage error naming the wrapper, not a silent revert to\nthe default gate; a near-miss key (`\"rulez\"`) gets a did-you-mean. `{\"rules\":{}}`\nis allowed through to the library, which returns `inconclusive` `no_rules`\n(exit 2) -- the CLI does not duplicate that verdict at load time.\n\n**Example: gate under 10 reps with GitHub Actions output:**\n\n```\nlite-gc-gate run bench/hot.mjs --reps 10 --config gc-gate.json --format github\n```\n\n**Example: capture a baseline once, gate against it thereafter:**\n\n```\n# Green build, once:\nlite-gc-gate run bench/hot.mjs --reps 20 --baseline gc-baseline.json --update-baseline\n\n# Every subsequent build:\nlite-gc-gate run bench/hot.mjs --reps 20 --baseline gc-baseline.json --format github\n```\n\n**Example: ratchet the baseline on every green build.**\n\nA static baseline only catches regressions below the line you first drew. If a\nrelease improves `major` from 8 to 3 and a later one slips back to 7, a baseline\nfrozen at 8 still passes -- the win evaporated silently. `--ratchet` makes the\nbaseline a lockfile that only ever tightens:\n\n```\n# On every green build, after the gate passes, tighten the committed floor:\nlite-gc-gate run bench/hot.mjs --reps 20 --baseline gc-baseline.json --ratchet\n# -> \"baseline ratcheted (3 metrics tightened: gc.major, gc.totalMs, gc.count)\"\n# then commit the updated gc-baseline.json\n```\n\nOn a passing run it rewrites `gc-baseline.json` with the element-wise minimum of\nthe old floor and this run, and prints what moved. On a failing or inconclusive\nrun it leaves the file byte-identical and exits non-zero -- you never ratchet\ntoward a number you just failed. Unlike `--update-baseline` (which overwrites in\neither direction and can enshrine a regression), `--ratchet` is safe to run\nunattended in CI: it can only lower the floor, and only on a run that cleared\nthe current one. A metric the run could not measure is carried forward\nunchanged -- the floor a run did not see is one it cannot move.\n\n**`process.exit()` handling (v1.3.0+).** If the target script calls\n`process.exit()` before `beforeExit` can settle, the register preload's\nsync exit handler writes a *partial* report (`schema: 'lite-gc-partial/1'`).\nThe CLI reads it, downgrades verdict to `inconclusive` with\n`reason: 'partial_report'`, and emits exit code `2` (inconclusive) rather\nthan `3` (infrastructure error). CI can distinguish \"target hard-exited,\nmeasurement is truncated\" from \"harness genuinely broken.\" Reports carry\na `partial` field with per-rep exit codes for debugging.\n\n## Test integration: node:test\n\nThe `./test-helpers` subpath exports `withGcGate`, a wrapper that turns the\nstart/settle/assert dance into a one-liner. On failure, the formatted\nreport is attached to the test's diagnostic output so CI logs show what the\ngate saw next to the test name.\n\n```js\nimport { test } from 'node:test';\nimport { withGcGate } from '@zakkster/lite-gc-profiler/test-helpers';\n\ntest('zero-alloc claim', async (t) => {\n    await withGcGate(t, { maxMajor: 0 }, async (gc) => {\n        runMyCode();\n    });\n});\n```\n\nWith phases:\n\n```js\ntest('warmup then steady', async (t) => {\n    await withGcGate(t, {\n        phases: {\n            warmup: { maxMajor: 1 },\n            steady: { maxMajor: 0, maxMinor: 0 }\n        }\n    }, async (gc) => {\n        gc.phase('warmup');\n        warmTheCache();\n        gc.phase('steady');\n        runMyCode();\n    });\n});\n```\n\n`measureGc` is the quieter form: returns the report instead of asserting.\nUseful when the test wants to inspect the verdict rather than fail.\n\nA canonical `test/99-gc-gate.mjs` template ships under `templates/GcGate.mjs`.\nEvery `@zakkster/lite-*` package that wants the Zero-GC badge copies this\nverbatim, adjusting only the workload body and package import.\n\n## Framework integration: Vue, React, Angular\n\nThere is nothing framework-specific to install. The profiler gates a\n*function* -- a reactive tick -- so integration is just choosing which tick to\nwrap and running the test under `--expose-gc`.\n\n| Framework | The tick to gate | Driven by |\n| --- | --- | --- |\n| Vue | a reactivity `effect` re-run | `count.value = i` (`@vue/reactivity`) |\n| React | a component render | `root.update(...)` under `react-test-renderer` |\n| Angular | a change-detection cycle | `fixture.detectChanges()","readmeFilename":"README.md"}