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
54 changes: 54 additions & 0 deletions scripts/check-platform-checklist.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -704,6 +704,45 @@ function foldedCallMessage(path, call, spelling, singular) {
);
}

// ── Self-test verdict handshake ─────────────────────────────────────────────
//
// Five batteries, each returning `{ checked, failures }` for a caller to
// report. A `return` above a battery's own end prints nothing, registers no
// failure, and yields a SMALLER `checked` that both legs below read as a pass.
// Measured on this file: a section that stopped running took the `--self-test`
// verdict from 141 assertions to 119, exited 0, and still claimed in prose that
// the direction it had skipped "REFUSES an empty/renamed/reshaped" table. A
// bare `return` is no better — it yields `undefined` and CRASHES the combine
// below, and an exit code alone reads that crash as a handshake rather than as
// the accident it is.
//
// So each battery sets its own flag as its last act and every caller checks it.
// The return value is load-bearing here (it carries `checked` and `failures`),
// so the handshake is a flag rather than a returned sentinel — the spelling
// `check-durability-degradation-log-level.mjs` and
// `check-dispatcher-error-vocabulary.mjs` carry, for that same reason.
let trapReachedVerdict = false;
let provisioningReachedVerdict = false;
let unreferencedReachedVerdict = false;
let metaCallReachedVerdict = false;
let citationsReachedVerdict = false;

/**
* One wording, ten call sites — five batteries across the two legs that run
* them. The check, the message and the exit code are the landed ones; only the
* duplication is factored out.
*/
function requireReachedVerdict(name, reached) {
if (reached) return;
console.error(
`\n✗ check-platform-checklist self-test: ${name}() returned without reaching its verdict,\n`
+ 'so its assertions did not all run and no failure of theirs could be reported.\n'
+ 'Running the gate on top of a self-test that never finished would report an\n'
+ 'unverified gate as a verified one.\n',
);
process.exit(1);
}

/**
* The positive control. Proves the extractor reads a good table AND refuses an
* empty / renamed / reshaped one, and that the item-side checker catches both
Expand DownExpand Up@@ -770,6 +809,7 @@ function selfTestTrapVocabulary() {
t('C8 an empty-string trap is flagged', trapProblems({ traps: [''] }, vocab).length === 1);
t('C9 a trap listed twice on one item is flagged', trapProblems({ traps: ['stale-dist', 'stale-dist'] }, vocab).some((m) => m.includes('twice')));

trapReachedVerdict = true;
return { checked, failures };
}

Expand DownExpand Up@@ -877,6 +917,7 @@ function selfTestProvisioningUse() {
const hintedEmpty = check('qa-contributor-bound-member', 'records-forms');
t('Q20 the same hint reaches an area that has no recipe block of its own', hintedEmpty.length === 1 && hintedEmpty[0].includes('`search:qa-contributor-bound-member`'));

provisioningReachedVerdict = true;
return { checked, failures };
}

Expand DownExpand Up@@ -978,6 +1019,7 @@ function selfTestUnreferencedRecipes() {
t('R18 a `$comment` is never reported unreferenced', flag(ALL).length === 0 && none.every((r) => !r.recipe.startsWith('$')));
t('R19 an area that defines no recipes contributes nothing to flag', !none.some((r) => r.area === 'records-forms'));

unreferencedReachedVerdict = true;
return { checked, failures };
}

Expand DownExpand Up@@ -1136,6 +1178,7 @@ export const NEIGHBOURING_MAP: Readonly<Record<string, string>> = Object.freeze(
t('M52 the live map is a bijection-free lookup: no folded spelling is ALSO a canonical singular — so the refusal can never fire on a canonical `/meta/<type>` segment',
live.refusal === null && !live.folded.some((f) => live.canonical.includes(f)));

metaCallReachedVerdict = true;
return { checked, failures };
}

Expand DownExpand Up@@ -1216,6 +1259,7 @@ function selfTestSourceLineCitations() {
t('S6 an ADR section reference is not a citation', n('ADR-0025 §3.3 and #13479') === 0);
t('S7 the README placeholder spelling of the ban is not itself a citation', n('never pin `file.ts:NNN` or a bare `:NNN`') === 0);

citationsReachedVerdict = true;
return { failures, checked };
}

Expand All@@ -1225,6 +1269,11 @@ if (process.argv.slice(2).includes('--self-test')) {
const unref = selfTestUnreferencedRecipes();
const metaCall = selfTestMetaCallSpelling();
const cites = selfTestSourceLineCitations();
requireReachedVerdict('selfTestTrapVocabulary', trapReachedVerdict);
requireReachedVerdict('selfTestProvisioningUse', provisioningReachedVerdict);
requireReachedVerdict('selfTestUnreferencedRecipes', unreferencedReachedVerdict);
requireReachedVerdict('selfTestMetaCallSpelling', metaCallReachedVerdict);
requireReachedVerdict('selfTestSourceLineCitations', citationsReachedVerdict);
const failures = [...trap.failures, ...prov.failures, ...unref.failures, ...metaCall.failures, ...cites.failures];
if (failures.length === 0) {
console.log(
Expand All@@ -1243,6 +1292,7 @@ if (process.argv.slice(2).includes('--self-test')) {

// The extractor's own positive control, before it is trusted with anything.
const trapControl = selfTestTrapVocabulary();
requireReachedVerdict('selfTestTrapVocabulary', trapReachedVerdict);
if (trapControl.failures.length) {
console.error("check-platform-checklist: the trap-vocabulary extractor's own positive control FAILED — this check cannot be trusted, and a green from it would mean nothing.\n");
for (const f of trapControl.failures) console.error(` ✗ ${f}`);
Expand All@@ -1252,6 +1302,7 @@ if (trapControl.failures.length) {
// Same, for the provisioning resolve: a green from a check that cannot fire is
// indistinguishable from the green this gate printed before it existed.
const provisioningControl = selfTestProvisioningUse();
requireReachedVerdict('selfTestProvisioningUse', provisioningReachedVerdict);
if (provisioningControl.failures.length) {
console.error("check-platform-checklist: the provisioning-resolve check's own positive control FAILED — a `use` that resolves to nothing would pass, which is the exact defect this check was added to close.\n");
for (const f of provisioningControl.failures) console.error(` ✗ ${f}`);
Expand All@@ -1263,6 +1314,7 @@ if (provisioningControl.failures.length) {
// recipes on the real ledger are referenced, so this direction's output is
// permanently empty and its green says nothing on its own.
const unreferencedControl = selfTestUnreferencedRecipes();
requireReachedVerdict('selfTestUnreferencedRecipes', unreferencedReachedVerdict);
if (unreferencedControl.failures.length) {
console.error('check-platform-checklist: the unreferenced-recipe direction\'s own positive control FAILED — a recipe no item references would pass unreported, and because every real recipe IS referenced, nothing else in this gate would ever notice.\n');
for (const f of unreferencedControl.failures) console.error(` ✗ ${f}`);
Expand All@@ -1275,6 +1327,7 @@ if (unreferencedControl.failures.length) {
// subject population is zero — so nothing but this battery can tell a working
// direction from a deleted one.
const metaCallControl = selfTestMetaCallSpelling();
requireReachedVerdict('selfTestMetaCallSpelling', metaCallReachedVerdict);
if (metaCallControl.failures.length) {
console.error("check-platform-checklist: the `/meta` call-spelling refusal's own positive control FAILED — an executable step instructing a folded plural spelling would pass unreported, which is the exact defect this check was added to close.\n");
for (const f of metaCallControl.failures) console.error(` ✗ ${f}`);
Expand All@@ -1288,6 +1341,7 @@ if (metaCallControl.failures.length) {
// from the ledger staying clean — which is precisely the exit-0-by-construction
// shape this check was added to end.
const citationControl = selfTestSourceLineCitations();
requireReachedVerdict('selfTestSourceLineCitations', citationsReachedVerdict);
if (citationControl.failures.length) {
console.error('check-platform-checklist: the source-line-citation refusal\'s own positive control FAILED — a rotting `file:line` pointer would pass unreported, and because the ledger is clean nothing else here would ever notice.\n');
for (const f of citationControl.failures) console.error(` ✗ ${f}`);
Expand Down
28 changes: 27 additions & 1 deletion scripts/pm/dispatch-gates.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -10514,6 +10514,23 @@ export function bannerLines({ identity, paths = [], drift = null }) {
// the tree, in both directions.
// ---------------------------------------------------------------------------

/**
* Returned by `selfTest()` only after its verdict line is printed, and compared
* at the dispatch: a `return` that leaves the function above that line prints
* NOTHING and still exits 0, because the dispatch discarded the result. Measured
* on this file before this guard existed: an early return took the run from
* "1288 cases pass" to zero bytes of output and exit 0 — a self-test that never
* finished, reported as one that passed.
*
* The mechanical probe in `scripts/measure-self-test-floor.mjs` cannot read this
* file (its anchor matches the first `function selfTest() {` in the source, which
* here is a FIXTURE STRING, so the injection lands inside a template literal and
* only ever produces a SyntaxError). That is a limit of the instrument, not a
* property of this file, and it is why the entry is hand-read there. Anchoring an
* early return on the real definition below measures it in one run.
*/
const SELF_TEST_VERDICT = 'dispatch-gates self-test reached its verdict';

function selfTest() {
const cases = [];
// Stream the verdict the moment it is decided (#14281) rather than only at
Expand DownExpand Up@@ -17737,6 +17754,8 @@ function selfTest() {
process.exit(1);
}
console.log(`✓ dispatch-gates self-test: ${cases.length} cases pass.`);

return SELF_TEST_VERDICT;
}

