Merged
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
62 changes: 50 additions & 12 deletions .github/workflows/lint.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -239,8 +239,9 @@ jobs:
- name: Raw control-byte guard
run: pnpm check:nul-bytes

# The three shared modules the two `scripts/**` routing gates below
# DELEGATE their design arguments to (#10608). Both of those gates are
# The first three of these are the shared modules the two `scripts/**`
# routing gates below DELEGATE their design arguments to (#10608). Both of
# those gates are
# SPELLING gates by deliberate design — `check:entry-guard` enforces that
# only `scripts/invoked-as.mjs` may read `process.argv[1]`, and
# `check:parse-guard` that every TypeScript parse goes through
Expand All@@ -261,23 +262,59 @@ jobs:
# own documentation — loud — while a mask that starts OVER-masking makes
# both go quietly green over text they never read.
#
# What runs here is the self-tests, not the modules' callers: the callers
# are the two gate steps below, which already run on every PR.
# `import-prerequisite.mjs` is the FOURTH module here, from a different
# family and for the same reason (#14007). It is not one of the #10608
# delegates — it is the shared `PREREQUISITE NOT MET` frame that 45 gates
# IMPORT (42 under `scripts/**`, 3 under `packages/lint/scripts/**`), and
# its `--self-test` is the ONE place the inherited advisory is pinned. The
# module says so itself: *"Pinned HERE and nowhere else, because this is
# the one copy 45 importers print."* Since #13983 the same self-test also
# pins the exit-code CLASS those 45 gates return for an unmet prerequisite
# (`EXIT_PREREQUISITE_NOT_MET`, distinct from a gate's own findings exit).
# Nothing ran it: `git grep -n "import-prerequisite" -- .github/workflows
# package.json` was EMPTY, so 60 cases executed only when a human or an
# agent typed the command by hand.
#
# ⛔ NOT a hole in `check:self-test-wired`, whose green is correct by its
# own definition: its population is the scripts CI RUNS, and this file is a
# MODULE no workflow can invoke, so it sat in that gate's remainder by
# construction. The blast radius and the population rule point in opposite
# directions here: the file with the largest inheritance surface in the
# farm is the one shape the wiring gate cannot see. Naming it in this step
# is what moves it INTO that population (161 -> 162 scripts CI runs that
# ship a `--self-test`), and it is the smaller of the two remedies — the
# other being to widen the gate to a transitive closure, which #14007
# explicitly does not ask for. ⛔ It is also not a licence to sweep the
# rest of that remainder from here; that is a separate card.
#
# What runs here is the self-tests, not the modules' callers: for the first
# three the callers are the two gate steps below, which already run on
# every PR; for `import-prerequisite` the callers are the 45 importing
# gates, whose ordinary runs take the branch where the dependency IS
# present and therefore observe none of what the self-test pins.
# Invoked as `node` rather than through `pnpm check:*`: see the GATE
# INVOCATION IDIOM note at the top of this file.
# `ts-parse` spawns ~20 real node children (~10 s measured, and the spawns
# are the point — they pin that a caller's try/catch cannot swallow the
# refusal); the other two are in-process fixtures, ~0.5 s combined.
# refusal); the other three are in-process fixtures, ~0.6 s combined.
#
# ⭐ Collected rather than sequenced, for the reason spelled out at the
# `Shallow-history guard self-tests` step below (#10814): under `bash -e` a
# bare sequence stops at the first failure, so a red `ts-parse` would leave
# the entry-predicate and comment-mask self-tests UNRUN while the log shows
# only the one failure. `ts-parse` is both the slowest of the three and the
# one that spawns real children, so it is the likeliest to be red —
# precisely the masking direction. The three modules are independent of one
# another, so collecting loses nothing.
- name: scripts/ shared-module self-tests (parse · entry predicate · comment mask)
# the entry-predicate, comment-mask and prerequisite-frame self-tests UNRUN
# while the log shows only the one failure. `ts-parse` is both the slowest
# of the four and the one that spawns real children, so it is the likeliest
# to be red — precisely the masking direction. The four modules are
# independent of one another, so collecting loses nothing.
#
# ⭐ Collected is also why the fourth leg is HERE rather than in a step of
# its own: Actions skips a job's remaining steps once a step fails, so a
# standalone step further down this job would be masked by every gate above
# it — the same defect one level up, and the split `check-step-collectors`
# explicitly refuses as a remedy. Inside this block the frame's self-test
# prints its own verdict whatever the other three do, and it does so early
# in the job.
- name: scripts/ shared-module self-tests (parse · entry predicate · comment mask · prerequisite frame)
run: |
# Tolerate-and-collect (#10814) — see the note above this step. Each
# self-test runs unconditionally and prints its own verdict; the step
Expand All@@ -300,13 +337,14 @@ jobs:
run_self_test node scripts/ts-parse.mjs --self-test
run_self_test node scripts/invoked-as.mjs --self-test
run_self_test node scripts/js-comment-mask.mjs --self-test
run_self_test node scripts/import-prerequisite.mjs --self-test
if [ -n "$failed" ]; then
echo ""
echo "scripts/ shared-module self-tests — the following FAILED:"
printf "%s" "$failed"
exit 1
fi
echo "scripts/ shared-module self-tests — all three ran and passed"
echo "scripts/ shared-module self-tests — all four ran and passed"

