Skip to content

docs(adr): record that the spec superseded ADR-0055 item 5's target precedence - #9377

Draft
claude[bot] wants to merge 1 commit into
mainfrom
claude/issue-9223-adr-0055-item-5-amendment
Draft

docs(adr): record that the spec superseded ADR-0055 item 5's target precedence#9377
claude[bot] wants to merge 1 commit into
mainfrom
claude/issue-9223-adr-0055-item-5-amendment

Conversation

@claude

@claude claude Bot commented Sep 13, 2026

Copy link
Copy Markdown
Contributor

Fixes #9223

Item 5 of docs/adr/0055-parameterized-bare-data-surface.md records, verbatim at :52:
「Precedence within type:'object': recordIdfiltersviewName.」 No implementation
applies 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/main 69aa9c01, in this worktree:

Claim in the note Where it was read
the rule is @objectstack/spec's objectNavTargetExclusivity packages/types/src/__tests__/nav-target-exclusivity-8563.test.ts imports it by name from @objectstack/spec/ui
spec 17.4.0 packages/types/package.json declares ^17.4.0; pnpm-lock.yaml resolves every @objectstack/spec importer to 17.4.0
objectui#8563 chains it on NavigationItemSchema packages/types/src/zod/app.zod.ts calls objectNavTargetExclusivity(item, ctx) inside the item.type === 'object' arm; .changeset/8563-nav-target-exclusivity-chained.md says so in the same words
filters refused with recordId or viewName; runAction refused with recordId the three refusal cases in nav-target-exclusivity-8563.test.ts
recordId + viewName tolerated the same file's tolerated-controls table, plus the comment beside the chain site, which calls the asymmetry deliberate

Acceptance greps, both directions

Run against the file at origin/main and at this branch's head:

