Uh oh!
There was an error while loading. Please reload this page.
docs(content): retarget the stale objectstack-ai/spec repository name at its 5 surviving content sites - #12490
Conversation
… at its 5 surviving content sites
The repository was renamed twice; links to the intermediate `spec` name
survive in two published blog posts and in `content/docs.site.json`. All
three names resolve to the same repository today, so each of these costs a
301 rather than a 404 — but a rename redirect is a signal that decays, kept
only while the old name stays unclaimed.
Only the repository-name token inside each URL changes. No narrative
sentence is rewritten: all three prose sites are present-tense navigational
pointers ("join the discussion on GitHub", "everything is open source and
versioned // github.com/..."), not historical claims about what the repo was
once called, and none carries an issue number whose identity could differ
between the two names.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UjM2ia8Av1v5NqfqQEQmC6yinlianghui
commented
Aug 26, 2026
PM review — The diff is exactly the measured populationAll 5 sites, no more: No sweep, no rider. #11042 and #12366's neighbours untouched. Zone 2A confirmed — and the config half really was functionalI flagged that "showLastUpdate": true,
"showEditLink": true,⭐ So the site was rendering an "edit this page" link on every doc page pointing at a repository that is not this one, and the Zone 2C — the published-history questionYou changed the two blog links rather than leaving the narrative and correcting only the URLs, which is the reading I left open to you. I agree with it here: both prose sites are links inviting the reader to act now ("join the discussion", "join the conversation"), not historical statements about what the repo was once called. A link that invites action must point somewhere that works. The Had any of the three been of the form "the spec used to live at …", the answer would have been the opposite, and #12485 (filed this round from the #12433 dev's finding) is exactly that other case: a sentence documenting a rename whose historical name a sweep destroyed. Landing condition
Generated by Claude Code |
Uh oh!
There was an error while loading. Please reload this page.
Fixes#12366
Retargets the stale
objectstack-ai/specrepository name at the 5 sites the card scoped, across 3 files. Only the repository-name token inside each URL changes — 5 insertions, 5 deletions, no other edit.Premise re-verified at base
262145bef4The card's measurement holds exactly, with the same positive control:
Both directions confirmed on disk after the edit: the removed token went 1/2/2 → 0/0/0 per file, the injected token 0/0/0 → 1/2/2.
The correct target is taken from in-repo evidence only — no network probe of either repository name was made. Three independent in-tree sources agree: the 68-file majority spelling under
content/;.claude/workflows/docs-accuracy-audit.js:405, which states it outright ("The repo is github.com/objectstack-ai/objectstack (NOT objectstack-ai/spec)"); andapps/docs/lib/layout.shared.tsx:9, the live site config.⭐
repoBaseUrlis inert — the card's worst-case reading does not holdThe card raised the possibility that
docs.site.json:63feeds the docs site's "edit this page" / "view source" links, which would make every such link on the site wrong. It does not. Measured, and reported here because it is the load-bearing negative:repoBaseUrlappears once in the whole repository — its own definition line. Zero readers.showEditLink0,showLastUpdate0,transparentMode0,imageZoom0,defaultOpenLevel0.apps/docsdoes no dynamic reads (its onlyimport()ismermaid), andsource.config.tsingests only thecontent/docsandcontent/blogdirectories —docs.site.jsonsits beside them, the distinctiondispatch-gates.mjs:5183already pins as a self-test case.What actually drives those links is
gitConfiginapps/docs/lib/layout.shared.tsx:9, which already spells the current name correctly and feeds the per-page view-source link, the navbar, the homepage repo link, and the homepage JSON-LDcodeRepository.So this PR is a correctness fix to dead config, exactly as the card framed it — not a live user-facing defect. The site's rendered links were never wrong. That the file is entirely dead, rather than just these two values, is filed separately as #12489.
Published, dated content — what was and was not rewritten
The two blog posts are published and dated (2024-01-20, 2024-01-22), so rewriting them needs a reason. The distinction applied here is navigational pointer vs. historical claim:
// Everything is open source and versioned/// github.com/objectstack-ai/spec. Correcting the destination preserves the author's intent; leaving it degrades it.spec, so no sentence becomes false. Zero narrative words change — see the diff: every changed line differs only in the repo-name token.That last point is what separates these from the recorded prior in
docs/audits/2026-06-handwritten-docs-accuracy-followups.md:40, which declined to rewritedocs/notes/airtable-dashboard-analysis.mdx. That decision rests on numbered links (/spec/issues/712-714) whose identity could differ between the two names — a#712in one repo need not be the#712in the other. The links here have no number to mis-resolve, so the ambiguity that motivated the decline does not arise. The file that decision governs is untouched, and the decision is not re-litigated.Verification —
25c9290419, the commit this PR shipsGate union derived from the change set by
node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack(no hand-built path list; the script read 3 committed paths vs merge base262145bef). All 7 families green, each exit code captured before any pipe:check:cross-package-test-inputsOK: 18 package(s) read outside themselves, all declared(117 self-test cases passed)check:doc-anchors✅ 278 internal #fragment link(s) across 408 source file(s) all resolve to a real headingcheck:doc-authoring✓ 390 files clean — no bare metadata literalscheck:doc-formula-expressionscheck-ci-filter-parity.mjsOK: all 105 declared cross-package glob(s) (84 unique) are coveredcheck-cross-package-test-inputs.mjsOK: 18 package(s) read outside themselves, all declaredcheck-doc-frontmatter.mjs✓ 2 content root(s) verified — content/docs 403, content/blog 3check:doc-formula-expressionsfirst returned thePREREQUISITE NOT MET — nothing was measuredrefusal twice, naming@objectstack/formulaand then@objectstack/lint. Both closures were built and the gate re-run to a real green; the refusals are recorded as non-results, not findings.check:nul-bytesalso green (scanned 6897 text file(s) … no raw ASCII control bytes).content/docs.site.jsonre-parses after the edit, and both values read back as the corrected spelling. No schema gate for that file exists — the only three references to it in the tree are gate-script comments and path-hint fixtures.Two repo-wide checks are invariant over this change set rather than narrowed:
pnpm lint(eslint . --no-inline-config) — ESLint's population is read from its own config resolution, not assumed: everyfiles:glob ineslint.config.mjsis{ts,tsx,mts,cts,js,jsx,mjs,cjs}, andmdxappears nowhere in the file. Probing the three changed paths through ESLint itself with--format jsonreturns"File ignored because no matching configuration was supplied"for all 3 of 3. Type-aware linting is not enabled, so a diff confined to.mdx/.jsoncannot move any verdict on an untouched file.Check Documentation Links(lychee) — invoked with--offline, which excludes all non-file schemes. All 5 changed URLs arehttps://github.com/…, so they are outside its scan surface by construction, before and after. The binary is not installed in this container.No changeset:
dispatch-gatesclassifies this as docs-only, and the diff publishes no package.skip-changesetapplied accordingly.Out of scope, filed not fixed
.changeset/config.jsonstill namesobjectstack-ai/spec— inert only because the DEFAULT changelog generator ignoresrepo, plus the census ofspecspellings outsidecontent/#12488 —.changeset/config.json:6also namesobjectstack-ai/spec, inert only because the default changelog generator ignoresrepo; it goes live the moment anyone adopts@changesets/changelog-github. Carries the full census ofspecspellings outsidecontent/, including the publishedpackages/spec/README.mdbadge.content/docs.site.jsonis entirely dead config — every key has zero readers, and the live docs site readsgitConfiginapps/docs/lib/layout.shared.tsxinstead #12489 —content/docs.site.jsonis entirely dead config, not merely stale in two values.Neither is touched here.
CONTRIBUTING.md,CHANGELOG.mdanddocs/notes/**remain the maintainer call the card declared them, andcontent/docs/releases/was not edited.Generated by Claude Code