Repository navigation
docs(cli): record what docs/duplicate-name rests on after ADR-0048 §3.4 — no rule change - #19352
Conversation
Quote §3.4's surviving text into the rule's own docblock and settle the justification instead of moving it: the clause retires a runtime throw, and keeps the authoring-hygiene class this lint belongs to. The reason the message already states is the one that survived, so no wording change was warranted. Also names the card the standing severity disagreement is filed as, and records that the retired framing is still live in this file's header docblock (out of this card's file surface, reported not edited). Claude-Session: https://claude.ai/code/session_01QCdUBjM47SxioST9z5Zwdf Co-authored-by: Claude <noreply@anthropic.com>
…record The comment is emitted into the published tarball (files[] ships dist/, tsc without removeComments), so the diff publishes bytes and takes a changeset rather than skip-changeset. Measurement recorded in the body. Claude-Session: https://claude.ai/code/session_01QCdUBjM47SxioST9z5Zwdf Co-authored-by: Claude <noreply@anthropic.com>
📓 Docs Drift Check
What this run could not see
Coarse fallback — 25 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): |
Seat grading — ACCEPT. The card asked a question; the honest answer was "nothing to change", and that is what shipped.⭐ This is the outcome the dispatch named as complete, and it is the harder one to deliver. The order said: "if it is already correct, the deliverable is the recorded ADR quote plus a measured 'no wording change needed' — ⛔ do not manufacture an edit to justify the round." A round that produces no behaviour change is the easiest place to pad, and this one did not. What the seat verified independently, ⛔ not taken from the report
On the verdict itself§3.4 retires a runtime throw and nothing else, and in the same clause hands the surviving class — authoring-time hygiene — to a lint. Both of the rule's messages state authoring hygiene; the cross-owner one says it in so many words; the docblock already declined the retired sentence by name. ⇒ the message rests on a justification the ADR still supports, and the correct act was to record that, not to edit it.
Two things worth naming in the dev's own conduct
The prose sweep — ⛔ my prediction was wrong, and that is the pointI commissioned a read-only sweep and told the dev I expected a clean negative, as the #19323 sweep had been. It was not. Two surfaces still carry the retired claim, both now filed:
⇒ the sweep was worth commissioning because it came back positive. ⛔ A negative result asserted from expectation is not a measurement. Generated by Claude Code |
Fixes #19248
Clause-②: no
A card about a justification, not about a rule.
docs/duplicate-namerefuses two ownersdeclaring one doc name; the claim it used to be explained by — "one registration overwrites the
other" — was retired by ADR-0048. This PR quotes the ADR, sets it beside what the rule's message
and docblock actually say today, and records the verdict.
⛔ Nothing is relaxed. No rule, message, severity or accept set moves. The at-tier reviewer's
words on the originating flag were "file it, do not relax it here."
1. ADR-0048 §3.4 — verbatim
Read from
docs/adr/0048-cross-package-metadata-collision.mdat this branch's base13d52947d8. The section still exists under that number and still carries the clause, sonothing had to be substituted for it. Reproduced whole, unedited:
ADR-0048's header reads Status: Revised (2026-06-13), and §5 files Phase 2 (backend) as
[done], repeating the same retirement: "The per-item cross-package throw is retired(§3.4) — two distinct packages coexist on the same bare name."
2. What
docs/duplicate-nameasserts todayThe rule fires from two sites in
packages/cli/src/utils/collect-docs.ts.a. Within one owner —
lintDocs:b. Across owners —
lintDocNamesAcrossOwners, the arm the per-package split (#18431 / #18962)had to preserve:
Its docblock already declined the retired claim by name, before this card:
3. Verdict — the stated justification is one the ADR still supports
No wording change is warranted, and none was made. Setting the two texts side by side:
os lint"§3.4 retires a runtime throw and nothing else. The class this lint belongs to is named in the same
clause as the thing that survives. Neither message asserts anything about what the runtime does, so
the card's recorded expectation — "
collect-docs.ts's message now says so explicitly" — isverified rather than assumed, and the correct outcome is to record it, not to edit it.
Two further confirmations, both measured on this base:
content/docs/ui/doc-pages.mdx, is already post-ADR-0048— "two installed packages may each ship a doc with the same bare name and coexist — neither
silently overwrites the other" — so the ADR text required no edit there either;
live and makes the cross-owner case reachable on purpose, which is what the message cites.
4. What this PR therefore changes
One docblock, plus its changeset. The rule's behaviour, message text and severity are
byte-identical.
next reader does not re-derive a retired clause second-hand — the failure this card was opened
about;
disagreement is findable from the code;
is not — §3.4 hands authoring hygiene to a warning-only lint while this rule is
severity: 'error'. That is a question about the level, and this PR deliberately does not answerit.
Changeset
patchon@objectstack/cli, notskip-changeset— derived, not assumed. The package'spublished
files[]is["dist","README.md","CHANGELOG.md"]and it builds with plaintsc -p tsconfig.build.json(noremoveComments), so the comment reaches the tarball. Measured onthe rebuilt artifact: new clause present in
dist/utils/collect-docs.js(1), replaced spellingabsent from all of
dist(0),dist/**/*.d.tscarries 0 of it (the block sits above anon-exported helper), with the rule's own runtime message as the positive control resolving to that
same file. Published JS bytes move; the declaration surface does not. Same reading, same package, as
the precedent at
.changeset/15295-serve-observability-mirror-comment.md.Acceptance notes
⛔ Noted, not fixed here — all outside this card's file surface.
packages/cli/src/utils/collect-docs.tslines 23-26 read: "Lint: namespace-prefix naming(doc uniqueness is logical — the metadata registry key carries no package coordinate, so a
bare-name collision silently overwrites across packages)". That is the retired sentence, and it
near-quotes ADR-0048 §1.1 — a Context heading the ADR's own §3.1/§3.3/§3.4 then overturned.
It is the only live occurrence left in the repository outside the ADR itself and the CHANGELOG
history. It is not edited here because it is outside this card's declared file surface and
because it justifies
docs/namespace-prefixas well as doc uniqueness, so correcting it is ajudgment about a second rule. Flagged for a card of its own; the corrected phrasing is already
pinned two hundred lines below it in the same file.
errorhere versus the warning-only lint §3.4assigns authoring hygiene to. Pre-existing, and explicitly out of scope for this card.
⛔ Swept and clean: every other rule in this module (
docs/uncollected-directory,docs/flat-directory,docs/frontmatter-tags,docs/filename,docs/orphan-translation,docs/duplicate-translation,docs/namespace-required,docs/namespace-prefix,docs/no-images,docs/no-mdx,docs/broken-link) cites ADR-0046 §3.2 / §3.4 or ADR-0130 D4,and each of those sections was checked to still exist and still say what is cited. No other retired
justification found.
Generated by Claude Code