chore(content): clear the rot — dead links, held drafts, orphan sections - #169
Open
avrabe wants to merge 2 commits into
Open
chore(content): clear the rot — dead links, held drafts, orphan sections#169avrabe wants to merge 2 commits into
avrabe wants to merge 2 commits into
Conversation
…par) Each was an `_index.md` reading "Artifacts from the <project> project, exported by rivet" with zero pages beneath it. Nothing populates them — no workflow, no script — and the reports section (#59, `load_data` over `static/reports/index.json`) is what actually ships project evidence now. They were unreachable from the nav and from any page body, yet all three were in the sitemap: three URLs submitted to search engines rendering a title and one sentence. zola build: 39 pages (0 orphan), 14 sections -> 11 sections. No page lost. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01G5qpB7zvxLvdrvn5YRyj4R
…ates
Six internal links were dead on the live site, four of them on the
nav-linked /docs/ page: `/docs/guide/{architecture,verify,trace,compliance}/`
were never written, `/blog/rivet-v0.1.0/` slugifies to `rivet-v0-1-0`, and
`/blog/2026-05-01-cross-language-lto-…/` carried a date the URL does not.
CI ran `zola build`, which does not validate links, so all six were green.
Adds `scripts/check-internal-links.py` and runs it in CI. Deliberately NOT
`zola check --skip-external-links`: measured, it exits 0 with a dead
`/docs/guide/compliance/` link in the tree, because it only understands
Zola's `@/path.md` syntax and our content uses raw absolute hrefs. The new
checker was verified red-first — green, red on one reintroduced dead link,
green again — and refuses to pass if it matched zero links at all.
The "The Guide" list on /docs/ drops the four pages that do not exist and
now surfaces `/guides/verification-guide/` — a 16 KB reference that was
reachable only from a footnote in the March 15 post.
Deletes two drafts that had been held 112 and 101 days
(`witness-wasm-mcdc`, `attestation-chains-trustmee-to-cerisier`).
The reason the second one rotted is fixed too. blog-autopublish runs daily
and is 40/40 green, and reported both as `∞ Held` — but one carried an
explicit `hold = true` (a decision) and the other was simply missing
`ready = true` (an omission). The report now separates them, and the
workflow header no longer documents a contract the script does not
implement (it said `draft = true` + no `hold` was enough; the script
requires `ready = true`). Verified with a fixture in each bucket.
Filename dates now match frontmatter dates on three posts. URLs are
date-free, so no page moved and no alias is needed.
zola build: 39 pages (0 orphan), 11 sections. Internal links: 94 checked, 0 dead.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G5qpB7zvxLvdrvn5YRyj4R
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Walked the content tree after noticing duplicates and unpublished material sitting there. Four separate kinds of rot, one of them breaking the local build.
The build was broken locally
content/preprints/was an untracked leftover from the preprints → publications rename. The survivingcontent/publications/oracle-gated-agent-loops.mddiffers from it by exactly one line — thealiases = ["/preprints/oracle-gated-agent-loops/"]added to keep the old URL alive.zola buildfailed with a path collision on any tree that had it. Removed (it was never committed, so it is not in this diff — noted for the record).Six dead internal links, CI green over all of them
/docs/guide/architecture//docs/(in the nav)/docs/guide/verify//docs//docs/guide/trace//docs//docs/guide/compliance//docs//blog/rivet-v0.1.0/rivet-v0-1-0/blog/2026-05-01-cross-language-lto-…/Four of the five bullets under The Guide on the Documentation page were 404s.
CI runs
zola build, which does not validate links.The gate that would have caught it is vacuous here
zola check --skip-external-linkslooks like the obvious fix. It isn't — measured with a deliberately dead/docs/guide/compliance/in the tree:It only understands Zola's
@/path.mdinternal-link syntax; our content uses raw absolute hrefs, which it treats as unchecked.So this adds
scripts/check-internal-links.pyinstead, verified red-first:It also fails if it matched zero links — Zola minifies output and emits unquoted attributes (
href=/docs/), so the naivehref="([^"]+)"pattern matches nothing and reports a triumphant zero. That is how the first version of this check fooled me.Two drafts that rotted for 112 and 101 days
Deleted
witness-wasm-mcdcandattestation-chains-trustmee-to-cerisier.The interesting part is why the second one rotted.
blog-autopublishruns daily and is 40/40 success, and reported both identically:But they were held for different reasons:
witness-wasm-mcdccarried an explicithold = true— a decision.attestation-chainshad noholdand noready— an omission. One glyph for both, so the only surface anyone would check made a forgotten flag look like a deliberate park.Fixed two ways:
hold = true) and not yet markedready = true, the latter with a note saying it will never publish until someone acts. Verified with a fixture in each bucket.draft = true+ noholdwas enough;scripts/blog-autopublish.pyrequiresready = true. The opt-in design is right — the stale comment was not.Three empty sections in the sitemap
/gale/,/rivet/,/spar/— each an_index.mdreading "Artifacts from the X project, exported by rivet" with zero pages. Nothing populates them;/reports/(#59) is what ships project evidence now. Unlinked from nav and from every page body, yet all three were insitemap.xml.Smaller
overdoing-…22→29 Apr,variant-pruning24→30 Apr,verified-os-on-silicon15→18 Jul). URLs are date-free, so nothing moved and no alias is needed./guides/verification-guide/— a 16 KB reference reachable only from a footnote in the March 15 post — is now linked from the Documentation page.Verification
Still open, not touched here:
content/talks/is a leftover from the same talks → publications rename — no_index.md, holding one draft (speaker notes, 14 days old, not yet rotting).🤖 Generated with Claude Code
https://claude.ai/code/session_01G5qpB7zvxLvdrvn5YRyj4R