# Every `scripts/**` entry guard goes through ONE predicate (#10086).
# The hand-typed forms of "did node run me, or did someone import me?"
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
Merged
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
62 changes: 50 additions & 12 deletions .github/workflows/lint.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -239,8 +239,9 @@ jobs:
- name: Raw control-byte guard
run: pnpm check:nul-bytes

# The three shared modules the two `scripts/**` routing gates below
# DELEGATE their design arguments to (#10608). Both of those gates are
# The first three of these are the shared modules the two `scripts/**`
# routing gates below DELEGATE their design arguments to (#10608). Both of
# those gates are
# SPELLING gates by deliberate design — `check:entry-guard` enforces that
# only `scripts/invoked-as.mjs` may read `process.argv[1]`, and
# `check:parse-guard` that every TypeScript parse goes through
Expand All@@ -261,23 +262,59 @@ jobs:
# own documentation — loud — while a mask that starts OVER-masking makes
# both go quietly green over text they never read.
#
# What runs here is the self-tests, not the modules' callers: the callers
# are the two gate steps below, which already run on every PR.
# `import-prerequisite.mjs` is the FOURTH module here, from a different
# family and for the same reason (#14007). It is not one of the #10608
# delegates — it is the shared `PREREQUISITE NOT MET` frame that 45 gates
# IMPORT (42 under `scripts/**`, 3 under `packages/lint/scripts/**`), and
# its `--self-test` is the ONE place the inherited advisory is pinned. The
# module says so itself: *"Pinned HERE and nowhere else, because this is
# the one copy 45 importers print."* Since #13983 the same self-test also
# pins the exit-code CLASS those 45 gates return for an unmet prerequisite
# (`EXIT_PREREQUISITE_NOT_MET`, distinct from a gate's own findings exit).
# Nothing ran it: `git grep -n "import-prerequisite" -- .github/workflows
# package.json` was EMPTY, so 60 cases executed only when a human or an
# agent typed the command by hand.
#
# ⛔ NOT a hole in `check:self-test-wired`, whose green is correct by its
# own definition: its population is the scripts CI RUNS, and this file is a
# MODULE no workflow can invoke, so it sat in that gate's remainder by
# construction. The blast radius and the population rule point in opposite
# directions here: the file with the largest inheritance surface in the
# farm is the one shape the wiring gate cannot see. Naming it in this step
# is what moves it INTO that population (161 -> 162 scripts CI runs that
# ship a `--self-test`), and it is the smaller of the two remedies — the
# other being to widen the gate to a transitive closure, which #14007
# explicitly does not ask for. ⛔ It is also not a licence to sweep the
# rest of that remainder from here; that is a separate card.
#
# What runs here is the self-tests, not the modules' callers: for the first
# three the callers are the two gate steps below, which already run on
# every PR; for `import-prerequisite` the callers are the 45 importing
# gates, whose ordinary runs take the branch where the dependency IS
# present and therefore observe none of what the self-test pins.
# Invoked as `node` rather than through `pnpm check:*`: see the GATE
# INVOCATION IDIOM note at the top of this file.
# `ts-parse` spawns ~20 real node children (~10 s measured, and the spawns
# are the point — they pin that a caller's try/catch cannot swallow the
# refusal); the other two are in-process fixtures, ~0.5 s combined.
# refusal); the other three are in-process fixtures, ~0.6 s combined.
#
# ⭐ Collected rather than sequenced, for the reason spelled out at the
# `Shallow-history guard self-tests` step below (#10814): under `bash -e` a
# bare sequence stops at the first failure, so a red `ts-parse` would leave
# the entry-predicate and comment-mask self-tests UNRUN while the log shows
# only the one failure. `ts-parse` is both the slowest of the three and the
# one that spawns real children, so it is the likeliest to be red —
# precisely the masking direction. The three modules are independent of one
# another, so collecting loses nothing.
- name: scripts/ shared-module self-tests (parse · entry predicate · comment mask)
# the entry-predicate, comment-mask and prerequisite-frame self-tests UNRUN
# while the log shows only the one failure. `ts-parse` is both the slowest
# of the four and the one that spawns real children, so it is the likeliest
# to be red — precisely the masking direction. The four modules are
# independent of one another, so collecting loses nothing.
#
# ⭐ Collected is also why the fourth leg is HERE rather than in a step of
# its own: Actions skips a job's remaining steps once a step fails, so a
# standalone step further down this job would be masked by every gate above
# it — the same defect one level up, and the split `check-step-collectors`
# explicitly refuses as a remedy. Inside this block the frame's self-test
# prints its own verdict whatever the other three do, and it does so early
# in the job.
- name: scripts/ shared-module self-tests (parse · entry predicate · comment mask · prerequisite frame)
run: |
# Tolerate-and-collect (#10814) — see the note above this step. Each
# self-test runs unconditionally and prints its own verdict; the step
Expand All@@ -300,13 +337,14 @@ jobs:
run_self_test node scripts/ts-parse.mjs --self-test
run_self_test node scripts/invoked-as.mjs --self-test
run_self_test node scripts/js-comment-mask.mjs --self-test
run_self_test node scripts/import-prerequisite.mjs --self-test
if [ -n "$failed" ]; then
echo ""
echo "scripts/ shared-module self-tests — the following FAILED:"
printf "%s" "$failed"
exit 1
fi
echo "scripts/ shared-module self-tests — all three ran and passed"
echo "scripts/ shared-module self-tests — all four ran and passed"

