docs(adr): record that the spec superseded ADR-0055 item 5's target precedence - #9377
docs(adr): record that the spec superseded ADR-0055 item 5's target precedence#9377claude[bot] wants to merge 1 commit into
Conversation
…recedence Item 5 of `docs/adr/0055-parameterized-bare-data-surface.md` states "Precedence within `type:'object'`: `recordId` -> `filters` -> `viewName`". No implementation applies that precedence, and since objectui#8563 this repository's own door refuses the shape it teaches: `NavigationItemSchema` chains `@objectstack/spec`'s `objectNavTargetExclusivity` (spec 17.4.0, `packages/types/src/zod/app.zod.ts`), which refuses `filters` with `recordId` or `viewName`, and `runAction` with `recordId`, while tolerating `recordId` + `viewName`. An accepted ADR binds until something supersedes it, so the item was still in force as a false rule. Add a dated amendment note as its own paragraph under item 5. The item's own text is kept byte-for-byte: the ADR records what was decided in 2026-07, and the note records that the protocol has since decided otherwise. Rewriting the item would erase the history; leaving it alone would leave a binding rule the platform refuses. The diff is six added lines and no deleted line. The ADR corpus had no prior dated amendment-note form (only the header-level `Amends` / `Supersedes` metadata rows), so this note follows the wording the decision record carries rather than a house precedent. Decision-record prose only; empty-frontmatter changeset declares no release. Claude-Session: https://claude.ai/code/session_01DAcomhvR9kKizeYgg89Vo8 Co-authored-by: Claude <noreply@anthropic.com>
|
CI reading (skills seat, 2026-09-13T08:34Z) — Generated by Claude Code |
Contract reviewHead: ① derived judgments — two paths, +14/−0 on merge-base Implemented-by: claude/issue-9223-adr-0055-item-5-amendment (mode:subagent) Verdict: PASS. Governed surface ( Generated by Claude Code |
维护者速读(终稿)改了什么 —— 为什么改 —— ADR 记着一条 schema 会当场拒绝的优先级,而 Prime Directive 13 让已接受的 ADR 持续有效;总监席今早按「协议为准」类裁了选项 2(记录取代、不改写历史、不留假规则),并把它定为此后「ADR 条目被协议取代」的通用形式(#17748 第 4 项)。技能那一半 objectui#9059 昨天已合。 风险与代价(含回滚) —— 纯决策记录散文,不动代码与 schema;ADR 语料里这是第一条条目内修订注(此前只有表头级 Amends / Supersedes)。回滚 = revert 一个 PR。 席位意见 —— 收。本席在 head 你要做的(一个动作) —— 受管面( Generated by Claude Code |
Fixes #9223
Item 5 of
docs/adr/0055-parameterized-bare-data-surface.mdrecords, verbatim at:52:「Precedence within
type:'object':recordId→filters→viewName.」 No implementationapplies that ordering as an authoring rule, and since objectui#8563 this repository's own door
refuses the shape the sentence teaches. An accepted ADR binds until something supersedes it, so
the item was still in force as a false rule.
This pull request adds a dated amendment note under item 5 and changes nothing else. Item 5's own
text is kept byte-for-byte: the diff is six added lines and zero deleted lines.
The ruling this implements
Director-seat class-one adjudication, comment 5651818470 on objectui#9223 (2026-09-13), option 2 of
the three the card put up: the item keeps its text and gains a dated amendment note. Option 1
(rewrite item 5) and option 3 (leave it) are closed by that ruling. The note carries the ruled
content; the only adjustment is register — the lead marker is bolded to match the file's own
bold lead-ins, and no fact is altered.
What the note asserts, and where each fact was measured
Measured on
origin/main69aa9c01, in this worktree:@objectstack/spec'sobjectNavTargetExclusivitypackages/types/src/__tests__/nav-target-exclusivity-8563.test.tsimports it by name from@objectstack/spec/ui17.4.0packages/types/package.jsondeclares^17.4.0;pnpm-lock.yamlresolves every@objectstack/specimporter to17.4.0NavigationItemSchemapackages/types/src/zod/app.zod.tscallsobjectNavTargetExclusivity(item, ctx)inside theitem.type === 'object'arm;.changeset/8563-nav-target-exclusivity-chained.mdsays so in the same wordsfiltersrefused withrecordIdorviewName;runActionrefused withrecordIdnav-target-exclusivity-8563.test.tsrecordId+viewNametoleratedAcceptance greps, both directions
Run against the file at
origin/mainand at this branch's head:Amended 2026-09-13objectNavTargetExclusivityPrecedence within(item 5's own sentence)resolveHref(literal control)resolveHrefcontrol at 1 → 1. The file carries three occurrences(the
Consumersheader row, item 5, and the rejected-alternatives section), so the measuredreading is 3 → 3 — the direction the control tests, unchanged, is what holds.
git diff --stat origin/mainis exactly two paths: the ADR (+6 −0) and the changeset (+8 −0), 14 insertions and 0 deletions in total.Gates run locally, with exit codes
Derived from this repository's own scan surfaces rather than from a list:
docs/adris incheck-doc-links.mjs'sSCAN_ROOTS(thedocsrow,diskrule) and isADR_DOCSincheck-doc-snippet-types.mjs; the four.changeset/gates apply because this diff adds one.node scripts/check-doc-links.mjsnode scripts/check-doc-fence-languages.mjsnode scripts/check-control-bytes.mjsnode scripts/check-changeset-presence.mjsnode scripts/check-changeset-no-major.mjsnode scripts/check-changeset-fixed.mjsnode scripts/check-changeset-overwrite.mjsnode scripts/check-changeset-claims.mjsnode scripts/check-new-cross-file-line-citations.mjsnode scripts/check-upstream-port-parity.mjsnode scripts/check-doc-snippet-types.mjsmain's own red, reproduced on cleanmain; see belowEach exit code was captured directly from the command, with output redirected to a file first —
never read through a pipe.
Doc Snippet Type Check— the red ismain's, measured rather than assumedThe gate first exited 2, which is its own PRECONDITION NOT MET ("I could not run", explicitly not a
verdict). After the scoped build it names (
turbo run build $(node scripts/check-doc-snippet-types.mjs --build-filter) --concurrency=2, 35 tasks, run under this container's shared verify lock), it exits 1with three
TS2740failures:content/docs/guide/schema-rendering.md:99:29content/docs/guide/schema-rendering.md:434:29packages/react/README.md:73:29A control run settles whose red it is. A detached worktree at clean
origin/main69aa9c01wasinstalled, built through the same filter and run through the same gate: exit 1, the same three sites,
the same
649 of 649 block(s) judged, 3 failed. Path-normalized, the control's output and thisbranch's are BYTE-IDENTICAL. So this is the red
mainhas carried sinceedea22a5(cardobjectui#9346), and none of the three files is touched here.
The structural reason this diff cannot reach that gate: it judges fenced
ts/tsxblocks, anddocs/adr/0055-parameterized-bare-data-surface.mdholds zero code fences before this change and zeroafter. The control worktree was removed after the reading.
On the changeset, measured rather than assumed
Changeset Declarationdoes NOT owe a declaration for this diff, and the gate says so itself:with the ADR edit alone in the tree,
node scripts/check-changeset-presence.mjsexits 0 with"No source or published contract of a released package changed in this range, so no changeset is
owed" — the guarded population is
SRCof the packages in thefixedgroup, anddocs/adr/**is in none of them. The declaration is added anyway, in the empty-frontmatter "declare once, no
release" shape this repository treats as a first-class pass (AGENTS.md §7, and the shape PR #9374
used), because the dispatch and the claim comment both name it as part of this change's file
surface. It cannot move a version: the frontmatter lists no package.
Premise checks
:52onorigin/main69aa9c01, item 5 still runs fromNavigationItem.filtersto the app-composition-guidereference, and no amendment note existed under it.
2026-09-12T06:24:38Z;
skills/objectui/guides/app-composition.mdnow teaches exclusivity byname. Nothing in
skills/**is touched here.git grep -n -E 'Amended 20|superseded by'over
docs/adrreturns only header-level**Amends**/**Supersedes**metadata rows(
0053:6,0055:6,0058:6) and one prose use in0001:252. There is no dated in-item form tocopy, so this note is the corpus's first instance and follows the ruling's wording.
dispatch's 08:16Z reading, and none touches this ADR.
Acceptance notes
Out of scope here, noted rather than filed:
packages/app-shell/src/views/metadata-admin/inspectors/nav-target.tsstill describes「
recordId→filters→viewName→ bare default」 asresolveHref's precedence. Checked anddeliberately not filed: that is a READ-side derivation over an already-valid item, the inspector
clears the sibling target fields when the mode changes, and
recordId+viewNameis a pair thespec tolerates — so a precedence to resolve it is exactly what that layer still needs. It does not
lead an author to write refused metadata. Carrier: none needed; nothing is owed.
维护者速读(草稿)
改了什么。 给
docs/adr/0055的第 5 条加了一段带日期的修订注记,说明该条写的「
recordId→filters→viewName优先级」已被协议侧的objectNavTargetExclusivity取代:filters与recordId或viewName同写会被拒,runAction与recordId同写会被拒,recordId+viewName仍被容忍。第 5 条原文一个字节都没动,diff 是 6 行纯新增。另附一个空 frontmatter 的 changeset,声明本次不发版。
为什么改。 一份已接受的 ADR 在被取代之前一直有约束力,所以那句优先级不是过期散文,
而是一条仍在生效的假规则:照它写导航项的人,会被本仓的
NavigationItemSchema.safeParse当场拒掉。方向没有争议(协议优先),有争议的只是记录形式,而形式已由总监席位裁定为「留原文 + 加注」。
风险与代价(含回滚)。 只动决策记录散文,不动任何契约、代码或发布面,本次发布量为零。
代价是 ADR 正文从此不是「当下规则」的唯一读法 —— 读者必须连注记一起读;这正是保留历史的价钱。
回滚就是 revert 这一个 commit,没有任何迁移。
席位意见。
你要做的。 这是受管面(
docs/adr/**),按规程停在 draft:请你确认注记的措辞与日期,然后由你合并。⛔ 本席不翻 ready、不入队、不批准。
另有一件值得你顺带拍板的:总监席位把这条裁决同时记成了「ADR 条目被协议取代」的通则
(objectstack#17748 item 4),本 PR 是它的第一个实例 —— 如果你认为通则的记录形式该长成别的样子,
现在改的成本最低。
Drafted by the
domain:skillsseat, sessionsession_01DAcomhvR9kKizeYgg89Vo8— https://claude.ai/code/session_01DAcomhvR9kKizeYgg89Vo8Generated by Claude Code