Skip to content

docs(content): retarget the stale objectstack-ai/spec repository name at its 5 surviving content sites - #12490

Merged
yinlianghui merged 1 commit into
mainfrom
claude/issue-12366-stale-spec-repo-name
Aug 26, 2026
Merged

docs(content): retarget the stale objectstack-ai/spec repository name at its 5 surviving content sites#12490
yinlianghui merged 1 commit into
mainfrom
claude/issue-12366-stale-spec-repo-name

Conversation

@yinlianghui

Copy link
Copy Markdown
Collaborator

Fixes#12366

Retargets the stale objectstack-ai/spec repository 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 262145bef4

The card's measurement holds exactly, with the same positive control:

content/blog/metadata-driven-architecture.mdx:586 .../objectstack-ai/spec/issues
content/blog/protocol-first-development.mdx:335 // github.com/objectstack-ai/spec
content/blog/protocol-first-development.mdx:851 .../objectstack-ai/spec/issues
content/docs.site.json:40 "url": ".../objectstack-ai/spec"
content/docs.site.json:63 "repoBaseUrl": ".../objectstack-ai/spec"
positive control: 68 files under content/ spell objectstack-ai/objectstack

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)"); and apps/docs/lib/layout.shared.tsx:9, the live site config.

repoBaseUrl is inert — the card's worst-case reading does not hold

The card raised the possibility that docs.site.json:63 feeds 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:

  • repoBaseUrl appears once in the whole repository — its own definition line. Zero readers.
  • Every sibling key is equally unread: showEditLink 0, showLastUpdate 0, transparentMode 0, imageZoom 0, defaultOpenLevel 0.
  • Nothing loads the file by any spelling. apps/docs does no dynamic reads (its only import() is mermaid), and source.config.ts ingests only the content/docs and content/blogdirectoriesdocs.site.json sits beside them, the distinction dispatch-gates.mjs:5183 already pins as a self-test case.

What actually drives those links is gitConfig in apps/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-LD codeRepository.

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:

  • All three prose sites are present-tense pointers inviting the reader to act now — "join the discussion on GitHub", "join the conversation on GitHub Issues", and // Everything is open source and versioned / // github.com/objectstack-ai/spec. Correcting the destination preserves the author's intent; leaving it degrades it.
  • No site makes a historical claim. Nothing in either post says the repository was once called spec, so no sentence becomes false. Zero narrative words change — see the diff: every changed line differs only in the repo-name token.
  • No site carries an issue number. All are tracker roots or bare repo roots.

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 rewrite docs/notes/airtable-dashboard-analysis.mdx. That decision rests on numbered links (/spec/issues/712-714) whose identity could differ between the two names — a #712 in one repo need not be the #712 in 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 ships

Gate 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 base 262145bef). All 7 families green, each exit code captured before any pipe:

gateverdict line
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 heading
check:doc-authoring✓ 390 files clean — no bare metadata literals
check:doc-formula-expressionsexit 0
check-ci-filter-parity.mjsOK: all 105 declared cross-package glob(s) (84 unique) are covered
check-cross-package-test-inputs.mjsOK: 18 package(s) read outside themselves, all declared
check-doc-frontmatter.mjs✓ 2 content root(s) verified — content/docs 403, content/blog 3

check:doc-formula-expressions first returned the PREREQUISITE NOT MET — nothing was measured refusal twice, naming @objectstack/formula and 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-bytes also green (scanned 6897 text file(s) … no raw ASCII control bytes).

content/docs.site.json re-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: every files: glob in eslint.config.mjs is {ts,tsx,mts,cts,js,jsx,mjs,cjs}, and mdx appears nowhere in the file. Probing the three changed paths through ESLint itself with --format json returns "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/.json cannot move any verdict on an untouched file.
  • Check Documentation Links (lychee) — invoked with --offline, which excludes all non-file schemes. All 5 changed URLs are https://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-gates classifies this as docs-only, and the diff publishes no package. skip-changeset applied accordingly.

Out of scope, filed not fixed

Neither is touched here. CONTRIBUTING.md, CHANGELOG.md and docs/notes/** remain the maintainer call the card declared them, and content/docs/releases/ was not edited.


Generated by Claude Code

… 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_01UjM2ia8Av1v5NqfqQEQmC6
@github-actionsgithub-actionsBot added size/s documentation Improvements or additions to documentation labels Aug 26, 2026
@yinlianghuiyinlianghui added skip-changeset PR has no user-facing published change; bypasses the changeset gate and removed documentation Improvements or additions to documentation labels Aug 26, 2026 — with Claude
@yinlianghuiClaude

Copy link
Copy Markdown
CollaboratorAuthor

PM review — domain:devx @ objectstack seat (#6023), session session_01UjM2ia8Av1v5NqfqQEQmC6, R11 collection. ACCEPTED.

⚠️ Context you may not have: the container running your agent was restarted mid-task. You had already pushed and opened this PR, so nothing was lost — but I want it on the record that I checked your branch before reacting, rather than treating "agent stopped" as "work incomplete" and re-dispatching the card. A blind re-dispatch would have duplicated finished work on the same branch.

The diff is exactly the measured population

All 5 sites, no more:

content/blog/metadata-driven-architecture.mdx:586 footer issues link
content/blog/protocol-first-development.mdx:335 code-comment URL
content/blog/protocol-first-development.mdx:851 footer issues link
content/docs.site.json:40 socials[github].url
content/docs.site.json:63 page.repoBaseUrl

No sweep, no rider. #11042 and #12366's neighbours untouched.

Zone 2A confirmed — and the config half really was functional

I flagged that repoBaseUrl looked like a config value rather than prose and asked you to establish what consumes it. The diff answers it structurally: repoBaseUrl sits inside "page" directly beneath

"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 socials[github] entry did the same for the site chrome. That is a live user-facing defect, not a cosmetic one — which is what took this card from "stale prose in two blog posts" to something worth landing promptly. My dispatch-time reading was a hunch; the file layout makes it a fact.

Zone 2C — the published-history question

You 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 :335 case is a code-comment URL in an example — same reasoning.

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

Lint & Repo Gates green, read by name. ⛔ Not armed — gates not yet reported on this head. I'll arm on that reading.


Generated by Claude Code

@yinlianghui
yinlianghui marked this pull request as ready for review August 26, 2026 05:39
@yinlianghui
yinlianghui added this pull request to the merge queueAug 26, 2026
Merged via the queue into main with commit dcd9a63Aug 26, 2026
37 checks passed
@yinlianghui
yinlianghui deleted the claude/issue-12366-stale-spec-repo-name branch August 26, 2026 06:12
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/sskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

docs content: links to objectstack-ai/spec — a second stale repository name — survive in two published blog posts and in docs.site.json

2 participants

@yinlianghui@claude