# Every `scripts/**` entry guard goes through ONE predicate (#10086).
# The hand-typed forms of "did node run me, or did someone import me?"
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
Merged
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
62 changes: 50 additions & 12 deletions .github/workflows/lint.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -239,8 +239,9 @@ jobs:
- name: Raw control-byte guard
run: pnpm check:nul-bytes

# The three shared modules the two `scripts/**` routing gates below
# DELEGATE their design arguments to (#10608). Both of those gates are
# The first three of these are the shared modules the two `scripts/**`
# routing gates below DELEGATE their design arguments to (#10608). Both of
# those gates are
# SPELLING gates by deliberate design — `check:entry-guard` enforces that
# only `scripts/invoked-as.mjs` may read `process.argv[1]`, and
# `check:parse-guard` that every TypeScript parse goes through
Expand All@@ -261,23 +262,59 @@ jobs:
# own documentation — loud — while a mask that starts OVER-masking makes
# both go quietly green over text they never read.
#
# What runs here is the self-tests, not the modules' callers: the callers
# are the two gate steps below, which already run on every PR.
# `import-prerequisite.mjs` is the FOURTH module here, from a different
# family and for the same reason (#14007). It is not one of the #10608
# delegates — it is the shared `PREREQUISITE NOT MET` frame that 45 gates
# IMPORT (42 under `scripts/**`, 3 under `packages/lint/scripts/**`), and
# its `--self-test` is the ONE place the inherited advisory is pinned. The
# module says so itself: *"Pinned HERE and nowhere else, because this is
# the one copy 45 importers print."* Since #13983 the same self-test also
# pins the exit-code CLASS those 45 gates return for an unmet prerequisite
# (`EXIT_PREREQUISITE_NOT_MET`, distinct from a gate's own findings exit).
# Nothing ran it: `git grep -n "import-prerequisite" -- .github/workflows
# package.json` was EMPTY, so 60 cases executed only when a human or an
# agent typed the command by hand.
#
# ⛔ NOT a hole in `check:self-test-wired`, whose green is correct by its
# own definition: its population is the scripts CI RUNS, and this file is a
# MODULE no workflow can invoke, so it sat in that gate's remainder by
# construction. The blast radius and the population rule point in opposite
# directions here: the file with the largest inheritance surface in the
# farm is the one shape the wiring gate cannot see. Naming it in this step
# is what moves it INTO that population (161 -> 162 scripts CI runs that
# ship a `--self-test`), and it is the smaller of the two remedies — the
# other being to widen the gate to a transitive closure, which #14007
# explicitly does not ask for. ⛔ It is also not a licence to sweep the
# rest of that remainder from here; that is a separate card.
#
# What runs here is the self-tests, not the modules' callers: for the first
# three the callers are the two gate steps below, which already run on
# every PR; for `import-prerequisite` the callers are the 45 importing
# gates, whose ordinary runs take the branch where the dependency IS
# present and therefore observe none of what the self-test pins.
# Invoked as `node` rather than through `pnpm check:*`: see the GATE
# INVOCATION IDIOM note at the top of this file.
# `ts-parse` spawns ~20 real node children (~10 s measured, and the spawns
# are the point — they pin that a caller's try/catch cannot swallow the
# refusal); the other two are in-process fixtures, ~0.5 s combined.
# refusal); the other three are in-process fixtures, ~0.6 s combined.
#
# ⭐ Collected rather than sequenced, for the reason spelled out at the
# `Shallow-history guard self-tests` step below (#10814): under `bash -e` a
# bare sequence stops at the first failure, so a red `ts-parse` would leave
# the entry-predicate and comment-mask self-tests UNRUN while the log shows
# only the one failure. `ts-parse` is both the slowest of the three and the
# one that spawns real children, so it is the likeliest to be red —
# precisely the masking direction. The three modules are independent of one
# another, so collecting loses nothing.
- name: scripts/ shared-module self-tests (parse · entry predicate · comment mask)
# the entry-predicate, comment-mask and prerequisite-frame self-tests UNRUN
# while the log shows only the one failure. `ts-parse` is both the slowest
# of the four and the one that spawns real children, so it is the likeliest
# to be red — precisely the masking direction. The four modules are
# independent of one another, so collecting loses nothing.
#
# ⭐ Collected is also why the fourth leg is HERE rather than in a step of
# its own: Actions skips a job's remaining steps once a step fails, so a
# standalone step further down this job would be masked by every gate above
# it — the same defect one level up, and the split `check-step-collectors`
# explicitly refuses as a remedy. Inside this block the frame's self-test
# prints its own verdict whatever the other three do, and it does so early
# in the job.
- name: scripts/ shared-module self-tests (parse · entry predicate · comment mask · prerequisite frame)
run: |
# Tolerate-and-collect (#10814) — see the note above this step. Each
# self-test runs unconditionally and prints its own verdict; the step
Expand All@@ -300,13 +337,14 @@ jobs:
run_self_test node scripts/ts-parse.mjs --self-test
run_self_test node scripts/invoked-as.mjs --self-test
run_self_test node scripts/js-comment-mask.mjs --self-test
run_self_test node scripts/import-prerequisite.mjs --self-test
if [ -n "$failed" ]; then
echo ""
echo "scripts/ shared-module self-tests — the following FAILED:"
printf "%s" "$failed"
exit 1
fi
echo "scripts/ shared-module self-tests — all three ran and passed"
echo "scripts/ shared-module self-tests — all four ran and passed"

