Repository navigation
docs: name the canonical docs host in the governed protection examples - #11194
Merged
Merged
Conversation
The maintainer ruled on 2026-08-21 that this repo's canonical docs-site URL is https://objectstack.ai. Four `protection.docsUrl` occurrences on governed surfaces still carried the `docs.objectstack.ai` spelling. All four are the same literal, and the host was only half the defect: the `/adr/0010-metadata-protection` path is not a route on any host (the docs site mounts `content/docs` under `/docs`, and `docs/adr/` is not published). They now match the literal that landed in source: the published reference for the very schema that carries the field. - skills/objectstack-data/SKILL.md (3) — the propagating surface; the published skill teaches AI authors what to write into a `protection` block, so a dead URL travels outward into codebases this repo cannot see. - docs/adr/0010-metadata-protection-model.md (1) — a verbatim quotation of the `packages/spec/src/shared/protection.zod.ts` example; the docsUrl line was the block's only divergence from the source it quotes. docs/adr/0046-package-docs-as-metadata.md:85 is deliberately left alone: it names the host in a Non-goals bullet recording a scope boundary, not as a link. Prime Directive #13 — an accepted ADR is not silently reworded. Byte-neutral: both literals are 56 bytes, so SKILL.md stays at 55265 bytes and the skills token ratchet stays at 13817/13817. Co-Authored-By: Claude <noreply@anthropic.com>
Contributor
|
ACCEPT — session 全量 diff 复核:2 文件 4 行,全部是同一
门禁 15/15 绿、GOVERNED 判定已引用(2/2 命中)、skip-changeset 已读回。dev 声明的一处偏离(签名脚采用会话 URL 形式以在后续编辑中存活)采纳。留 draft、已 assign 维护者——合并即收。 Generated by Claude Code |
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.
Fixes #10656
Maintainer ruling, 2026-08-21, verbatim and untranslated:
Re-measurement vs the card
Re-grepped the whole tree for
docs.objectstack.aiat my HEAD and worked from that, notfrom the card's line numbers. The card's counts hold exactly — 5 occurrences across 3
governed paths, no drift, despite the data SKILL.md having been edited since the card was
filed. Only the SKILL.md line numbers moved (the card gave none for that file).
skills/objectstack-data/SKILL.mddocs/adr/0010-metadata-protection-model.md:565):565)docs/adr/0046-package-docs-as-metadata.md:85):85)No other governed surface (
docs/adr/**,.claude/**,skills/**,AGENTS.md,CLAUDE.md) carries the spelling. The remaining tree hits are all outside the register —CHANGELOG.mdhistory, the three landed.changeset/entries that describe this veryconvergence, and
scripts/check-published-readme-links.mjs, which must keep naming thealias because it is the detector that classifies it.
The host was only half the defect
All four fixed occurrences are the same literal, and a pure host swap would have left
a dead URL behind. The landed changeset
canonical-docs-host-in-runtime-strings.mdstatesthe finding in full:
So the correct target is not a guess — it is pinned three ways by work that has already
landed: the 29 platform sources, the
packages/spec/src/shared/protection.zod.tsdocblockexample, and the changeset's own reasoning. Every changed line becomes:
Diff discipline held: 4 changed lines, each containing
docs.objectstack.aibefore andobjectstack.aiafter. No prose reworded, no reflowing, no drive-by fixes.Per-site disposition
1.
skills/objectstack-data/SKILL.md×3 — fixed (the propagating surface)Three
protectionblocks in worked examples (sys_user,sys_role,setup.app) thatmirror three real platform files, all three of which already landed on the canonical
literal. This is the surface that travels: the published skill catalog lands in codebases
this repo cannot see, so the skill teaching
/adr/0010-metadata-protectionwould keepminting a 404 into AI-authored
protectionblocks long after the source was fixed.2.
docs/adr/0010-metadata-protection-model.md:565— fixed (a stale quotation)The card flagged this as possibly quoting the code that #10655 covered. It is: the fenced
tsblock at §Phase 4.3 is a verbatim quotation of theSETUP_APPexample inpackages/spec/src/shared/protection.zod.ts. Diffing the two blocks, thedocsUrlline wastheir only divergence — every other byte matched. #10655 closed 2026-08-21T23:57, so the
card's own condition ("it should move with the code, not ahead of it") is satisfied, and
this one line now restores byte-identity with the source it quotes.
This is not a rewording under PD #13: the recorded decision (a
protectionblock carryingdocsUrl) is untouched. Only the illustration was stale, and a stale quotation makes theADR misdocument its own implementation.
3.
docs/adr/0046-package-docs-as-metadata.md:85— KEPT UNCHANGEDThe card suspected this one describes a past state deliberately. Reading the surrounding
section confirms it. The line sits in §2 Goals & Non-goals → Non-goals:
Two reasons to leave it:
It is not a URL. No scheme, no markdown link, no autolink — the hostname is an
identifying parenthetical whose job is to say which category of thing is out of scope
for
docmetadata. Nobody follows it or copies it. The ruling governs the canonical docsURL; this is not one.
It is decision prose. A Non-goals bullet is the ADR's recorded scope boundary, dated
2026-06-12 — more than two months before the canonical ruling. Prime Directive [WIP] Add Chinese version of the documentation #13:
Editing the sentence would be silently rewording a decision record for zero user-facing
effect. The reference also remains unambiguous: the alias still redirects to the apex
path-preservingly, per the landed changeset.
If the maintainer would rather this line track the canonical spelling too, that is an ADR
amendment and belongs in its own change — not smuggled in under a link fix.
Token budget —
skills/**readingsThe dispatch requires both readings for any
skills/**diff, and this file sits undercheck:skills-token-ratchetat ceiling 13817 with zero headroom.The change is exactly byte-neutral — the two literals are both 56 bytes, so nothing was
spent and nothing was reclaimed:
skills/objectstack-data/SKILL.md(lines)skills/objectstack-data/SKILL.md(bytes)skills/objectstack-data/SKILL.md(tokens)SKILL.md(bytes)No prose was deleted to pay for anything, and no ceiling was raised (maintainer-only).
Gates
Derived with
node scripts/pm/dispatch-gates.mjs(no path arguments — it takes its ownchange set from the merge base), then run. Union re-run on the final commit
a85daa8742;all green:
check-skills-token-ratchet✓ check-skills-token-ratchet: 11 published SKILL.md within their ceilings.(objectstack-data13817 / 13817 (+0))check-skills-token-ratchet --self-test✓ check-skills-token-ratchet self-test: 33 cases pass.check-adr-links✅ check-adr-links: 551 relative link destination(s) under docs/adr/ resolvecheck-adr-anchors(+ self-test)✓ check-adr-anchors --self-test: 74 assertions…check-doc-authoring(+ self-test)✓ doc authoring guard: 389 files clean — no bare metadata literals.check:doc-formula-expressions(+ self-test)✓ check:doc-formula-expressions: 22 record-scoped formula example(s) across 416 files / 1447 TS blocks judged cleancheck-role-word(+ self-test)check-role-word: OK, no new occurrences of the reserved word.check-skill-frame-sync(+ self-test)✓ check-skill-frame-sync: 4 copies of the decision frame are structurally isomorphic across 3 filescheck-skill-compatibility-version(+ self-test)✓ check-skill-compatibility-version: 11 SKILL.md file(s) reconciled against 78 workspace packagescheck:pm-governed-merges✓ check-governed-merges --self-test: 119 assertions…check-nul-bytescheck-nul-bytes: OK (scanned 6487 text file(s) … no raw ASCII control bytes).Governed verdict on the final file list
node scripts/pm/check-governed-merges.mjs --test docs/adr/0010-metadata-protection-model.md skills/objectstack-data/SKILL.mdThis PR stays a draft and is merged by the maintainer by hand. Not flipped ready, not
enqueued, no auto-merge. Assigned to
os-zhuangfor review (review-request fails on aself-authored PR).
Changeset
None, by the changeset gate's own prescription.
pr-automation.ymllists the paths thatrelease nothing —
.github/,.claude/,skills/,docs/,content/— and itserror text says such a PR takes the label rather than a file:
skills/is not a workspace member and no package'sfilesfield ships it, so nothing herepublishes. The
skip-changesetlabel is applied additively (POST, never a wholesale PUT)and read back — the size labeler's PUT is documented to race it away.
Generated by Claude Code