Draft
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 62 additions & 1 deletion scripts/check-type-check-coverage.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -2805,10 +2805,54 @@ function countTscErrors(output, { dropRootDirDiagnostics = false } = {}) {
// with `NODE_OPTIONS` on a box under this file's own eyes), so a 4096 old space
// reports 4144 and commits the 4147.5 above it.
//
// ## Re-measured FIRST-HAND on the runner, 2026-09-03 (#14569)
//
// The bracket above is archaeology through a failed job's GC trace. #14569
// asked for a raise to 6144 to be taken on a measurement rather than on a
// typed number, so the reading was taken where the verdict is taken: inside
// the `Type Check · debt ledger` job itself, by a temporary probe step that
// emitted its numbers as `::notice` annotations (run 33708954003, job
// 100504131338, image `ubuntu24 20260831.293.1`, Node v22.23.2, 4 vCPU).
//
// the runner MemTotal 16,373,452 kB (~15.6 GiB) plus 3,145,724 kB of
// swap -- NOT the 7 GB #14569 assumed. MemAvailable at the
// point the re-measure starts: 14,329,064 kB.
// other consumers 153 processes holding 940,316 kB (~918 MB) altogether:
// Runner.Worker 144 MB, Runner.Listener 98 MB, provjobd
// 96 MB, dockerd 73 MB, containerd 43 MB. The job's steps
// are sequential, so nothing in it runs BESIDE the
// re-measure -- the ledger's tsc has the box to itself.
// this gate's own `heap_size_limit` 4144 MB with `NODE_OPTIONS` unset --
// ceiling the runner's V8 default, read directly rather than
// inferred. It confirms the 4096 MB old space the GC trace
// above could only bracket.
// the heaviest `packages/qa/http-conformance`'s TEST_DEBT program (906
// program files, 692,003 lines of definitions, 7,328,937
// instantiations) under `--extendedDiagnostics`, twice:
//
// cap 4096 Memory used 4,077,718K peak RSS 4,212,904 kB
// check 26.84s
// cap 6144 Memory used 4,420,706K peak RSS 4,545,500 kB
// check 21.90s
//
// Neither OOMs, and the pair IS the headroom finding
// #14569 asked for: handed 343 MB more heap the same
// program keeps 343 MB more live and finishes ~5s sooner,
// so under 4096 it is paying GC pressure to fit rather
// than fitting. Lowest MemAvailable seen at any point
// during either run: 10,562,192 kB.
//
// The scarce resource is therefore NOT the runner's memory -- 15.6 GiB with
// ~918 MB of it spoken for -- but V8's DEFAULT old space on that runner, which
// is 4096 MB. This constant describes that default, and as of 2026-09-03 it
// still describes it exactly. That is why the re-measure leaves it here.
//
// ⚠️ If 4096 is wrong, it is wrong DOWNWARD -- the only safe direction. This
// number's entire job is to be no HIGHER than CI's ceiling. A pin ABOVE CI's is
// worse than no pin at all: it makes local runs pass where CI still OOMs, which
// is exactly this defect with extra confidence attached.
// is exactly this defect with extra confidence attached. The 2026-09-03
// reading above is the first taken with the runner in hand rather than
// inferred from a crash, and it lands on the same 4096 from the other side.
//
// ⛔ Do not raise this to make a local measurement complete. `--re-measure`
// OOMing under this ceiling is the gate WORKING -- it is CI's failure,
Expand All@@ -2817,6 +2861,18 @@ function countTscErrors(output, { dropRootDirDiagnostics = false } = {}) {
// lesson from the build side: a ceiling above the box's real memory does not
// buy a bigger run, it converts a recoverable heap error into an exit-137
// SIGKILL that carries no diagnostic at all.)
//
// ⛔ And raising it ALONE cannot buy the ledger a roomier run -- measured on
// 2026-09-03, not reasoned. `remeasureHeapCeiling` below takes the MINIMUM of
// this pin and the limit the running process actually has, so with the pin at
// 6144 and the gate started under the runner's own default the chosen ceiling
// is still 4144 -- and the `stale` arm below then refuses the run outright:
// `--re-measure` exits 1 before the first tsc ("the pin is now ABOVE the
// ceiling it claims to describe"), reproduced against a 4144 MB process. A
// raise has to hand the gate PROCESS the memory first -- a `NODE_OPTIONS` on
// the job's re-measure step -- so the pin keeps describing what the process
// really has. That is a workflow decision, not one this constant can take on
// its own; #14569 carries it.
const CI_TSC_HEAP_CEILING_MB = 4096;

/**
Expand DownExpand Up@@ -5162,6 +5218,11 @@ function selfTest() {
expect: { mb: CI_TSC_HEAP_CEILING_MB, stale: false },
},
{
// `+ 48` is the RUNNER, not a construction: the `Type Check · debt
// ledger` job reports a `heap_size_limit` of 4144 MB for its 4096 MB old
// space (measured there 2026-09-03, #14569), so this row is the shape of
// the machine whose verdict the pin exists to describe -- and the row
// above it is every box that is roomier than that one.
label: 'on a box shaped like CI the ceiling is a no-op that still names itself',
where: { heapLimitMb: CI_TSC_HEAP_CEILING_MB + 48, onCi: true },
expect: { mb: CI_TSC_HEAP_CEILING_MB, stale: false },
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
Draft
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 62 additions & 1 deletion scripts/check-type-check-coverage.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -2805,10 +2805,54 @@ function countTscErrors(output, { dropRootDirDiagnostics = false } = {}) {
// with `NODE_OPTIONS` on a box under this file's own eyes), so a 4096 old space
// reports 4144 and commits the 4147.5 above it.
//
// ## Re-measured FIRST-HAND on the runner, 2026-09-03 (#14569)
//
// The bracket above is archaeology through a failed job's GC trace. #14569
// asked for a raise to 6144 to be taken on a measurement rather than on a
// typed number, so the reading was taken where the verdict is taken: inside
// the `Type Check · debt ledger` job itself, by a temporary probe step that
// emitted its numbers as `::notice` annotations (run 33708954003, job
// 100504131338, image `ubuntu24 20260831.293.1`, Node v22.23.2, 4 vCPU).
//
// the runner MemTotal 16,373,452 kB (~15.6 GiB) plus 3,145,724 kB of
// swap -- NOT the 7 GB #14569 assumed. MemAvailable at the
// point the re-measure starts: 14,329,064 kB.
// other consumers 153 processes holding 940,316 kB (~918 MB) altogether:
// Runner.Worker 144 MB, Runner.Listener 98 MB, provjobd
// 96 MB, dockerd 73 MB, containerd 43 MB. The job's steps
// are sequential, so nothing in it runs BESIDE the
// re-measure -- the ledger's tsc has the box to itself.
// this gate's own `heap_size_limit` 4144 MB with `NODE_OPTIONS` unset --
// ceiling the runner's V8 default, read directly rather than
// inferred. It confirms the 4096 MB old space the GC trace
// above could only bracket.
// the heaviest `packages/qa/http-conformance`'s TEST_DEBT program (906
// program files, 692,003 lines of definitions, 7,328,937
// instantiations) under `--extendedDiagnostics`, twice:
//
// cap 4096 Memory used 4,077,718K peak RSS 4,212,904 kB
// check 26.84s
// cap 6144 Memory used 4,420,706K peak RSS 4,545,500 kB
// check 21.90s
//
// Neither OOMs, and the pair IS the headroom finding
// #14569 asked for: handed 343 MB more heap the same
// program keeps 343 MB more live and finishes ~5s sooner,
// so under 4096 it is paying GC pressure to fit rather
// than fitting. Lowest MemAvailable seen at any point
// during either run: 10,562,192 kB.
//
// The scarce resource is therefore NOT the runner's memory -- 15.6 GiB with
// ~918 MB of it spoken for -- but V8's DEFAULT old space on that runner, which
// is 4096 MB. This constant describes that default, and as of 2026-09-03 it
// still describes it exactly. That is why the re-measure leaves it here.
//
// ⚠️ If 4096 is wrong, it is wrong DOWNWARD -- the only safe direction. This
// number's entire job is to be no HIGHER than CI's ceiling. A pin ABOVE CI's is
// worse than no pin at all: it makes local runs pass where CI still OOMs, which
// is exactly this defect with extra confidence attached.
// is exactly this defect with extra confidence attached. The 2026-09-03
// reading above is the first taken with the runner in hand rather than
// inferred from a crash, and it lands on the same 4096 from the other side.
//
// ⛔ Do not raise this to make a local measurement complete. `--re-measure`
// OOMing under this ceiling is the gate WORKING -- it is CI's failure,
Expand All@@ -2817,6 +2861,18 @@ function countTscErrors(output, { dropRootDirDiagnostics = false } = {}) {
// lesson from the build side: a ceiling above the box's real memory does not
// buy a bigger run, it converts a recoverable heap error into an exit-137
// SIGKILL that carries no diagnostic at all.)
//
// ⛔ And raising it ALONE cannot buy the ledger a roomier run -- measured on
// 2026-09-03, not reasoned. `remeasureHeapCeiling` below takes the MINIMUM of
// this pin and the limit the running process actually has, so with the pin at
// 6144 and the gate started under the runner's own default the chosen ceiling
// is still 4144 -- and the `stale` arm below then refuses the run outright:
// `--re-measure` exits 1 before the first tsc ("the pin is now ABOVE the
// ceiling it claims to describe"), reproduced against a 4144 MB process. A
// raise has to hand the gate PROCESS the memory first -- a `NODE_OPTIONS` on
// the job's re-measure step -- so the pin keeps describing what the process
// really has. That is a workflow decision, not one this constant can take on
// its own; #14569 carries it.
const CI_TSC_HEAP_CEILING_MB = 4096;

/**
Expand DownExpand Up@@ -5162,6 +5218,11 @@ function selfTest() {
expect: { mb: CI_TSC_HEAP_CEILING_MB, stale: false },
},
{
// `+ 48` is the RUNNER, not a construction: the `Type Check · debt
// ledger` job reports a `heap_size_limit` of 4144 MB for its 4096 MB old
// space (measured there 2026-09-03, #14569), so this row is the shape of
// the machine whose verdict the pin exists to describe -- and the row
// above it is every box that is roomier than that one.
label: 'on a box shaped like CI the ceiling is a no-op that still names itself',
where: { heapLimitMb: CI_TSC_HEAP_CEILING_MB + 48, onCi: true },
expect: { mb: CI_TSC_HEAP_CEILING_MB, stale: false },
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Draft
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 62 additions & 1 deletion scripts/check-type-check-coverage.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -2805,10 +2805,54 @@ function countTscErrors(output, { dropRootDirDiagnostics = false } = {}) {
// with `NODE_OPTIONS` on a box under this file's own eyes), so a 4096 old space
// reports 4144 and commits the 4147.5 above it.
//
// ## Re-measured FIRST-HAND on the runner, 2026-09-03 (#14569)
//
// The bracket above is archaeology through a failed job's GC trace. #14569
// asked for a raise to 6144 to be taken on a measurement rather than on a
// typed number, so the reading was taken where the verdict is taken: inside
// the `Type Check · debt ledger` job itself, by a temporary probe step that
// emitted its numbers as `::notice` annotations (run 33708954003, job
// 100504131338, image `ubuntu24 20260831.293.1`, Node v22.23.2, 4 vCPU).
//
// the runner MemTotal 16,373,452 kB (~15.6 GiB) plus 3,145,724 kB of
// swap -- NOT the 7 GB #14569 assumed. MemAvailable at the
// point the re-measure starts: 14,329,064 kB.
// other consumers 153 processes holding 940,316 kB (~918 MB) altogether:
// Runner.Worker 144 MB, Runner.Listener 98 MB, provjobd
// 96 MB, dockerd 73 MB, containerd 43 MB. The job's steps
// are sequential, so nothing in it runs BESIDE the
// re-measure -- the ledger's tsc has the box to itself.
// this gate's own `heap_size_limit` 4144 MB with `NODE_OPTIONS` unset --
// ceiling the runner's V8 default, read directly rather than
// inferred. It confirms the 4096 MB old space the GC trace
// above could only bracket.
// the heaviest `packages/qa/http-conformance`'s TEST_DEBT program (906
// program files, 692,003 lines of definitions, 7,328,937
// instantiations) under `--extendedDiagnostics`, twice:
//
// cap 4096 Memory used 4,077,718K peak RSS 4,212,904 kB
// check 26.84s
// cap 6144 Memory used 4,420,706K peak RSS 4,545,500 kB
// check 21.90s
//
// Neither OOMs, and the pair IS the headroom finding
// #14569 asked for: handed 343 MB more heap the same
// program keeps 343 MB more live and finishes ~5s sooner,
// so under 4096 it is paying GC pressure to fit rather
// than fitting. Lowest MemAvailable seen at any point
// during either run: 10,562,192 kB.
//
// The scarce resource is therefore NOT the runner's memory -- 15.6 GiB with
// ~918 MB of it spoken for -- but V8's DEFAULT old space on that runner, which
// is 4096 MB. This constant describes that default, and as of 2026-09-03 it
// still describes it exactly. That is why the re-measure leaves it here.
//
// ⚠️ If 4096 is wrong, it is wrong DOWNWARD -- the only safe direction. This
// number's entire job is to be no HIGHER than CI's ceiling. A pin ABOVE CI's is
// worse than no pin at all: it makes local runs pass where CI still OOMs, which
// is exactly this defect with extra confidence attached.
// is exactly this defect with extra confidence attached. The 2026-09-03
// reading above is the first taken with the runner in hand rather than
// inferred from a crash, and it lands on the same 4096 from the other side.
//
// ⛔ Do not raise this to make a local measurement complete. `--re-measure`
// OOMing under this ceiling is the gate WORKING -- it is CI's failure,
Expand All@@ -2817,6 +2861,18 @@ function countTscErrors(output, { dropRootDirDiagnostics = false } = {}) {
// lesson from the build side: a ceiling above the box's real memory does not
// buy a bigger run, it converts a recoverable heap error into an exit-137
// SIGKILL that carries no diagnostic at all.)
//
// ⛔ And raising it ALONE cannot buy the ledger a roomier run -- measured on
// 2026-09-03, not reasoned. `remeasureHeapCeiling` below takes the MINIMUM of
// this pin and the limit the running process actually has, so with the pin at
// 6144 and the gate started under the runner's own default the chosen ceiling
// is still 4144 -- and the `stale` arm below then refuses the run outright:
// `--re-measure` exits 1 before the first tsc ("the pin is now ABOVE the
// ceiling it claims to describe"), reproduced against a 4144 MB process. A
// raise has to hand the gate PROCESS the memory first -- a `NODE_OPTIONS` on
// the job's re-measure step -- so the pin keeps describing what the process
// really has. That is a workflow decision, not one this constant can take on
// its own; #14569 carries it.
const CI_TSC_HEAP_CEILING_MB = 4096;

/**
Expand DownExpand Up@@ -5162,6 +5218,11 @@ function selfTest() {
expect: { mb: CI_TSC_HEAP_CEILING_MB, stale: false },
},
{
// `+ 48` is the RUNNER, not a construction: the `Type Check · debt
// ledger` job reports a `heap_size_limit` of 4144 MB for its 4096 MB old
// space (measured there 2026-09-03, #14569), so this row is the shape of
// the machine whose verdict the pin exists to describe -- and the row
// above it is every box that is roomier than that one.
label: 'on a box shaped like CI the ceiling is a no-op that still names itself',
where: { heapLimitMb: CI_TSC_HEAP_CEILING_MB + 48, onCi: true },
expect: { mb: CI_TSC_HEAP_CEILING_MB, stale: false },
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Draft
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 62 additions & 1 deletion scripts/check-type-check-coverage.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -2805,10 +2805,54 @@ function countTscErrors(output, { dropRootDirDiagnostics = false } = {}) {
// with `NODE_OPTIONS` on a box under this file's own eyes), so a 4096 old space
// reports 4144 and commits the 4147.5 above it.
//
// ## Re-measured FIRST-HAND on the runner, 2026-09-03 (#14569)
//
// The bracket above is archaeology through a failed job's GC trace. #14569
// asked for a raise to 6144 to be taken on a measurement rather than on a
// typed number, so the reading was taken where the verdict is taken: inside
// the `Type Check · debt ledger` job itself, by a temporary probe step that
// emitted its numbers as `::notice` annotations (run 33708954003, job
// 100504131338, image `ubuntu24 20260831.293.1`, Node v22.23.2, 4 vCPU).
//
// the runner MemTotal 16,373,452 kB (~15.6 GiB) plus 3,145,724 kB of
// swap -- NOT the 7 GB #14569 assumed. MemAvailable at the
// point the re-measure starts: 14,329,064 kB.
// other consumers 153 processes holding 940,316 kB (~918 MB) altogether:
// Runner.Worker 144 MB, Runner.Listener 98 MB, provjobd
// 96 MB, dockerd 73 MB, containerd 43 MB. The job's steps
// are sequential, so nothing in it runs BESIDE the
// re-measure -- the ledger's tsc has the box to itself.
// this gate's own `heap_size_limit` 4144 MB with `NODE_OPTIONS` unset --
// ceiling the runner's V8 default, read directly rather than
// inferred. It confirms the 4096 MB old space the GC trace
// above could only bracket.
// the heaviest `packages/qa/http-conformance`'s TEST_DEBT program (906
// program files, 692,003 lines of definitions, 7,328,937
// instantiations) under `--extendedDiagnostics`, twice:
//
// cap 4096 Memory used 4,077,718K peak RSS 4,212,904 kB
// check 26.84s
// cap 6144 Memory used 4,420,706K peak RSS 4,545,500 kB
// check 21.90s
//
// Neither OOMs, and the pair IS the headroom finding
// #14569 asked for: handed 343 MB more heap the same
// program keeps 343 MB more live and finishes ~5s sooner,
// so under 4096 it is paying GC pressure to fit rather
// than fitting. Lowest MemAvailable seen at any point
// during either run: 10,562,192 kB.
//
// The scarce resource is therefore NOT the runner's memory -- 15.6 GiB with
// ~918 MB of it spoken for -- but V8's DEFAULT old space on that runner, which
// is 4096 MB. This constant describes that default, and as of 2026-09-03 it
// still describes it exactly. That is why the re-measure leaves it here.
//
// ⚠️ If 4096 is wrong, it is wrong DOWNWARD -- the only safe direction. This
// number's entire job is to be no HIGHER than CI's ceiling. A pin ABOVE CI's is
// worse than no pin at all: it makes local runs pass where CI still OOMs, which
// is exactly this defect with extra confidence attached.
// is exactly this defect with extra confidence attached. The 2026-09-03
// reading above is the first taken with the runner in hand rather than
// inferred from a crash, and it lands on the same 4096 from the other side.
//
// ⛔ Do not raise this to make a local measurement complete. `--re-measure`
// OOMing under this ceiling is the gate WORKING -- it is CI's failure,
Expand All@@ -2817,6 +2861,18 @@ function countTscErrors(output, { dropRootDirDiagnostics = false } = {}) {
// lesson from the build side: a ceiling above the box's real memory does not
// buy a bigger run, it converts a recoverable heap error into an exit-137
// SIGKILL that carries no diagnostic at all.)
//
// ⛔ And raising it ALONE cannot buy the ledger a roomier run -- measured on
// 2026-09-03, not reasoned. `remeasureHeapCeiling` below takes the MINIMUM of
// this pin and the limit the running process actually has, so with the pin at
// 6144 and the gate started under the runner's own default the chosen ceiling
// is still 4144 -- and the `stale` arm below then refuses the run outright:
// `--re-measure` exits 1 before the first tsc ("the pin is now ABOVE the
// ceiling it claims to describe"), reproduced against a 4144 MB process. A
// raise has to hand the gate PROCESS the memory first -- a `NODE_OPTIONS` on
// the job's re-measure step -- so the pin keeps describing what the process
// really has. That is a workflow decision, not one this constant can take on
// its own; #14569 carries it.
const CI_TSC_HEAP_CEILING_MB = 4096;

/**
Expand DownExpand Up@@ -5162,6 +5218,11 @@ function selfTest() {
expect: { mb: CI_TSC_HEAP_CEILING_MB, stale: false },
},
{
// `+ 48` is the RUNNER, not a construction: the `Type Check · debt
// ledger` job reports a `heap_size_limit` of 4144 MB for its 4096 MB old
// space (measured there 2026-09-03, #14569), so this row is the shape of
// the machine whose verdict the pin exists to describe -- and the row
// above it is every box that is roomier than that one.
label: 'on a box shaped like CI the ceiling is a no-op that still names itself',
where: { heapLimitMb: CI_TSC_HEAP_CEILING_MB + 48, onCi: true },
expect: { mb: CI_TSC_HEAP_CEILING_MB, stale: false },
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
Draft
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 62 additions & 1 deletion scripts/check-type-check-coverage.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -2805,10 +2805,54 @@ function countTscErrors(output, { dropRootDirDiagnostics = false } = {}) {
// with `NODE_OPTIONS` on a box under this file's own eyes), so a 4096 old space
// reports 4144 and commits the 4147.5 above it.
//
// ## Re-measured FIRST-HAND on the runner, 2026-09-03 (#14569)
//
// The bracket above is archaeology through a failed job's GC trace. #14569
// asked for a raise to 6144 to be taken on a measurement rather than on a
// typed number, so the reading was taken where the verdict is taken: inside
// the `Type Check · debt ledger` job itself, by a temporary probe step that
// emitted its numbers as `::notice` annotations (run 33708954003, job
// 100504131338, image `ubuntu24 20260831.293.1`, Node v22.23.2, 4 vCPU).
//
// the runner MemTotal 16,373,452 kB (~15.6 GiB) plus 3,145,724 kB of
// swap -- NOT the 7 GB #14569 assumed. MemAvailable at the
// point the re-measure starts: 14,329,064 kB.
// other consumers 153 processes holding 940,316 kB (~918 MB) altogether:
// Runner.Worker 144 MB, Runner.Listener 98 MB, provjobd
// 96 MB, dockerd 73 MB, containerd 43 MB. The job's steps
// are sequential, so nothing in it runs BESIDE the
// re-measure -- the ledger's tsc has the box to itself.
// this gate's own `heap_size_limit` 4144 MB with `NODE_OPTIONS` unset --
// ceiling the runner's V8 default, read directly rather than
// inferred. It confirms the 4096 MB old space the GC trace
// above could only bracket.
// the heaviest `packages/qa/http-conformance`'s TEST_DEBT program (906
// program files, 692,003 lines of definitions, 7,328,937
// instantiations) under `--extendedDiagnostics`, twice:
//
// cap 4096 Memory used 4,077,718K peak RSS 4,212,904 kB
// check 26.84s
// cap 6144 Memory used 4,420,706K peak RSS 4,545,500 kB
// check 21.90s
//
// Neither OOMs, and the pair IS the headroom finding
// #14569 asked for: handed 343 MB more heap the same
// program keeps 343 MB more live and finishes ~5s sooner,
// so under 4096 it is paying GC pressure to fit rather
// than fitting. Lowest MemAvailable seen at any point
// during either run: 10,562,192 kB.
//
// The scarce resource is therefore NOT the runner's memory -- 15.6 GiB with
// ~918 MB of it spoken for -- but V8's DEFAULT old space on that runner, which
// is 4096 MB. This constant describes that default, and as of 2026-09-03 it
// still describes it exactly. That is why the re-measure leaves it here.
//
// ⚠️ If 4096 is wrong, it is wrong DOWNWARD -- the only safe direction. This
// number's entire job is to be no HIGHER than CI's ceiling. A pin ABOVE CI's is
// worse than no pin at all: it makes local runs pass where CI still OOMs, which
// is exactly this defect with extra confidence attached.
// is exactly this defect with extra confidence attached. The 2026-09-03
// reading above is the first taken with the runner in hand rather than
// inferred from a crash, and it lands on the same 4096 from the other side.
//
// ⛔ Do not raise this to make a local measurement complete. `--re-measure`
// OOMing under this ceiling is the gate WORKING -- it is CI's failure,
Expand All@@ -2817,6 +2861,18 @@ function countTscErrors(output, { dropRootDirDiagnostics = false } = {}) {
// lesson from the build side: a ceiling above the box's real memory does not
// buy a bigger run, it converts a recoverable heap error into an exit-137
// SIGKILL that carries no diagnostic at all.)
//
// ⛔ And raising it ALONE cannot buy the ledger a roomier run -- measured on
// 2026-09-03, not reasoned. `remeasureHeapCeiling` below takes the MINIMUM of
// this pin and the limit the running process actually has, so with the pin at
// 6144 and the gate started under the runner's own default the chosen ceiling
// is still 4144 -- and the `stale` arm below then refuses the run outright:
// `--re-measure` exits 1 before the first tsc ("the pin is now ABOVE the
// ceiling it claims to describe"), reproduced against a 4144 MB process. A
// raise has to hand the gate PROCESS the memory first -- a `NODE_OPTIONS` on
// the job's re-measure step -- so the pin keeps describing what the process
// really has. That is a workflow decision, not one this constant can take on
// its own; #14569 carries it.
const CI_TSC_HEAP_CEILING_MB = 4096;

/**
Expand DownExpand Up@@ -5162,6 +5218,11 @@ function selfTest() {
expect: { mb: CI_TSC_HEAP_CEILING_MB, stale: false },
},
{
// `+ 48` is the RUNNER, not a construction: the `Type Check · debt
// ledger` job reports a `heap_size_limit` of 4144 MB for its 4096 MB old
// space (measured there 2026-09-03, #14569), so this row is the shape of
// the machine whose verdict the pin exists to describe -- and the row
// above it is every box that is roomier than that one.
label: 'on a box shaped like CI the ceiling is a no-op that still names itself',
where: { heapLimitMb: CI_TSC_HEAP_CEILING_MB + 48, onCi: true },
expect: { mb: CI_TSC_HEAP_CEILING_MB, stale: false },
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Draft
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 62 additions & 1 deletion scripts/check-type-check-coverage.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -2805,10 +2805,54 @@ function countTscErrors(output, { dropRootDirDiagnostics = false } = {}) {
// with `NODE_OPTIONS` on a box under this file's own eyes), so a 4096 old space
// reports 4144 and commits the 4147.5 above it.
//
// ## Re-measured FIRST-HAND on the runner, 2026-09-03 (#14569)
//
// The bracket above is archaeology through a failed job's GC trace. #14569
// asked for a raise to 6144 to be taken on a measurement rather than on a
// typed number, so the reading was taken where the verdict is taken: inside
// the `Type Check · debt ledger` job itself, by a temporary probe step that
// emitted its numbers as `::notice` annotations (run 33708954003, job
// 100504131338, image `ubuntu24 20260831.293.1`, Node v22.23.2, 4 vCPU).
//
// the runner MemTotal 16,373,452 kB (~15.6 GiB) plus 3,145,724 kB of
// swap -- NOT the 7 GB #14569 assumed. MemAvailable at the
// point the re-measure starts: 14,329,064 kB.
// other consumers 153 processes holding 940,316 kB (~918 MB) altogether:
// Runner.Worker 144 MB, Runner.Listener 98 MB, provjobd
// 96 MB, dockerd 73 MB, containerd 43 MB. The job's steps
// are sequential, so nothing in it runs BESIDE the
// re-measure -- the ledger's tsc has the box to itself.
// this gate's own `heap_size_limit` 4144 MB with `NODE_OPTIONS` unset --
// ceiling the runner's V8 default, read directly rather than
// inferred. It confirms the 4096 MB old space the GC trace
// above could only bracket.
// the heaviest `packages/qa/http-conformance`'s TEST_DEBT program (906
// program files, 692,003 lines of definitions, 7,328,937
// instantiations) under `--extendedDiagnostics`, twice:
//
// cap 4096 Memory used 4,077,718K peak RSS 4,212,904 kB
// check 26.84s
// cap 6144 Memory used 4,420,706K peak RSS 4,545,500 kB
// check 21.90s
//
// Neither OOMs, and the pair IS the headroom finding
// #14569 asked for: handed 343 MB more heap the same
// program keeps 343 MB more live and finishes ~5s sooner,
// so under 4096 it is paying GC pressure to fit rather
// than fitting. Lowest MemAvailable seen at any point
// during either run: 10,562,192 kB.
//
// The scarce resource is therefore NOT the runner's memory -- 15.6 GiB with
// ~918 MB of it spoken for -- but V8's DEFAULT old space on that runner, which
// is 4096 MB. This constant describes that default, and as of 2026-09-03 it
// still describes it exactly. That is why the re-measure leaves it here.
//
// ⚠️ If 4096 is wrong, it is wrong DOWNWARD -- the only safe direction. This
// number's entire job is to be no HIGHER than CI's ceiling. A pin ABOVE CI's is
// worse than no pin at all: it makes local runs pass where CI still OOMs, which
// is exactly this defect with extra confidence attached.
// is exactly this defect with extra confidence attached. The 2026-09-03
// reading above is the first taken with the runner in hand rather than
// inferred from a crash, and it lands on the same 4096 from the other side.
//
// ⛔ Do not raise this to make a local measurement complete. `--re-measure`
// OOMing under this ceiling is the gate WORKING -- it is CI's failure,
Expand All@@ -2817,6 +2861,18 @@ function countTscErrors(output, { dropRootDirDiagnostics = false } = {}) {
// lesson from the build side: a ceiling above the box's real memory does not
// buy a bigger run, it converts a recoverable heap error into an exit-137
// SIGKILL that carries no diagnostic at all.)
//
// ⛔ And raising it ALONE cannot buy the ledger a roomier run -- measured on
// 2026-09-03, not reasoned. `remeasureHeapCeiling` below takes the MINIMUM of
// this pin and the limit the running process actually has, so with the pin at
// 6144 and the gate started under the runner's own default the chosen ceiling
// is still 4144 -- and the `stale` arm below then refuses the run outright:
// `--re-measure` exits 1 before the first tsc ("the pin is now ABOVE the
// ceiling it claims to describe"), reproduced against a 4144 MB process. A
// raise has to hand the gate PROCESS the memory first -- a `NODE_OPTIONS` on
// the job's re-measure step -- so the pin keeps describing what the process
// really has. That is a workflow decision, not one this constant can take on
// its own; #14569 carries it.
const CI_TSC_HEAP_CEILING_MB = 4096;

/**
Expand DownExpand Up@@ -5162,6 +5218,11 @@ function selfTest() {
expect: { mb: CI_TSC_HEAP_CEILING_MB, stale: false },
},
{
// `+ 48` is the RUNNER, not a construction: the `Type Check · debt
// ledger` job reports a `heap_size_limit` of 4144 MB for its 4096 MB old
// space (measured there 2026-09-03, #14569), so this row is the shape of
// the machine whose verdict the pin exists to describe -- and the row
// above it is every box that is roomier than that one.
label: 'on a box shaped like CI the ceiling is a no-op that still names itself',
where: { heapLimitMb: CI_TSC_HEAP_CEILING_MB + 48, onCi: true },
expect: { mb: CI_TSC_HEAP_CEILING_MB, stale: false },
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Draft
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 62 additions & 1 deletion scripts/check-type-check-coverage.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -2805,10 +2805,54 @@ function countTscErrors(output, { dropRootDirDiagnostics = false } = {}) {
// with `NODE_OPTIONS` on a box under this file's own eyes), so a 4096 old space
// reports 4144 and commits the 4147.5 above it.
//
// ## Re-measured FIRST-HAND on the runner, 2026-09-03 (#14569)
//
// The bracket above is archaeology through a failed job's GC trace. #14569
// asked for a raise to 6144 to be taken on a measurement rather than on a
// typed number, so the reading was taken where the verdict is taken: inside
// the `Type Check · debt ledger` job itself, by a temporary probe step that
// emitted its numbers as `::notice` annotations (run 33708954003, job
// 100504131338, image `ubuntu24 20260831.293.1`, Node v22.23.2, 4 vCPU).
//
// the runner MemTotal 16,373,452 kB (~15.6 GiB) plus 3,145,724 kB of
// swap -- NOT the 7 GB #14569 assumed. MemAvailable at the
// point the re-measure starts: 14,329,064 kB.
// other consumers 153 processes holding 940,316 kB (~918 MB) altogether:
// Runner.Worker 144 MB, Runner.Listener 98 MB, provjobd
// 96 MB, dockerd 73 MB, containerd 43 MB. The job's steps
// are sequential, so nothing in it runs BESIDE the
// re-measure -- the ledger's tsc has the box to itself.
// this gate's own `heap_size_limit` 4144 MB with `NODE_OPTIONS` unset --
// ceiling the runner's V8 default, read directly rather than
// inferred. It confirms the 4096 MB old space the GC trace
// above could only bracket.
// the heaviest `packages/qa/http-conformance`'s TEST_DEBT program (906
// program files, 692,003 lines of definitions, 7,328,937
// instantiations) under `--extendedDiagnostics`, twice:
//
// cap 4096 Memory used 4,077,718K peak RSS 4,212,904 kB
// check 26.84s
// cap 6144 Memory used 4,420,706K peak RSS 4,545,500 kB
// check 21.90s
//
// Neither OOMs, and the pair IS the headroom finding
// #14569 asked for: handed 343 MB more heap the same
// program keeps 343 MB more live and finishes ~5s sooner,
// so under 4096 it is paying GC pressure to fit rather
// than fitting. Lowest MemAvailable seen at any point
// during either run: 10,562,192 kB.
//
// The scarce resource is therefore NOT the runner's memory -- 15.6 GiB with
// ~918 MB of it spoken for -- but V8's DEFAULT old space on that runner, which
// is 4096 MB. This constant describes that default, and as of 2026-09-03 it
// still describes it exactly. That is why the re-measure leaves it here.
//
// ⚠️ If 4096 is wrong, it is wrong DOWNWARD -- the only safe direction. This
// number's entire job is to be no HIGHER than CI's ceiling. A pin ABOVE CI's is
// worse than no pin at all: it makes local runs pass where CI still OOMs, which
// is exactly this defect with extra confidence attached.
// is exactly this defect with extra confidence attached. The 2026-09-03
// reading above is the first taken with the runner in hand rather than
// inferred from a crash, and it lands on the same 4096 from the other side.
//
// ⛔ Do not raise this to make a local measurement complete. `--re-measure`
// OOMing under this ceiling is the gate WORKING -- it is CI's failure,
Expand All@@ -2817,6 +2861,18 @@ function countTscErrors(output, { dropRootDirDiagnostics = false } = {}) {
// lesson from the build side: a ceiling above the box's real memory does not
// buy a bigger run, it converts a recoverable heap error into an exit-137
// SIGKILL that carries no diagnostic at all.)
//
// ⛔ And raising it ALONE cannot buy the ledger a roomier run -- measured on
// 2026-09-03, not reasoned. `remeasureHeapCeiling` below takes the MINIMUM of
// this pin and the limit the running process actually has, so with the pin at
// 6144 and the gate started under the runner's own default the chosen ceiling
// is still 4144 -- and the `stale` arm below then refuses the run outright:
// `--re-measure` exits 1 before the first tsc ("the pin is now ABOVE the
// ceiling it claims to describe"), reproduced against a 4144 MB process. A
// raise has to hand the gate PROCESS the memory first -- a `NODE_OPTIONS` on
// the job's re-measure step -- so the pin keeps describing what the process
// really has. That is a workflow decision, not one this constant can take on
// its own; #14569 carries it.
const CI_TSC_HEAP_CEILING_MB = 4096;

/**
Expand DownExpand Up@@ -5162,6 +5218,11 @@ function selfTest() {
expect: { mb: CI_TSC_HEAP_CEILING_MB, stale: false },
},
{
// `+ 48` is the RUNNER, not a construction: the `Type Check · debt
// ledger` job reports a `heap_size_limit` of 4144 MB for its 4096 MB old
// space (measured there 2026-09-03, #14569), so this row is the shape of
// the machine whose verdict the pin exists to describe -- and the row
// above it is every box that is roomier than that one.
label: 'on a box shaped like CI the ceiling is a no-op that still names itself',
where: { heapLimitMb: CI_TSC_HEAP_CEILING_MB + 48, onCi: true },
expect: { mb: CI_TSC_HEAP_CEILING_MB, stale: false },
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
Draft
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 62 additions & 1 deletion scripts/check-type-check-coverage.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -2805,10 +2805,54 @@ function countTscErrors(output, { dropRootDirDiagnostics = false } = {}) {
// with `NODE_OPTIONS` on a box under this file's own eyes), so a 4096 old space
// reports 4144 and commits the 4147.5 above it.
//
// ## Re-measured FIRST-HAND on the runner, 2026-09-03 (#14569)
//
// The bracket above is archaeology through a failed job's GC trace. #14569
// asked for a raise to 6144 to be taken on a measurement rather than on a
// typed number, so the reading was taken where the verdict is taken: inside
// the `Type Check · debt ledger` job itself, by a temporary probe step that
// emitted its numbers as `::notice` annotations (run 33708954003, job
// 100504131338, image `ubuntu24 20260831.293.1`, Node v22.23.2, 4 vCPU).
//
// the runner MemTotal 16,373,452 kB (~15.6 GiB) plus 3,145,724 kB of
// swap -- NOT the 7 GB #14569 assumed. MemAvailable at the
// point the re-measure starts: 14,329,064 kB.
// other consumers 153 processes holding 940,316 kB (~918 MB) altogether:
// Runner.Worker 144 MB, Runner.Listener 98 MB, provjobd
// 96 MB, dockerd 73 MB, containerd 43 MB. The job's steps
// are sequential, so nothing in it runs BESIDE the
// re-measure -- the ledger's tsc has the box to itself.
// this gate's own `heap_size_limit` 4144 MB with `NODE_OPTIONS` unset --
// ceiling the runner's V8 default, read directly rather than
// inferred. It confirms the 4096 MB old space the GC trace
// above could only bracket.
// the heaviest `packages/qa/http-conformance`'s TEST_DEBT program (906
// program files, 692,003 lines of definitions, 7,328,937
// instantiations) under `--extendedDiagnostics`, twice:
//
// cap 4096 Memory used 4,077,718K peak RSS 4,212,904 kB
// check 26.84s
// cap 6144 Memory used 4,420,706K peak RSS 4,545,500 kB
// check 21.90s
//
// Neither OOMs, and the pair IS the headroom finding
// #14569 asked for: handed 343 MB more heap the same
// program keeps 343 MB more live and finishes ~5s sooner,
// so under 4096 it is paying GC pressure to fit rather
// than fitting. Lowest MemAvailable seen at any point
// during either run: 10,562,192 kB.
//
// The scarce resource is therefore NOT the runner's memory -- 15.6 GiB with
// ~918 MB of it spoken for -- but V8's DEFAULT old space on that runner, which
// is 4096 MB. This constant describes that default, and as of 2026-09-03 it
// still describes it exactly. That is why the re-measure leaves it here.
//
// ⚠️ If 4096 is wrong, it is wrong DOWNWARD -- the only safe direction. This
// number's entire job is to be no HIGHER than CI's ceiling. A pin ABOVE CI's is
// worse than no pin at all: it makes local runs pass where CI still OOMs, which
// is exactly this defect with extra confidence attached.
// is exactly this defect with extra confidence attached. The 2026-09-03
// reading above is the first taken with the runner in hand rather than
// inferred from a crash, and it lands on the same 4096 from the other side.
//
// ⛔ Do not raise this to make a local measurement complete. `--re-measure`
// OOMing under this ceiling is the gate WORKING -- it is CI's failure,
Expand All@@ -2817,6 +2861,18 @@ function countTscErrors(output, { dropRootDirDiagnostics = false } = {}) {
// lesson from the build side: a ceiling above the box's real memory does not
// buy a bigger run, it converts a recoverable heap error into an exit-137
// SIGKILL that carries no diagnostic at all.)
//
// ⛔ And raising it ALONE cannot buy the ledger a roomier run -- measured on
// 2026-09-03, not reasoned. `remeasureHeapCeiling` below takes the MINIMUM of
// this pin and the limit the running process actually has, so with the pin at
// 6144 and the gate started under the runner's own default the chosen ceiling
// is still 4144 -- and the `stale` arm below then refuses the run outright:
// `--re-measure` exits 1 before the first tsc ("the pin is now ABOVE the
// ceiling it claims to describe"), reproduced against a 4144 MB process. A
// raise has to hand the gate PROCESS the memory first -- a `NODE_OPTIONS` on
// the job's re-measure step -- so the pin keeps describing what the process
// really has. That is a workflow decision, not one this constant can take on
// its own; #14569 carries it.
const CI_TSC_HEAP_CEILING_MB = 4096;

/**
Expand DownExpand Up@@ -5162,6 +5218,11 @@ function selfTest() {
expect: { mb: CI_TSC_HEAP_CEILING_MB, stale: false },
},
{
// `+ 48` is the RUNNER, not a construction: the `Type Check · debt
// ledger` job reports a `heap_size_limit` of 4144 MB for its 4096 MB old
// space (measured there 2026-09-03, #14569), so this row is the shape of
// the machine whose verdict the pin exists to describe -- and the row
// above it is every box that is roomier than that one.
label: 'on a box shaped like CI the ceiling is a no-op that still names itself',
where: { heapLimitMb: CI_TSC_HEAP_CEILING_MB + 48, onCi: true },
expect: { mb: CI_TSC_HEAP_CEILING_MB, stale: false },
Expand Down
Loading