# Every `scripts/**` entry guard goes through ONE predicate (#10086).
# The hand-typed forms of "did node run me, or did someone import me?"
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
Merged
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
62 changes: 50 additions & 12 deletions .github/workflows/lint.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -239,8 +239,9 @@ jobs:
- name: Raw control-byte guard
run: pnpm check:nul-bytes

# The three shared modules the two `scripts/**` routing gates below
# DELEGATE their design arguments to (#10608). Both of those gates are
# The first three of these are the shared modules the two `scripts/**`
# routing gates below DELEGATE their design arguments to (#10608). Both of
# those gates are
# SPELLING gates by deliberate design — `check:entry-guard` enforces that
# only `scripts/invoked-as.mjs` may read `process.argv[1]`, and
# `check:parse-guard` that every TypeScript parse goes through
Expand All@@ -261,23 +262,59 @@ jobs:
# own documentation — loud — while a mask that starts OVER-masking makes
# both go quietly green over text they never read.
#
# What runs here is the self-tests, not the modules' callers: the callers
# are the two gate steps below, which already run on every PR.
# `import-prerequisite.mjs` is the FOURTH module here, from a different
# family and for the same reason (#14007). It is not one of the #10608
# delegates — it is the shared `PREREQUISITE NOT MET` frame that 45 gates
# IMPORT (42 under `scripts/**`, 3 under `packages/lint/scripts/**`), and
# its `--self-test` is the ONE place the inherited advisory is pinned. The
# module says so itself: *"Pinned HERE and nowhere else, because this is
# the one copy 45 importers print."* Since #13983 the same self-test also
# pins the exit-code CLASS those 45 gates return for an unmet prerequisite
# (`EXIT_PREREQUISITE_NOT_MET`, distinct from a gate's own findings exit).
# Nothing ran it: `git grep -n "import-prerequisite" -- .github/workflows
# package.json` was EMPTY, so 60 cases executed only when a human or an
# agent typed the command by hand.
#
# ⛔ NOT a hole in `check:self-test-wired`, whose green is correct by its
# own definition: its population is the scripts CI RUNS, and this file is a
# MODULE no workflow can invoke, so it sat in that gate's remainder by
# construction. The blast radius and the population rule point in opposite
# directions here: the file with the largest inheritance surface in the
# farm is the one shape the wiring gate cannot see. Naming it in this step
# is what moves it INTO that population (161 -> 162 scripts CI runs that
# ship a `--self-test`), and it is the smaller of the two remedies — the
# other being to widen the gate to a transitive closure, which #14007
# explicitly does not ask for. ⛔ It is also not a licence to sweep the
# rest of that remainder from here; that is a separate card.
#
# What runs here is the self-tests, not the modules' callers: for the first
# three the callers are the two gate steps below, which already run on
# every PR; for `import-prerequisite` the callers are the 45 importing
# gates, whose ordinary runs take the branch where the dependency IS
# present and therefore observe none of what the self-test pins.
# Invoked as `node` rather than through `pnpm check:*`: see the GATE
# INVOCATION IDIOM note at the top of this file.
# `ts-parse` spawns ~20 real node children (~10 s measured, and the spawns
# are the point — they pin that a caller's try/catch cannot swallow the
# refusal); the other two are in-process fixtures, ~0.5 s combined.
# refusal); the other three are in-process fixtures, ~0.6 s combined.
#
# ⭐ Collected rather than sequenced, for the reason spelled out at the
# `Shallow-history guard self-tests` step below (#10814): under `bash -e` a
# bare sequence stops at the first failure, so a red `ts-parse` would leave
# the entry-predicate and comment-mask self-tests UNRUN while the log shows
# only the one failure. `ts-parse` is both the slowest of the three and the
# one that spawns real children, so it is the likeliest to be red —
# precisely the masking direction. The three modules are independent of one
# another, so collecting loses nothing.
- name: scripts/ shared-module self-tests (parse · entry predicate · comment mask)
# the entry-predicate, comment-mask and prerequisite-frame self-tests UNRUN
# while the log shows only the one failure. `ts-parse` is both the slowest
# of the four and the one that spawns real children, so it is the likeliest
# to be red — precisely the masking direction. The four modules are
# independent of one another, so collecting loses nothing.
#
# ⭐ Collected is also why the fourth leg is HERE rather than in a step of
# its own: Actions skips a job's remaining steps once a step fails, so a
# standalone step further down this job would be masked by every gate above
# it — the same defect one level up, and the split `check-step-collectors`
# explicitly refuses as a remedy. Inside this block the frame's self-test
# prints its own verdict whatever the other three do, and it does so early
# in the job.
- name: scripts/ shared-module self-tests (parse · entry predicate · comment mask · prerequisite frame)
run: |
# Tolerate-and-collect (#10814) — see the note above this step. Each
# self-test runs unconditionally and prints its own verdict; the step
Expand All@@ -300,13 +337,14 @@ jobs:
run_self_test node scripts/ts-parse.mjs --self-test
run_self_test node scripts/invoked-as.mjs --self-test
run_self_test node scripts/js-comment-mask.mjs --self-test
run_self_test node scripts/import-prerequisite.mjs --self-test
if [ -n "$failed" ]; then
echo ""
echo "scripts/ shared-module self-tests — the following FAILED:"
printf "%s" "$failed"
exit 1
fi
echo "scripts/ shared-module self-tests — all three ran and passed"
echo "scripts/ shared-module self-tests — all four ran and passed"

