Repository navigation
docs(adr): annotate ADR-0046 §3.2's retired overwrite premise - #19702
Conversation
§3.2 states that the metadata registry key carries no package coordinate, so two packages shipping the same bare doc name silently overwrite each other (last-write-wins). ADR-0048 retired that: its §1.2 measured the write as already composite-keyed, §3.4 retires the cross-package throw, and §3.3 repairs the residual context-free read. ADR-0046 carried no annotation of that supersession, so the passage still reads as current and has regenerated into downstream copies. The dated record is annotated, not rewritten: the status line gains a one-line supersession clause and §3.2 closes with a note in the file's own amendment style pointing at ADR-0048. §3.2's own text, and the build/publish lint it prescribes, are untouched — the lint rests on authoring hygiene and the flat link namespace, which ADR-0048 keeps. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Wnstp2kTth7sGXfr8fXypc
Contract reviewServed-tier: ① Derived judgmentsRendered in-seat by the skills seat 1 session at the served tier the maintainer named on this date (the fable tier word at
② Semver levelNone — no release. ③ Boundary flags
Implemented-by: VERDICT: PASS Generated by Claude Code |
Fixes #19408
维护者速读(草稿)
改了什么 — 给 ADR-0046 加了一条超越注记,没有改写它的正文。状态行后面多一行:说明 §3.2 的「同名文档互相覆盖」前提已被 ADR-0048 取代;§3.2 末尾多一段引用块(本文件自己的 amendment 体例),指向 ADR-0048 的 §1.2 / §3.4 / §3.3。共 +8 行,只动这一个文件,§3.2 原文一字未动。
为什么改 — §3.2 那句「注册表键是 org/type/name,没有包坐标,所以两个包发同名文档会静默互相覆盖(last-write-wins)」是前提加结论的一整条推理,ADR-0048 已把它推翻:写入侧本来就是复合键(§1.2),§3.4 退役了跨包抛错,真正的残留是读侧的无上下文首个匹配,由 §3.3 的包内优先解析修掉。这段话已经繁殖出两处下游文案(#19359 的
collect-docs.ts头注释、#19358 的skills/objectstack-ui/rules/pages.md),两处都已在main上改正、卡也已关闭;源头不注记,它还能长出第三处。风险与代价(含回滚) — 纯文档改动:不发布任何包(70 个带
files[]的 package.json 里零条目涉及docs/adr,docs/adr也不在任何包根之内),不改行为,不改门禁,19 个派生门禁族全绿。唯一的判断风险在措辞:注记声称「§3.2 规定的 build/publish lint 仍然成立,只是它依据的理由换了 —— 靠的是作者侧卫生和扁平链接命名空间,不是覆盖」,这与已落地的collect-docs.ts更正读法一致。回滚 = revert 本 PR 的单个 commit,ADR 回到未注记状态,无其它后果。席位意见 —— 技能席 1(
session_01Wnstp2kTth7sGXfr8fXypc)已按 GitHub 与拉取的 head0cba6186d复核:一个文件 +8/−0;第 3 行(带日期的状态行)逐字节未动,第 4 行追加的 superseded 子句 96 字符,§3.2 末尾六行引用块每行 78–87 字符;注记对 ADR-0048 §1.2 / §3.4 / §3.3 的四处引用本席逐一在 ADR-0048 原文核对无误,末句与origin/main上collect-docs.ts(#19359)已落地的读法一致;被退役的原句仍在文件中出现恰好一次——是注记,不是改写,正是卡上Path:行与车道评级 5752868774 认可的形式。体例在树内有先例(ADR-0012 状态行的内联· **Superseded by …**、ADR-0053 的「Partly superseded」、本文件 §6.7 自己的 amendment 引用块)。本席在独立 worktree 复跑 ADR 链接 / 锚点 / doc-authoring / nul-bytes 等七个门禁均 exit 0;check-governed-merges --pr 19702读 GOVERNED、Tier H(docs/adr/**);CI 31 项全绿。复核记录 PASS 5774341677(席内 fable),ACCEPT 5774422000 在卡上。建议合并。卡上那张下游表已过时但方向对本卡有利:两处下游副本都已在main修正并关卡,本 ADR 是该退役论断的最后一个载体。你要做的 — 先判断卡片 First act 的那个治理问题:一段已被取代的文字,该不该在既有的日期记录里加注记。认可就合并(
docs/adr/**是 Tier H,由你的手落地);若你认为 ADR 是不可改写的日期记录、ADR-0048 存在本身已经够了,那就关掉这个 PR 并把该裁决记在卡上 —— 按卡片自己的说法,那同样是一个完整结果,不是失败。What changed
Two additions to
docs/adr/0046-package-docs-as-metadata.md, +8 physical lines, nothing removed:Status line (line 4) — one appended clause. The dated line 3 is byte-identical to what it was; the clause continues the same header paragraph, the way ADR-0048's own status line wraps across three physical lines:
· **Superseded in part (2026-06-13, ADR-0048)** — the bare-name overwrite premise; note at §3.2.A note closing §3.2 (lines 159-164) — a blockquote in the file's own amendment style, naming what §3.2 claimed, what retired it, and where the current truth lives:
§3.2's own text — the claim, the lint it prescribes, the bullet list — is untouched. This is the form Prime Directive #13 names ("a new ADR, or an amended status line on the old one") and the form the lane's grading named: an amended status line plus a one-line pointer at §3.2, ⛔ not a rewrite of a dated record.
The form, measured rather than assumed
§6.7(> **Amendment (…)**.), plus a second blockquote emphasis block in §4. The note here is that shape. It is not ADR-0090's[ruled]form, because this file has its own.### 3.3. Every section reference inside it is spelled "its §N" so it reads against ADR-0048, never against ADR-0046's own §3.3 that follows two lines later.git diff --stat:1 file changed, 8 insertions(+), against a ceiling of +8.Gates
Derived, not recalled:
node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands(no paths) at0cba6186d— 19 families, all run, exit captured before any pipe.node scripts/check-adr-links.mjs(+--self-test)check-adr-links: 690 relative link destination(s) under docs/adr/ resolvenode scripts/check-adr-symbol-anchors.mjs(+--self-test)2121 anchors across 140 records resolvepnpm check:adr-anchors106 assertions over the real auditAdrDirectory() / auditCitedNumbers() / assembleAnchors() pathspnpm check:doc-authoring44 published skill files clean;16120 customer-facing string(s) across 1031 spec sources cleanpnpm check:nul-bytesOK (scanned 9205 text file(s) … no raw ASCII control bytes)pnpm check:pm-governed-mergespnpm check:pm-prior-rulings155 cases passpnpm --filter @objectstack/lint run check:doc-formula-expressions@objectstack/formula/@objectstack/lint), i.e. NOT MEASURED, not a finding; re-run 0 afterturbo run build --filter=@objectstack/formula --filter=@objectstack/lintcheck-ci-filter-parity,check-closing-keyword-parity×2,check-comment-mask-corpus,check:cross-package-test-inputs,check:driver-memory-census,check:gitlink-declared,check:refd-timer-probe,check:watch-hint-literal)Reconciled:
dispatch-gates --ran→19 derived famil(ies) accounted for — 19 run, 0 NOT-MEASURED (a DERIVED zero — all 19 recorded an exit code and none of them is 3).Also swept by hand, outside the gate:
grep -naP '[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]'over the edited file — no match.skip-changeset: measured, not assumed. 70package.jsonfiles declarefiles[]; 0 entries namedocs/adror escape their package root, and 0 package roots containdocs/adr. The diff ships in no tarball.Governed-merge reading on this PR is reported in the card's
os-dev-reportcomment (check-governed-merges.mjs --pr): Tier H, the maintainer's merge. The PR stays draft.Acceptance notes
packages/cli/src/utils/collect-docs.ts([finding] collect-docs.ts's module header states the retired ADR-0048 claim as the live justification — the same file declines that sentence 900 lines below #19359) as repaired andskills/objectstack-ui/rules/pages.md([finding] a published skill teaches the ADR-0048 claim ADR-0048 retired — and cites ADR-0048 as its authority #19358) as open. On7e1b048a1dboth are repaired and both cards are closed as completed:collect-docs.ts:38-44now declines the sentence by name, andpages.md:340-341reads "hygiene, not uniqueness: two packages coexist on one bare name (ADR-0048 §3.4)". So this ADR is the last carrier of the retired claim in the tree, not one of three. Observation only — no card.Proposed. Whether that line should also move is a separate governance question this PR deliberately does not answer.Generated by Claude Code
Generated by Claude Code