From 329791c9e95907e1fb9da60cc4f0ddc8c2f8c823 Mon Sep 17 00:00:00 2001 From: Speculator55005 <50082482+fas89@users.noreply.github.com> Date: Tue, 15 Sep 2026 06:32:43 +0200 Subject: [PATCH 1/2] docs: a link gate that reads what ships, and the last GCP project id MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Four things, and the first is the one that matters. THE ARTIFACT GATE. Every link gate here read SOURCE MARKDOWN: the bundled links-check plugin filters candidates on /\.md(?:[?#]|$)/ and so sees about 861 of ~1331 internal links; base-prefix-check greps `](/…)`; lychee-source runs over docs/**.md. None can see the bytes that deploy. Measured on 92925e5: a one-character typo in the config.ts navbar (`/why` -> `/whyy`) leaves `npm run docs:build` exiting 0 while shipping 424 dead references across 212 of the 213 rendered pages. scripts/check-dist-links.mjs walks docs/.vuepress/dist/**.html instead — 219 pages, 107,738 absolute references, 474 distinct targets on this build, with the census printed, because "passed" with no numbers is indistinguishable from "inspected nothing". Its canaries run IN-PROCESS before every scan rather than as a separate step, a separate step being deletable while the gate keeps reporting green, and there are floors on pages, references and distinct targets. That machinery earned its keep immediately: the first version's fixture contained only `` elements, so dropping `src` from the extractor moved the counts by 219 of 107,738 — under every floor — and the gate printed "Clean" while no asset reference in dist was checked. Reproduced, then closed: the fixture now carries a resolving `` and a failing `', + 'must resolve — index', + 'must resolve — pretty', + 'must NOT resolve — missing file', + 'must NOT resolve — missing base prefix', + '
<a href="/canary_base/not-a-real-link.html">in a code sample</a>
', + '', + '', + ].join('\n')) + + const { census, findings } = scan({ distRoot: resolve(dir), base, relativeMode: 'warn' }) + const kinds = findings.map((f) => f.kind).sort() + const problems = [] + + if (census.pages !== 2) problems.push(`walked ${census.pages} canary pages, expected 2`) + if (census.byRule.exact !== 3) problems.push(`exact-rule resolutions ${census.byRule.exact}, expected 3`) + if (census.byRule.index !== 1) problems.push(`index-rule resolutions ${census.byRule.index}, expected 1`) + if (census.byRule.pretty !== 1) problems.push(`pretty-rule resolutions ${census.byRule.pretty}, expected 1`) + if (findings.length !== 3) problems.push(`reported ${findings.length} findings, expected exactly 3`) + if (kinds.join(',') !== 'missing-base,missing-file,missing-file') { + problems.push(`finding kinds were [${kinds.join(', ')}], expected [missing-base, missing-file, missing-file]`) + } + // The code sample and the script-body string must NOT have been collected. + // If either shows up, the extractor is reading page text as markup and + // every "finding" it reports is suspect. + if (findings.some((f) => /not-a-real-link|also-not-a-link/.test(f.ref))) { + problems.push('extractor picked up an attribute-shaped string out of a code sample or a