# Every `scripts/**` entry guard goes through ONE predicate (#10086).
# The hand-typed forms of "did node run me, or did someone import me?"
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
Merged
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
62 changes: 50 additions & 12 deletions .github/workflows/lint.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -239,8 +239,9 @@ jobs:
- name: Raw control-byte guard
run: pnpm check:nul-bytes

# The three shared modules the two `scripts/**` routing gates below
# DELEGATE their design arguments to (#10608). Both of those gates are
# The first three of these are the shared modules the two `scripts/**`
# routing gates below DELEGATE their design arguments to (#10608). Both of
# those gates are
# SPELLING gates by deliberate design — `check:entry-guard` enforces that
# only `scripts/invoked-as.mjs` may read `process.argv[1]`, and
# `check:parse-guard` that every TypeScript parse goes through
Expand All@@ -261,23 +262,59 @@ jobs:
# own documentation — loud — while a mask that starts OVER-masking makes
# both go quietly green over text they never read.
#
# What runs here is the self-tests, not the modules' callers: the callers
# are the two gate steps below, which already run on every PR.
# `import-prerequisite.mjs` is the FOURTH module here, from a different
# family and for the same reason (#14007). It is not one of the #10608
# delegates — it is the shared `PREREQUISITE NOT MET` frame that 45 gates
# IMPORT (42 under `scripts/**`, 3 under `packages/lint/scripts/**`), and
# its `--self-test` is the ONE place the inherited advisory is pinned. The
# module says so itself: *"Pinned HERE and nowhere else, because this is
# the one copy 45 importers print."* Since #13983 the same self-test also
# pins the exit-code CLASS those 45 gates return for an unmet prerequisite
# (`EXIT_PREREQUISITE_NOT_MET`, distinct from a gate's own findings exit).
# Nothing ran it: `git grep -n "import-prerequisite" -- .github/workflows
# package.json` was EMPTY, so 60 cases executed only when a human or an
# agent typed the command by hand.
#
# ⛔ NOT a hole in `check:self-test-wired`, whose green is correct by its
# own definition: its population is the scripts CI RUNS, and this file is a
# MODULE no workflow can invoke, so it sat in that gate's remainder by
# construction. The blast radius and the population rule point in opposite
# directions here: the file with the largest inheritance surface in the
# farm is the one shape the wiring gate cannot see. Naming it in this step
# is what moves it INTO that population (161 -> 162 scripts CI runs that
# ship a `--self-test`), and it is the smaller of the two remedies — the
# other being to widen the gate to a transitive closure, which #14007
# explicitly does not ask for. ⛔ It is also not a licence to sweep the
# rest of that remainder from here; that is a separate card.
#
# What runs here is the self-tests, not the modules' callers: for the first
# three the callers are the two gate steps below, which already run on
# every PR; for `import-prerequisite` the callers are the 45 importing
# gates, whose ordinary runs take the branch where the dependency IS
# present and therefore observe none of what the self-test pins.
# Invoked as `node` rather than through `pnpm check:*`: see the GATE
# INVOCATION IDIOM note at the top of this file.
# `ts-parse` spawns ~20 real node children (~10 s measured, and the spawns
# are the point — they pin that a caller's try/catch cannot swallow the
# refusal); the other two are in-process fixtures, ~0.5 s combined.
# refusal); the other three are in-process fixtures, ~0.6 s combined.
#
# ⭐ Collected rather than sequenced, for the reason spelled out at the
# `Shallow-history guard self-tests` step below (#10814): under `bash -e` a
# bare sequence stops at the first failure, so a red `ts-parse` would leave
# the entry-predicate and comment-mask self-tests UNRUN while the log shows
# only the one failure. `ts-parse` is both the slowest of the three and the
# one that spawns real children, so it is the likeliest to be red —
# precisely the masking direction. The three modules are independent of one
# another, so collecting loses nothing.
- name: scripts/ shared-module self-tests (parse · entry predicate · comment mask)
# the entry-predicate, comment-mask and prerequisite-frame self-tests UNRUN
# while the log shows only the one failure. `ts-parse` is both the slowest
# of the four and the one that spawns real children, so it is the likeliest
# to be red — precisely the masking direction. The four modules are
# independent of one another, so collecting loses nothing.
#
# ⭐ Collected is also why the fourth leg is HERE rather than in a step of
# its own: Actions skips a job's remaining steps once a step fails, so a
# standalone step further down this job would be masked by every gate above
# it — the same defect one level up, and the split `check-step-collectors`
# explicitly refuses as a remedy. Inside this block the frame's self-test
# prints its own verdict whatever the other three do, and it does so early
# in the job.
- name: scripts/ shared-module self-tests (parse · entry predicate · comment mask · prerequisite frame)
run: |
# Tolerate-and-collect (#10814) — see the note above this step. Each
# self-test runs unconditionally and prints its own verdict; the step
Expand All@@ -300,13 +337,14 @@ jobs:
run_self_test node scripts/ts-parse.mjs --self-test
run_self_test node scripts/invoked-as.mjs --self-test
run_self_test node scripts/js-comment-mask.mjs --self-test
run_self_test node scripts/import-prerequisite.mjs --self-test
if [ -n "$failed" ]; then
echo ""
echo "scripts/ shared-module self-tests — the following FAILED:"
printf "%s" "$failed"
exit 1
fi
echo "scripts/ shared-module self-tests — all three ran and passed"
echo "scripts/ shared-module self-tests — all four ran and passed"