// ── CLI ─────────────────────────────────────────────────────────────────────
Expand DownExpand Up@@ -17791,7 +17810,14 @@ if (invokedDirectly) {
const argvPaths = argv.paths;
const wantsChanged = process.argv.includes('--changed');
if (process.argv.includes('--self-test')) {
selfTest();
if (selfTest() !== SELF_TEST_VERDICT) {
console.error(
'\n✗ dispatch-gates 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.malformed) {
console.error(`dispatch-gates: ${argv.malformed}.`);
process.exit(2);
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all \u003cpre\u003e\u003ccode\u003e 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
54 changes: 54 additions & 0 deletions scripts/check-platform-checklist.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -704,6 +704,45 @@ function foldedCallMessage(path, call, spelling, singular) {
);
}

// ── Self-test verdict handshake ─────────────────────────────────────────────
//
// Five batteries, each returning `{ checked, failures }` for a caller to
// report. A `return` above a battery's own end prints nothing, registers no
// failure, and yields a SMALLER `checked` that both legs below read as a pass.
// Measured on this file: a section that stopped running took the `--self-test`
// verdict from 141 assertions to 119, exited 0, and still claimed in prose that
// the direction it had skipped "REFUSES an empty/renamed/reshaped" table. A
// bare `return` is no better — it yields `undefined` and CRASHES the combine
// below, and an exit code alone reads that crash as a handshake rather than as
// the accident it is.
//
// So each battery sets its own flag as its last act and every caller checks it.
// The return value is load-bearing here (it carries `checked` and `failures`),
// so the handshake is a flag rather than a returned sentinel — the spelling
// `check-durability-degradation-log-level.mjs` and
// `check-dispatcher-error-vocabulary.mjs` carry, for that same reason.
let trapReachedVerdict = false;
let provisioningReachedVerdict = false;
let unreferencedReachedVerdict = false;
let metaCallReachedVerdict = false;
let citationsReachedVerdict = false;

/**
* One wording, ten call sites — five batteries across the two legs that run
* them. The check, the message and the exit code are the landed ones; only the
* duplication is factored out.
*/
function requireReachedVerdict(name, reached) {
if (reached) return;
console.error(
`\n✗ check-platform-checklist self-test: ${name}() returned without reaching its verdict,\n`
+ 'so its assertions did not all run and no failure of theirs could be reported.\n'
+ 'Running the gate on top of a self-test that never finished would report an\n'
+ 'unverified gate as a verified one.\n',
);
process.exit(1);
}

/**
* The positive control. Proves the extractor reads a good table AND refuses an
* empty / renamed / reshaped one, and that the item-side checker catches both
Expand DownExpand Up@@ -770,6 +809,7 @@ function selfTestTrapVocabulary() {
t('C8 an empty-string trap is flagged', trapProblems({ traps: [''] }, vocab).length === 1);
t('C9 a trap listed twice on one item is flagged', trapProblems({ traps: ['stale-dist', 'stale-dist'] }, vocab).some((m) => m.includes('twice')));

trapReachedVerdict = true;
return { checked, failures };
}

Expand DownExpand Up@@ -877,6 +917,7 @@ function selfTestProvisioningUse() {
const hintedEmpty = check('qa-contributor-bound-member', 'records-forms');
t('Q20 the same hint reaches an area that has no recipe block of its own', hintedEmpty.length === 1 && hintedEmpty[0].includes('`search:qa-contributor-bound-member`'));

provisioningReachedVerdict = true;
return { checked, failures };
}

Expand DownExpand Up@@ -978,6 +1019,7 @@ function selfTestUnreferencedRecipes() {
t('R18 a `$comment` is never reported unreferenced', flag(ALL).length === 0 && none.every((r) => !r.recipe.startsWith('$')));
t('R19 an area that defines no recipes contributes nothing to flag', !none.some((r) => r.area === 'records-forms'));

unreferencedReachedVerdict = true;
return { checked, failures };
}

Expand DownExpand Up@@ -1136,6 +1178,7 @@ export const NEIGHBOURING_MAP: Readonly<Record<string, string>> = Object.freeze(
t('M52 the live map is a bijection-free lookup: no folded spelling is ALSO a canonical singular — so the refusal can never fire on a canonical `/meta/<type>` segment',
live.refusal === null && !live.folded.some((f) => live.canonical.includes(f)));

metaCallReachedVerdict = true;
return { checked, failures };
}

Expand DownExpand Up@@ -1216,6 +1259,7 @@ function selfTestSourceLineCitations() {
t('S6 an ADR section reference is not a citation', n('ADR-0025 §3.3 and #13479') === 0);
t('S7 the README placeholder spelling of the ban is not itself a citation', n('never pin `file.ts:NNN` or a bare `:NNN`') === 0);

citationsReachedVerdict = true;
return { failures, checked };
}

Expand All@@ -1225,6 +1269,11 @@ if (process.argv.slice(2).includes('--self-test')) {
const unref = selfTestUnreferencedRecipes();
const metaCall = selfTestMetaCallSpelling();
const cites = selfTestSourceLineCitations();
requireReachedVerdict('selfTestTrapVocabulary', trapReachedVerdict);
requireReachedVerdict('selfTestProvisioningUse', provisioningReachedVerdict);
requireReachedVerdict('selfTestUnreferencedRecipes', unreferencedReachedVerdict);
requireReachedVerdict('selfTestMetaCallSpelling', metaCallReachedVerdict);
requireReachedVerdict('selfTestSourceLineCitations', citationsReachedVerdict);
const failures = [...trap.failures, ...prov.failures, ...unref.failures, ...metaCall.failures, ...cites.failures];
if (failures.length === 0) {
console.log(
Expand All@@ -1243,6 +1292,7 @@ if (process.argv.slice(2).includes('--self-test')) {

// The extractor's own positive control, before it is trusted with anything.
const trapControl = selfTestTrapVocabulary();
requireReachedVerdict('selfTestTrapVocabulary', trapReachedVerdict);
if (trapControl.failures.length) {
console.error("check-platform-checklist: the trap-vocabulary extractor's own positive control FAILED — this check cannot be trusted, and a green from it would mean nothing.\n");
for (const f of trapControl.failures) console.error(` ✗ ${f}`);
Expand All@@ -1252,6 +1302,7 @@ if (trapControl.failures.length) {
// Same, for the provisioning resolve: a green from a check that cannot fire is
// indistinguishable from the green this gate printed before it existed.
const provisioningControl = selfTestProvisioningUse();
requireReachedVerdict('selfTestProvisioningUse', provisioningReachedVerdict);
if (provisioningControl.failures.length) {
console.error("check-platform-checklist: the provisioning-resolve check's own positive control FAILED — a `use` that resolves to nothing would pass, which is the exact defect this check was added to close.\n");
for (const f of provisioningControl.failures) console.error(` ✗ ${f}`);
Expand All@@ -1263,6 +1314,7 @@ if (provisioningControl.failures.length) {
// recipes on the real ledger are referenced, so this direction's output is
// permanently empty and its green says nothing on its own.
const unreferencedControl = selfTestUnreferencedRecipes();
requireReachedVerdict('selfTestUnreferencedRecipes', unreferencedReachedVerdict);
if (unreferencedControl.failures.length) {
console.error('check-platform-checklist: the unreferenced-recipe direction\'s own positive control FAILED — a recipe no item references would pass unreported, and because every real recipe IS referenced, nothing else in this gate would ever notice.\n');
for (const f of unreferencedControl.failures) console.error(` ✗ ${f}`);
Expand All@@ -1275,6 +1327,7 @@ if (unreferencedControl.failures.length) {
// subject population is zero — so nothing but this battery can tell a working
// direction from a deleted one.
const metaCallControl = selfTestMetaCallSpelling();
requireReachedVerdict('selfTestMetaCallSpelling', metaCallReachedVerdict);
if (metaCallControl.failures.length) {
console.error("check-platform-checklist: the `/meta` call-spelling refusal's own positive control FAILED — an executable step instructing a folded plural spelling would pass unreported, which is the exact defect this check was added to close.\n");
for (const f of metaCallControl.failures) console.error(` ✗ ${f}`);
Expand All@@ -1288,6 +1341,7 @@ if (metaCallControl.failures.length) {
// from the ledger staying clean — which is precisely the exit-0-by-construction
// shape this check was added to end.
const citationControl = selfTestSourceLineCitations();
requireReachedVerdict('selfTestSourceLineCitations', citationsReachedVerdict);
if (citationControl.failures.length) {
console.error('check-platform-checklist: the source-line-citation refusal\'s own positive control FAILED — a rotting `file:line` pointer would pass unreported, and because the ledger is clean nothing else here would ever notice.\n');
for (const f of citationControl.failures) console.error(` ✗ ${f}`);
Expand Down
28 changes: 27 additions & 1 deletion scripts/pm/dispatch-gates.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -10514,6 +10514,23 @@ export function bannerLines({ identity, paths = [], drift = null }) {
// the tree, in both directions.
// ---------------------------------------------------------------------------

/**
* Returned by `selfTest()` only after its verdict line is printed, and compared
* at the dispatch: a `return` that leaves the function above that line prints
* NOTHING and still exits 0, because the dispatch discarded the result. Measured
* on this file before this guard existed: an early return took the run from
* "1288 cases pass" to zero bytes of output and exit 0 — a self-test that never
* finished, reported as one that passed.
*
* The mechanical probe in `scripts/measure-self-test-floor.mjs` cannot read this
* file (its anchor matches the first `function selfTest() {` in the source, which
* here is a FIXTURE STRING, so the injection lands inside a template literal and
* only ever produces a SyntaxError). That is a limit of the instrument, not a
* property of this file, and it is why the entry is hand-read there. Anchoring an
* early return on the real definition below measures it in one run.
*/
const SELF_TEST_VERDICT = 'dispatch-gates self-test reached its verdict';

function selfTest() {
const cases = [];
// Stream the verdict the moment it is decided (#14281) rather than only at
Expand DownExpand Up@@ -17737,6 +17754,8 @@ function selfTest() {
process.exit(1);
}
console.log(`✓ dispatch-gates self-test: ${cases.length} cases pass.`);

return SELF_TEST_VERDICT;
}

// ── CLI ─────────────────────────────────────────────────────────────────────
Expand DownExpand Up@@ -17791,7 +17810,14 @@ if (invokedDirectly) {
const argvPaths = argv.paths;
const wantsChanged = process.argv.includes('--changed');
if (process.argv.includes('--self-test')) {
selfTest();
if (selfTest() !== SELF_TEST_VERDICT) {
console.error(
'\n✗ dispatch-gates 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.malformed) {
console.error(`dispatch-gates: ${argv.malformed}.`);
process.exit(2);
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
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
54 changes: 54 additions & 0 deletions scripts/check-platform-checklist.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -704,6 +704,45 @@ function foldedCallMessage(path, call, spelling, singular) {
);
}

// ── Self-test verdict handshake ─────────────────────────────────────────────
//
// Five batteries, each returning `{ checked, failures }` for a caller to
// report. A `return` above a battery's own end prints nothing, registers no
// failure, and yields a SMALLER `checked` that both legs below read as a pass.
// Measured on this file: a section that stopped running took the `--self-test`
// verdict from 141 assertions to 119, exited 0, and still claimed in prose that
// the direction it had skipped "REFUSES an empty/renamed/reshaped" table. A
// bare `return` is no better — it yields `undefined` and CRASHES the combine
// below, and an exit code alone reads that crash as a handshake rather than as
// the accident it is.
//
// So each battery sets its own flag as its last act and every caller checks it.
// The return value is load-bearing here (it carries `checked` and `failures`),
// so the handshake is a flag rather than a returned sentinel — the spelling
// `check-durability-degradation-log-level.mjs` and
// `check-dispatcher-error-vocabulary.mjs` carry, for that same reason.
let trapReachedVerdict = false;
let provisioningReachedVerdict = false;
let unreferencedReachedVerdict = false;
let metaCallReachedVerdict = false;
let citationsReachedVerdict = false;

/**
* One wording, ten call sites — five batteries across the two legs that run
* them. The check, the message and the exit code are the landed ones; only the
* duplication is factored out.
*/
function requireReachedVerdict(name, reached) {
if (reached) return;
console.error(
`\n✗ check-platform-checklist self-test: ${name}() returned without reaching its verdict,\n`
+ 'so its assertions did not all run and no failure of theirs could be reported.\n'
+ 'Running the gate on top of a self-test that never finished would report an\n'
+ 'unverified gate as a verified one.\n',
);
process.exit(1);
}

/**
* The positive control. Proves the extractor reads a good table AND refuses an
* empty / renamed / reshaped one, and that the item-side checker catches both
Expand DownExpand Up@@ -770,6 +809,7 @@ function selfTestTrapVocabulary() {
t('C8 an empty-string trap is flagged', trapProblems({ traps: [''] }, vocab).length === 1);
t('C9 a trap listed twice on one item is flagged', trapProblems({ traps: ['stale-dist', 'stale-dist'] }, vocab).some((m) => m.includes('twice')));

trapReachedVerdict = true;
return { checked, failures };
}

Expand DownExpand Up@@ -877,6 +917,7 @@ function selfTestProvisioningUse() {
const hintedEmpty = check('qa-contributor-bound-member', 'records-forms');
t('Q20 the same hint reaches an area that has no recipe block of its own', hintedEmpty.length === 1 && hintedEmpty[0].includes('`search:qa-contributor-bound-member`'));

provisioningReachedVerdict = true;
return { checked, failures };
}

Expand DownExpand Up@@ -978,6 +1019,7 @@ function selfTestUnreferencedRecipes() {
t('R18 a `$comment` is never reported unreferenced', flag(ALL).length === 0 && none.every((r) => !r.recipe.startsWith('$')));
t('R19 an area that defines no recipes contributes nothing to flag', !none.some((r) => r.area === 'records-forms'));

unreferencedReachedVerdict = true;
return { checked, failures };
}

Expand DownExpand Up@@ -1136,6 +1178,7 @@ export const NEIGHBOURING_MAP: Readonly<Record<string, string>> = Object.freeze(
t('M52 the live map is a bijection-free lookup: no folded spelling is ALSO a canonical singular — so the refusal can never fire on a canonical `/meta/<type>` segment',
live.refusal === null && !live.folded.some((f) => live.canonical.includes(f)));

metaCallReachedVerdict = true;
return { checked, failures };
}

Expand DownExpand Up@@ -1216,6 +1259,7 @@ function selfTestSourceLineCitations() {
t('S6 an ADR section reference is not a citation', n('ADR-0025 §3.3 and #13479') === 0);
t('S7 the README placeholder spelling of the ban is not itself a citation', n('never pin `file.ts:NNN` or a bare `:NNN`') === 0);

citationsReachedVerdict = true;
return { failures, checked };
}

Expand All@@ -1225,6 +1269,11 @@ if (process.argv.slice(2).includes('--self-test')) {
const unref = selfTestUnreferencedRecipes();
const metaCall = selfTestMetaCallSpelling();
const cites = selfTestSourceLineCitations();
requireReachedVerdict('selfTestTrapVocabulary', trapReachedVerdict);
requireReachedVerdict('selfTestProvisioningUse', provisioningReachedVerdict);
requireReachedVerdict('selfTestUnreferencedRecipes', unreferencedReachedVerdict);
requireReachedVerdict('selfTestMetaCallSpelling', metaCallReachedVerdict);
requireReachedVerdict('selfTestSourceLineCitations', citationsReachedVerdict);
const failures = [...trap.failures, ...prov.failures, ...unref.failures, ...metaCall.failures, ...cites.failures];
if (failures.length === 0) {
console.log(
Expand All@@ -1243,6 +1292,7 @@ if (process.argv.slice(2).includes('--self-test')) {

// The extractor's own positive control, before it is trusted with anything.
const trapControl = selfTestTrapVocabulary();
requireReachedVerdict('selfTestTrapVocabulary', trapReachedVerdict);
if (trapControl.failures.length) {
console.error("check-platform-checklist: the trap-vocabulary extractor's own positive control FAILED — this check cannot be trusted, and a green from it would mean nothing.\n");
for (const f of trapControl.failures) console.error(` ✗ ${f}`);
Expand All@@ -1252,6 +1302,7 @@ if (trapControl.failures.length) {
// Same, for the provisioning resolve: a green from a check that cannot fire is
// indistinguishable from the green this gate printed before it existed.
const provisioningControl = selfTestProvisioningUse();
requireReachedVerdict('selfTestProvisioningUse', provisioningReachedVerdict);
if (provisioningControl.failures.length) {
console.error("check-platform-checklist: the provisioning-resolve check's own positive control FAILED — a `use` that resolves to nothing would pass, which is the exact defect this check was added to close.\n");
for (const f of provisioningControl.failures) console.error(` ✗ ${f}`);
Expand All@@ -1263,6 +1314,7 @@ if (provisioningControl.failures.length) {
// recipes on the real ledger are referenced, so this direction's output is
// permanently empty and its green says nothing on its own.
const unreferencedControl = selfTestUnreferencedRecipes();
requireReachedVerdict('selfTestUnreferencedRecipes', unreferencedReachedVerdict);
if (unreferencedControl.failures.length) {
console.error('check-platform-checklist: the unreferenced-recipe direction\'s own positive control FAILED — a recipe no item references would pass unreported, and because every real recipe IS referenced, nothing else in this gate would ever notice.\n');
for (const f of unreferencedControl.failures) console.error(` ✗ ${f}`);
Expand All@@ -1275,6 +1327,7 @@ if (unreferencedControl.failures.length) {
// subject population is zero — so nothing but this battery can tell a working
// direction from a deleted one.
const metaCallControl = selfTestMetaCallSpelling();
requireReachedVerdict('selfTestMetaCallSpelling', metaCallReachedVerdict);
if (metaCallControl.failures.length) {
console.error("check-platform-checklist: the `/meta` call-spelling refusal's own positive control FAILED — an executable step instructing a folded plural spelling would pass unreported, which is the exact defect this check was added to close.\n");
for (const f of metaCallControl.failures) console.error(` ✗ ${f}`);
Expand All@@ -1288,6 +1341,7 @@ if (metaCallControl.failures.length) {
// from the ledger staying clean — which is precisely the exit-0-by-construction
// shape this check was added to end.
const citationControl = selfTestSourceLineCitations();
requireReachedVerdict('selfTestSourceLineCitations', citationsReachedVerdict);
if (citationControl.failures.length) {
console.error('check-platform-checklist: the source-line-citation refusal\'s own positive control FAILED — a rotting `file:line` pointer would pass unreported, and because the ledger is clean nothing else here would ever notice.\n');
for (const f of citationControl.failures) console.error(` ✗ ${f}`);
Expand Down
28 changes: 27 additions & 1 deletion scripts/pm/dispatch-gates.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -10514,6 +10514,23 @@ export function bannerLines({ identity, paths = [], drift = null }) {
// the tree, in both directions.
// ---------------------------------------------------------------------------

/**
* Returned by `selfTest()` only after its verdict line is printed, and compared
* at the dispatch: a `return` that leaves the function above that line prints
* NOTHING and still exits 0, because the dispatch discarded the result. Measured
* on this file before this guard existed: an early return took the run from
* "1288 cases pass" to zero bytes of output and exit 0 — a self-test that never
* finished, reported as one that passed.
*
* The mechanical probe in `scripts/measure-self-test-floor.mjs` cannot read this
* file (its anchor matches the first `function selfTest() {` in the source, which
* here is a FIXTURE STRING, so the injection lands inside a template literal and
* only ever produces a SyntaxError). That is a limit of the instrument, not a
* property of this file, and it is why the entry is hand-read there. Anchoring an
* early return on the real definition below measures it in one run.
*/
const SELF_TEST_VERDICT = 'dispatch-gates self-test reached its verdict';

function selfTest() {
const cases = [];
// Stream the verdict the moment it is decided (#14281) rather than only at
Expand DownExpand Up@@ -17737,6 +17754,8 @@ function selfTest() {
process.exit(1);
}
console.log(`✓ dispatch-gates self-test: ${cases.length} cases pass.`);

return SELF_TEST_VERDICT;
}

// ── CLI ─────────────────────────────────────────────────────────────────────
Expand DownExpand Up@@ -17791,7 +17810,14 @@ if (invokedDirectly) {
const argvPaths = argv.paths;
const wantsChanged = process.argv.includes('--changed');
if (process.argv.includes('--self-test')) {
selfTest();
if (selfTest() !== SELF_TEST_VERDICT) {
console.error(
'\n✗ dispatch-gates 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.malformed) {
console.error(`dispatch-gates: ${argv.malformed}.`);
process.exit(2);
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length \u003e 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
54 changes: 54 additions & 0 deletions scripts/check-platform-checklist.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -704,6 +704,45 @@ function foldedCallMessage(path, call, spelling, singular) {
);
}

// ── Self-test verdict handshake ─────────────────────────────────────────────
//
// Five batteries, each returning `{ checked, failures }` for a caller to
// report. A `return` above a battery's own end prints nothing, registers no
// failure, and yields a SMALLER `checked` that both legs below read as a pass.
// Measured on this file: a section that stopped running took the `--self-test`
// verdict from 141 assertions to 119, exited 0, and still claimed in prose that
// the direction it had skipped "REFUSES an empty/renamed/reshaped" table. A
// bare `return` is no better — it yields `undefined` and CRASHES the combine
// below, and an exit code alone reads that crash as a handshake rather than as
// the accident it is.
//
// So each battery sets its own flag as its last act and every caller checks it.
// The return value is load-bearing here (it carries `checked` and `failures`),
// so the handshake is a flag rather than a returned sentinel — the spelling
// `check-durability-degradation-log-level.mjs` and
// `check-dispatcher-error-vocabulary.mjs` carry, for that same reason.
let trapReachedVerdict = false;
let provisioningReachedVerdict = false;
let unreferencedReachedVerdict = false;
let metaCallReachedVerdict = false;
let citationsReachedVerdict = false;

/**
* One wording, ten call sites — five batteries across the two legs that run
* them. The check, the message and the exit code are the landed ones; only the
* duplication is factored out.
*/
function requireReachedVerdict(name, reached) {
if (reached) return;
console.error(
`\n✗ check-platform-checklist self-test: ${name}() returned without reaching its verdict,\n`
+ 'so its assertions did not all run and no failure of theirs could be reported.\n'
+ 'Running the gate on top of a self-test that never finished would report an\n'
+ 'unverified gate as a verified one.\n',
);
process.exit(1);
}

/**
* The positive control. Proves the extractor reads a good table AND refuses an
* empty / renamed / reshaped one, and that the item-side checker catches both
Expand DownExpand Up@@ -770,6 +809,7 @@ function selfTestTrapVocabulary() {
t('C8 an empty-string trap is flagged', trapProblems({ traps: [''] }, vocab).length === 1);
t('C9 a trap listed twice on one item is flagged', trapProblems({ traps: ['stale-dist', 'stale-dist'] }, vocab).some((m) => m.includes('twice')));

trapReachedVerdict = true;
return { checked, failures };
}

Expand DownExpand Up@@ -877,6 +917,7 @@ function selfTestProvisioningUse() {
const hintedEmpty = check('qa-contributor-bound-member', 'records-forms');
t('Q20 the same hint reaches an area that has no recipe block of its own', hintedEmpty.length === 1 && hintedEmpty[0].includes('`search:qa-contributor-bound-member`'));

provisioningReachedVerdict = true;
return { checked, failures };
}

Expand DownExpand Up@@ -978,6 +1019,7 @@ function selfTestUnreferencedRecipes() {
t('R18 a `$comment` is never reported unreferenced', flag(ALL).length === 0 && none.every((r) => !r.recipe.startsWith('$')));
t('R19 an area that defines no recipes contributes nothing to flag', !none.some((r) => r.area === 'records-forms'));

unreferencedReachedVerdict = true;
return { checked, failures };
}

Expand DownExpand Up@@ -1136,6 +1178,7 @@ export const NEIGHBOURING_MAP: Readonly<Record<string, string>> = Object.freeze(
t('M52 the live map is a bijection-free lookup: no folded spelling is ALSO a canonical singular — so the refusal can never fire on a canonical `/meta/<type>` segment',
live.refusal === null && !live.folded.some((f) => live.canonical.includes(f)));

metaCallReachedVerdict = true;
return { checked, failures };
}

Expand DownExpand Up@@ -1216,6 +1259,7 @@ function selfTestSourceLineCitations() {
t('S6 an ADR section reference is not a citation', n('ADR-0025 §3.3 and #13479') === 0);
t('S7 the README placeholder spelling of the ban is not itself a citation', n('never pin `file.ts:NNN` or a bare `:NNN`') === 0);

citationsReachedVerdict = true;
return { failures, checked };
}

Expand All@@ -1225,6 +1269,11 @@ if (process.argv.slice(2).includes('--self-test')) {
const unref = selfTestUnreferencedRecipes();
const metaCall = selfTestMetaCallSpelling();
const cites = selfTestSourceLineCitations();
requireReachedVerdict('selfTestTrapVocabulary', trapReachedVerdict);
requireReachedVerdict('selfTestProvisioningUse', provisioningReachedVerdict);
requireReachedVerdict('selfTestUnreferencedRecipes', unreferencedReachedVerdict);
requireReachedVerdict('selfTestMetaCallSpelling', metaCallReachedVerdict);
requireReachedVerdict('selfTestSourceLineCitations', citationsReachedVerdict);
const failures = [...trap.failures, ...prov.failures, ...unref.failures, ...metaCall.failures, ...cites.failures];
if (failures.length === 0) {
console.log(
Expand All@@ -1243,6 +1292,7 @@ if (process.argv.slice(2).includes('--self-test')) {

// The extractor's own positive control, before it is trusted with anything.
const trapControl = selfTestTrapVocabulary();
requireReachedVerdict('selfTestTrapVocabulary', trapReachedVerdict);
if (trapControl.failures.length) {
console.error("check-platform-checklist: the trap-vocabulary extractor's own positive control FAILED — this check cannot be trusted, and a green from it would mean nothing.\n");
for (const f of trapControl.failures) console.error(` ✗ ${f}`);
Expand All@@ -1252,6 +1302,7 @@ if (trapControl.failures.length) {
// Same, for the provisioning resolve: a green from a check that cannot fire is
// indistinguishable from the green this gate printed before it existed.
const provisioningControl = selfTestProvisioningUse();
requireReachedVerdict('selfTestProvisioningUse', provisioningReachedVerdict);
if (provisioningControl.failures.length) {
console.error("check-platform-checklist: the provisioning-resolve check's own positive control FAILED — a `use` that resolves to nothing would pass, which is the exact defect this check was added to close.\n");
for (const f of provisioningControl.failures) console.error(` ✗ ${f}`);
Expand All@@ -1263,6 +1314,7 @@ if (provisioningControl.failures.length) {
// recipes on the real ledger are referenced, so this direction's output is
// permanently empty and its green says nothing on its own.
const unreferencedControl = selfTestUnreferencedRecipes();
requireReachedVerdict('selfTestUnreferencedRecipes', unreferencedReachedVerdict);
if (unreferencedControl.failures.length) {
console.error('check-platform-checklist: the unreferenced-recipe direction\'s own positive control FAILED — a recipe no item references would pass unreported, and because every real recipe IS referenced, nothing else in this gate would ever notice.\n');
for (const f of unreferencedControl.failures) console.error(` ✗ ${f}`);
Expand All@@ -1275,6 +1327,7 @@ if (unreferencedControl.failures.length) {
// subject population is zero — so nothing but this battery can tell a working
// direction from a deleted one.
const metaCallControl = selfTestMetaCallSpelling();
requireReachedVerdict('selfTestMetaCallSpelling', metaCallReachedVerdict);
if (metaCallControl.failures.length) {
console.error("check-platform-checklist: the `/meta` call-spelling refusal's own positive control FAILED — an executable step instructing a folded plural spelling would pass unreported, which is the exact defect this check was added to close.\n");
for (const f of metaCallControl.failures) console.error(` ✗ ${f}`);
Expand All@@ -1288,6 +1341,7 @@ if (metaCallControl.failures.length) {
// from the ledger staying clean — which is precisely the exit-0-by-construction
// shape this check was added to end.
const citationControl = selfTestSourceLineCitations();
requireReachedVerdict('selfTestSourceLineCitations', citationsReachedVerdict);
if (citationControl.failures.length) {
console.error('check-platform-checklist: the source-line-citation refusal\'s own positive control FAILED — a rotting `file:line` pointer would pass unreported, and because the ledger is clean nothing else here would ever notice.\n');
for (const f of citationControl.failures) console.error(` ✗ ${f}`);
Expand Down
28 changes: 27 additions & 1 deletion scripts/pm/dispatch-gates.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -10514,6 +10514,23 @@ export function bannerLines({ identity, paths = [], drift = null }) {
// the tree, in both directions.
// ---------------------------------------------------------------------------

/**
* Returned by `selfTest()` only after its verdict line is printed, and compared
* at the dispatch: a `return` that leaves the function above that line prints
* NOTHING and still exits 0, because the dispatch discarded the result. Measured
* on this file before this guard existed: an early return took the run from
* "1288 cases pass" to zero bytes of output and exit 0 — a self-test that never
* finished, reported as one that passed.
*
* The mechanical probe in `scripts/measure-self-test-floor.mjs` cannot read this
* file (its anchor matches the first `function selfTest() {` in the source, which
* here is a FIXTURE STRING, so the injection lands inside a template literal and
* only ever produces a SyntaxError). That is a limit of the instrument, not a
* property of this file, and it is why the entry is hand-read there. Anchoring an
* early return on the real definition below measures it in one run.
*/
const SELF_TEST_VERDICT = 'dispatch-gates self-test reached its verdict';

function selfTest() {
const cases = [];
// Stream the verdict the moment it is decided (#14281) rather than only at
Expand DownExpand Up@@ -17737,6 +17754,8 @@ function selfTest() {
process.exit(1);
}
console.log(`✓ dispatch-gates self-test: ${cases.length} cases pass.`);

return SELF_TEST_VERDICT;
}

// ── CLI ─────────────────────────────────────────────────────────────────────
Expand DownExpand Up@@ -17791,7 +17810,14 @@ if (invokedDirectly) {
const argvPaths = argv.paths;
const wantsChanged = process.argv.includes('--changed');
if (process.argv.includes('--self-test')) {
selfTest();
if (selfTest() !== SELF_TEST_VERDICT) {
console.error(
'\n✗ dispatch-gates 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.malformed) {
console.error(`dispatch-gates: ${argv.malformed}.`);
process.exit(2);
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
Merged
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
54 changes: 54 additions & 0 deletions scripts/check-platform-checklist.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -704,6 +704,45 @@ function foldedCallMessage(path, call, spelling, singular) {
);
}

// ── Self-test verdict handshake ─────────────────────────────────────────────
//
// Five batteries, each returning `{ checked, failures }` for a caller to
// report. A `return` above a battery's own end prints nothing, registers no
// failure, and yields a SMALLER `checked` that both legs below read as a pass.
// Measured on this file: a section that stopped running took the `--self-test`
// verdict from 141 assertions to 119, exited 0, and still claimed in prose that
// the direction it had skipped "REFUSES an empty/renamed/reshaped" table. A
// bare `return` is no better — it yields `undefined` and CRASHES the combine
// below, and an exit code alone reads that crash as a handshake rather than as
// the accident it is.
//
// So each battery sets its own flag as its last act and every caller checks it.
// The return value is load-bearing here (it carries `checked` and `failures`),
// so the handshake is a flag rather than a returned sentinel — the spelling
// `check-durability-degradation-log-level.mjs` and
// `check-dispatcher-error-vocabulary.mjs` carry, for that same reason.
let trapReachedVerdict = false;
let provisioningReachedVerdict = false;
let unreferencedReachedVerdict = false;
let metaCallReachedVerdict = false;
let citationsReachedVerdict = false;

/**
* One wording, ten call sites — five batteries across the two legs that run
* them. The check, the message and the exit code are the landed ones; only the
* duplication is factored out.
*/
function requireReachedVerdict(name, reached) {
if (reached) return;
console.error(
`\n✗ check-platform-checklist self-test: ${name}() returned without reaching its verdict,\n`
+ 'so its assertions did not all run and no failure of theirs could be reported.\n'
+ 'Running the gate on top of a self-test that never finished would report an\n'
+ 'unverified gate as a verified one.\n',
);
process.exit(1);
}

/**
* The positive control. Proves the extractor reads a good table AND refuses an
* empty / renamed / reshaped one, and that the item-side checker catches both
Expand DownExpand Up@@ -770,6 +809,7 @@ function selfTestTrapVocabulary() {
t('C8 an empty-string trap is flagged', trapProblems({ traps: [''] }, vocab).length === 1);
t('C9 a trap listed twice on one item is flagged', trapProblems({ traps: ['stale-dist', 'stale-dist'] }, vocab).some((m) => m.includes('twice')));

trapReachedVerdict = true;
return { checked, failures };
}

Expand DownExpand Up@@ -877,6 +917,7 @@ function selfTestProvisioningUse() {
const hintedEmpty = check('qa-contributor-bound-member', 'records-forms');
t('Q20 the same hint reaches an area that has no recipe block of its own', hintedEmpty.length === 1 && hintedEmpty[0].includes('`search:qa-contributor-bound-member`'));

provisioningReachedVerdict = true;
return { checked, failures };
}

Expand DownExpand Up@@ -978,6 +1019,7 @@ function selfTestUnreferencedRecipes() {
t('R18 a `$comment` is never reported unreferenced', flag(ALL).length === 0 && none.every((r) => !r.recipe.startsWith('$')));
t('R19 an area that defines no recipes contributes nothing to flag', !none.some((r) => r.area === 'records-forms'));

unreferencedReachedVerdict = true;
return { checked, failures };
}

Expand DownExpand Up@@ -1136,6 +1178,7 @@ export const NEIGHBOURING_MAP: Readonly<Record<string, string>> = Object.freeze(
t('M52 the live map is a bijection-free lookup: no folded spelling is ALSO a canonical singular — so the refusal can never fire on a canonical `/meta/<type>` segment',
live.refusal === null && !live.folded.some((f) => live.canonical.includes(f)));

metaCallReachedVerdict = true;
return { checked, failures };
}

Expand DownExpand Up@@ -1216,6 +1259,7 @@ function selfTestSourceLineCitations() {
t('S6 an ADR section reference is not a citation', n('ADR-0025 §3.3 and #13479') === 0);
t('S7 the README placeholder spelling of the ban is not itself a citation', n('never pin `file.ts:NNN` or a bare `:NNN`') === 0);

citationsReachedVerdict = true;
return { failures, checked };
}

Expand All@@ -1225,6 +1269,11 @@ if (process.argv.slice(2).includes('--self-test')) {
const unref = selfTestUnreferencedRecipes();
const metaCall = selfTestMetaCallSpelling();
const cites = selfTestSourceLineCitations();
requireReachedVerdict('selfTestTrapVocabulary', trapReachedVerdict);
requireReachedVerdict('selfTestProvisioningUse', provisioningReachedVerdict);
requireReachedVerdict('selfTestUnreferencedRecipes', unreferencedReachedVerdict);
requireReachedVerdict('selfTestMetaCallSpelling', metaCallReachedVerdict);
requireReachedVerdict('selfTestSourceLineCitations', citationsReachedVerdict);
const failures = [...trap.failures, ...prov.failures, ...unref.failures, ...metaCall.failures, ...cites.failures];
if (failures.length === 0) {
console.log(
Expand All@@ -1243,6 +1292,7 @@ if (process.argv.slice(2).includes('--self-test')) {

// The extractor's own positive control, before it is trusted with anything.
const trapControl = selfTestTrapVocabulary();
requireReachedVerdict('selfTestTrapVocabulary', trapReachedVerdict);
if (trapControl.failures.length) {
console.error("check-platform-checklist: the trap-vocabulary extractor's own positive control FAILED — this check cannot be trusted, and a green from it would mean nothing.\n");
for (const f of trapControl.failures) console.error(` ✗ ${f}`);
Expand All@@ -1252,6 +1302,7 @@ if (trapControl.failures.length) {
// Same, for the provisioning resolve: a green from a check that cannot fire is
// indistinguishable from the green this gate printed before it existed.
const provisioningControl = selfTestProvisioningUse();
requireReachedVerdict('selfTestProvisioningUse', provisioningReachedVerdict);
if (provisioningControl.failures.length) {
console.error("check-platform-checklist: the provisioning-resolve check's own positive control FAILED — a `use` that resolves to nothing would pass, which is the exact defect this check was added to close.\n");
for (const f of provisioningControl.failures) console.error(` ✗ ${f}`);
Expand All@@ -1263,6 +1314,7 @@ if (provisioningControl.failures.length) {
// recipes on the real ledger are referenced, so this direction's output is
// permanently empty and its green says nothing on its own.
const unreferencedControl = selfTestUnreferencedRecipes();
requireReachedVerdict('selfTestUnreferencedRecipes', unreferencedReachedVerdict);
if (unreferencedControl.failures.length) {
console.error('check-platform-checklist: the unreferenced-recipe direction\'s own positive control FAILED — a recipe no item references would pass unreported, and because every real recipe IS referenced, nothing else in this gate would ever notice.\n');
for (const f of unreferencedControl.failures) console.error(` ✗ ${f}`);
Expand All@@ -1275,6 +1327,7 @@ if (unreferencedControl.failures.length) {
// subject population is zero — so nothing but this battery can tell a working
// direction from a deleted one.
const metaCallControl = selfTestMetaCallSpelling();
requireReachedVerdict('selfTestMetaCallSpelling', metaCallReachedVerdict);
if (metaCallControl.failures.length) {
console.error("check-platform-checklist: the `/meta` call-spelling refusal's own positive control FAILED — an executable step instructing a folded plural spelling would pass unreported, which is the exact defect this check was added to close.\n");
for (const f of metaCallControl.failures) console.error(` ✗ ${f}`);
Expand All@@ -1288,6 +1341,7 @@ if (metaCallControl.failures.length) {
// from the ledger staying clean — which is precisely the exit-0-by-construction
// shape this check was added to end.
const citationControl = selfTestSourceLineCitations();
requireReachedVerdict('selfTestSourceLineCitations', citationsReachedVerdict);
if (citationControl.failures.length) {
console.error('check-platform-checklist: the source-line-citation refusal\'s own positive control FAILED — a rotting `file:line` pointer would pass unreported, and because the ledger is clean nothing else here would ever notice.\n');
for (const f of citationControl.failures) console.error(` ✗ ${f}`);
Expand Down
28 changes: 27 additions & 1 deletion scripts/pm/dispatch-gates.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -10514,6 +10514,23 @@ export function bannerLines({ identity, paths = [], drift = null }) {
// the tree, in both directions.
// ---------------------------------------------------------------------------

/**
* Returned by `selfTest()` only after its verdict line is printed, and compared
* at the dispatch: a `return` that leaves the function above that line prints
* NOTHING and still exits 0, because the dispatch discarded the result. Measured
* on this file before this guard existed: an early return took the run from
* "1288 cases pass" to zero bytes of output and exit 0 — a self-test that never
* finished, reported as one that passed.
*
* The mechanical probe in `scripts/measure-self-test-floor.mjs` cannot read this
* file (its anchor matches the first `function selfTest() {` in the source, which
* here is a FIXTURE STRING, so the injection lands inside a template literal and
* only ever produces a SyntaxError). That is a limit of the instrument, not a
* property of this file, and it is why the entry is hand-read there. Anchoring an
* early return on the real definition below measures it in one run.
*/
const SELF_TEST_VERDICT = 'dispatch-gates self-test reached its verdict';

function selfTest() {
const cases = [];
// Stream the verdict the moment it is decided (#14281) rather than only at
Expand DownExpand Up@@ -17737,6 +17754,8 @@ function selfTest() {
process.exit(1);
}
console.log(`✓ dispatch-gates self-test: ${cases.length} cases pass.`);

return SELF_TEST_VERDICT;
}

// ── CLI ─────────────────────────────────────────────────────────────────────
Expand DownExpand Up@@ -17791,7 +17810,14 @@ if (invokedDirectly) {
const argvPaths = argv.paths;
const wantsChanged = process.argv.includes('--changed');
if (process.argv.includes('--self-test')) {
selfTest();
if (selfTest() !== SELF_TEST_VERDICT) {
console.error(
'\n✗ dispatch-gates 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.malformed) {
console.error(`dispatch-gates: ${argv.malformed}.`);
process.exit(2);
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
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
54 changes: 54 additions & 0 deletions scripts/check-platform-checklist.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -704,6 +704,45 @@ function foldedCallMessage(path, call, spelling, singular) {
);
}

// ── Self-test verdict handshake ─────────────────────────────────────────────
//
// Five batteries, each returning `{ checked, failures }` for a caller to
// report. A `return` above a battery's own end prints nothing, registers no
// failure, and yields a SMALLER `checked` that both legs below read as a pass.
// Measured on this file: a section that stopped running took the `--self-test`
// verdict from 141 assertions to 119, exited 0, and still claimed in prose that
// the direction it had skipped "REFUSES an empty/renamed/reshaped" table. A
// bare `return` is no better — it yields `undefined` and CRASHES the combine
// below, and an exit code alone reads that crash as a handshake rather than as
// the accident it is.
//
// So each battery sets its own flag as its last act and every caller checks it.
// The return value is load-bearing here (it carries `checked` and `failures`),
// so the handshake is a flag rather than a returned sentinel — the spelling
// `check-durability-degradation-log-level.mjs` and
// `check-dispatcher-error-vocabulary.mjs` carry, for that same reason.
let trapReachedVerdict = false;
let provisioningReachedVerdict = false;
let unreferencedReachedVerdict = false;
let metaCallReachedVerdict = false;
let citationsReachedVerdict = false;

/**
* One wording, ten call sites — five batteries across the two legs that run
* them. The check, the message and the exit code are the landed ones; only the
* duplication is factored out.
*/
function requireReachedVerdict(name, reached) {
if (reached) return;
console.error(
`\n✗ check-platform-checklist self-test: ${name}() returned without reaching its verdict,\n`
+ 'so its assertions did not all run and no failure of theirs could be reported.\n'
+ 'Running the gate on top of a self-test that never finished would report an\n'
+ 'unverified gate as a verified one.\n',
);
process.exit(1);
}

/**
* The positive control. Proves the extractor reads a good table AND refuses an
* empty / renamed / reshaped one, and that the item-side checker catches both
Expand DownExpand Up@@ -770,6 +809,7 @@ function selfTestTrapVocabulary() {
t('C8 an empty-string trap is flagged', trapProblems({ traps: [''] }, vocab).length === 1);
t('C9 a trap listed twice on one item is flagged', trapProblems({ traps: ['stale-dist', 'stale-dist'] }, vocab).some((m) => m.includes('twice')));

trapReachedVerdict = true;
return { checked, failures };
}

Expand DownExpand Up@@ -877,6 +917,7 @@ function selfTestProvisioningUse() {
const hintedEmpty = check('qa-contributor-bound-member', 'records-forms');
t('Q20 the same hint reaches an area that has no recipe block of its own', hintedEmpty.length === 1 && hintedEmpty[0].includes('`search:qa-contributor-bound-member`'));

provisioningReachedVerdict = true;
return { checked, failures };
}

Expand DownExpand Up@@ -978,6 +1019,7 @@ function selfTestUnreferencedRecipes() {
t('R18 a `$comment` is never reported unreferenced', flag(ALL).length === 0 && none.every((r) => !r.recipe.startsWith('$')));
t('R19 an area that defines no recipes contributes nothing to flag', !none.some((r) => r.area === 'records-forms'));

unreferencedReachedVerdict = true;
return { checked, failures };
}

Expand DownExpand Up@@ -1136,6 +1178,7 @@ export const NEIGHBOURING_MAP: Readonly<Record<string, string>> = Object.freeze(
t('M52 the live map is a bijection-free lookup: no folded spelling is ALSO a canonical singular — so the refusal can never fire on a canonical `/meta/<type>` segment',
live.refusal === null && !live.folded.some((f) => live.canonical.includes(f)));

metaCallReachedVerdict = true;
return { checked, failures };
}

Expand DownExpand Up@@ -1216,6 +1259,7 @@ function selfTestSourceLineCitations() {
t('S6 an ADR section reference is not a citation', n('ADR-0025 §3.3 and #13479') === 0);
t('S7 the README placeholder spelling of the ban is not itself a citation', n('never pin `file.ts:NNN` or a bare `:NNN`') === 0);

citationsReachedVerdict = true;
return { failures, checked };
}

Expand All@@ -1225,6 +1269,11 @@ if (process.argv.slice(2).includes('--self-test')) {
const unref = selfTestUnreferencedRecipes();
const metaCall = selfTestMetaCallSpelling();
const cites = selfTestSourceLineCitations();
requireReachedVerdict('selfTestTrapVocabulary', trapReachedVerdict);
requireReachedVerdict('selfTestProvisioningUse', provisioningReachedVerdict);
requireReachedVerdict('selfTestUnreferencedRecipes', unreferencedReachedVerdict);
requireReachedVerdict('selfTestMetaCallSpelling', metaCallReachedVerdict);
requireReachedVerdict('selfTestSourceLineCitations', citationsReachedVerdict);
const failures = [...trap.failures, ...prov.failures, ...unref.failures, ...metaCall.failures, ...cites.failures];
if (failures.length === 0) {
console.log(
Expand All@@ -1243,6 +1292,7 @@ if (process.argv.slice(2).includes('--self-test')) {

// The extractor's own positive control, before it is trusted with anything.
const trapControl = selfTestTrapVocabulary();
requireReachedVerdict('selfTestTrapVocabulary', trapReachedVerdict);
if (trapControl.failures.length) {
console.error("check-platform-checklist: the trap-vocabulary extractor's own positive control FAILED — this check cannot be trusted, and a green from it would mean nothing.\n");
for (const f of trapControl.failures) console.error(` ✗ ${f}`);
Expand All@@ -1252,6 +1302,7 @@ if (trapControl.failures.length) {
// Same, for the provisioning resolve: a green from a check that cannot fire is
// indistinguishable from the green this gate printed before it existed.
const provisioningControl = selfTestProvisioningUse();
requireReachedVerdict('selfTestProvisioningUse', provisioningReachedVerdict);
if (provisioningControl.failures.length) {
console.error("check-platform-checklist: the provisioning-resolve check's own positive control FAILED — a `use` that resolves to nothing would pass, which is the exact defect this check was added to close.\n");
for (const f of provisioningControl.failures) console.error(` ✗ ${f}`);
Expand All@@ -1263,6 +1314,7 @@ if (provisioningControl.failures.length) {
// recipes on the real ledger are referenced, so this direction's output is
// permanently empty and its green says nothing on its own.
const unreferencedControl = selfTestUnreferencedRecipes();
requireReachedVerdict('selfTestUnreferencedRecipes', unreferencedReachedVerdict);
if (unreferencedControl.failures.length) {
console.error('check-platform-checklist: the unreferenced-recipe direction\'s own positive control FAILED — a recipe no item references would pass unreported, and because every real recipe IS referenced, nothing else in this gate would ever notice.\n');
for (const f of unreferencedControl.failures) console.error(` ✗ ${f}`);
Expand All@@ -1275,6 +1327,7 @@ if (unreferencedControl.failures.length) {
// subject population is zero — so nothing but this battery can tell a working
// direction from a deleted one.
const metaCallControl = selfTestMetaCallSpelling();
requireReachedVerdict('selfTestMetaCallSpelling', metaCallReachedVerdict);
if (metaCallControl.failures.length) {
console.error("check-platform-checklist: the `/meta` call-spelling refusal's own positive control FAILED — an executable step instructing a folded plural spelling would pass unreported, which is the exact defect this check was added to close.\n");
for (const f of metaCallControl.failures) console.error(` ✗ ${f}`);
Expand All@@ -1288,6 +1341,7 @@ if (metaCallControl.failures.length) {
// from the ledger staying clean — which is precisely the exit-0-by-construction
// shape this check was added to end.
const citationControl = selfTestSourceLineCitations();
requireReachedVerdict('selfTestSourceLineCitations', citationsReachedVerdict);
if (citationControl.failures.length) {
console.error('check-platform-checklist: the source-line-citation refusal\'s own positive control FAILED — a rotting `file:line` pointer would pass unreported, and because the ledger is clean nothing else here would ever notice.\n');
for (const f of citationControl.failures) console.error(` ✗ ${f}`);
Expand Down
28 changes: 27 additions & 1 deletion scripts/pm/dispatch-gates.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -10514,6 +10514,23 @@ export function bannerLines({ identity, paths = [], drift = null }) {
// the tree, in both directions.
// ---------------------------------------------------------------------------

/**
* Returned by `selfTest()` only after its verdict line is printed, and compared
* at the dispatch: a `return` that leaves the function above that line prints
* NOTHING and still exits 0, because the dispatch discarded the result. Measured
* on this file before this guard existed: an early return took the run from
* "1288 cases pass" to zero bytes of output and exit 0 — a self-test that never
* finished, reported as one that passed.
*
* The mechanical probe in `scripts/measure-self-test-floor.mjs` cannot read this
* file (its anchor matches the first `function selfTest() {` in the source, which
* here is a FIXTURE STRING, so the injection lands inside a template literal and
* only ever produces a SyntaxError). That is a limit of the instrument, not a
* property of this file, and it is why the entry is hand-read there. Anchoring an
* early return on the real definition below measures it in one run.
*/
const SELF_TEST_VERDICT = 'dispatch-gates self-test reached its verdict';

function selfTest() {
const cases = [];
// Stream the verdict the moment it is decided (#14281) rather than only at
Expand DownExpand Up@@ -17737,6 +17754,8 @@ function selfTest() {
process.exit(1);
}
console.log(`✓ dispatch-gates self-test: ${cases.length} cases pass.`);

return SELF_TEST_VERDICT;
}

// ── CLI ─────────────────────────────────────────────────────────────────────
Expand DownExpand Up@@ -17791,7 +17810,14 @@ if (invokedDirectly) {
const argvPaths = argv.paths;
const wantsChanged = process.argv.includes('--changed');
if (process.argv.includes('--self-test')) {
selfTest();
if (selfTest() !== SELF_TEST_VERDICT) {
console.error(
'\n✗ dispatch-gates 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.malformed) {
console.error(`dispatch-gates: ${argv.malformed}.`);
process.exit(2);
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
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
54 changes: 54 additions & 0 deletions scripts/check-platform-checklist.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -704,6 +704,45 @@ function foldedCallMessage(path, call, spelling, singular) {
);
}

// ── Self-test verdict handshake ─────────────────────────────────────────────
//
// Five batteries, each returning `{ checked, failures }` for a caller to
// report. A `return` above a battery's own end prints nothing, registers no
// failure, and yields a SMALLER `checked` that both legs below read as a pass.
// Measured on this file: a section that stopped running took the `--self-test`
// verdict from 141 assertions to 119, exited 0, and still claimed in prose that
// the direction it had skipped "REFUSES an empty/renamed/reshaped" table. A
// bare `return` is no better — it yields `undefined` and CRASHES the combine
// below, and an exit code alone reads that crash as a handshake rather than as
// the accident it is.
//
// So each battery sets its own flag as its last act and every caller checks it.
// The return value is load-bearing here (it carries `checked` and `failures`),
// so the handshake is a flag rather than a returned sentinel — the spelling
// `check-durability-degradation-log-level.mjs` and
// `check-dispatcher-error-vocabulary.mjs` carry, for that same reason.
let trapReachedVerdict = false;
let provisioningReachedVerdict = false;
let unreferencedReachedVerdict = false;
let metaCallReachedVerdict = false;
let citationsReachedVerdict = false;

/**
* One wording, ten call sites — five batteries across the two legs that run
* them. The check, the message and the exit code are the landed ones; only the
* duplication is factored out.
*/
function requireReachedVerdict(name, reached) {
if (reached) return;
console.error(
`\n✗ check-platform-checklist self-test: ${name}() returned without reaching its verdict,\n`
+ 'so its assertions did not all run and no failure of theirs could be reported.\n'
+ 'Running the gate on top of a self-test that never finished would report an\n'
+ 'unverified gate as a verified one.\n',
);
process.exit(1);
}

/**
* The positive control. Proves the extractor reads a good table AND refuses an
* empty / renamed / reshaped one, and that the item-side checker catches both
Expand DownExpand Up@@ -770,6 +809,7 @@ function selfTestTrapVocabulary() {
t('C8 an empty-string trap is flagged', trapProblems({ traps: [''] }, vocab).length === 1);
t('C9 a trap listed twice on one item is flagged', trapProblems({ traps: ['stale-dist', 'stale-dist'] }, vocab).some((m) => m.includes('twice')));

trapReachedVerdict = true;
return { checked, failures };
}

Expand DownExpand Up@@ -877,6 +917,7 @@ function selfTestProvisioningUse() {
const hintedEmpty = check('qa-contributor-bound-member', 'records-forms');
t('Q20 the same hint reaches an area that has no recipe block of its own', hintedEmpty.length === 1 && hintedEmpty[0].includes('`search:qa-contributor-bound-member`'));

provisioningReachedVerdict = true;
return { checked, failures };
}

Expand DownExpand Up@@ -978,6 +1019,7 @@ function selfTestUnreferencedRecipes() {
t('R18 a `$comment` is never reported unreferenced', flag(ALL).length === 0 && none.every((r) => !r.recipe.startsWith('$')));
t('R19 an area that defines no recipes contributes nothing to flag', !none.some((r) => r.area === 'records-forms'));

unreferencedReachedVerdict = true;
return { checked, failures };
}

Expand DownExpand Up@@ -1136,6 +1178,7 @@ export const NEIGHBOURING_MAP: Readonly<Record<string, string>> = Object.freeze(
t('M52 the live map is a bijection-free lookup: no folded spelling is ALSO a canonical singular — so the refusal can never fire on a canonical `/meta/<type>` segment',
live.refusal === null && !live.folded.some((f) => live.canonical.includes(f)));

metaCallReachedVerdict = true;
return { checked, failures };
}

Expand DownExpand Up@@ -1216,6 +1259,7 @@ function selfTestSourceLineCitations() {
t('S6 an ADR section reference is not a citation', n('ADR-0025 §3.3 and #13479') === 0);
t('S7 the README placeholder spelling of the ban is not itself a citation', n('never pin `file.ts:NNN` or a bare `:NNN`') === 0);

citationsReachedVerdict = true;
return { failures, checked };
}

Expand All@@ -1225,6 +1269,11 @@ if (process.argv.slice(2).includes('--self-test')) {
const unref = selfTestUnreferencedRecipes();
const metaCall = selfTestMetaCallSpelling();
const cites = selfTestSourceLineCitations();
requireReachedVerdict('selfTestTrapVocabulary', trapReachedVerdict);
requireReachedVerdict('selfTestProvisioningUse', provisioningReachedVerdict);
requireReachedVerdict('selfTestUnreferencedRecipes', unreferencedReachedVerdict);
requireReachedVerdict('selfTestMetaCallSpelling', metaCallReachedVerdict);
requireReachedVerdict('selfTestSourceLineCitations', citationsReachedVerdict);
const failures = [...trap.failures, ...prov.failures, ...unref.failures, ...metaCall.failures, ...cites.failures];
if (failures.length === 0) {
console.log(
Expand All@@ -1243,6 +1292,7 @@ if (process.argv.slice(2).includes('--self-test')) {

// The extractor's own positive control, before it is trusted with anything.
const trapControl = selfTestTrapVocabulary();
requireReachedVerdict('selfTestTrapVocabulary', trapReachedVerdict);
if (trapControl.failures.length) {
console.error("check-platform-checklist: the trap-vocabulary extractor's own positive control FAILED — this check cannot be trusted, and a green from it would mean nothing.\n");
for (const f of trapControl.failures) console.error(` ✗ ${f}`);
Expand All@@ -1252,6 +1302,7 @@ if (trapControl.failures.length) {
// Same, for the provisioning resolve: a green from a check that cannot fire is
// indistinguishable from the green this gate printed before it existed.
const provisioningControl = selfTestProvisioningUse();
requireReachedVerdict('selfTestProvisioningUse', provisioningReachedVerdict);
if (provisioningControl.failures.length) {
console.error("check-platform-checklist: the provisioning-resolve check's own positive control FAILED — a `use` that resolves to nothing would pass, which is the exact defect this check was added to close.\n");
for (const f of provisioningControl.failures) console.error(` ✗ ${f}`);
Expand All@@ -1263,6 +1314,7 @@ if (provisioningControl.failures.length) {
// recipes on the real ledger are referenced, so this direction's output is
// permanently empty and its green says nothing on its own.
const unreferencedControl = selfTestUnreferencedRecipes();
requireReachedVerdict('selfTestUnreferencedRecipes', unreferencedReachedVerdict);
if (unreferencedControl.failures.length) {
console.error('check-platform-checklist: the unreferenced-recipe direction\'s own positive control FAILED — a recipe no item references would pass unreported, and because every real recipe IS referenced, nothing else in this gate would ever notice.\n');
for (const f of unreferencedControl.failures) console.error(` ✗ ${f}`);
Expand All@@ -1275,6 +1327,7 @@ if (unreferencedControl.failures.length) {
// subject population is zero — so nothing but this battery can tell a working
// direction from a deleted one.
const metaCallControl = selfTestMetaCallSpelling();
requireReachedVerdict('selfTestMetaCallSpelling', metaCallReachedVerdict);
if (metaCallControl.failures.length) {
console.error("check-platform-checklist: the `/meta` call-spelling refusal's own positive control FAILED — an executable step instructing a folded plural spelling would pass unreported, which is the exact defect this check was added to close.\n");
for (const f of metaCallControl.failures) console.error(` ✗ ${f}`);
Expand All@@ -1288,6 +1341,7 @@ if (metaCallControl.failures.length) {
// from the ledger staying clean — which is precisely the exit-0-by-construction
// shape this check was added to end.
const citationControl = selfTestSourceLineCitations();
requireReachedVerdict('selfTestSourceLineCitations', citationsReachedVerdict);
if (citationControl.failures.length) {
console.error('check-platform-checklist: the source-line-citation refusal\'s own positive control FAILED — a rotting `file:line` pointer would pass unreported, and because the ledger is clean nothing else here would ever notice.\n');
for (const f of citationControl.failures) console.error(` ✗ ${f}`);
Expand Down
28 changes: 27 additions & 1 deletion scripts/pm/dispatch-gates.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -10514,6 +10514,23 @@ export function bannerLines({ identity, paths = [], drift = null }) {
// the tree, in both directions.
// ---------------------------------------------------------------------------

/**
* Returned by `selfTest()` only after its verdict line is printed, and compared
* at the dispatch: a `return` that leaves the function above that line prints
* NOTHING and still exits 0, because the dispatch discarded the result. Measured
* on this file before this guard existed: an early return took the run from
* "1288 cases pass" to zero bytes of output and exit 0 — a self-test that never
* finished, reported as one that passed.
*
* The mechanical probe in `scripts/measure-self-test-floor.mjs` cannot read this
* file (its anchor matches the first `function selfTest() {` in the source, which
* here is a FIXTURE STRING, so the injection lands inside a template literal and
* only ever produces a SyntaxError). That is a limit of the instrument, not a
* property of this file, and it is why the entry is hand-read there. Anchoring an
* early return on the real definition below measures it in one run.
*/
const SELF_TEST_VERDICT = 'dispatch-gates self-test reached its verdict';

function selfTest() {
const cases = [];
// Stream the verdict the moment it is decided (#14281) rather than only at
Expand DownExpand Up@@ -17737,6 +17754,8 @@ function selfTest() {
process.exit(1);
}
console.log(`✓ dispatch-gates self-test: ${cases.length} cases pass.`);

return SELF_TEST_VERDICT;
}

// ── CLI ─────────────────────────────────────────────────────────────────────
Expand DownExpand Up@@ -17791,7 +17810,14 @@ if (invokedDirectly) {
const argvPaths = argv.paths;
const wantsChanged = process.argv.includes('--changed');
if (process.argv.includes('--self-test')) {
selfTest();
if (selfTest() !== SELF_TEST_VERDICT) {
console.error(
'\n✗ dispatch-gates 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.malformed) {
console.error(`dispatch-gates: ${argv.malformed}.`);
process.exit(2);
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
Merged
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
54 changes: 54 additions & 0 deletions scripts/check-platform-checklist.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -704,6 +704,45 @@ function foldedCallMessage(path, call, spelling, singular) {
);
}

// ── Self-test verdict handshake ─────────────────────────────────────────────
//
// Five batteries, each returning `{ checked, failures }` for a caller to
// report. A `return` above a battery's own end prints nothing, registers no
// failure, and yields a SMALLER `checked` that both legs below read as a pass.
// Measured on this file: a section that stopped running took the `--self-test`
// verdict from 141 assertions to 119, exited 0, and still claimed in prose that
// the direction it had skipped "REFUSES an empty/renamed/reshaped" table. A
// bare `return` is no better — it yields `undefined` and CRASHES the combine
// below, and an exit code alone reads that crash as a handshake rather than as
// the accident it is.
//
// So each battery sets its own flag as its last act and every caller checks it.
// The return value is load-bearing here (it carries `checked` and `failures`),
// so the handshake is a flag rather than a returned sentinel — the spelling
// `check-durability-degradation-log-level.mjs` and
// `check-dispatcher-error-vocabulary.mjs` carry, for that same reason.
let trapReachedVerdict = false;
let provisioningReachedVerdict = false;
let unreferencedReachedVerdict = false;
let metaCallReachedVerdict = false;
let citationsReachedVerdict = false;

/**
* One wording, ten call sites — five batteries across the two legs that run
* them. The check, the message and the exit code are the landed ones; only the
* duplication is factored out.
*/
function requireReachedVerdict(name, reached) {
if (reached) return;
console.error(
`\n✗ check-platform-checklist self-test: ${name}() returned without reaching its verdict,\n`
+ 'so its assertions did not all run and no failure of theirs could be reported.\n'
+ 'Running the gate on top of a self-test that never finished would report an\n'
+ 'unverified gate as a verified one.\n',
);
process.exit(1);
}

/**
* The positive control. Proves the extractor reads a good table AND refuses an
* empty / renamed / reshaped one, and that the item-side checker catches both
Expand DownExpand Up@@ -770,6 +809,7 @@ function selfTestTrapVocabulary() {
t('C8 an empty-string trap is flagged', trapProblems({ traps: [''] }, vocab).length === 1);
t('C9 a trap listed twice on one item is flagged', trapProblems({ traps: ['stale-dist', 'stale-dist'] }, vocab).some((m) => m.includes('twice')));

trapReachedVerdict = true;
return { checked, failures };
}

Expand DownExpand Up@@ -877,6 +917,7 @@ function selfTestProvisioningUse() {
const hintedEmpty = check('qa-contributor-bound-member', 'records-forms');
t('Q20 the same hint reaches an area that has no recipe block of its own', hintedEmpty.length === 1 && hintedEmpty[0].includes('`search:qa-contributor-bound-member`'));

provisioningReachedVerdict = true;
return { checked, failures };
}

Expand DownExpand Up@@ -978,6 +1019,7 @@ function selfTestUnreferencedRecipes() {
t('R18 a `$comment` is never reported unreferenced', flag(ALL).length === 0 && none.every((r) => !r.recipe.startsWith('$')));
t('R19 an area that defines no recipes contributes nothing to flag', !none.some((r) => r.area === 'records-forms'));

unreferencedReachedVerdict = true;
return { checked, failures };
}

Expand DownExpand Up@@ -1136,6 +1178,7 @@ export const NEIGHBOURING_MAP: Readonly<Record<string, string>> = Object.freeze(
t('M52 the live map is a bijection-free lookup: no folded spelling is ALSO a canonical singular — so the refusal can never fire on a canonical `/meta/<type>` segment',
live.refusal === null && !live.folded.some((f) => live.canonical.includes(f)));

metaCallReachedVerdict = true;
return { checked, failures };
}

Expand DownExpand Up@@ -1216,6 +1259,7 @@ function selfTestSourceLineCitations() {
t('S6 an ADR section reference is not a citation', n('ADR-0025 §3.3 and #13479') === 0);
t('S7 the README placeholder spelling of the ban is not itself a citation', n('never pin `file.ts:NNN` or a bare `:NNN`') === 0);

citationsReachedVerdict = true;
return { failures, checked };
}

Expand All@@ -1225,6 +1269,11 @@ if (process.argv.slice(2).includes('--self-test')) {
const unref = selfTestUnreferencedRecipes();
const metaCall = selfTestMetaCallSpelling();
const cites = selfTestSourceLineCitations();
requireReachedVerdict('selfTestTrapVocabulary', trapReachedVerdict);
requireReachedVerdict('selfTestProvisioningUse', provisioningReachedVerdict);
requireReachedVerdict('selfTestUnreferencedRecipes', unreferencedReachedVerdict);
requireReachedVerdict('selfTestMetaCallSpelling', metaCallReachedVerdict);
requireReachedVerdict('selfTestSourceLineCitations', citationsReachedVerdict);
const failures = [...trap.failures, ...prov.failures, ...unref.failures, ...metaCall.failures, ...cites.failures];
if (failures.length === 0) {
console.log(
Expand All@@ -1243,6 +1292,7 @@ if (process.argv.slice(2).includes('--self-test')) {

// The extractor's own positive control, before it is trusted with anything.
const trapControl = selfTestTrapVocabulary();
requireReachedVerdict('selfTestTrapVocabulary', trapReachedVerdict);
if (trapControl.failures.length) {
console.error("check-platform-checklist: the trap-vocabulary extractor's own positive control FAILED — this check cannot be trusted, and a green from it would mean nothing.\n");
for (const f of trapControl.failures) console.error(` ✗ ${f}`);
Expand All@@ -1252,6 +1302,7 @@ if (trapControl.failures.length) {
// Same, for the provisioning resolve: a green from a check that cannot fire is
// indistinguishable from the green this gate printed before it existed.
const provisioningControl = selfTestProvisioningUse();
requireReachedVerdict('selfTestProvisioningUse', provisioningReachedVerdict);
if (provisioningControl.failures.length) {
console.error("check-platform-checklist: the provisioning-resolve check's own positive control FAILED — a `use` that resolves to nothing would pass, which is the exact defect this check was added to close.\n");
for (const f of provisioningControl.failures) console.error(` ✗ ${f}`);
Expand All@@ -1263,6 +1314,7 @@ if (provisioningControl.failures.length) {
// recipes on the real ledger are referenced, so this direction's output is
// permanently empty and its green says nothing on its own.
const unreferencedControl = selfTestUnreferencedRecipes();
requireReachedVerdict('selfTestUnreferencedRecipes', unreferencedReachedVerdict);
if (unreferencedControl.failures.length) {
console.error('check-platform-checklist: the unreferenced-recipe direction\'s own positive control FAILED — a recipe no item references would pass unreported, and because every real recipe IS referenced, nothing else in this gate would ever notice.\n');
for (const f of unreferencedControl.failures) console.error(` ✗ ${f}`);
Expand All@@ -1275,6 +1327,7 @@ if (unreferencedControl.failures.length) {
// subject population is zero — so nothing but this battery can tell a working
// direction from a deleted one.
const metaCallControl = selfTestMetaCallSpelling();
requireReachedVerdict('selfTestMetaCallSpelling', metaCallReachedVerdict);
if (metaCallControl.failures.length) {
console.error("check-platform-checklist: the `/meta` call-spelling refusal's own positive control FAILED — an executable step instructing a folded plural spelling would pass unreported, which is the exact defect this check was added to close.\n");
for (const f of metaCallControl.failures) console.error(` ✗ ${f}`);
Expand All@@ -1288,6 +1341,7 @@ if (metaCallControl.failures.length) {
// from the ledger staying clean — which is precisely the exit-0-by-construction
// shape this check was added to end.
const citationControl = selfTestSourceLineCitations();
requireReachedVerdict('selfTestSourceLineCitations', citationsReachedVerdict);
if (citationControl.failures.length) {
console.error('check-platform-checklist: the source-line-citation refusal\'s own positive control FAILED — a rotting `file:line` pointer would pass unreported, and because the ledger is clean nothing else here would ever notice.\n');
for (const f of citationControl.failures) console.error(` ✗ ${f}`);
Expand Down
28 changes: 27 additions & 1 deletion scripts/pm/dispatch-gates.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -10514,6 +10514,23 @@ export function bannerLines({ identity, paths = [], drift = null }) {
// the tree, in both directions.
// ---------------------------------------------------------------------------

/**
* Returned by `selfTest()` only after its verdict line is printed, and compared
* at the dispatch: a `return` that leaves the function above that line prints
* NOTHING and still exits 0, because the dispatch discarded the result. Measured
* on this file before this guard existed: an early return took the run from
* "1288 cases pass" to zero bytes of output and exit 0 — a self-test that never
* finished, reported as one that passed.
*
* The mechanical probe in `scripts/measure-self-test-floor.mjs` cannot read this
* file (its anchor matches the first `function selfTest() {` in the source, which
* here is a FIXTURE STRING, so the injection lands inside a template literal and
* only ever produces a SyntaxError). That is a limit of the instrument, not a
* property of this file, and it is why the entry is hand-read there. Anchoring an
* early return on the real definition below measures it in one run.
*/
const SELF_TEST_VERDICT = 'dispatch-gates self-test reached its verdict';

function selfTest() {
const cases = [];
// Stream the verdict the moment it is decided (#14281) rather than only at
Expand DownExpand Up@@ -17737,6 +17754,8 @@ function selfTest() {
process.exit(1);
}
console.log(`✓ dispatch-gates self-test: ${cases.length} cases pass.`);

return SELF_TEST_VERDICT;
}

// ── CLI ─────────────────────────────────────────────────────────────────────
Expand DownExpand Up@@ -17791,7 +17810,14 @@ if (invokedDirectly) {
const argvPaths = argv.paths;
const wantsChanged = process.argv.includes('--changed');
if (process.argv.includes('--self-test')) {
selfTest();
if (selfTest() !== SELF_TEST_VERDICT) {
console.error(
'\n✗ dispatch-gates 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.malformed) {
console.error(`dispatch-gates: ${argv.malformed}.`);
process.exit(2);
Expand Down
Loading