Pattern before after
Amended 2026-09-13 0 1
objectNavTargetExclusivity 0 1
Precedence within (item 5's own sentence) 1 1
resolveHref (literal control) 3 3

⚠️ The dispatch predicted the resolveHref control at 1 → 1. The file carries three occurrences
(the Consumers header row, item 5, and the rejected-alternatives section), so the measured
reading is 3 → 3 — the direction the control tests, unchanged, is what holds.

git diff --stat origin/main is 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/adr is in
check-doc-links.mjs's SCAN_ROOTS (the docs row, disk rule) and is ADR_DOCS in
check-doc-snippet-types.mjs; the four .changeset/ gates apply because this diff adds one.

Command Exit
node scripts/check-doc-links.mjs 0 — "Links are valid across 17 scan roots."
node scripts/check-doc-fence-languages.mjs 0
node scripts/check-control-bytes.mjs 0 — 7539 tracked text files scanned
node scripts/check-changeset-presence.mjs 0
node scripts/check-changeset-no-major.mjs 0
node scripts/check-changeset-fixed.mjs 0
node scripts/check-changeset-overwrite.mjs 0
node scripts/check-changeset-claims.mjs 0 (report-only)
node scripts/check-new-cross-file-line-citations.mjs 0 (report-only, 0 new citations)
node scripts/check-upstream-port-parity.mjs 0
node scripts/check-doc-snippet-types.mjs 1 — main's own red, reproduced on clean main; see below

Each 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 is main's, measured rather than assumed

The 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 1
with three TS2740 failures:

  • content/docs/guide/schema-rendering.md:99:29
  • content/docs/guide/schema-rendering.md:434:29
  • packages/react/README.md:73:29

A control run settles whose red it is. A detached worktree at clean origin/main 69aa9c01 was
installed, 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 this
branch's are BYTE-IDENTICAL. So this is the red main has carried since edea22a5 (card
objectui#9346), and none of the three files is touched here.

The structural reason this diff cannot reach that gate: it judges fenced ts/tsx blocks, and
docs/adr/0055-parameterized-bare-data-surface.md holds zero code fences before this change and zero
after. The control worktree was removed after the reading.

On the changeset, measured rather than assumed

Changeset Declaration does 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.mjs exits 0 with
"No source or published contract of a released package changed in this range, so no changeset is
owed" — the guarded population is SRC of the packages in the fixed group, and docs/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

  • The card's premise holds. The precedence sentence is still at :52 on origin/main
    69aa9c01, item 5 still runs from NavigationItem.filters to the app-composition-guide
    reference, and no amendment note existed under it.
  • The published skill line is already corrected. objectui#9059's PR is docs(skills): app-composition teaches object-nav target exclusivity, not a refused precedence #9227, merged
    2026-09-12T06:24:38Z; skills/objectui/guides/app-composition.md now teaches exclusivity by
    name. Nothing in skills/** is touched here.
  • The ADR corpus had no amendment-note precedent. git grep -n -E 'Amended 20|superseded by'
    over docs/adr returns only header-level **Amends** / **Supersedes** metadata rows
    (0053:6, 0055:6, 0058:6) and one prose use in 0001:252. There is no dated in-item form to
    copy, so this note is the corpus's first instance and follows the ruling's wording.
  • No serial conflict. All 22 open pull requests were created at or before 07:58Z, before the
    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.ts still describes
    recordIdfiltersviewName → bare default」 as resolveHref's precedence. Checked and
    deliberately 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 + viewName is a pair the
    spec 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 条加了一段带日期的修订注记,说明该条写的
recordIdfiltersviewName 优先级」已被协议侧的 objectNavTargetExclusivity 取代:
filtersrecordIdviewName 同写会被拒,runActionrecordId 同写会被拒,
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:skills seat, session session_01DAcomhvR9kKizeYgg89Vo8https://claude.ai/code/session_01DAcomhvR9kKizeYgg89Vo8


Generated by Claude Code

…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>
@github-actions github-actions Bot added the documentation Improvements or additions to documentation label Sep 13, 2026
@claude

claude Bot commented Sep 13, 2026

Copy link
Copy Markdown
Contributor Author

CI reading (skills seat, 2026-09-13T08:34Z)Doc Snippet Type Check is red on head 39e2851a, and the red is main's, not this PR's: the same check has failed on every main push since edea22a5 (PR #9310, run of 2026-09-13T04:59Z), and this PR's failure signature is identical to main's latest run on 69aa9c01 — same failing step (node scripts/check-doc-snippet-types.mjs), same three TS2740 sites (content/docs/guide/schema-rendering.md:99 / :434, packages/react/README.md:73), same first error line. This PR touches docs/adr/0055-parameterized-bare-data-surface.md and a changeset only; none of the three files. The check is not in main's required set (rulesets read 2026-09-13T08:16Z). The carrying card is objectui#9346 (domain:ui, pm:blocked on objectui#9308); the fix is objectui PR #9369, in flight in the ui lane — nothing to port here, since the repair lives in the docs those three sites belong to. Under the maintainer's accepted #17934 shape (same check name and same failure signature on the merge-base does not count against 「全绿」) this PR's own face is clean; no re-run is spent on a red that reproduces on main.


Generated by Claude Code

@claude

claude Bot commented Sep 13, 2026

Copy link
Copy Markdown
Contributor Author

Contract review

Head: 39e2851a (objectui PR #9377, card objectui#9223) — read at 2026-09-13T08:37Z by the skills seat at the contract-review tier (served model claude-fable-5-1, get_session external_metadata.last_served_model at 2026-09-13T08:08Z); the build was default-tier (model: opus, docs/adr/** carries no path mandate), so this record is the compensating control.

① derived judgments — two paths, +14/−0 on merge-base 69aa9c01 = objectui origin/main (no main-side touch on the ADR). (a) The ADR's item 5 keeps its text byte-for-byte (「Precedence within type:'object': recordIdfiltersviewName.」 1 → 1) and gains, directly under it, the ruled note (director class-one ruling 5651818470, option 2): 「Amended 2026-09-13: superseded by @objectstack/spec's objectNavTargetExclusivity (17.4.0; objectui#8563 chains it on NavigationItemSchema): filters is refused with recordId or viewName, runAction with recordId; recordId + viewName is tolerated. The precedence above no longer applies.」 — the ruling's wording with the lead marker bolded to the file's register, no fact altered. Each fact re-measured on origin/main 69aa9c01: the named import at packages/types/src/__tests__/nav-target-exclusivity-8563.test.ts :45 (seat-read), the chain site inside the type === 'object' arm of NavigationItemSchema at packages/types/src/zod/app.zod.ts :188 and @objectstack/spec resolved to 17.4.0 in the lockfile (dev-read), the refusal/tolerance matrix pinned in that test. Seat greps head vs base: Amended 2026-09-13 0 → 1, objectNavTargetExclusivity 0 → 1, objectui#8563 0 → 1, 17.4.0 0 → 1; controls Precedence within 1 → 1, resolveHref 3 → 3 (the dispatch predicted 1 → 1; the file carries three occurrences — the dev measured and reported the true cardinal); 87 → 93 lines; control-character scan clean. Convention measured: the ADR corpus has no dated in-item amendment form (only header-level Amends / Supersedes rows), so this note is the first instance and follows the ruling — which the director also recorded as the general rule (#17748 item 4). The skill line half is already landed (objectui#9059 → PR #9227, MERGED 2026-09-12T06:24Z). (b) The changeset .changeset/9223-adr-0055-item-5-amendment.md is the empty-frontmatter, no-release shape; the dev measured that check-changeset-presence.mjs owes none for docs/adr/** and added it anyway because the claim named it — accepted, it cannot move a version. No accept-set or public-surface change; Clause-②: no (objectui has no carrier script; the declaration is on the claim).
② semver: decision-record prose only ⇒ no release; consistent with the empty changeset.
③ boundary flags: none raised (open_questions: []). Declared deviations accepted: the resolveHref cardinal; the changeset not owed but named; the bold lead marker; the PR-body footer settled at one platform footer with the session attribution in prose; a detached control worktree at clean origin/main used only for the doc-snippet comparison and removed. CI: Doc Snippet Type Check red is main's — the dev reproduced it byte-identically on the clean control worktree (three TS2740 sites, 649 of 649 judged, 3 failed) and this seat matched the job signature to main's latest run (note 5652245096); carried by objectui#9346. Out-of-scope note carried as the dev judged it: packages/app-shell/src/views/metadata-admin/inspectors/nav-target.ts :10 still names the old precedence for a read-side derivation the spec tolerates — not a filing class, no card.

Implemented-by: claude/issue-9223-adr-0055-item-5-amendment (mode:subagent)
Reviewed-by: session_01DAcomhvR9kKizeYgg89Vo8

Verdict: PASS. Governed surface (docs/adr/**): no gate carrier was hung (the content limb is reviewed here); the PR stays a draft for the maintainer's hand merge.


Generated by Claude Code

@claude

claude Bot commented Sep 13, 2026

Copy link
Copy Markdown
Contributor Author

维护者速读(终稿)

改了什么 —— docs/adr/0055 第 5 条原文一字不动,在它下面加一段带日期的修订注:该优先级已被 @objectstack/specobjectNavTargetExclusivity(17.4.0,objectui#8563 挂在 NavigationItemSchema 上)取代 —— filtersrecordId / viewName 互斥,runActionrecordId 互斥,recordId + viewName 容忍。另附一个空 frontmatter 的 changeset(不发版)。87 → 93 行。

为什么改 —— ADR 记着一条 schema 会当场拒绝的优先级,而 Prime Directive 13 让已接受的 ADR 持续有效;总监席今早按「协议为准」类裁了选项 2(记录取代、不改写历史、不留假规则),并把它定为此后「ADR 条目被协议取代」的通用形式(#17748 第 4 项)。技能那一半 objectui#9059 昨天已合。

风险与代价(含回滚) —— 纯决策记录散文,不动代码与 schema;ADR 语料里这是第一条条目内修订注(此前只有表头级 Amends / Supersedes)。回滚 = revert 一个 PR。

席位意见 —— 收。本席在 head 39e2851a 上亲核:新注 1、原句 1→1、对照 resolveHref 3→3;origin/main 上导入点与链接点都在;dev 侧 10 个门禁 exit 0。CI 那一红 Doc Snippet Type Check 是 main 自己的(objectui#9346,dev 在干净 main 的对照 worktree 上复现出逐字相同的三处 TS2740,本席也比对了 job 签名,见上一条读数);其余 26 绿、4 个测试分片在跑。

你要做的(一个动作) —— 受管面(docs/adr/**):分片跑完后 approve 并人工合入(或像今早那样批准后挂 auto-merge,队列只看必过集)。


Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation needs-user-decision

Projects

None yet

1 participant