# Every `scripts/**` entry guard goes through ONE predicate (#10086).
# The hand-typed forms of "did node run me, or did someone import me?"
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
Merged
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
62 changes: 50 additions & 12 deletions .github/workflows/lint.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -239,8 +239,9 @@ jobs:
- name: Raw control-byte guard
run: pnpm check:nul-bytes

# The three shared modules the two `scripts/**` routing gates below
# DELEGATE their design arguments to (#10608). Both of those gates are
# The first three of these are the shared modules the two `scripts/**`
# routing gates below DELEGATE their design arguments to (#10608). Both of
# those gates are
# SPELLING gates by deliberate design — `check:entry-guard` enforces that
# only `scripts/invoked-as.mjs` may read `process.argv[1]`, and
# `check:parse-guard` that every TypeScript parse goes through
Expand All@@ -261,23 +262,59 @@ jobs:
# own documentation — loud — while a mask that starts OVER-masking makes
# both go quietly green over text they never read.
#
# What runs here is the self-tests, not the modules' callers: the callers
# are the two gate steps below, which already run on every PR.
# `import-prerequisite.mjs` is the FOURTH module here, from a different
# family and for the same reason (#14007). It is not one of the #10608
# delegates — it is the shared `PREREQUISITE NOT MET` frame that 45 gates
# IMPORT (42 under `scripts/**`, 3 under `packages/lint/scripts/**`), and
# its `--self-test` is the ONE place the inherited advisory is pinned. The
# module says so itself: *"Pinned HERE and nowhere else, because this is
# the one copy 45 importers print."* Since #13983 the same self-test also
# pins the exit-code CLASS those 45 gates return for an unmet prerequisite
# (`EXIT_PREREQUISITE_NOT_MET`, distinct from a gate's own findings exit).
# Nothing ran it: `git grep -n "import-prerequisite" -- .github/workflows
# package.json` was EMPTY, so 60 cases executed only when a human or an
# agent typed the command by hand.
#
# ⛔ NOT a hole in `check:self-test-wired`, whose green is correct by its
# own definition: its population is the scripts CI RUNS, and this file is a
# MODULE no workflow can invoke, so it sat in that gate's remainder by
# construction. The blast radius and the population rule point in opposite
# directions here: the file with the largest inheritance surface in the
# farm is the one shape the wiring gate cannot see. Naming it in this step
# is what moves it INTO that population (161 -> 162 scripts CI runs that
# ship a `--self-test`), and it is the smaller of the two remedies — the
# other being to widen the gate to a transitive closure, which #14007
# explicitly does not ask for. ⛔ It is also not a licence to sweep the
# rest of that remainder from here; that is a separate card.
#
# What runs here is the self-tests, not the modules' callers: for the first
# three the callers are the two gate steps below, which already run on
# every PR; for `import-prerequisite` the callers are the 45 importing
# gates, whose ordinary runs take the branch where the dependency IS
# present and therefore observe none of what the self-test pins.
# Invoked as `node` rather than through `pnpm check:*`: see the GATE
# INVOCATION IDIOM note at the top of this file.
# `ts-parse` spawns ~20 real node children (~10 s measured, and the spawns
# are the point — they pin that a caller's try/catch cannot swallow the
# refusal); the other two are in-process fixtures, ~0.5 s combined.
# refusal); the other three are in-process fixtures, ~0.6 s combined.
#
# ⭐ Collected rather than sequenced, for the reason spelled out at the
# `Shallow-history guard self-tests` step below (#10814): under `bash -e` a
# bare sequence stops at the first failure, so a red `ts-parse` would leave
# the entry-predicate and comment-mask self-tests UNRUN while the log shows
# only the one failure. `ts-parse` is both the slowest of the three and the
# one that spawns real children, so it is the likeliest to be red —
# precisely the masking direction. The three modules are independent of one
# another, so collecting loses nothing.
- name: scripts/ shared-module self-tests (parse · entry predicate · comment mask)
# the entry-predicate, comment-mask and prerequisite-frame self-tests UNRUN
# while the log shows only the one failure. `ts-parse` is both the slowest
# of the four and the one that spawns real children, so it is the likeliest
# to be red — precisely the masking direction. The four modules are
# independent of one another, so collecting loses nothing.
#
# ⭐ Collected is also why the fourth leg is HERE rather than in a step of
# its own: Actions skips a job's remaining steps once a step fails, so a
# standalone step further down this job would be masked by every gate above
# it — the same defect one level up, and the split `check-step-collectors`
# explicitly refuses as a remedy. Inside this block the frame's self-test
# prints its own verdict whatever the other three do, and it does so early
# in the job.
- name: scripts/ shared-module self-tests (parse · entry predicate · comment mask · prerequisite frame)
run: |
# Tolerate-and-collect (#10814) — see the note above this step. Each
# self-test runs unconditionally and prints its own verdict; the step
Expand All@@ -300,13 +337,14 @@ jobs:
run_self_test node scripts/ts-parse.mjs --self-test
run_self_test node scripts/invoked-as.mjs --self-test
run_self_test node scripts/js-comment-mask.mjs --self-test
run_self_test node scripts/import-prerequisite.mjs --self-test
if [ -n "$failed" ]; then
echo ""
echo "scripts/ shared-module self-tests — the following FAILED:"
printf "%s" "$failed"
exit 1
fi
echo "scripts/ shared-module self-tests — all three ran and passed"
echo "scripts/ shared-module self-tests — all four ran and passed"

