Merged
Show file tree
Hide file tree
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
20 changes: 19 additions & 1 deletion scripts/check-exported-any-returns.mts
Original file line numberDiff line numberDiff line change
Expand Up@@ -385,6 +385,13 @@ function readLedger(target: Target): Ledger {
* nested type-literal namespaces), so it exercises the walk and not just the
* predicate.
*/
// Set by `selfTest()` only after its verdict is printed, and read at the
// dispatch: a `return` that leaves the function above that line prints nothing
// and still exits 0 — a self-test that never finished, reported as one that
// passed (#13798). The self-test's own exit code stays load-bearing, so the
// handshake is a flag rather than a returned sentinel.
let selfTestReachedVerdict = false;

function selfTest(): never {
const fail = (msg: string): never => {
console.error(`✗ self-test: ${msg}`);
Expand DownExpand Up@@ -484,6 +491,7 @@ function selfTest(): never {
'✅ self-test: flags awaited-`any` returns through nested namespaces, and NOT caller-supplied generics, ' +
'`any`-containing types, or named data properties. Ledger is exact in both directions.',
);
selfTestReachedVerdict = true;
process.exit(0);
}

Expand All@@ -492,7 +500,17 @@ function selfTest(): never {
// Both modes live behind the guard: `--self-test` calls `process.exit` too, so
// running it on import would be the same defect wearing a friendlier name.
if (isEntrypoint(import.meta.url)) {
if (SELF_TEST) selfTest();
if (SELF_TEST) {
selfTest();
if (!selfTestReachedVerdict) {
console.error(
'\n✗ check-exported-any-returns self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Exiting 0 here would report a self-test\n'
+ 'that never finished as a self-test that passed.\n',
);
process.exit(1);
}
}

const target = resolveTarget();

Expand Down
9 changes: 8 additions & 1 deletion scripts/check-filter-alias-parity.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -636,7 +636,14 @@ function main() {
}
return;
}
selfTest();
if (selfTest() !== SELF_TEST_VERDICT) {
console.error(
'\n✗ check-filter-alias-parity self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Running the gate on top of a self-test\n'
+ 'that never finished would report an unverified gate as a verified one.\n',
);
process.exit(1);
}

const read = (rel) => readFileSync(join(ROOT, rel), 'utf8');
const { problems, protocolSet, restSet } = judge({
Expand Down
9 changes: 8 additions & 1 deletion scripts/check-meta-type-normalized.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -251,7 +251,14 @@ function main() {
}
return;
}
selfTest();
if (selfTest() !== SELF_TEST_VERDICT) {
console.error(
'\n✗ check-meta-type-normalized self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Running the gate on top of a self-test\n'
+ 'that never finished would report an unverified gate as a verified one.\n',
);
process.exit(1);
}

const files = [];
for (const dir of SCAN_DIRS) walkFiles(join(ROOT, dir), files);
Expand Down
22 changes: 21 additions & 1 deletion scripts/check-osv-exemptions.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -378,6 +378,13 @@ function validateLedger(text, today) {
}

/** @returns {{ passed: boolean, lines: string[] }} */
// Set by `selfTest()` only after its verdict is printed, and read at the
// dispatch: a `return` that leaves the function above that line prints nothing
// and still exits 0 — a self-test that never finished, reported as one that
// passed (#13798). The self-test's own exit code stays load-bearing, so the
// handshake is a flag rather than a returned sentinel.
let selfTestReachedVerdict = false;

function selfTest() {
const today = new Date(Date.UTC(2026, 7, 4)); // 2026-08-04, fixed
const good = [
Expand DownExpand Up@@ -487,12 +494,25 @@ function selfTest() {
(ok ? '' : `\n got: ${problems.length === 0 ? '(no problems)' : problems.join('\n ')}`),
);
}
selfTestReachedVerdict = true;
return { passed, lines };
}

function main() {
if (process.argv.includes('--self-test')) {
const { passed, lines } = selfTest();
// Read BEFORE destructuring: an early return yields `undefined`, and
// destructuring that throws a TypeError before the handshake is reached —
// an accidental non-zero exit is not a verdict handshake (#13798).
const selfTestResult = selfTest();
if (!selfTestReachedVerdict) {
console.error(
'\n✗ check-osv-exemptions self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Exiting 0 here would report a self-test\n'
+ 'that never finished as a self-test that passed.\n',
);
process.exit(1);
}
const { passed, lines } = selfTestResult;
console.log('check-osv-exemptions self-test (both directions):');
for (const line of lines) console.log(line);
if (!passed) {
Expand Down
19 changes: 18 additions & 1 deletion scripts/check-page-declaration-shape.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -365,6 +365,13 @@ function findingMessage({ file, line, name, decl }) {
// Self-test
// ---------------------------------------------------------------------------

// Set by `selfTest()` only after its verdict is printed, and read at the
// dispatch: a `return` that leaves the function above that line prints nothing
// and still exits 0 — a self-test that never finished, reported as one that
// passed (#13798). The self-test's own exit code stays load-bearing, so the
// handshake is a flag rather than a returned sentinel.
let selfTestReachedVerdict = false;

function selfTest() {
let failed = 0;
const t = (label, ok) => {
Expand DownExpand Up@@ -481,14 +488,24 @@ function selfTest() {
PAGE_CARRIER_GLOBS.every((g) => g.includes('/')));

console.log(failed ? `\ncheck-page-declaration-shape --self-test: ${failed} FAILED` : '\ncheck-page-declaration-shape --self-test: all passed');
selfTestReachedVerdict = true;
return failed === 0;
}

// ---------------------------------------------------------------------------

if (isEntrypoint(import.meta.url)) {
if (process.argv.includes('--self-test')) {
process.exit(selfTest() ? 0 : 1);
const selfTestOk = selfTest();
if (!selfTestReachedVerdict) {
console.error(
'\n✗ check-page-declaration-shape self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Exiting 0 here would report a self-test\n'
+ 'that never finished as a self-test that passed.\n',
);
process.exit(1);
}
process.exit(selfTestOk ? 0 : 1);
}
const result = scan();
const computed = computedCarrierSites();
Expand Down
20 changes: 18 additions & 2 deletions scripts/check-skill-identifier-liveness.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -868,6 +868,12 @@ function allSpecSources() {

// ── Self-test ───────────────────────────────────────────────────────────────

// Returned by `selfTest()` only after its verdict is printed. The dispatch
// refuses anything else: a `return` that leaves the function above that line
// prints nothing and still exits 0 — a self-test that never finished, reported
// as one that passed (#13798).
const SELF_TEST_VERDICT = 'check-skill-identifier-liveness self-test reached its verdict';

/**
* Why this exists at all, in the words of the wiring gate that requires it: a
* gate whose defect class is its MATCHING RULE cannot detect its own regression
Expand DownExpand Up@@ -1141,6 +1147,8 @@ function selfTest() {
process.exit(1);
}
console.log('check-skill-identifier-liveness --self-test OK');

return SELF_TEST_VERDICT;
}

let SELF_SOURCE = null;
Expand All@@ -1152,6 +1160,14 @@ function selfSource() {
}

if (isEntrypoint(import.meta.url)) {
if (argv.includes('--self-test')) selfTest();
else main();
if (argv.includes('--self-test')) {
if (selfTest() !== SELF_TEST_VERDICT) {
console.error(
'\n✗ check-skill-identifier-liveness self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Exiting 0 here would report a self-test\n'
+ 'that never finished as a self-test that passed.\n',
);
process.exit(1);
}
} else main();
}
20 changes: 18 additions & 2 deletions scripts/check-skills-token-ratchet.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -704,6 +704,12 @@ function fixtureTree() {
return { root, cleanup: () => rmSync(root, { recursive: true, force: true }) };
}

// Returned by `selfTest()` only after its verdict is printed. The dispatch
// refuses anything else: a `return` that leaves the function above that line
// prints nothing and still exits 0 — a self-test that never finished, reported
// as one that passed (#13798).
const SELF_TEST_VERDICT = 'check-skills-token-ratchet self-test reached its verdict';

function selfTest() {
const rel = 'skills/objectstack-ui/SKILL.md';
const over = verdict(rel, 26000, 25154).msg;
Expand DownExpand Up@@ -922,9 +928,19 @@ function selfTest() {
process.exit(1);
}
console.log(`✓ check-skills-token-ratchet self-test: ${cases.length} cases pass.`);

return SELF_TEST_VERDICT;
}

if (isEntrypoint(import.meta.url)) {
if (process.argv.includes('--self-test')) selfTest();
else run();
if (process.argv.includes('--self-test')) {
if (selfTest() !== SELF_TEST_VERDICT) {
console.error(
'\n✗ check-skills-token-ratchet self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Exiting 0 here would report a self-test\n'
+ 'that never finished as a self-test that passed.\n',
);
process.exit(1);
}
} else run();
}
9 changes: 8 additions & 1 deletion scripts/check-test-completeness.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -925,7 +925,14 @@ function main() {
return;
}
// Every invocation, not a lint step -- see the header note on why.
selfTest({ quiet: true });
if (selfTest({ quiet: true }) !== SELF_TEST_VERDICT) {
console.error(
'\n✗ check-test-completeness self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Running the gate on top of a self-test\n'
+ 'that never finished would report an unverified gate as a verified one.\n',
);
process.exit(1);
}

const { verdict, paths } = invocationVerdict(argv);
if (verdict) reportVerdict(verdict);
Expand Down
17 changes: 16 additions & 1 deletion scripts/check-type-source-resolution.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -1724,6 +1724,12 @@ function buildFixtureTree() {
return root;
}

// Returned by `selfTest()` only after its verdict is printed. The dispatch
// refuses anything else: a `return` that leaves the function above that line
// prints nothing and still exits 0 — a self-test that never finished, reported
// as one that passed (#13798).
const SELF_TEST_VERDICT = 'check-type-source-resolution self-test reached its verdict';

function selfTest() {
const root = buildFixtureTree();
const problems = [];
Expand DownExpand Up@@ -2062,13 +2068,22 @@ function selfTest() {
process.exit(1);
}
console.log('check-type-source-resolution --self-test OK');

return SELF_TEST_VERDICT;
}

// ── entry point ─────────────────────────────────────────────────────────────

const argv = process.argv.slice(2);
if (argv.includes('--self-test')) {
selfTest();
if (selfTest() !== SELF_TEST_VERDICT) {
console.error(
'\n✗ check-type-source-resolution self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Exiting 0 here would report a self-test\n'
+ 'that never finished as a self-test that passed.\n',
);
process.exit(1);
}
} else if (argv.includes('--list')) {
printList(REPO_ROOT);
} else {
Expand Down
20 changes: 18 additions & 2 deletions scripts/check-workspace-manifest-cycles.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -697,6 +697,12 @@ export function selfTest() {
return failures;
}

// Returned by `runSelfTest()` only after its verdict is printed. The dispatch
// refuses anything else: a `return` that leaves the function above that line
// prints nothing and still exits 0 — a self-test that never finished, reported
// as one that passed (#13798).
const SELF_TEST_VERDICT = 'check-workspace-manifest-cycles self-test reached its verdict';

function runSelfTest() {
const failures = selfTest();
if (failures.length) {
Expand All@@ -705,10 +711,20 @@ function runSelfTest() {
process.exit(1);
}
console.log('OK: check-workspace-manifest-cycles --self-test — all cases passed.');

return SELF_TEST_VERDICT;
}

// Exports bindings, so an import for those exports alone must run nothing (#10667).
if (isEntrypoint(import.meta.url)) {
if (process.argv.includes('--self-test')) runSelfTest();
else main();
if (process.argv.includes('--self-test')) {
if (runSelfTest() !== SELF_TEST_VERDICT) {
console.error(
'\n✗ check-workspace-manifest-cycles self-test: runSelfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Exiting 0 here would report a self-test\n'
+ 'that never finished as a self-test that passed.\n',
);
process.exit(1);
}
} else main();
}
20 changes: 19 additions & 1 deletion scripts/checklist-select.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -118,6 +118,13 @@ function isBlocked(it) {
}

// ── self-test ────────────────────────────────────────────────────────────────
// Set by `selfTest()` only after its verdict is printed, and read at the
// dispatch: a `return` that leaves the function above that line prints nothing
// and still exits 0 — a self-test that never finished, reported as one that
// passed (#13798). The self-test's own exit code stays load-bearing, so the
// handshake is a flag rather than a returned sentinel.
let selfTestReachedVerdict = false;

function selfTest() {
const FIX = [
{ id: 'a.one', status: 'active', priority: 'P0', surface: 'browser', since: 'v16', source: ['packages/foo/bar.ts'] },
Expand DownExpand Up@@ -150,6 +157,7 @@ function selfTest() {
eq(ids('bar.ts'), ['a.one'], 'bare source basename (code ext) → file: mode');
eq(ids('missing.json'), [], 'unmatched .json name → empty, no throw');
console.log('✓ checklist-select self-test: 17 cases pass.');
selfTestReachedVerdict = true;
process.exit(0);
}

Expand DownExpand Up@@ -197,6 +205,16 @@ function main() {
// (the skill's front half is a pure resolver), the old top-level CLI printed a
// usage block to the importer's stderr and killed it with exit 2 mid-import.
if (isEntrypoint(import.meta.url)) {
if (process.argv.includes('--self-test')) selfTest();
if (process.argv.includes('--self-test')) {
selfTest();
if (!selfTestReachedVerdict) {
console.error(
'\n✗ checklist-select self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Exiting 0 here would report a self-test\n'
+ 'that never finished as a self-test that passed.\n',
);
process.exit(1);
}
}
main();
}
Loading
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
Show file tree
Hide file tree
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
20 changes: 19 additions & 1 deletion scripts/check-exported-any-returns.mts
Original file line numberDiff line numberDiff line change
Expand Up@@ -385,6 +385,13 @@ function readLedger(target: Target): Ledger {
* nested type-literal namespaces), so it exercises the walk and not just the
* predicate.
*/
// Set by `selfTest()` only after its verdict is printed, and read at the
// dispatch: a `return` that leaves the function above that line prints nothing
// and still exits 0 — a self-test that never finished, reported as one that
// passed (#13798). The self-test's own exit code stays load-bearing, so the
// handshake is a flag rather than a returned sentinel.
let selfTestReachedVerdict = false;

function selfTest(): never {
const fail = (msg: string): never => {
console.error(`✗ self-test: ${msg}`);
Expand DownExpand Up@@ -484,6 +491,7 @@ function selfTest(): never {
'✅ self-test: flags awaited-`any` returns through nested namespaces, and NOT caller-supplied generics, ' +
'`any`-containing types, or named data properties. Ledger is exact in both directions.',
);
selfTestReachedVerdict = true;
process.exit(0);
}

Expand All@@ -492,7 +500,17 @@ function selfTest(): never {
// Both modes live behind the guard: `--self-test` calls `process.exit` too, so
// running it on import would be the same defect wearing a friendlier name.
if (isEntrypoint(import.meta.url)) {
if (SELF_TEST) selfTest();
if (SELF_TEST) {
selfTest();
if (!selfTestReachedVerdict) {
console.error(
'\n✗ check-exported-any-returns self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Exiting 0 here would report a self-test\n'
+ 'that never finished as a self-test that passed.\n',
);
process.exit(1);
}
}

const target = resolveTarget();

Expand Down
9 changes: 8 additions & 1 deletion scripts/check-filter-alias-parity.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -636,7 +636,14 @@ function main() {
}
return;
}
selfTest();
if (selfTest() !== SELF_TEST_VERDICT) {
console.error(
'\n✗ check-filter-alias-parity self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Running the gate on top of a self-test\n'
+ 'that never finished would report an unverified gate as a verified one.\n',
);
process.exit(1);
}

const read = (rel) => readFileSync(join(ROOT, rel), 'utf8');
const { problems, protocolSet, restSet } = judge({
Expand Down
9 changes: 8 additions & 1 deletion scripts/check-meta-type-normalized.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -251,7 +251,14 @@ function main() {
}
return;
}
selfTest();
if (selfTest() !== SELF_TEST_VERDICT) {
console.error(
'\n✗ check-meta-type-normalized self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Running the gate on top of a self-test\n'
+ 'that never finished would report an unverified gate as a verified one.\n',
);
process.exit(1);
}

const files = [];
for (const dir of SCAN_DIRS) walkFiles(join(ROOT, dir), files);
Expand Down
22 changes: 21 additions & 1 deletion scripts/check-osv-exemptions.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -378,6 +378,13 @@ function validateLedger(text, today) {
}

/** @returns {{ passed: boolean, lines: string[] }} */
// Set by `selfTest()` only after its verdict is printed, and read at the
// dispatch: a `return` that leaves the function above that line prints nothing
// and still exits 0 — a self-test that never finished, reported as one that
// passed (#13798). The self-test's own exit code stays load-bearing, so the
// handshake is a flag rather than a returned sentinel.
let selfTestReachedVerdict = false;

function selfTest() {
const today = new Date(Date.UTC(2026, 7, 4)); // 2026-08-04, fixed
const good = [
Expand DownExpand Up@@ -487,12 +494,25 @@ function selfTest() {
(ok ? '' : `\n got: ${problems.length === 0 ? '(no problems)' : problems.join('\n ')}`),
);
}
selfTestReachedVerdict = true;
return { passed, lines };
}

function main() {
if (process.argv.includes('--self-test')) {
const { passed, lines } = selfTest();
// Read BEFORE destructuring: an early return yields `undefined`, and
// destructuring that throws a TypeError before the handshake is reached —
// an accidental non-zero exit is not a verdict handshake (#13798).
const selfTestResult = selfTest();
if (!selfTestReachedVerdict) {
console.error(
'\n✗ check-osv-exemptions self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Exiting 0 here would report a self-test\n'
+ 'that never finished as a self-test that passed.\n',
);
process.exit(1);
}
const { passed, lines } = selfTestResult;
console.log('check-osv-exemptions self-test (both directions):');
for (const line of lines) console.log(line);
if (!passed) {
Expand Down
19 changes: 18 additions & 1 deletion scripts/check-page-declaration-shape.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -365,6 +365,13 @@ function findingMessage({ file, line, name, decl }) {
// Self-test
// ---------------------------------------------------------------------------

// Set by `selfTest()` only after its verdict is printed, and read at the
// dispatch: a `return` that leaves the function above that line prints nothing
// and still exits 0 — a self-test that never finished, reported as one that
// passed (#13798). The self-test's own exit code stays load-bearing, so the
// handshake is a flag rather than a returned sentinel.
let selfTestReachedVerdict = false;

function selfTest() {
let failed = 0;
const t = (label, ok) => {
Expand DownExpand Up@@ -481,14 +488,24 @@ function selfTest() {
PAGE_CARRIER_GLOBS.every((g) => g.includes('/')));

console.log(failed ? `\ncheck-page-declaration-shape --self-test: ${failed} FAILED` : '\ncheck-page-declaration-shape --self-test: all passed');
selfTestReachedVerdict = true;
return failed === 0;
}

// ---------------------------------------------------------------------------

if (isEntrypoint(import.meta.url)) {
if (process.argv.includes('--self-test')) {
process.exit(selfTest() ? 0 : 1);
const selfTestOk = selfTest();
if (!selfTestReachedVerdict) {
console.error(
'\n✗ check-page-declaration-shape self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Exiting 0 here would report a self-test\n'
+ 'that never finished as a self-test that passed.\n',
);
process.exit(1);
}
process.exit(selfTestOk ? 0 : 1);
}
const result = scan();
const computed = computedCarrierSites();
Expand Down
20 changes: 18 additions & 2 deletions scripts/check-skill-identifier-liveness.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -868,6 +868,12 @@ function allSpecSources() {

// ── Self-test ───────────────────────────────────────────────────────────────

// Returned by `selfTest()` only after its verdict is printed. The dispatch
// refuses anything else: a `return` that leaves the function above that line
// prints nothing and still exits 0 — a self-test that never finished, reported
// as one that passed (#13798).
const SELF_TEST_VERDICT = 'check-skill-identifier-liveness self-test reached its verdict';

/**
* Why this exists at all, in the words of the wiring gate that requires it: a
* gate whose defect class is its MATCHING RULE cannot detect its own regression
Expand DownExpand Up@@ -1141,6 +1147,8 @@ function selfTest() {
process.exit(1);
}
console.log('check-skill-identifier-liveness --self-test OK');

return SELF_TEST_VERDICT;
}

let SELF_SOURCE = null;
Expand All@@ -1152,6 +1160,14 @@ function selfSource() {
}

if (isEntrypoint(import.meta.url)) {
if (argv.includes('--self-test')) selfTest();
else main();
if (argv.includes('--self-test')) {
if (selfTest() !== SELF_TEST_VERDICT) {
console.error(
'\n✗ check-skill-identifier-liveness self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Exiting 0 here would report a self-test\n'
+ 'that never finished as a self-test that passed.\n',
);
process.exit(1);
}
} else main();
}
20 changes: 18 additions & 2 deletions scripts/check-skills-token-ratchet.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -704,6 +704,12 @@ function fixtureTree() {
return { root, cleanup: () => rmSync(root, { recursive: true, force: true }) };
}

// Returned by `selfTest()` only after its verdict is printed. The dispatch
// refuses anything else: a `return` that leaves the function above that line
// prints nothing and still exits 0 — a self-test that never finished, reported
// as one that passed (#13798).
const SELF_TEST_VERDICT = 'check-skills-token-ratchet self-test reached its verdict';

function selfTest() {
const rel = 'skills/objectstack-ui/SKILL.md';
const over = verdict(rel, 26000, 25154).msg;
Expand DownExpand Up@@ -922,9 +928,19 @@ function selfTest() {
process.exit(1);
}
console.log(`✓ check-skills-token-ratchet self-test: ${cases.length} cases pass.`);

return SELF_TEST_VERDICT;
}

if (isEntrypoint(import.meta.url)) {
if (process.argv.includes('--self-test')) selfTest();
else run();
if (process.argv.includes('--self-test')) {
if (selfTest() !== SELF_TEST_VERDICT) {
console.error(
'\n✗ check-skills-token-ratchet self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Exiting 0 here would report a self-test\n'
+ 'that never finished as a self-test that passed.\n',
);
process.exit(1);
}
} else run();
}
9 changes: 8 additions & 1 deletion scripts/check-test-completeness.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -925,7 +925,14 @@ function main() {
return;
}
// Every invocation, not a lint step -- see the header note on why.
selfTest({ quiet: true });
if (selfTest({ quiet: true }) !== SELF_TEST_VERDICT) {
console.error(
'\n✗ check-test-completeness self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Running the gate on top of a self-test\n'
+ 'that never finished would report an unverified gate as a verified one.\n',
);
process.exit(1);
}

const { verdict, paths } = invocationVerdict(argv);
if (verdict) reportVerdict(verdict);
Expand Down
17 changes: 16 additions & 1 deletion scripts/check-type-source-resolution.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -1724,6 +1724,12 @@ function buildFixtureTree() {
return root;
}

// Returned by `selfTest()` only after its verdict is printed. The dispatch
// refuses anything else: a `return` that leaves the function above that line
// prints nothing and still exits 0 — a self-test that never finished, reported
// as one that passed (#13798).
const SELF_TEST_VERDICT = 'check-type-source-resolution self-test reached its verdict';

function selfTest() {
const root = buildFixtureTree();
const problems = [];
Expand DownExpand Up@@ -2062,13 +2068,22 @@ function selfTest() {
process.exit(1);
}
console.log('check-type-source-resolution --self-test OK');

return SELF_TEST_VERDICT;
}

// ── entry point ─────────────────────────────────────────────────────────────

const argv = process.argv.slice(2);
if (argv.includes('--self-test')) {
selfTest();
if (selfTest() !== SELF_TEST_VERDICT) {
console.error(
'\n✗ check-type-source-resolution self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Exiting 0 here would report a self-test\n'
+ 'that never finished as a self-test that passed.\n',
);
process.exit(1);
}
} else if (argv.includes('--list')) {
printList(REPO_ROOT);
} else {
Expand Down
20 changes: 18 additions & 2 deletions scripts/check-workspace-manifest-cycles.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -697,6 +697,12 @@ export function selfTest() {
return failures;
}

// Returned by `runSelfTest()` only after its verdict is printed. The dispatch
// refuses anything else: a `return` that leaves the function above that line
// prints nothing and still exits 0 — a self-test that never finished, reported
// as one that passed (#13798).
const SELF_TEST_VERDICT = 'check-workspace-manifest-cycles self-test reached its verdict';

function runSelfTest() {
const failures = selfTest();
if (failures.length) {
Expand All@@ -705,10 +711,20 @@ function runSelfTest() {
process.exit(1);
}
console.log('OK: check-workspace-manifest-cycles --self-test — all cases passed.');

return SELF_TEST_VERDICT;
}

// Exports bindings, so an import for those exports alone must run nothing (#10667).
if (isEntrypoint(import.meta.url)) {
if (process.argv.includes('--self-test')) runSelfTest();
else main();
if (process.argv.includes('--self-test')) {
if (runSelfTest() !== SELF_TEST_VERDICT) {
console.error(
'\n✗ check-workspace-manifest-cycles self-test: runSelfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Exiting 0 here would report a self-test\n'
+ 'that never finished as a self-test that passed.\n',
);
process.exit(1);
}
} else main();
}
20 changes: 19 additions & 1 deletion scripts/checklist-select.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -118,6 +118,13 @@ function isBlocked(it) {
}

// ── self-test ────────────────────────────────────────────────────────────────
// Set by `selfTest()` only after its verdict is printed, and read at the
// dispatch: a `return` that leaves the function above that line prints nothing
// and still exits 0 — a self-test that never finished, reported as one that
// passed (#13798). The self-test's own exit code stays load-bearing, so the
// handshake is a flag rather than a returned sentinel.
let selfTestReachedVerdict = false;

function selfTest() {
const FIX = [
{ id: 'a.one', status: 'active', priority: 'P0', surface: 'browser', since: 'v16', source: ['packages/foo/bar.ts'] },
Expand DownExpand Up@@ -150,6 +157,7 @@ function selfTest() {
eq(ids('bar.ts'), ['a.one'], 'bare source basename (code ext) → file: mode');
eq(ids('missing.json'), [], 'unmatched .json name → empty, no throw');
console.log('✓ checklist-select self-test: 17 cases pass.');
selfTestReachedVerdict = true;
process.exit(0);
}

Expand DownExpand Up@@ -197,6 +205,16 @@ function main() {
// (the skill's front half is a pure resolver), the old top-level CLI printed a
// usage block to the importer's stderr and killed it with exit 2 mid-import.
if (isEntrypoint(import.meta.url)) {
if (process.argv.includes('--self-test')) selfTest();
if (process.argv.includes('--self-test')) {
selfTest();
if (!selfTestReachedVerdict) {
console.error(
'\n✗ checklist-select self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Exiting 0 here would report a self-test\n'
+ 'that never finished as a self-test that passed.\n',
);
process.exit(1);
}
}
main();
}
Loading
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
Show file tree
Hide file tree
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
20 changes: 19 additions & 1 deletion scripts/check-exported-any-returns.mts
Original file line numberDiff line numberDiff line change
Expand Up@@ -385,6 +385,13 @@ function readLedger(target: Target): Ledger {
* nested type-literal namespaces), so it exercises the walk and not just the
* predicate.
*/
// Set by `selfTest()` only after its verdict is printed, and read at the
// dispatch: a `return` that leaves the function above that line prints nothing
// and still exits 0 — a self-test that never finished, reported as one that
// passed (#13798). The self-test's own exit code stays load-bearing, so the
// handshake is a flag rather than a returned sentinel.
let selfTestReachedVerdict = false;

function selfTest(): never {
const fail = (msg: string): never => {
console.error(`✗ self-test: ${msg}`);
Expand DownExpand Up@@ -484,6 +491,7 @@ function selfTest(): never {
'✅ self-test: flags awaited-`any` returns through nested namespaces, and NOT caller-supplied generics, ' +
'`any`-containing types, or named data properties. Ledger is exact in both directions.',
);
selfTestReachedVerdict = true;
process.exit(0);
}

Expand All@@ -492,7 +500,17 @@ function selfTest(): never {
// Both modes live behind the guard: `--self-test` calls `process.exit` too, so
// running it on import would be the same defect wearing a friendlier name.
if (isEntrypoint(import.meta.url)) {
if (SELF_TEST) selfTest();
if (SELF_TEST) {
selfTest();
if (!selfTestReachedVerdict) {
console.error(
'\n✗ check-exported-any-returns self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Exiting 0 here would report a self-test\n'
+ 'that never finished as a self-test that passed.\n',
);
process.exit(1);
}
}

const target = resolveTarget();

Expand Down
9 changes: 8 additions & 1 deletion scripts/check-filter-alias-parity.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -636,7 +636,14 @@ function main() {
}
return;
}
selfTest();
if (selfTest() !== SELF_TEST_VERDICT) {
console.error(
'\n✗ check-filter-alias-parity self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Running the gate on top of a self-test\n'
+ 'that never finished would report an unverified gate as a verified one.\n',
);
process.exit(1);
}

const read = (rel) => readFileSync(join(ROOT, rel), 'utf8');
const { problems, protocolSet, restSet } = judge({
Expand Down
9 changes: 8 additions & 1 deletion scripts/check-meta-type-normalized.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -251,7 +251,14 @@ function main() {
}
return;
}
selfTest();
if (selfTest() !== SELF_TEST_VERDICT) {
console.error(
'\n✗ check-meta-type-normalized self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Running the gate on top of a self-test\n'
+ 'that never finished would report an unverified gate as a verified one.\n',
);
process.exit(1);
}

const files = [];
for (const dir of SCAN_DIRS) walkFiles(join(ROOT, dir), files);
Expand Down
22 changes: 21 additions & 1 deletion scripts/check-osv-exemptions.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -378,6 +378,13 @@ function validateLedger(text, today) {
}

/** @returns {{ passed: boolean, lines: string[] }} */
// Set by `selfTest()` only after its verdict is printed, and read at the
// dispatch: a `return` that leaves the function above that line prints nothing
// and still exits 0 — a self-test that never finished, reported as one that
// passed (#13798). The self-test's own exit code stays load-bearing, so the
// handshake is a flag rather than a returned sentinel.
let selfTestReachedVerdict = false;

function selfTest() {
const today = new Date(Date.UTC(2026, 7, 4)); // 2026-08-04, fixed
const good = [
Expand DownExpand Up@@ -487,12 +494,25 @@ function selfTest() {
(ok ? '' : `\n got: ${problems.length === 0 ? '(no problems)' : problems.join('\n ')}`),
);
}
selfTestReachedVerdict = true;
return { passed, lines };
}

function main() {
if (process.argv.includes('--self-test')) {
const { passed, lines } = selfTest();
// Read BEFORE destructuring: an early return yields `undefined`, and
// destructuring that throws a TypeError before the handshake is reached —
// an accidental non-zero exit is not a verdict handshake (#13798).
const selfTestResult = selfTest();
if (!selfTestReachedVerdict) {
console.error(
'\n✗ check-osv-exemptions self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Exiting 0 here would report a self-test\n'
+ 'that never finished as a self-test that passed.\n',
);
process.exit(1);
}
const { passed, lines } = selfTestResult;
console.log('check-osv-exemptions self-test (both directions):');
for (const line of lines) console.log(line);
if (!passed) {
Expand Down
19 changes: 18 additions & 1 deletion scripts/check-page-declaration-shape.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -365,6 +365,13 @@ function findingMessage({ file, line, name, decl }) {
// Self-test
// ---------------------------------------------------------------------------

// Set by `selfTest()` only after its verdict is printed, and read at the
// dispatch: a `return` that leaves the function above that line prints nothing
// and still exits 0 — a self-test that never finished, reported as one that
// passed (#13798). The self-test's own exit code stays load-bearing, so the
// handshake is a flag rather than a returned sentinel.
let selfTestReachedVerdict = false;

function selfTest() {
let failed = 0;
const t = (label, ok) => {
Expand DownExpand Up@@ -481,14 +488,24 @@ function selfTest() {
PAGE_CARRIER_GLOBS.every((g) => g.includes('/')));

console.log(failed ? `\ncheck-page-declaration-shape --self-test: ${failed} FAILED` : '\ncheck-page-declaration-shape --self-test: all passed');
selfTestReachedVerdict = true;
return failed === 0;
}

// ---------------------------------------------------------------------------

if (isEntrypoint(import.meta.url)) {
if (process.argv.includes('--self-test')) {
process.exit(selfTest() ? 0 : 1);
const selfTestOk = selfTest();
if (!selfTestReachedVerdict) {
console.error(
'\n✗ check-page-declaration-shape self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Exiting 0 here would report a self-test\n'
+ 'that never finished as a self-test that passed.\n',
);
process.exit(1);
}
process.exit(selfTestOk ? 0 : 1);
}
const result = scan();
const computed = computedCarrierSites();
Expand Down
20 changes: 18 additions & 2 deletions scripts/check-skill-identifier-liveness.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -868,6 +868,12 @@ function allSpecSources() {

// ── Self-test ───────────────────────────────────────────────────────────────

// Returned by `selfTest()` only after its verdict is printed. The dispatch
// refuses anything else: a `return` that leaves the function above that line
// prints nothing and still exits 0 — a self-test that never finished, reported
// as one that passed (#13798).
const SELF_TEST_VERDICT = 'check-skill-identifier-liveness self-test reached its verdict';

/**
* Why this exists at all, in the words of the wiring gate that requires it: a
* gate whose defect class is its MATCHING RULE cannot detect its own regression
Expand DownExpand Up@@ -1141,6 +1147,8 @@ function selfTest() {
process.exit(1);
}
console.log('check-skill-identifier-liveness --self-test OK');

return SELF_TEST_VERDICT;
}

let SELF_SOURCE = null;
Expand All@@ -1152,6 +1160,14 @@ function selfSource() {
}

if (isEntrypoint(import.meta.url)) {
if (argv.includes('--self-test')) selfTest();
else main();
if (argv.includes('--self-test')) {
if (selfTest() !== SELF_TEST_VERDICT) {
console.error(
'\n✗ check-skill-identifier-liveness self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Exiting 0 here would report a self-test\n'
+ 'that never finished as a self-test that passed.\n',
);
process.exit(1);
}
} else main();
}
20 changes: 18 additions & 2 deletions scripts/check-skills-token-ratchet.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -704,6 +704,12 @@ function fixtureTree() {
return { root, cleanup: () => rmSync(root, { recursive: true, force: true }) };
}

// Returned by `selfTest()` only after its verdict is printed. The dispatch
// refuses anything else: a `return` that leaves the function above that line
// prints nothing and still exits 0 — a self-test that never finished, reported
// as one that passed (#13798).
const SELF_TEST_VERDICT = 'check-skills-token-ratchet self-test reached its verdict';

function selfTest() {
const rel = 'skills/objectstack-ui/SKILL.md';
const over = verdict(rel, 26000, 25154).msg;
Expand DownExpand Up@@ -922,9 +928,19 @@ function selfTest() {
process.exit(1);
}
console.log(`✓ check-skills-token-ratchet self-test: ${cases.length} cases pass.`);

return SELF_TEST_VERDICT;
}

if (isEntrypoint(import.meta.url)) {
if (process.argv.includes('--self-test')) selfTest();
else run();
if (process.argv.includes('--self-test')) {
if (selfTest() !== SELF_TEST_VERDICT) {
console.error(
'\n✗ check-skills-token-ratchet self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Exiting 0 here would report a self-test\n'
+ 'that never finished as a self-test that passed.\n',
);
process.exit(1);
}
} else run();
}
9 changes: 8 additions & 1 deletion scripts/check-test-completeness.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -925,7 +925,14 @@ function main() {
return;
}
// Every invocation, not a lint step -- see the header note on why.
selfTest({ quiet: true });
if (selfTest({ quiet: true }) !== SELF_TEST_VERDICT) {
console.error(
'\n✗ check-test-completeness self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Running the gate on top of a self-test\n'
+ 'that never finished would report an unverified gate as a verified one.\n',
);
process.exit(1);
}

const { verdict, paths } = invocationVerdict(argv);
if (verdict) reportVerdict(verdict);
Expand Down
17 changes: 16 additions & 1 deletion scripts/check-type-source-resolution.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -1724,6 +1724,12 @@ function buildFixtureTree() {
return root;
}

// Returned by `selfTest()` only after its verdict is printed. The dispatch
// refuses anything else: a `return` that leaves the function above that line
// prints nothing and still exits 0 — a self-test that never finished, reported
// as one that passed (#13798).
const SELF_TEST_VERDICT = 'check-type-source-resolution self-test reached its verdict';

function selfTest() {
const root = buildFixtureTree();
const problems = [];
Expand DownExpand Up@@ -2062,13 +2068,22 @@ function selfTest() {
process.exit(1);
}
console.log('check-type-source-resolution --self-test OK');

return SELF_TEST_VERDICT;
}

// ── entry point ─────────────────────────────────────────────────────────────

const argv = process.argv.slice(2);
if (argv.includes('--self-test')) {
selfTest();
if (selfTest() !== SELF_TEST_VERDICT) {
console.error(
'\n✗ check-type-source-resolution self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Exiting 0 here would report a self-test\n'
+ 'that never finished as a self-test that passed.\n',
);
process.exit(1);
}
} else if (argv.includes('--list')) {
printList(REPO_ROOT);
} else {
Expand Down
20 changes: 18 additions & 2 deletions scripts/check-workspace-manifest-cycles.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -697,6 +697,12 @@ export function selfTest() {
return failures;
}

// Returned by `runSelfTest()` only after its verdict is printed. The dispatch
// refuses anything else: a `return` that leaves the function above that line
// prints nothing and still exits 0 — a self-test that never finished, reported
// as one that passed (#13798).
const SELF_TEST_VERDICT = 'check-workspace-manifest-cycles self-test reached its verdict';

function runSelfTest() {
const failures = selfTest();
if (failures.length) {
Expand All@@ -705,10 +711,20 @@ function runSelfTest() {
process.exit(1);
}
console.log('OK: check-workspace-manifest-cycles --self-test — all cases passed.');

return SELF_TEST_VERDICT;
}

// Exports bindings, so an import for those exports alone must run nothing (#10667).
if (isEntrypoint(import.meta.url)) {
if (process.argv.includes('--self-test')) runSelfTest();
else main();
if (process.argv.includes('--self-test')) {
if (runSelfTest() !== SELF_TEST_VERDICT) {
console.error(
'\n✗ check-workspace-manifest-cycles self-test: runSelfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Exiting 0 here would report a self-test\n'
+ 'that never finished as a self-test that passed.\n',
);
process.exit(1);
}
} else main();
}
20 changes: 19 additions & 1 deletion scripts/checklist-select.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -118,6 +118,13 @@ function isBlocked(it) {
}

// ── self-test ────────────────────────────────────────────────────────────────
// Set by `selfTest()` only after its verdict is printed, and read at the
// dispatch: a `return` that leaves the function above that line prints nothing
// and still exits 0 — a self-test that never finished, reported as one that
// passed (#13798). The self-test's own exit code stays load-bearing, so the
// handshake is a flag rather than a returned sentinel.
let selfTestReachedVerdict = false;

function selfTest() {
const FIX = [
{ id: 'a.one', status: 'active', priority: 'P0', surface: 'browser', since: 'v16', source: ['packages/foo/bar.ts'] },
Expand DownExpand Up@@ -150,6 +157,7 @@ function selfTest() {
eq(ids('bar.ts'), ['a.one'], 'bare source basename (code ext) → file: mode');
eq(ids('missing.json'), [], 'unmatched .json name → empty, no throw');
console.log('✓ checklist-select self-test: 17 cases pass.');
selfTestReachedVerdict = true;
process.exit(0);
}

Expand DownExpand Up@@ -197,6 +205,16 @@ function main() {
// (the skill's front half is a pure resolver), the old top-level CLI printed a
// usage block to the importer's stderr and killed it with exit 2 mid-import.
if (isEntrypoint(import.meta.url)) {
if (process.argv.includes('--self-test')) selfTest();
if (process.argv.includes('--self-test')) {
selfTest();
if (!selfTestReachedVerdict) {
console.error(
'\n✗ checklist-select self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Exiting 0 here would report a self-test\n'
+ 'that never finished as a self-test that passed.\n',
);
process.exit(1);
}
}
main();
}
Loading
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
Show file tree
Hide file tree
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
20 changes: 19 additions & 1 deletion scripts/check-exported-any-returns.mts
Original file line numberDiff line numberDiff line change
Expand Up@@ -385,6 +385,13 @@ function readLedger(target: Target): Ledger {
* nested type-literal namespaces), so it exercises the walk and not just the
* predicate.
*/
// Set by `selfTest()` only after its verdict is printed, and read at the
// dispatch: a `return` that leaves the function above that line prints nothing
// and still exits 0 — a self-test that never finished, reported as one that
// passed (#13798). The self-test's own exit code stays load-bearing, so the
// handshake is a flag rather than a returned sentinel.
let selfTestReachedVerdict = false;

function selfTest(): never {
const fail = (msg: string): never => {
console.error(`✗ self-test: ${msg}`);
Expand DownExpand Up@@ -484,6 +491,7 @@ function selfTest(): never {
'✅ self-test: flags awaited-`any` returns through nested namespaces, and NOT caller-supplied generics, ' +
'`any`-containing types, or named data properties. Ledger is exact in both directions.',
);
selfTestReachedVerdict = true;
process.exit(0);
}

Expand All@@ -492,7 +500,17 @@ function selfTest(): never {
// Both modes live behind the guard: `--self-test` calls `process.exit` too, so
// running it on import would be the same defect wearing a friendlier name.
if (isEntrypoint(import.meta.url)) {
if (SELF_TEST) selfTest();
if (SELF_TEST) {
selfTest();
if (!selfTestReachedVerdict) {
console.error(
'\n✗ check-exported-any-returns self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Exiting 0 here would report a self-test\n'
+ 'that never finished as a self-test that passed.\n',
);
process.exit(1);
}
}

const target = resolveTarget();

Expand Down
9 changes: 8 additions & 1 deletion scripts/check-filter-alias-parity.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -636,7 +636,14 @@ function main() {
}
return;
}
selfTest();
if (selfTest() !== SELF_TEST_VERDICT) {
console.error(
'\n✗ check-filter-alias-parity self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Running the gate on top of a self-test\n'
+ 'that never finished would report an unverified gate as a verified one.\n',
);
process.exit(1);
}

const read = (rel) => readFileSync(join(ROOT, rel), 'utf8');
const { problems, protocolSet, restSet } = judge({
Expand Down
9 changes: 8 additions & 1 deletion scripts/check-meta-type-normalized.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -251,7 +251,14 @@ function main() {
}
return;
}
selfTest();
if (selfTest() !== SELF_TEST_VERDICT) {
console.error(
'\n✗ check-meta-type-normalized self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Running the gate on top of a self-test\n'
+ 'that never finished would report an unverified gate as a verified one.\n',
);
process.exit(1);
}

const files = [];
for (const dir of SCAN_DIRS) walkFiles(join(ROOT, dir), files);
Expand Down
22 changes: 21 additions & 1 deletion scripts/check-osv-exemptions.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -378,6 +378,13 @@ function validateLedger(text, today) {
}

/** @returns {{ passed: boolean, lines: string[] }} */
// Set by `selfTest()` only after its verdict is printed, and read at the
// dispatch: a `return` that leaves the function above that line prints nothing
// and still exits 0 — a self-test that never finished, reported as one that
// passed (#13798). The self-test's own exit code stays load-bearing, so the
// handshake is a flag rather than a returned sentinel.
let selfTestReachedVerdict = false;

function selfTest() {
const today = new Date(Date.UTC(2026, 7, 4)); // 2026-08-04, fixed
const good = [
Expand DownExpand Up@@ -487,12 +494,25 @@ function selfTest() {
(ok ? '' : `\n got: ${problems.length === 0 ? '(no problems)' : problems.join('\n ')}`),
);
}
selfTestReachedVerdict = true;
return { passed, lines };
}

function main() {
if (process.argv.includes('--self-test')) {
const { passed, lines } = selfTest();
// Read BEFORE destructuring: an early return yields `undefined`, and
// destructuring that throws a TypeError before the handshake is reached —
// an accidental non-zero exit is not a verdict handshake (#13798).
const selfTestResult = selfTest();
if (!selfTestReachedVerdict) {
console.error(
'\n✗ check-osv-exemptions self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Exiting 0 here would report a self-test\n'
+ 'that never finished as a self-test that passed.\n',
);
process.exit(1);
}
const { passed, lines } = selfTestResult;
console.log('check-osv-exemptions self-test (both directions):');
for (const line of lines) console.log(line);
if (!passed) {
Expand Down
19 changes: 18 additions & 1 deletion scripts/check-page-declaration-shape.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -365,6 +365,13 @@ function findingMessage({ file, line, name, decl }) {
// Self-test
// ---------------------------------------------------------------------------

// Set by `selfTest()` only after its verdict is printed, and read at the
// dispatch: a `return` that leaves the function above that line prints nothing
// and still exits 0 — a self-test that never finished, reported as one that
// passed (#13798). The self-test's own exit code stays load-bearing, so the
// handshake is a flag rather than a returned sentinel.
let selfTestReachedVerdict = false;

function selfTest() {
let failed = 0;
const t = (label, ok) => {
Expand DownExpand Up@@ -481,14 +488,24 @@ function selfTest() {
PAGE_CARRIER_GLOBS.every((g) => g.includes('/')));

console.log(failed ? `\ncheck-page-declaration-shape --self-test: ${failed} FAILED` : '\ncheck-page-declaration-shape --self-test: all passed');
selfTestReachedVerdict = true;
return failed === 0;
}

// ---------------------------------------------------------------------------

if (isEntrypoint(import.meta.url)) {
if (process.argv.includes('--self-test')) {
process.exit(selfTest() ? 0 : 1);
const selfTestOk = selfTest();
if (!selfTestReachedVerdict) {
console.error(
'\n✗ check-page-declaration-shape self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Exiting 0 here would report a self-test\n'
+ 'that never finished as a self-test that passed.\n',
);
process.exit(1);
}
process.exit(selfTestOk ? 0 : 1);
}
const result = scan();
const computed = computedCarrierSites();
Expand Down
20 changes: 18 additions & 2 deletions scripts/check-skill-identifier-liveness.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -868,6 +868,12 @@ function allSpecSources() {

// ── Self-test ───────────────────────────────────────────────────────────────

// Returned by `selfTest()` only after its verdict is printed. The dispatch
// refuses anything else: a `return` that leaves the function above that line
// prints nothing and still exits 0 — a self-test that never finished, reported
// as one that passed (#13798).
const SELF_TEST_VERDICT = 'check-skill-identifier-liveness self-test reached its verdict';

/**
* Why this exists at all, in the words of the wiring gate that requires it: a
* gate whose defect class is its MATCHING RULE cannot detect its own regression
Expand DownExpand Up@@ -1141,6 +1147,8 @@ function selfTest() {
process.exit(1);
}
console.log('check-skill-identifier-liveness --self-test OK');

return SELF_TEST_VERDICT;
}

let SELF_SOURCE = null;
Expand All@@ -1152,6 +1160,14 @@ function selfSource() {
}

if (isEntrypoint(import.meta.url)) {
if (argv.includes('--self-test')) selfTest();
else main();
if (argv.includes('--self-test')) {
if (selfTest() !== SELF_TEST_VERDICT) {
console.error(
'\n✗ check-skill-identifier-liveness self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Exiting 0 here would report a self-test\n'
+ 'that never finished as a self-test that passed.\n',
);
process.exit(1);
}
} else main();
}
20 changes: 18 additions & 2 deletions scripts/check-skills-token-ratchet.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -704,6 +704,12 @@ function fixtureTree() {
return { root, cleanup: () => rmSync(root, { recursive: true, force: true }) };
}

// Returned by `selfTest()` only after its verdict is printed. The dispatch
// refuses anything else: a `return` that leaves the function above that line
// prints nothing and still exits 0 — a self-test that never finished, reported
// as one that passed (#13798).
const SELF_TEST_VERDICT = 'check-skills-token-ratchet self-test reached its verdict';

function selfTest() {
const rel = 'skills/objectstack-ui/SKILL.md';
const over = verdict(rel, 26000, 25154).msg;
Expand DownExpand Up@@ -922,9 +928,19 @@ function selfTest() {
process.exit(1);
}
console.log(`✓ check-skills-token-ratchet self-test: ${cases.length} cases pass.`);

return SELF_TEST_VERDICT;
}

if (isEntrypoint(import.meta.url)) {
if (process.argv.includes('--self-test')) selfTest();
else run();
if (process.argv.includes('--self-test')) {
if (selfTest() !== SELF_TEST_VERDICT) {
console.error(
'\n✗ check-skills-token-ratchet self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Exiting 0 here would report a self-test\n'
+ 'that never finished as a self-test that passed.\n',
);
process.exit(1);
}
} else run();
}
9 changes: 8 additions & 1 deletion scripts/check-test-completeness.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -925,7 +925,14 @@ function main() {
return;
}
// Every invocation, not a lint step -- see the header note on why.
selfTest({ quiet: true });
if (selfTest({ quiet: true }) !== SELF_TEST_VERDICT) {
console.error(
'\n✗ check-test-completeness self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Running the gate on top of a self-test\n'
+ 'that never finished would report an unverified gate as a verified one.\n',
);
process.exit(1);
}

const { verdict, paths } = invocationVerdict(argv);
if (verdict) reportVerdict(verdict);
Expand Down
17 changes: 16 additions & 1 deletion scripts/check-type-source-resolution.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -1724,6 +1724,12 @@ function buildFixtureTree() {
return root;
}

// Returned by `selfTest()` only after its verdict is printed. The dispatch
// refuses anything else: a `return` that leaves the function above that line
// prints nothing and still exits 0 — a self-test that never finished, reported
// as one that passed (#13798).
const SELF_TEST_VERDICT = 'check-type-source-resolution self-test reached its verdict';

function selfTest() {
const root = buildFixtureTree();
const problems = [];
Expand DownExpand Up@@ -2062,13 +2068,22 @@ function selfTest() {
process.exit(1);
}
console.log('check-type-source-resolution --self-test OK');

return SELF_TEST_VERDICT;
}

// ── entry point ─────────────────────────────────────────────────────────────

const argv = process.argv.slice(2);
if (argv.includes('--self-test')) {
selfTest();
if (selfTest() !== SELF_TEST_VERDICT) {
console.error(
'\n✗ check-type-source-resolution self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Exiting 0 here would report a self-test\n'
+ 'that never finished as a self-test that passed.\n',
);
process.exit(1);
}
} else if (argv.includes('--list')) {
printList(REPO_ROOT);
} else {
Expand Down
20 changes: 18 additions & 2 deletions scripts/check-workspace-manifest-cycles.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -697,6 +697,12 @@ export function selfTest() {
return failures;
}

// Returned by `runSelfTest()` only after its verdict is printed. The dispatch
// refuses anything else: a `return` that leaves the function above that line
// prints nothing and still exits 0 — a self-test that never finished, reported
// as one that passed (#13798).
const SELF_TEST_VERDICT = 'check-workspace-manifest-cycles self-test reached its verdict';

function runSelfTest() {
const failures = selfTest();
if (failures.length) {
Expand All@@ -705,10 +711,20 @@ function runSelfTest() {
process.exit(1);
}
console.log('OK: check-workspace-manifest-cycles --self-test — all cases passed.');

return SELF_TEST_VERDICT;
}

// Exports bindings, so an import for those exports alone must run nothing (#10667).
if (isEntrypoint(import.meta.url)) {
if (process.argv.includes('--self-test')) runSelfTest();
else main();
if (process.argv.includes('--self-test')) {
if (runSelfTest() !== SELF_TEST_VERDICT) {
console.error(
'\n✗ check-workspace-manifest-cycles self-test: runSelfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Exiting 0 here would report a self-test\n'
+ 'that never finished as a self-test that passed.\n',
);
process.exit(1);
}
} else main();
}
20 changes: 19 additions & 1 deletion scripts/checklist-select.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -118,6 +118,13 @@ function isBlocked(it) {
}

// ── self-test ────────────────────────────────────────────────────────────────
// Set by `selfTest()` only after its verdict is printed, and read at the
// dispatch: a `return` that leaves the function above that line prints nothing
// and still exits 0 — a self-test that never finished, reported as one that
// passed (#13798). The self-test's own exit code stays load-bearing, so the
// handshake is a flag rather than a returned sentinel.
let selfTestReachedVerdict = false;

function selfTest() {
const FIX = [
{ id: 'a.one', status: 'active', priority: 'P0', surface: 'browser', since: 'v16', source: ['packages/foo/bar.ts'] },
Expand DownExpand Up@@ -150,6 +157,7 @@ function selfTest() {
eq(ids('bar.ts'), ['a.one'], 'bare source basename (code ext) → file: mode');
eq(ids('missing.json'), [], 'unmatched .json name → empty, no throw');
console.log('✓ checklist-select self-test: 17 cases pass.');
selfTestReachedVerdict = true;
process.exit(0);
}

Expand DownExpand Up@@ -197,6 +205,16 @@ function main() {
// (the skill's front half is a pure resolver), the old top-level CLI printed a
// usage block to the importer's stderr and killed it with exit 2 mid-import.
if (isEntrypoint(import.meta.url)) {
if (process.argv.includes('--self-test')) selfTest();
if (process.argv.includes('--self-test')) {
selfTest();
if (!selfTestReachedVerdict) {
console.error(
'\n✗ checklist-select self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Exiting 0 here would report a self-test\n'
+ 'that never finished as a self-test that passed.\n',
);
process.exit(1);
}
}
main();
}
Loading
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
Show file tree
Hide file tree
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
20 changes: 19 additions & 1 deletion scripts/check-exported-any-returns.mts
Original file line numberDiff line numberDiff line change
Expand Up@@ -385,6 +385,13 @@ function readLedger(target: Target): Ledger {
* nested type-literal namespaces), so it exercises the walk and not just the
* predicate.
*/
// Set by `selfTest()` only after its verdict is printed, and read at the
// dispatch: a `return` that leaves the function above that line prints nothing
// and still exits 0 — a self-test that never finished, reported as one that
// passed (#13798). The self-test's own exit code stays load-bearing, so the
// handshake is a flag rather than a returned sentinel.
let selfTestReachedVerdict = false;

function selfTest(): never {
const fail = (msg: string): never => {
console.error(`✗ self-test: ${msg}`);
Expand DownExpand Up@@ -484,6 +491,7 @@ function selfTest(): never {
'✅ self-test: flags awaited-`any` returns through nested namespaces, and NOT caller-supplied generics, ' +
'`any`-containing types, or named data properties. Ledger is exact in both directions.',
);
selfTestReachedVerdict = true;
process.exit(0);
}

Expand All@@ -492,7 +500,17 @@ function selfTest(): never {
// Both modes live behind the guard: `--self-test` calls `process.exit` too, so
// running it on import would be the same defect wearing a friendlier name.
if (isEntrypoint(import.meta.url)) {
if (SELF_TEST) selfTest();
if (SELF_TEST) {
selfTest();
if (!selfTestReachedVerdict) {
console.error(
'\n✗ check-exported-any-returns self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Exiting 0 here would report a self-test\n'
+ 'that never finished as a self-test that passed.\n',
);
process.exit(1);
}
}

const target = resolveTarget();

Expand Down
9 changes: 8 additions & 1 deletion scripts/check-filter-alias-parity.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -636,7 +636,14 @@ function main() {
}
return;
}
selfTest();
if (selfTest() !== SELF_TEST_VERDICT) {
console.error(
'\n✗ check-filter-alias-parity self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Running the gate on top of a self-test\n'
+ 'that never finished would report an unverified gate as a verified one.\n',
);
process.exit(1);
}

const read = (rel) => readFileSync(join(ROOT, rel), 'utf8');
const { problems, protocolSet, restSet } = judge({
Expand Down
9 changes: 8 additions & 1 deletion scripts/check-meta-type-normalized.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -251,7 +251,14 @@ function main() {
}
return;
}
selfTest();
if (selfTest() !== SELF_TEST_VERDICT) {
console.error(
'\n✗ check-meta-type-normalized self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Running the gate on top of a self-test\n'
+ 'that never finished would report an unverified gate as a verified one.\n',
);
process.exit(1);
}

const files = [];
for (const dir of SCAN_DIRS) walkFiles(join(ROOT, dir), files);
Expand Down
22 changes: 21 additions & 1 deletion scripts/check-osv-exemptions.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -378,6 +378,13 @@ function validateLedger(text, today) {
}

/** @returns {{ passed: boolean, lines: string[] }} */
// Set by `selfTest()` only after its verdict is printed, and read at the
// dispatch: a `return` that leaves the function above that line prints nothing
// and still exits 0 — a self-test that never finished, reported as one that
// passed (#13798). The self-test's own exit code stays load-bearing, so the
// handshake is a flag rather than a returned sentinel.
let selfTestReachedVerdict = false;

function selfTest() {
const today = new Date(Date.UTC(2026, 7, 4)); // 2026-08-04, fixed
const good = [
Expand DownExpand Up@@ -487,12 +494,25 @@ function selfTest() {
(ok ? '' : `\n got: ${problems.length === 0 ? '(no problems)' : problems.join('\n ')}`),
);
}
selfTestReachedVerdict = true;
return { passed, lines };
}

function main() {
if (process.argv.includes('--self-test')) {
const { passed, lines } = selfTest();
// Read BEFORE destructuring: an early return yields `undefined`, and
// destructuring that throws a TypeError before the handshake is reached —
// an accidental non-zero exit is not a verdict handshake (#13798).
const selfTestResult = selfTest();
if (!selfTestReachedVerdict) {
console.error(
'\n✗ check-osv-exemptions self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Exiting 0 here would report a self-test\n'
+ 'that never finished as a self-test that passed.\n',
);
process.exit(1);
}
const { passed, lines } = selfTestResult;
console.log('check-osv-exemptions self-test (both directions):');
for (const line of lines) console.log(line);
if (!passed) {
Expand Down
19 changes: 18 additions & 1 deletion scripts/check-page-declaration-shape.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -365,6 +365,13 @@ function findingMessage({ file, line, name, decl }) {
// Self-test
// ---------------------------------------------------------------------------

// Set by `selfTest()` only after its verdict is printed, and read at the
// dispatch: a `return` that leaves the function above that line prints nothing
// and still exits 0 — a self-test that never finished, reported as one that
// passed (#13798). The self-test's own exit code stays load-bearing, so the
// handshake is a flag rather than a returned sentinel.
let selfTestReachedVerdict = false;

function selfTest() {
let failed = 0;
const t = (label, ok) => {
Expand DownExpand Up@@ -481,14 +488,24 @@ function selfTest() {
PAGE_CARRIER_GLOBS.every((g) => g.includes('/')));

console.log(failed ? `\ncheck-page-declaration-shape --self-test: ${failed} FAILED` : '\ncheck-page-declaration-shape --self-test: all passed');
selfTestReachedVerdict = true;
return failed === 0;
}

// ---------------------------------------------------------------------------

if (isEntrypoint(import.meta.url)) {
if (process.argv.includes('--self-test')) {
process.exit(selfTest() ? 0 : 1);
const selfTestOk = selfTest();
if (!selfTestReachedVerdict) {
console.error(
'\n✗ check-page-declaration-shape self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Exiting 0 here would report a self-test\n'
+ 'that never finished as a self-test that passed.\n',
);
process.exit(1);
}
process.exit(selfTestOk ? 0 : 1);
}
const result = scan();
const computed = computedCarrierSites();
Expand Down
20 changes: 18 additions & 2 deletions scripts/check-skill-identifier-liveness.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -868,6 +868,12 @@ function allSpecSources() {

// ── Self-test ───────────────────────────────────────────────────────────────

// Returned by `selfTest()` only after its verdict is printed. The dispatch
// refuses anything else: a `return` that leaves the function above that line
// prints nothing and still exits 0 — a self-test that never finished, reported
// as one that passed (#13798).
const SELF_TEST_VERDICT = 'check-skill-identifier-liveness self-test reached its verdict';

/**
* Why this exists at all, in the words of the wiring gate that requires it: a
* gate whose defect class is its MATCHING RULE cannot detect its own regression
Expand DownExpand Up@@ -1141,6 +1147,8 @@ function selfTest() {
process.exit(1);
}
console.log('check-skill-identifier-liveness --self-test OK');

return SELF_TEST_VERDICT;
}

let SELF_SOURCE = null;
Expand All@@ -1152,6 +1160,14 @@ function selfSource() {
}

if (isEntrypoint(import.meta.url)) {
if (argv.includes('--self-test')) selfTest();
else main();
if (argv.includes('--self-test')) {
if (selfTest() !== SELF_TEST_VERDICT) {
console.error(
'\n✗ check-skill-identifier-liveness self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Exiting 0 here would report a self-test\n'
+ 'that never finished as a self-test that passed.\n',
);
process.exit(1);
}
} else main();
}
20 changes: 18 additions & 2 deletions scripts/check-skills-token-ratchet.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -704,6 +704,12 @@ function fixtureTree() {
return { root, cleanup: () => rmSync(root, { recursive: true, force: true }) };
}

// Returned by `selfTest()` only after its verdict is printed. The dispatch
// refuses anything else: a `return` that leaves the function above that line
// prints nothing and still exits 0 — a self-test that never finished, reported
// as one that passed (#13798).
const SELF_TEST_VERDICT = 'check-skills-token-ratchet self-test reached its verdict';

function selfTest() {
const rel = 'skills/objectstack-ui/SKILL.md';
const over = verdict(rel, 26000, 25154).msg;
Expand DownExpand Up@@ -922,9 +928,19 @@ function selfTest() {
process.exit(1);
}
console.log(`✓ check-skills-token-ratchet self-test: ${cases.length} cases pass.`);

return SELF_TEST_VERDICT;
}

if (isEntrypoint(import.meta.url)) {
if (process.argv.includes('--self-test')) selfTest();
else run();
if (process.argv.includes('--self-test')) {
if (selfTest() !== SELF_TEST_VERDICT) {
console.error(
'\n✗ check-skills-token-ratchet self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Exiting 0 here would report a self-test\n'
+ 'that never finished as a self-test that passed.\n',
);
process.exit(1);
}
} else run();
}
9 changes: 8 additions & 1 deletion scripts/check-test-completeness.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -925,7 +925,14 @@ function main() {
return;
}
// Every invocation, not a lint step -- see the header note on why.
selfTest({ quiet: true });
if (selfTest({ quiet: true }) !== SELF_TEST_VERDICT) {
console.error(
'\n✗ check-test-completeness self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Running the gate on top of a self-test\n'
+ 'that never finished would report an unverified gate as a verified one.\n',
);
process.exit(1);
}

const { verdict, paths } = invocationVerdict(argv);
if (verdict) reportVerdict(verdict);
Expand Down
17 changes: 16 additions & 1 deletion scripts/check-type-source-resolution.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -1724,6 +1724,12 @@ function buildFixtureTree() {
return root;
}

// Returned by `selfTest()` only after its verdict is printed. The dispatch
// refuses anything else: a `return` that leaves the function above that line
// prints nothing and still exits 0 — a self-test that never finished, reported
// as one that passed (#13798).
const SELF_TEST_VERDICT = 'check-type-source-resolution self-test reached its verdict';

function selfTest() {
const root = buildFixtureTree();
const problems = [];
Expand DownExpand Up@@ -2062,13 +2068,22 @@ function selfTest() {
process.exit(1);
}
console.log('check-type-source-resolution --self-test OK');

return SELF_TEST_VERDICT;
}

// ── entry point ─────────────────────────────────────────────────────────────

const argv = process.argv.slice(2);
if (argv.includes('--self-test')) {
selfTest();
if (selfTest() !== SELF_TEST_VERDICT) {
console.error(
'\n✗ check-type-source-resolution self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Exiting 0 here would report a self-test\n'
+ 'that never finished as a self-test that passed.\n',
);
process.exit(1);
}
} else if (argv.includes('--list')) {
printList(REPO_ROOT);
} else {
Expand Down
20 changes: 18 additions & 2 deletions scripts/check-workspace-manifest-cycles.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -697,6 +697,12 @@ export function selfTest() {
return failures;
}

// Returned by `runSelfTest()` only after its verdict is printed. The dispatch
// refuses anything else: a `return` that leaves the function above that line
// prints nothing and still exits 0 — a self-test that never finished, reported
// as one that passed (#13798).
const SELF_TEST_VERDICT = 'check-workspace-manifest-cycles self-test reached its verdict';

function runSelfTest() {
const failures = selfTest();
if (failures.length) {
Expand All@@ -705,10 +711,20 @@ function runSelfTest() {
process.exit(1);
}
console.log('OK: check-workspace-manifest-cycles --self-test — all cases passed.');

return SELF_TEST_VERDICT;
}

// Exports bindings, so an import for those exports alone must run nothing (#10667).
if (isEntrypoint(import.meta.url)) {
if (process.argv.includes('--self-test')) runSelfTest();
else main();
if (process.argv.includes('--self-test')) {
if (runSelfTest() !== SELF_TEST_VERDICT) {
console.error(
'\n✗ check-workspace-manifest-cycles self-test: runSelfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Exiting 0 here would report a self-test\n'
+ 'that never finished as a self-test that passed.\n',
);
process.exit(1);
}
} else main();
}
20 changes: 19 additions & 1 deletion scripts/checklist-select.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -118,6 +118,13 @@ function isBlocked(it) {
}

// ── self-test ────────────────────────────────────────────────────────────────
// Set by `selfTest()` only after its verdict is printed, and read at the
// dispatch: a `return` that leaves the function above that line prints nothing
// and still exits 0 — a self-test that never finished, reported as one that
// passed (#13798). The self-test's own exit code stays load-bearing, so the
// handshake is a flag rather than a returned sentinel.
let selfTestReachedVerdict = false;

function selfTest() {
const FIX = [
{ id: 'a.one', status: 'active', priority: 'P0', surface: 'browser', since: 'v16', source: ['packages/foo/bar.ts'] },
Expand DownExpand Up@@ -150,6 +157,7 @@ function selfTest() {
eq(ids('bar.ts'), ['a.one'], 'bare source basename (code ext) → file: mode');
eq(ids('missing.json'), [], 'unmatched .json name → empty, no throw');
console.log('✓ checklist-select self-test: 17 cases pass.');
selfTestReachedVerdict = true;
process.exit(0);
}

Expand DownExpand Up@@ -197,6 +205,16 @@ function main() {
// (the skill's front half is a pure resolver), the old top-level CLI printed a
// usage block to the importer's stderr and killed it with exit 2 mid-import.
if (isEntrypoint(import.meta.url)) {
if (process.argv.includes('--self-test')) selfTest();
if (process.argv.includes('--self-test')) {
selfTest();
if (!selfTestReachedVerdict) {
console.error(
'\n✗ checklist-select self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Exiting 0 here would report a self-test\n'
+ 'that never finished as a self-test that passed.\n',
);
process.exit(1);
}
}
main();
}
Loading
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
Show file tree
Hide file tree
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
20 changes: 19 additions & 1 deletion scripts/check-exported-any-returns.mts
Original file line numberDiff line numberDiff line change
Expand Up@@ -385,6 +385,13 @@ function readLedger(target: Target): Ledger {
* nested type-literal namespaces), so it exercises the walk and not just the
* predicate.
*/
// Set by `selfTest()` only after its verdict is printed, and read at the
// dispatch: a `return` that leaves the function above that line prints nothing
// and still exits 0 — a self-test that never finished, reported as one that
// passed (#13798). The self-test's own exit code stays load-bearing, so the
// handshake is a flag rather than a returned sentinel.
let selfTestReachedVerdict = false;

function selfTest(): never {
const fail = (msg: string): never => {
console.error(`✗ self-test: ${msg}`);
Expand DownExpand Up@@ -484,6 +491,7 @@ function selfTest(): never {
'✅ self-test: flags awaited-`any` returns through nested namespaces, and NOT caller-supplied generics, ' +
'`any`-containing types, or named data properties. Ledger is exact in both directions.',
);
selfTestReachedVerdict = true;
process.exit(0);
}

Expand All@@ -492,7 +500,17 @@ function selfTest(): never {
// Both modes live behind the guard: `--self-test` calls `process.exit` too, so
// running it on import would be the same defect wearing a friendlier name.
if (isEntrypoint(import.meta.url)) {
if (SELF_TEST) selfTest();
if (SELF_TEST) {
selfTest();
if (!selfTestReachedVerdict) {
console.error(
'\n✗ check-exported-any-returns self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Exiting 0 here would report a self-test\n'
+ 'that never finished as a self-test that passed.\n',
);
process.exit(1);
}
}

const target = resolveTarget();

Expand Down
9 changes: 8 additions & 1 deletion scripts/check-filter-alias-parity.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -636,7 +636,14 @@ function main() {
}
return;
}
selfTest();
if (selfTest() !== SELF_TEST_VERDICT) {
console.error(
'\n✗ check-filter-alias-parity self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Running the gate on top of a self-test\n'
+ 'that never finished would report an unverified gate as a verified one.\n',
);
process.exit(1);
}

const read = (rel) => readFileSync(join(ROOT, rel), 'utf8');
const { problems, protocolSet, restSet } = judge({
Expand Down
9 changes: 8 additions & 1 deletion scripts/check-meta-type-normalized.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -251,7 +251,14 @@ function main() {
}
return;
}
selfTest();
if (selfTest() !== SELF_TEST_VERDICT) {
console.error(
'\n✗ check-meta-type-normalized self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Running the gate on top of a self-test\n'
+ 'that never finished would report an unverified gate as a verified one.\n',
);
process.exit(1);
}

const files = [];
for (const dir of SCAN_DIRS) walkFiles(join(ROOT, dir), files);
Expand Down
22 changes: 21 additions & 1 deletion scripts/check-osv-exemptions.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -378,6 +378,13 @@ function validateLedger(text, today) {
}

/** @returns {{ passed: boolean, lines: string[] }} */
// Set by `selfTest()` only after its verdict is printed, and read at the
// dispatch: a `return` that leaves the function above that line prints nothing
// and still exits 0 — a self-test that never finished, reported as one that
// passed (#13798). The self-test's own exit code stays load-bearing, so the
// handshake is a flag rather than a returned sentinel.
let selfTestReachedVerdict = false;

function selfTest() {
const today = new Date(Date.UTC(2026, 7, 4)); // 2026-08-04, fixed
const good = [
Expand DownExpand Up@@ -487,12 +494,25 @@ function selfTest() {
(ok ? '' : `\n got: ${problems.length === 0 ? '(no problems)' : problems.join('\n ')}`),
);
}
selfTestReachedVerdict = true;
return { passed, lines };
}

function main() {
if (process.argv.includes('--self-test')) {
const { passed, lines } = selfTest();
// Read BEFORE destructuring: an early return yields `undefined`, and
// destructuring that throws a TypeError before the handshake is reached —
// an accidental non-zero exit is not a verdict handshake (#13798).
const selfTestResult = selfTest();
if (!selfTestReachedVerdict) {
console.error(
'\n✗ check-osv-exemptions self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Exiting 0 here would report a self-test\n'
+ 'that never finished as a self-test that passed.\n',
);
process.exit(1);
}
const { passed, lines } = selfTestResult;
console.log('check-osv-exemptions self-test (both directions):');
for (const line of lines) console.log(line);
if (!passed) {
Expand Down
19 changes: 18 additions & 1 deletion scripts/check-page-declaration-shape.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -365,6 +365,13 @@ function findingMessage({ file, line, name, decl }) {
// Self-test
// ---------------------------------------------------------------------------

// Set by `selfTest()` only after its verdict is printed, and read at the
// dispatch: a `return` that leaves the function above that line prints nothing
// and still exits 0 — a self-test that never finished, reported as one that
// passed (#13798). The self-test's own exit code stays load-bearing, so the
// handshake is a flag rather than a returned sentinel.
let selfTestReachedVerdict = false;

function selfTest() {
let failed = 0;
const t = (label, ok) => {
Expand DownExpand Up@@ -481,14 +488,24 @@ function selfTest() {
PAGE_CARRIER_GLOBS.every((g) => g.includes('/')));

console.log(failed ? `\ncheck-page-declaration-shape --self-test: ${failed} FAILED` : '\ncheck-page-declaration-shape --self-test: all passed');
selfTestReachedVerdict = true;
return failed === 0;
}

// ---------------------------------------------------------------------------

if (isEntrypoint(import.meta.url)) {
if (process.argv.includes('--self-test')) {
process.exit(selfTest() ? 0 : 1);
const selfTestOk = selfTest();
if (!selfTestReachedVerdict) {
console.error(
'\n✗ check-page-declaration-shape self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Exiting 0 here would report a self-test\n'
+ 'that never finished as a self-test that passed.\n',
);
process.exit(1);
}
process.exit(selfTestOk ? 0 : 1);
}
const result = scan();
const computed = computedCarrierSites();
Expand Down
20 changes: 18 additions & 2 deletions scripts/check-skill-identifier-liveness.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -868,6 +868,12 @@ function allSpecSources() {

// ── Self-test ───────────────────────────────────────────────────────────────

// Returned by `selfTest()` only after its verdict is printed. The dispatch
// refuses anything else: a `return` that leaves the function above that line
// prints nothing and still exits 0 — a self-test that never finished, reported
// as one that passed (#13798).
const SELF_TEST_VERDICT = 'check-skill-identifier-liveness self-test reached its verdict';

/**
* Why this exists at all, in the words of the wiring gate that requires it: a
* gate whose defect class is its MATCHING RULE cannot detect its own regression
Expand DownExpand Up@@ -1141,6 +1147,8 @@ function selfTest() {
process.exit(1);
}
console.log('check-skill-identifier-liveness --self-test OK');

return SELF_TEST_VERDICT;
}

let SELF_SOURCE = null;
Expand All@@ -1152,6 +1160,14 @@ function selfSource() {
}

if (isEntrypoint(import.meta.url)) {
if (argv.includes('--self-test')) selfTest();
else main();
if (argv.includes('--self-test')) {
if (selfTest() !== SELF_TEST_VERDICT) {
console.error(
'\n✗ check-skill-identifier-liveness self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Exiting 0 here would report a self-test\n'
+ 'that never finished as a self-test that passed.\n',
);
process.exit(1);
}
} else main();
}
20 changes: 18 additions & 2 deletions scripts/check-skills-token-ratchet.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -704,6 +704,12 @@ function fixtureTree() {
return { root, cleanup: () => rmSync(root, { recursive: true, force: true }) };
}

// Returned by `selfTest()` only after its verdict is printed. The dispatch
// refuses anything else: a `return` that leaves the function above that line
// prints nothing and still exits 0 — a self-test that never finished, reported
// as one that passed (#13798).
const SELF_TEST_VERDICT = 'check-skills-token-ratchet self-test reached its verdict';

function selfTest() {
const rel = 'skills/objectstack-ui/SKILL.md';
const over = verdict(rel, 26000, 25154).msg;
Expand DownExpand Up@@ -922,9 +928,19 @@ function selfTest() {
process.exit(1);
}
console.log(`✓ check-skills-token-ratchet self-test: ${cases.length} cases pass.`);

return SELF_TEST_VERDICT;
}

if (isEntrypoint(import.meta.url)) {
if (process.argv.includes('--self-test')) selfTest();
else run();
if (process.argv.includes('--self-test')) {
if (selfTest() !== SELF_TEST_VERDICT) {
console.error(
'\n✗ check-skills-token-ratchet self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Exiting 0 here would report a self-test\n'
+ 'that never finished as a self-test that passed.\n',
);
process.exit(1);
}
} else run();
}
9 changes: 8 additions & 1 deletion scripts/check-test-completeness.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -925,7 +925,14 @@ function main() {
return;
}
// Every invocation, not a lint step -- see the header note on why.
selfTest({ quiet: true });
if (selfTest({ quiet: true }) !== SELF_TEST_VERDICT) {
console.error(
'\n✗ check-test-completeness self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Running the gate on top of a self-test\n'
+ 'that never finished would report an unverified gate as a verified one.\n',
);
process.exit(1);
}

const { verdict, paths } = invocationVerdict(argv);
if (verdict) reportVerdict(verdict);
Expand Down
17 changes: 16 additions & 1 deletion scripts/check-type-source-resolution.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -1724,6 +1724,12 @@ function buildFixtureTree() {
return root;
}

// Returned by `selfTest()` only after its verdict is printed. The dispatch
// refuses anything else: a `return` that leaves the function above that line
// prints nothing and still exits 0 — a self-test that never finished, reported
// as one that passed (#13798).
const SELF_TEST_VERDICT = 'check-type-source-resolution self-test reached its verdict';

function selfTest() {
const root = buildFixtureTree();
const problems = [];
Expand DownExpand Up@@ -2062,13 +2068,22 @@ function selfTest() {
process.exit(1);
}
console.log('check-type-source-resolution --self-test OK');

return SELF_TEST_VERDICT;
}

// ── entry point ─────────────────────────────────────────────────────────────

const argv = process.argv.slice(2);
if (argv.includes('--self-test')) {
selfTest();
if (selfTest() !== SELF_TEST_VERDICT) {
console.error(
'\n✗ check-type-source-resolution self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Exiting 0 here would report a self-test\n'
+ 'that never finished as a self-test that passed.\n',
);
process.exit(1);
}
} else if (argv.includes('--list')) {
printList(REPO_ROOT);
} else {
Expand Down
20 changes: 18 additions & 2 deletions scripts/check-workspace-manifest-cycles.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -697,6 +697,12 @@ export function selfTest() {
return failures;
}

// Returned by `runSelfTest()` only after its verdict is printed. The dispatch
// refuses anything else: a `return` that leaves the function above that line
// prints nothing and still exits 0 — a self-test that never finished, reported
// as one that passed (#13798).
const SELF_TEST_VERDICT = 'check-workspace-manifest-cycles self-test reached its verdict';

function runSelfTest() {
const failures = selfTest();
if (failures.length) {
Expand All@@ -705,10 +711,20 @@ function runSelfTest() {
process.exit(1);
}
console.log('OK: check-workspace-manifest-cycles --self-test — all cases passed.');

return SELF_TEST_VERDICT;
}

// Exports bindings, so an import for those exports alone must run nothing (#10667).
if (isEntrypoint(import.meta.url)) {
if (process.argv.includes('--self-test')) runSelfTest();
else main();
if (process.argv.includes('--self-test')) {
if (runSelfTest() !== SELF_TEST_VERDICT) {
console.error(
'\n✗ check-workspace-manifest-cycles self-test: runSelfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Exiting 0 here would report a self-test\n'
+ 'that never finished as a self-test that passed.\n',
);
process.exit(1);
}
} else main();
}
20 changes: 19 additions & 1 deletion scripts/checklist-select.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -118,6 +118,13 @@ function isBlocked(it) {
}

// ── self-test ────────────────────────────────────────────────────────────────
// Set by `selfTest()` only after its verdict is printed, and read at the
// dispatch: a `return` that leaves the function above that line prints nothing
// and still exits 0 — a self-test that never finished, reported as one that
// passed (#13798). The self-test's own exit code stays load-bearing, so the
// handshake is a flag rather than a returned sentinel.
let selfTestReachedVerdict = false;

function selfTest() {
const FIX = [
{ id: 'a.one', status: 'active', priority: 'P0', surface: 'browser', since: 'v16', source: ['packages/foo/bar.ts'] },
Expand DownExpand Up@@ -150,6 +157,7 @@ function selfTest() {
eq(ids('bar.ts'), ['a.one'], 'bare source basename (code ext) → file: mode');
eq(ids('missing.json'), [], 'unmatched .json name → empty, no throw');
console.log('✓ checklist-select self-test: 17 cases pass.');
selfTestReachedVerdict = true;
process.exit(0);
}

Expand DownExpand Up@@ -197,6 +205,16 @@ function main() {
// (the skill's front half is a pure resolver), the old top-level CLI printed a
// usage block to the importer's stderr and killed it with exit 2 mid-import.
if (isEntrypoint(import.meta.url)) {
if (process.argv.includes('--self-test')) selfTest();
if (process.argv.includes('--self-test')) {
selfTest();
if (!selfTestReachedVerdict) {
console.error(
'\n✗ checklist-select self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Exiting 0 here would report a self-test\n'
+ 'that never finished as a self-test that passed.\n',
);
process.exit(1);
}
}
main();
}
Loading
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
Show file tree
Hide file tree
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
20 changes: 19 additions & 1 deletion scripts/check-exported-any-returns.mts
Original file line numberDiff line numberDiff line change
Expand Up@@ -385,6 +385,13 @@ function readLedger(target: Target): Ledger {
* nested type-literal namespaces), so it exercises the walk and not just the
* predicate.
*/
// Set by `selfTest()` only after its verdict is printed, and read at the
// dispatch: a `return` that leaves the function above that line prints nothing
// and still exits 0 — a self-test that never finished, reported as one that
// passed (#13798). The self-test's own exit code stays load-bearing, so the
// handshake is a flag rather than a returned sentinel.
let selfTestReachedVerdict = false;

function selfTest(): never {
const fail = (msg: string): never => {
console.error(`✗ self-test: ${msg}`);
Expand DownExpand Up@@ -484,6 +491,7 @@ function selfTest(): never {
'✅ self-test: flags awaited-`any` returns through nested namespaces, and NOT caller-supplied generics, ' +
'`any`-containing types, or named data properties. Ledger is exact in both directions.',
);
selfTestReachedVerdict = true;
process.exit(0);
}

Expand All@@ -492,7 +500,17 @@ function selfTest(): never {
// Both modes live behind the guard: `--self-test` calls `process.exit` too, so
// running it on import would be the same defect wearing a friendlier name.
if (isEntrypoint(import.meta.url)) {
if (SELF_TEST) selfTest();
if (SELF_TEST) {
selfTest();
if (!selfTestReachedVerdict) {
console.error(
'\n✗ check-exported-any-returns self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Exiting 0 here would report a self-test\n'
+ 'that never finished as a self-test that passed.\n',
);
process.exit(1);
}
}

const target = resolveTarget();

Expand Down
9 changes: 8 additions & 1 deletion scripts/check-filter-alias-parity.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -636,7 +636,14 @@ function main() {
}
return;
}
selfTest();
if (selfTest() !== SELF_TEST_VERDICT) {
console.error(
'\n✗ check-filter-alias-parity self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Running the gate on top of a self-test\n'
+ 'that never finished would report an unverified gate as a verified one.\n',
);
process.exit(1);
}

const read = (rel) => readFileSync(join(ROOT, rel), 'utf8');
const { problems, protocolSet, restSet } = judge({
Expand Down
9 changes: 8 additions & 1 deletion scripts/check-meta-type-normalized.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -251,7 +251,14 @@ function main() {
}
return;
}
selfTest();
if (selfTest() !== SELF_TEST_VERDICT) {
console.error(
'\n✗ check-meta-type-normalized self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Running the gate on top of a self-test\n'
+ 'that never finished would report an unverified gate as a verified one.\n',
);
process.exit(1);
}

const files = [];
for (const dir of SCAN_DIRS) walkFiles(join(ROOT, dir), files);
Expand Down
22 changes: 21 additions & 1 deletion scripts/check-osv-exemptions.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -378,6 +378,13 @@ function validateLedger(text, today) {
}

/** @returns {{ passed: boolean, lines: string[] }} */
// Set by `selfTest()` only after its verdict is printed, and read at the
// dispatch: a `return` that leaves the function above that line prints nothing
// and still exits 0 — a self-test that never finished, reported as one that
// passed (#13798). The self-test's own exit code stays load-bearing, so the
// handshake is a flag rather than a returned sentinel.
let selfTestReachedVerdict = false;

function selfTest() {
const today = new Date(Date.UTC(2026, 7, 4)); // 2026-08-04, fixed
const good = [
Expand DownExpand Up@@ -487,12 +494,25 @@ function selfTest() {
(ok ? '' : `\n got: ${problems.length === 0 ? '(no problems)' : problems.join('\n ')}`),
);
}
selfTestReachedVerdict = true;
return { passed, lines };
}

function main() {
if (process.argv.includes('--self-test')) {
const { passed, lines } = selfTest();
// Read BEFORE destructuring: an early return yields `undefined`, and
// destructuring that throws a TypeError before the handshake is reached —
// an accidental non-zero exit is not a verdict handshake (#13798).
const selfTestResult = selfTest();
if (!selfTestReachedVerdict) {
console.error(
'\n✗ check-osv-exemptions self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Exiting 0 here would report a self-test\n'
+ 'that never finished as a self-test that passed.\n',
);
process.exit(1);
}
const { passed, lines } = selfTestResult;
console.log('check-osv-exemptions self-test (both directions):');
for (const line of lines) console.log(line);
if (!passed) {
Expand Down
19 changes: 18 additions & 1 deletion scripts/check-page-declaration-shape.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -365,6 +365,13 @@ function findingMessage({ file, line, name, decl }) {
// Self-test
// ---------------------------------------------------------------------------

// Set by `selfTest()` only after its verdict is printed, and read at the
// dispatch: a `return` that leaves the function above that line prints nothing
// and still exits 0 — a self-test that never finished, reported as one that
// passed (#13798). The self-test's own exit code stays load-bearing, so the
// handshake is a flag rather than a returned sentinel.
let selfTestReachedVerdict = false;

function selfTest() {
let failed = 0;
const t = (label, ok) => {
Expand DownExpand Up@@ -481,14 +488,24 @@ function selfTest() {
PAGE_CARRIER_GLOBS.every((g) => g.includes('/')));

console.log(failed ? `\ncheck-page-declaration-shape --self-test: ${failed} FAILED` : '\ncheck-page-declaration-shape --self-test: all passed');
selfTestReachedVerdict = true;
return failed === 0;
}

// ---------------------------------------------------------------------------

if (isEntrypoint(import.meta.url)) {
if (process.argv.includes('--self-test')) {
process.exit(selfTest() ? 0 : 1);
const selfTestOk = selfTest();
if (!selfTestReachedVerdict) {
console.error(
'\n✗ check-page-declaration-shape self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Exiting 0 here would report a self-test\n'
+ 'that never finished as a self-test that passed.\n',
);
process.exit(1);
}
process.exit(selfTestOk ? 0 : 1);
}
const result = scan();
const computed = computedCarrierSites();
Expand Down
20 changes: 18 additions & 2 deletions scripts/check-skill-identifier-liveness.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -868,6 +868,12 @@ function allSpecSources() {

// ── Self-test ───────────────────────────────────────────────────────────────

// Returned by `selfTest()` only after its verdict is printed. The dispatch
// refuses anything else: a `return` that leaves the function above that line
// prints nothing and still exits 0 — a self-test that never finished, reported
// as one that passed (#13798).
const SELF_TEST_VERDICT = 'check-skill-identifier-liveness self-test reached its verdict';

/**
* Why this exists at all, in the words of the wiring gate that requires it: a
* gate whose defect class is its MATCHING RULE cannot detect its own regression
Expand DownExpand Up@@ -1141,6 +1147,8 @@ function selfTest() {
process.exit(1);
}
console.log('check-skill-identifier-liveness --self-test OK');

return SELF_TEST_VERDICT;
}

let SELF_SOURCE = null;
Expand All@@ -1152,6 +1160,14 @@ function selfSource() {
}

if (isEntrypoint(import.meta.url)) {
if (argv.includes('--self-test')) selfTest();
else main();
if (argv.includes('--self-test')) {
if (selfTest() !== SELF_TEST_VERDICT) {
console.error(
'\n✗ check-skill-identifier-liveness self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Exiting 0 here would report a self-test\n'
+ 'that never finished as a self-test that passed.\n',
);
process.exit(1);
}
} else main();
}
20 changes: 18 additions & 2 deletions scripts/check-skills-token-ratchet.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -704,6 +704,12 @@ function fixtureTree() {
return { root, cleanup: () => rmSync(root, { recursive: true, force: true }) };
}

// Returned by `selfTest()` only after its verdict is printed. The dispatch
// refuses anything else: a `return` that leaves the function above that line
// prints nothing and still exits 0 — a self-test that never finished, reported
// as one that passed (#13798).
const SELF_TEST_VERDICT = 'check-skills-token-ratchet self-test reached its verdict';

function selfTest() {
const rel = 'skills/objectstack-ui/SKILL.md';
const over = verdict(rel, 26000, 25154).msg;
Expand DownExpand Up@@ -922,9 +928,19 @@ function selfTest() {
process.exit(1);
}
console.log(`✓ check-skills-token-ratchet self-test: ${cases.length} cases pass.`);

return SELF_TEST_VERDICT;
}

if (isEntrypoint(import.meta.url)) {
if (process.argv.includes('--self-test')) selfTest();
else run();
if (process.argv.includes('--self-test')) {
if (selfTest() !== SELF_TEST_VERDICT) {
console.error(
'\n✗ check-skills-token-ratchet self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Exiting 0 here would report a self-test\n'
+ 'that never finished as a self-test that passed.\n',
);
process.exit(1);
}
} else run();
}
9 changes: 8 additions & 1 deletion scripts/check-test-completeness.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -925,7 +925,14 @@ function main() {
return;
}
// Every invocation, not a lint step -- see the header note on why.
selfTest({ quiet: true });
if (selfTest({ quiet: true }) !== SELF_TEST_VERDICT) {
console.error(
'\n✗ check-test-completeness self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Running the gate on top of a self-test\n'
+ 'that never finished would report an unverified gate as a verified one.\n',
);
process.exit(1);
}

const { verdict, paths } = invocationVerdict(argv);
if (verdict) reportVerdict(verdict);
Expand Down
17 changes: 16 additions & 1 deletion scripts/check-type-source-resolution.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -1724,6 +1724,12 @@ function buildFixtureTree() {
return root;
}

// Returned by `selfTest()` only after its verdict is printed. The dispatch
// refuses anything else: a `return` that leaves the function above that line
// prints nothing and still exits 0 — a self-test that never finished, reported
// as one that passed (#13798).
const SELF_TEST_VERDICT = 'check-type-source-resolution self-test reached its verdict';

function selfTest() {
const root = buildFixtureTree();
const problems = [];
Expand DownExpand Up@@ -2062,13 +2068,22 @@ function selfTest() {
process.exit(1);
}
console.log('check-type-source-resolution --self-test OK');

return SELF_TEST_VERDICT;
}

// ── entry point ─────────────────────────────────────────────────────────────

const argv = process.argv.slice(2);
if (argv.includes('--self-test')) {
selfTest();
if (selfTest() !== SELF_TEST_VERDICT) {
console.error(
'\n✗ check-type-source-resolution self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Exiting 0 here would report a self-test\n'
+ 'that never finished as a self-test that passed.\n',
);
process.exit(1);
}
} else if (argv.includes('--list')) {
printList(REPO_ROOT);
} else {
Expand Down
20 changes: 18 additions & 2 deletions scripts/check-workspace-manifest-cycles.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -697,6 +697,12 @@ export function selfTest() {
return failures;
}

// Returned by `runSelfTest()` only after its verdict is printed. The dispatch
// refuses anything else: a `return` that leaves the function above that line
// prints nothing and still exits 0 — a self-test that never finished, reported
// as one that passed (#13798).
const SELF_TEST_VERDICT = 'check-workspace-manifest-cycles self-test reached its verdict';

function runSelfTest() {
const failures = selfTest();
if (failures.length) {
Expand All@@ -705,10 +711,20 @@ function runSelfTest() {
process.exit(1);
}
console.log('OK: check-workspace-manifest-cycles --self-test — all cases passed.');

return SELF_TEST_VERDICT;
}

// Exports bindings, so an import for those exports alone must run nothing (#10667).
if (isEntrypoint(import.meta.url)) {
if (process.argv.includes('--self-test')) runSelfTest();
else main();
if (process.argv.includes('--self-test')) {
if (runSelfTest() !== SELF_TEST_VERDICT) {
console.error(
'\n✗ check-workspace-manifest-cycles self-test: runSelfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Exiting 0 here would report a self-test\n'
+ 'that never finished as a self-test that passed.\n',
);
process.exit(1);
}
} else main();
}
20 changes: 19 additions & 1 deletion scripts/checklist-select.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -118,6 +118,13 @@ function isBlocked(it) {
}

// ── self-test ────────────────────────────────────────────────────────────────
// Set by `selfTest()` only after its verdict is printed, and read at the
// dispatch: a `return` that leaves the function above that line prints nothing
// and still exits 0 — a self-test that never finished, reported as one that
// passed (#13798). The self-test's own exit code stays load-bearing, so the
// handshake is a flag rather than a returned sentinel.
let selfTestReachedVerdict = false;

function selfTest() {
const FIX = [
{ id: 'a.one', status: 'active', priority: 'P0', surface: 'browser', since: 'v16', source: ['packages/foo/bar.ts'] },
Expand DownExpand Up@@ -150,6 +157,7 @@ function selfTest() {
eq(ids('bar.ts'), ['a.one'], 'bare source basename (code ext) → file: mode');
eq(ids('missing.json'), [], 'unmatched .json name → empty, no throw');
console.log('✓ checklist-select self-test: 17 cases pass.');
selfTestReachedVerdict = true;
process.exit(0);
}

Expand DownExpand Up@@ -197,6 +205,16 @@ function main() {
// (the skill's front half is a pure resolver), the old top-level CLI printed a
// usage block to the importer's stderr and killed it with exit 2 mid-import.
if (isEntrypoint(import.meta.url)) {
if (process.argv.includes('--self-test')) selfTest();
if (process.argv.includes('--self-test')) {
selfTest();
if (!selfTestReachedVerdict) {
console.error(
'\n✗ checklist-select self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Exiting 0 here would report a self-test\n'
+ 'that never finished as a self-test that passed.\n',
);
process.exit(1);
}
}
main();
}
Loading
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
Show file tree
Hide file tree
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
20 changes: 19 additions & 1 deletion scripts/check-exported-any-returns.mts
Original file line numberDiff line numberDiff line change
Expand Up@@ -385,6 +385,13 @@ function readLedger(target: Target): Ledger {
* nested type-literal namespaces), so it exercises the walk and not just the
* predicate.
*/
// Set by `selfTest()` only after its verdict is printed, and read at the
// dispatch: a `return` that leaves the function above that line prints nothing
// and still exits 0 — a self-test that never finished, reported as one that
// passed (#13798). The self-test's own exit code stays load-bearing, so the
// handshake is a flag rather than a returned sentinel.
let selfTestReachedVerdict = false;

function selfTest(): never {
const fail = (msg: string): never => {
console.error(`✗ self-test: ${msg}`);
Expand DownExpand Up@@ -484,6 +491,7 @@ function selfTest(): never {
'✅ self-test: flags awaited-`any` returns through nested namespaces, and NOT caller-supplied generics, ' +
'`any`-containing types, or named data properties. Ledger is exact in both directions.',
);
selfTestReachedVerdict = true;
process.exit(0);
}

Expand All@@ -492,7 +500,17 @@ function selfTest(): never {
// Both modes live behind the guard: `--self-test` calls `process.exit` too, so
// running it on import would be the same defect wearing a friendlier name.
if (isEntrypoint(import.meta.url)) {
if (SELF_TEST) selfTest();
if (SELF_TEST) {
selfTest();
if (!selfTestReachedVerdict) {
console.error(
'\n✗ check-exported-any-returns self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Exiting 0 here would report a self-test\n'
+ 'that never finished as a self-test that passed.\n',
);
process.exit(1);
}
}

const target = resolveTarget();

Expand Down
9 changes: 8 additions & 1 deletion scripts/check-filter-alias-parity.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -636,7 +636,14 @@ function main() {
}
return;
}
selfTest();
if (selfTest() !== SELF_TEST_VERDICT) {
console.error(
'\n✗ check-filter-alias-parity self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Running the gate on top of a self-test\n'
+ 'that never finished would report an unverified gate as a verified one.\n',
);
process.exit(1);
}

const read = (rel) => readFileSync(join(ROOT, rel), 'utf8');
const { problems, protocolSet, restSet } = judge({
Expand Down
9 changes: 8 additions & 1 deletion scripts/check-meta-type-normalized.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -251,7 +251,14 @@ function main() {
}
return;
}
selfTest();
if (selfTest() !== SELF_TEST_VERDICT) {
console.error(
'\n✗ check-meta-type-normalized self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Running the gate on top of a self-test\n'
+ 'that never finished would report an unverified gate as a verified one.\n',
);
process.exit(1);
}

const files = [];
for (const dir of SCAN_DIRS) walkFiles(join(ROOT, dir), files);
Expand Down
22 changes: 21 additions & 1 deletion scripts/check-osv-exemptions.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -378,6 +378,13 @@ function validateLedger(text, today) {
}

/** @returns {{ passed: boolean, lines: string[] }} */
// Set by `selfTest()` only after its verdict is printed, and read at the
// dispatch: a `return` that leaves the function above that line prints nothing
// and still exits 0 — a self-test that never finished, reported as one that
// passed (#13798). The self-test's own exit code stays load-bearing, so the
// handshake is a flag rather than a returned sentinel.
let selfTestReachedVerdict = false;

function selfTest() {
const today = new Date(Date.UTC(2026, 7, 4)); // 2026-08-04, fixed
const good = [
Expand DownExpand Up@@ -487,12 +494,25 @@ function selfTest() {
(ok ? '' : `\n got: ${problems.length === 0 ? '(no problems)' : problems.join('\n ')}`),
);
}
selfTestReachedVerdict = true;
return { passed, lines };
}

function main() {
if (process.argv.includes('--self-test')) {
const { passed, lines } = selfTest();
// Read BEFORE destructuring: an early return yields `undefined`, and
// destructuring that throws a TypeError before the handshake is reached —
// an accidental non-zero exit is not a verdict handshake (#13798).
const selfTestResult = selfTest();
if (!selfTestReachedVerdict) {
console.error(
'\n✗ check-osv-exemptions self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Exiting 0 here would report a self-test\n'
+ 'that never finished as a self-test that passed.\n',
);
process.exit(1);
}
const { passed, lines } = selfTestResult;
console.log('check-osv-exemptions self-test (both directions):');
for (const line of lines) console.log(line);
if (!passed) {
Expand Down
19 changes: 18 additions & 1 deletion scripts/check-page-declaration-shape.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -365,6 +365,13 @@ function findingMessage({ file, line, name, decl }) {
// Self-test
// ---------------------------------------------------------------------------

// Set by `selfTest()` only after its verdict is printed, and read at the
// dispatch: a `return` that leaves the function above that line prints nothing
// and still exits 0 — a self-test that never finished, reported as one that
// passed (#13798). The self-test's own exit code stays load-bearing, so the
// handshake is a flag rather than a returned sentinel.
let selfTestReachedVerdict = false;

function selfTest() {
let failed = 0;
const t = (label, ok) => {
Expand DownExpand Up@@ -481,14 +488,24 @@ function selfTest() {
PAGE_CARRIER_GLOBS.every((g) => g.includes('/')));

console.log(failed ? `\ncheck-page-declaration-shape --self-test: ${failed} FAILED` : '\ncheck-page-declaration-shape --self-test: all passed');
selfTestReachedVerdict = true;
return failed === 0;
}

// ---------------------------------------------------------------------------

if (isEntrypoint(import.meta.url)) {
if (process.argv.includes('--self-test')) {
process.exit(selfTest() ? 0 : 1);
const selfTestOk = selfTest();
if (!selfTestReachedVerdict) {
console.error(
'\n✗ check-page-declaration-shape self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Exiting 0 here would report a self-test\n'
+ 'that never finished as a self-test that passed.\n',
);
process.exit(1);
}
process.exit(selfTestOk ? 0 : 1);
}
const result = scan();
const computed = computedCarrierSites();
Expand Down
20 changes: 18 additions & 2 deletions scripts/check-skill-identifier-liveness.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -868,6 +868,12 @@ function allSpecSources() {

// ── Self-test ───────────────────────────────────────────────────────────────

// Returned by `selfTest()` only after its verdict is printed. The dispatch
// refuses anything else: a `return` that leaves the function above that line
// prints nothing and still exits 0 — a self-test that never finished, reported
// as one that passed (#13798).
const SELF_TEST_VERDICT = 'check-skill-identifier-liveness self-test reached its verdict';

/**
* Why this exists at all, in the words of the wiring gate that requires it: a
* gate whose defect class is its MATCHING RULE cannot detect its own regression
Expand DownExpand Up@@ -1141,6 +1147,8 @@ function selfTest() {
process.exit(1);
}
console.log('check-skill-identifier-liveness --self-test OK');

return SELF_TEST_VERDICT;
}

let SELF_SOURCE = null;
Expand All@@ -1152,6 +1160,14 @@ function selfSource() {
}

if (isEntrypoint(import.meta.url)) {
if (argv.includes('--self-test')) selfTest();
else main();
if (argv.includes('--self-test')) {
if (selfTest() !== SELF_TEST_VERDICT) {
console.error(
'\n✗ check-skill-identifier-liveness self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Exiting 0 here would report a self-test\n'
+ 'that never finished as a self-test that passed.\n',
);
process.exit(1);
}
} else main();
}
20 changes: 18 additions & 2 deletions scripts/check-skills-token-ratchet.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -704,6 +704,12 @@ function fixtureTree() {
return { root, cleanup: () => rmSync(root, { recursive: true, force: true }) };
}

// Returned by `selfTest()` only after its verdict is printed. The dispatch
// refuses anything else: a `return` that leaves the function above that line
// prints nothing and still exits 0 — a self-test that never finished, reported
// as one that passed (#13798).
const SELF_TEST_VERDICT = 'check-skills-token-ratchet self-test reached its verdict';

function selfTest() {
const rel = 'skills/objectstack-ui/SKILL.md';
const over = verdict(rel, 26000, 25154).msg;
Expand DownExpand Up@@ -922,9 +928,19 @@ function selfTest() {
process.exit(1);
}
console.log(`✓ check-skills-token-ratchet self-test: ${cases.length} cases pass.`);

return SELF_TEST_VERDICT;
}

if (isEntrypoint(import.meta.url)) {
if (process.argv.includes('--self-test')) selfTest();
else run();
if (process.argv.includes('--self-test')) {
if (selfTest() !== SELF_TEST_VERDICT) {
console.error(
'\n✗ check-skills-token-ratchet self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Exiting 0 here would report a self-test\n'
+ 'that never finished as a self-test that passed.\n',
);
process.exit(1);
}
} else run();
}
9 changes: 8 additions & 1 deletion scripts/check-test-completeness.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -925,7 +925,14 @@ function main() {
return;
}
// Every invocation, not a lint step -- see the header note on why.
selfTest({ quiet: true });
if (selfTest({ quiet: true }) !== SELF_TEST_VERDICT) {
console.error(
'\n✗ check-test-completeness self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Running the gate on top of a self-test\n'
+ 'that never finished would report an unverified gate as a verified one.\n',
);
process.exit(1);
}

const { verdict, paths } = invocationVerdict(argv);
if (verdict) reportVerdict(verdict);
Expand Down
17 changes: 16 additions & 1 deletion scripts/check-type-source-resolution.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -1724,6 +1724,12 @@ function buildFixtureTree() {
return root;
}

// Returned by `selfTest()` only after its verdict is printed. The dispatch
// refuses anything else: a `return` that leaves the function above that line
// prints nothing and still exits 0 — a self-test that never finished, reported
// as one that passed (#13798).
const SELF_TEST_VERDICT = 'check-type-source-resolution self-test reached its verdict';

function selfTest() {
const root = buildFixtureTree();
const problems = [];
Expand DownExpand Up@@ -2062,13 +2068,22 @@ function selfTest() {
process.exit(1);
}
console.log('check-type-source-resolution --self-test OK');

return SELF_TEST_VERDICT;
}

// ── entry point ─────────────────────────────────────────────────────────────

const argv = process.argv.slice(2);
if (argv.includes('--self-test')) {
selfTest();
if (selfTest() !== SELF_TEST_VERDICT) {
console.error(
'\n✗ check-type-source-resolution self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Exiting 0 here would report a self-test\n'
+ 'that never finished as a self-test that passed.\n',
);
process.exit(1);
}
} else if (argv.includes('--list')) {
printList(REPO_ROOT);
} else {
Expand Down
20 changes: 18 additions & 2 deletions scripts/check-workspace-manifest-cycles.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -697,6 +697,12 @@ export function selfTest() {
return failures;
}

// Returned by `runSelfTest()` only after its verdict is printed. The dispatch
// refuses anything else: a `return` that leaves the function above that line
// prints nothing and still exits 0 — a self-test that never finished, reported
// as one that passed (#13798).
const SELF_TEST_VERDICT = 'check-workspace-manifest-cycles self-test reached its verdict';

function runSelfTest() {
const failures = selfTest();
if (failures.length) {
Expand All@@ -705,10 +711,20 @@ function runSelfTest() {
process.exit(1);
}
console.log('OK: check-workspace-manifest-cycles --self-test — all cases passed.');

return SELF_TEST_VERDICT;
}

// Exports bindings, so an import for those exports alone must run nothing (#10667).
if (isEntrypoint(import.meta.url)) {
if (process.argv.includes('--self-test')) runSelfTest();
else main();
if (process.argv.includes('--self-test')) {
if (runSelfTest() !== SELF_TEST_VERDICT) {
console.error(
'\n✗ check-workspace-manifest-cycles self-test: runSelfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Exiting 0 here would report a self-test\n'
+ 'that never finished as a self-test that passed.\n',
);
process.exit(1);
}
} else main();
}
20 changes: 19 additions & 1 deletion scripts/checklist-select.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -118,6 +118,13 @@ function isBlocked(it) {
}

// ── self-test ────────────────────────────────────────────────────────────────
// Set by `selfTest()` only after its verdict is printed, and read at the
// dispatch: a `return` that leaves the function above that line prints nothing
// and still exits 0 — a self-test that never finished, reported as one that
// passed (#13798). The self-test's own exit code stays load-bearing, so the
// handshake is a flag rather than a returned sentinel.
let selfTestReachedVerdict = false;

function selfTest() {
const FIX = [
{ id: 'a.one', status: 'active', priority: 'P0', surface: 'browser', since: 'v16', source: ['packages/foo/bar.ts'] },
Expand DownExpand Up@@ -150,6 +157,7 @@ function selfTest() {
eq(ids('bar.ts'), ['a.one'], 'bare source basename (code ext) → file: mode');
eq(ids('missing.json'), [], 'unmatched .json name → empty, no throw');
console.log('✓ checklist-select self-test: 17 cases pass.');
selfTestReachedVerdict = true;
process.exit(0);
}

Expand DownExpand Up@@ -197,6 +205,16 @@ function main() {
// (the skill's front half is a pure resolver), the old top-level CLI printed a
// usage block to the importer's stderr and killed it with exit 2 mid-import.
if (isEntrypoint(import.meta.url)) {
if (process.argv.includes('--self-test')) selfTest();
if (process.argv.includes('--self-test')) {
selfTest();
if (!selfTestReachedVerdict) {
console.error(
'\n✗ checklist-select self-test: selfTest() returned without reaching its verdict,\n'
+ 'so no success line was printed. Exiting 0 here would report a self-test\n'
+ 'that never finished as a self-test that passed.\n',
);
process.exit(1);
}
}
main();
}
Loading
Loading