# Every `scripts/**` entry guard goes through ONE predicate (#10086).
# The hand-typed forms of "did node run me, or did someone import me?"
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
Merged
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
62 changes: 50 additions & 12 deletions .github/workflows/lint.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -239,8 +239,9 @@ jobs:
- name: Raw control-byte guard
run: pnpm check:nul-bytes

# The three shared modules the two `scripts/**` routing gates below
# DELEGATE their design arguments to (#10608). Both of those gates are
# The first three of these are the shared modules the two `scripts/**`
# routing gates below DELEGATE their design arguments to (#10608). Both of
# those gates are
# SPELLING gates by deliberate design — `check:entry-guard` enforces that
# only `scripts/invoked-as.mjs` may read `process.argv[1]`, and
# `check:parse-guard` that every TypeScript parse goes through
Expand All@@ -261,23 +262,59 @@ jobs:
# own documentation — loud — while a mask that starts OVER-masking makes
# both go quietly green over text they never read.
#
# What runs here is the self-tests, not the modules' callers: the callers
# are the two gate steps below, which already run on every PR.
# `import-prerequisite.mjs` is the FOURTH module here, from a different
# family and for the same reason (#14007). It is not one of the #10608
# delegates — it is the shared `PREREQUISITE NOT MET` frame that 45 gates
# IMPORT (42 under `scripts/**`, 3 under `packages/lint/scripts/**`), and
# its `--self-test` is the ONE place the inherited advisory is pinned. The
# module says so itself: *"Pinned HERE and nowhere else, because this is
# the one copy 45 importers print."* Since #13983 the same self-test also
# pins the exit-code CLASS those 45 gates return for an unmet prerequisite
# (`EXIT_PREREQUISITE_NOT_MET`, distinct from a gate's own findings exit).
# Nothing ran it: `git grep -n "import-prerequisite" -- .github/workflows
# package.json` was EMPTY, so 60 cases executed only when a human or an
# agent typed the command by hand.
#
# ⛔ NOT a hole in `check:self-test-wired`, whose green is correct by its
# own definition: its population is the scripts CI RUNS, and this file is a
# MODULE no workflow can invoke, so it sat in that gate's remainder by
# construction. The blast radius and the population rule point in opposite
# directions here: the file with the largest inheritance surface in the
# farm is the one shape the wiring gate cannot see. Naming it in this step
# is what moves it INTO that population (161 -> 162 scripts CI runs that
# ship a `--self-test`), and it is the smaller of the two remedies — the
# other being to widen the gate to a transitive closure, which #14007
# explicitly does not ask for. ⛔ It is also not a licence to sweep the
# rest of that remainder from here; that is a separate card.
#
# What runs here is the self-tests, not the modules' callers: for the first
# three the callers are the two gate steps below, which already run on
# every PR; for `import-prerequisite` the callers are the 45 importing
# gates, whose ordinary runs take the branch where the dependency IS
# present and therefore observe none of what the self-test pins.
# Invoked as `node` rather than through `pnpm check:*`: see the GATE
# INVOCATION IDIOM note at the top of this file.
# `ts-parse` spawns ~20 real node children (~10 s measured, and the spawns
# are the point — they pin that a caller's try/catch cannot swallow the
# refusal); the other two are in-process fixtures, ~0.5 s combined.
# refusal); the other three are in-process fixtures, ~0.6 s combined.
#
# ⭐ Collected rather than sequenced, for the reason spelled out at the
# `Shallow-history guard self-tests` step below (#10814): under `bash -e` a
# bare sequence stops at the first failure, so a red `ts-parse` would leave
# the entry-predicate and comment-mask self-tests UNRUN while the log shows
# only the one failure. `ts-parse` is both the slowest of the three and the
# one that spawns real children, so it is the likeliest to be red —
# precisely the masking direction. The three modules are independent of one
# another, so collecting loses nothing.
- name: scripts/ shared-module self-tests (parse · entry predicate · comment mask)
# the entry-predicate, comment-mask and prerequisite-frame self-tests UNRUN
# while the log shows only the one failure. `ts-parse` is both the slowest
# of the four and the one that spawns real children, so it is the likeliest
# to be red — precisely the masking direction. The four modules are
# independent of one another, so collecting loses nothing.
#
# ⭐ Collected is also why the fourth leg is HERE rather than in a step of
# its own: Actions skips a job's remaining steps once a step fails, so a
# standalone step further down this job would be masked by every gate above
# it — the same defect one level up, and the split `check-step-collectors`
# explicitly refuses as a remedy. Inside this block the frame's self-test
# prints its own verdict whatever the other three do, and it does so early
# in the job.
- name: scripts/ shared-module self-tests (parse · entry predicate · comment mask · prerequisite frame)
run: |
# Tolerate-and-collect (#10814) — see the note above this step. Each
# self-test runs unconditionally and prints its own verdict; the step
Expand All@@ -300,13 +337,14 @@ jobs:
run_self_test node scripts/ts-parse.mjs --self-test
run_self_test node scripts/invoked-as.mjs --self-test
run_self_test node scripts/js-comment-mask.mjs --self-test
run_self_test node scripts/import-prerequisite.mjs --self-test
if [ -n "$failed" ]; then
echo ""
echo "scripts/ shared-module self-tests — the following FAILED:"
printf "%s" "$failed"
exit 1
fi
echo "scripts/ shared-module self-tests — all three ran and passed"
echo "scripts/ shared-module self-tests — all four ran and passed"

# Every `scripts/**` entry guard goes through ONE predicate (#10086).
# The hand-typed forms of "did node run me, or did someone import me?"
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
Merged
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
62 changes: 50 additions & 12 deletions .github/workflows/lint.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -239,8 +239,9 @@ jobs:
- name: Raw control-byte guard
run: pnpm check:nul-bytes

# The three shared modules the two `scripts/**` routing gates below
# DELEGATE their design arguments to (#10608). Both of those gates are
# The first three of these are the shared modules the two `scripts/**`
# routing gates below DELEGATE their design arguments to (#10608). Both of
# those gates are
# SPELLING gates by deliberate design — `check:entry-guard` enforces that
# only `scripts/invoked-as.mjs` may read `process.argv[1]`, and
# `check:parse-guard` that every TypeScript parse goes through
Expand All@@ -261,23 +262,59 @@ jobs:
# own documentation — loud — while a mask that starts OVER-masking makes
# both go quietly green over text they never read.
#
# What runs here is the self-tests, not the modules' callers: the callers
# are the two gate steps below, which already run on every PR.
# `import-prerequisite.mjs` is the FOURTH module here, from a different
# family and for the same reason (#14007). It is not one of the #10608
# delegates — it is the shared `PREREQUISITE NOT MET` frame that 45 gates
# IMPORT (42 under `scripts/**`, 3 under `packages/lint/scripts/**`), and
# its `--self-test` is the ONE place the inherited advisory is pinned. The
# module says so itself: *"Pinned HERE and nowhere else, because this is
# the one copy 45 importers print."* Since #13983 the same self-test also
# pins the exit-code CLASS those 45 gates return for an unmet prerequisite
# (`EXIT_PREREQUISITE_NOT_MET`, distinct from a gate's own findings exit).
# Nothing ran it: `git grep -n "import-prerequisite" -- .github/workflows
# package.json` was EMPTY, so 60 cases executed only when a human or an
# agent typed the command by hand.
#
# ⛔ NOT a hole in `check:self-test-wired`, whose green is correct by its
# own definition: its population is the scripts CI RUNS, and this file is a
# MODULE no workflow can invoke, so it sat in that gate's remainder by
# construction. The blast radius and the population rule point in opposite
# directions here: the file with the largest inheritance surface in the
# farm is the one shape the wiring gate cannot see. Naming it in this step
# is what moves it INTO that population (161 -> 162 scripts CI runs that
# ship a `--self-test`), and it is the smaller of the two remedies — the
# other being to widen the gate to a transitive closure, which #14007
# explicitly does not ask for. ⛔ It is also not a licence to sweep the
# rest of that remainder from here; that is a separate card.
#
# What runs here is the self-tests, not the modules' callers: for the first
# three the callers are the two gate steps below, which already run on
# every PR; for `import-prerequisite` the callers are the 45 importing
# gates, whose ordinary runs take the branch where the dependency IS
# present and therefore observe none of what the self-test pins.
# Invoked as `node` rather than through `pnpm check:*`: see the GATE
# INVOCATION IDIOM note at the top of this file.
# `ts-parse` spawns ~20 real node children (~10 s measured, and the spawns
# are the point — they pin that a caller's try/catch cannot swallow the
# refusal); the other two are in-process fixtures, ~0.5 s combined.
# refusal); the other three are in-process fixtures, ~0.6 s combined.
#
# ⭐ Collected rather than sequenced, for the reason spelled out at the
# `Shallow-history guard self-tests` step below (#10814): under `bash -e` a
# bare sequence stops at the first failure, so a red `ts-parse` would leave
# the entry-predicate and comment-mask self-tests UNRUN while the log shows
# only the one failure. `ts-parse` is both the slowest of the three and the
# one that spawns real children, so it is the likeliest to be red —
# precisely the masking direction. The three modules are independent of one
# another, so collecting loses nothing.
- name: scripts/ shared-module self-tests (parse · entry predicate · comment mask)
# the entry-predicate, comment-mask and prerequisite-frame self-tests UNRUN
# while the log shows only the one failure. `ts-parse` is both the slowest
# of the four and the one that spawns real children, so it is the likeliest
# to be red — precisely the masking direction. The four modules are
# independent of one another, so collecting loses nothing.
#
# ⭐ Collected is also why the fourth leg is HERE rather than in a step of
# its own: Actions skips a job's remaining steps once a step fails, so a
# standalone step further down this job would be masked by every gate above
# it — the same defect one level up, and the split `check-step-collectors`
# explicitly refuses as a remedy. Inside this block the frame's self-test
# prints its own verdict whatever the other three do, and it does so early
# in the job.
- name: scripts/ shared-module self-tests (parse · entry predicate · comment mask · prerequisite frame)
run: |
# Tolerate-and-collect (#10814) — see the note above this step. Each
# self-test runs unconditionally and prints its own verdict; the step
Expand All@@ -300,13 +337,14 @@ jobs:
run_self_test node scripts/ts-parse.mjs --self-test
run_self_test node scripts/invoked-as.mjs --self-test
run_self_test node scripts/js-comment-mask.mjs --self-test
run_self_test node scripts/import-prerequisite.mjs --self-test
if [ -n "$failed" ]; then
echo ""
echo "scripts/ shared-module self-tests — the following FAILED:"
printf "%s" "$failed"
exit 1
fi
echo "scripts/ shared-module self-tests — all three ran and passed"
echo "scripts/ shared-module self-tests — all four ran and passed"

# Every `scripts/**` entry guard goes through ONE predicate (#10086).
# The hand-typed forms of "did node run me, or did someone import me?"
Expand Down
Loading