Skip to content

docs(skills): objectstack-data teaches relatedList placement by each value’s role, not by record-page tabs or columns - #29929

Merged
os-zhuang merged 1 commit into
mainfrom
claude/project-thread-xwv4ux
Nov 3, 2026
Merged

os-zhuang merged 1 commit into
mainfrom
claude/project-thread-xwv4ux

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Requested by Irene · project thread

Fixes #29801

Clause-②: no
Metadata-protocol: none

Fable mandate waived by the maintainer; contract review by triage.

维护者速读

  • 改了什么:objectstack-data 技能 rules/relationships.md 里 relatedList 的三条说明不再提任何标签页或栏位:'primary' = 记录主体内容里的一张通栏表格(记录详情主体);false = 父记录页不显示该子对象;true 或不写 = 记录页上的一个辅助面板。另加一个 '@objectstack/skills': patch changeset。
  • 为什么改:PR docs(spec): relatedList describe states each value's role, not the record page's tabs #29799([Decision] spec: the relatedList describe still names the retired "Related" and "Details" tabs of the old record page — fix now, after record page v2 settles, or leave it #28888,裁决 6568787922 字母 B)已把 spec 的 relatedList describe 改成只讲各值的角色;技能还在教「Details 标签」「side card(共用 Related 标签)」,AI 照着写会把用户引向记录页上不存在的标签。
  • 风险与回滚:纯技能文本 + changeset,无代码、键、默认值改动。文件变小(3844 → 3838 tokens,上限 3873 未动),无 re-wrap。回滚即 revert。
  • 先看:skills/objectstack-data/rules/relationships.md 的 relatedList is tri-state 三条;对照 packages/spec/src/data/field.zod.ts 的 relatedList describe。
  • 两分钟验证:grep -rn "Details tab\|Related\*\* tab\|side card" skills/,预期无输出;node scripts/check-skills-token-ratchet.mjs,预期 relationships.md 3838/3873。
  • 需要你做的:Tier H 受管面(skills/**),契约复审由 triage 出具后,需要 GOVERNED_APPROVERS 的批准;PR 保持 draft。

What changes

skills/objectstack-data/rules/relationships.md, the three value bullets under "relatedList is tri-state — placement (ADR-0085)". Each now says what the merged relatedList describe in packages/spec/src/data/field.zod.ts (read at a04e9d76, L1950) says, and names no tab or column. The heading line, the "Order is the parent's" bullet below and every other line in the file are byte-identical.

Before:

- `'primary'` — main content: a full-width table in the details column after
  the first field section (in the Details tab, no tab of its own). Default for a
  `master_detail` FK with `inlineEdit`.
- `false` — hidden from the parent's page.
- `true`, or omitted (except inline-edited `master_detail`) — a side card
  (the shared **Related** tab).

After:

- `'primary'` — part of the record's main content: a full-width table in the
  record's detail body. Default for a `master_detail` FK with `inlineEdit`.
- `false` — the child object is not shown on the parent record page.
- `true`, or omitted (except inline-edited `master_detail`) — an auxiliary
  panel on the record page.

The spec describe it follows: "false = the child object is not shown on the parent record page; true/absent = shown as an auxiliary panel on the record page; 'primary' = part of the record's main content, shown as a full-width table in the record's detail body. ... The page layout is defined by ADR-0085." The ADR-0085 pointer is already on the heading line, so it is not repeated.

.changeset/29801-related-list-placement-skill.md: '@objectstack/skills': patch, with both declaration lines. @objectstack/skills (packages/skills) is in the fixed release group in .changeset/config.json and ships this catalog, so the teaching change publishes and takes a patch changeset.

Token ratchet (no ceiling row moved, no re-wrap)

file tokens before / after / ceiling lines before / after
rules/relationships.md 3844 / 3838 / 3873 (headroom 29 → 35) 414 / 413
package skills/objectstack-data (17 files) 44406 / 44400 3970 / 3969

The edit is smaller than the text it replaces, so no deletion is owed to pay for it.

Tests

  • node scripts/check-skills-token-ratchet.mjs: exit 0, rules/relationships.md is 3838 tokens (ceiling 3873; headroom 35), 57 authored bundle file(s) within their ceilings.
  • The card's done-when grep, grep -rn "Details tab\|Related\*\* tab\|side card" skills/, prints nothing at this head (exit 1).
  • No code changed, so no package test, typecheck, ablation or dogfood battery is owed (Clause-②: no, no ! in the title).

Acceptance notes

  • The code comment in the example above the bullets, relatedList: 'primary', // read side: a body table, is left as it is. It names no tab or column, the card's done-when grep does not match it, and the order scoped this card to the three bullets. If the seat wants it to read "a full-width table" too, it is a one-line follow-up in the same file.
  • The edit is made on the branch the platform fixes for this thread (claude/project-thread-xwv4ux, named in the claim 6604743289) in this container's own checkout rather than in a sibling worktree. The container is this card's alone.
  • PR docs(skills): a user field's declared deleteBehavior is taught in the data skill's field-types and relationships rules #29781 (same file, the deleteBehavior paragraph) merged before this branch was cut, so no rebase lap was owed.

Verification

Head baa17407 (one commit on a04e9d76).

Local gates on baa1740: 42 derived, 41 run with exit 0, 1 NOT MEASURED (`dispatch-gates --ran`)
  • node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derived 42 commands for the two changed files. All 42 ran in a tree with pnpm install --frozen-lockfile done and @objectstack/formula, @objectstack/lint and @objectstack/objectql built (turbo build exit 0), each with a 900 s timeout and its exit code captured before any pipe.
  • 41 exited 0, among them check-skills-token-ratchet.mjs (and its --self-test), check-adr-0087-registration.mjs --base origin/main, check-changeset-no-major.mjs, check-empty-changeset.mjs, check:changeset-gate-self-tests, check-comment-mask-corpus.mjs, check:doc-authoring, check:doc-formula-expressions, check:skill-compatibility, check:skill-frame-sync, check:skill-identifier-liveness, check:pm-skill-id-lint, check:pm-governed-merges, check:role-word, check:nul-bytes, check:dts-closure and check:lean-entry-closure.
  • pnpm check:dual-build-cjs-loads exited 3: PREREQUISITE NOT MET (Run pnpm build first. This is NOT a pass: nothing was measured.); it needs a full pnpm build. This diff touches no packages/** file; CI's Lint & Repo Gates run on the PR is its reading.
  • --ran printed: 42 derived famil(ies) accounted for — 41 run, 1 NOT-MEASURED (1 DERIVED from a recorded exit 3).
  • node scripts/check-commit-card-trailers.mjs --range origin/main..HEAD: exit 0 (one commit, no card relation, model-free trailer pair).
  • Writes: git push ×2 (the bare branch pointer, baa1740); one relay pr_create; no GitHub MCP write.

Human Minimum

  • 1. Schemas start as Zod; packages/spec holds no runtime logic. (No schema touched.)
  • 2. Every name I added uses the casing for its kind.
  • 3. No formatter ran; pnpm lint is CI's repo-wide run.
  • 4. One issue, one branch off an up-to-date main, one pull request.
  • 5. A change that publishes carries a changeset, and both declaration lines are filled in here and in the changeset.
  • 6. packages/spec not touched.
  • 7. No hand edits to content/docs/references/, packages/*/CHANGELOG.md or content/docs/releases/.
  • 8. Title, body and comments are in English (the 维护者速读 block is the repo's own Chinese reading aid).

🤖 Generated with Claude Code

https://claude.ai/code/session_01J8VVAkV4r9DLBV3JKUsdf5


Generated by Claude Code

… not by record-page tabs

The three relatedList bullets in rules/relationships.md now follow the
spec describe: 'primary' is a full-width table in the record's detail
body, false is not shown on the parent record page, true or omitted is
an auxiliary panel on the record page. No tab or column is named.

Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01J8VVAkV4r9DLBV3JKUsdf5
@objectstack-fleet objectstack-fleet Bot added the documentation Improvements or additions to documentation label Nov 3, 2026
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#1 · huangyiirene · session_01J8VVAnMUWA9rufXzFaEh4J

Contract-review-handoff: triage — CONTRACT_REVIEW_TIER unavailable (HTTP 429, 2026-11-03T13:34Z) · head baa1740

The seat's review tier has had no quota since its HTTP 429 at 2026-11-03T04:50Z. The maintainer's word, 2026-11-03: 「没有fable可以用 opus,等契约复审」. So this FULL review of a Tier H skills/** PR goes to triage. The PR is for card #29801.

What to check:

  • The bullets. The three relatedList bullets in relationships.md should match the merged describe in packages/spec/src/data/field.zod.ts (around L1950), which PR docs(spec): relatedList describe states each value's role, not the record page's tabs #29799 landed. false means not shown, true or absent means an auxiliary panel, and 'primary' means a full-width table in the record's detail body. No tab or column may be named.
  • The changeset. .changeset/29801-related-list-placement-skill.md ('@objectstack/skills': patch).
  • The ratchet. 3844 → 3838 against a ceiling of 3873. The edit is net smaller, so no payment is owed. Check that nothing was re-wrapped.
  • The gates. 42 were derived. 41 exit 0, and 1 (dual-build-cjs-loads) is NOT-MEASURED because it needs a full build.

After a PASS the PR stays a draft for GOVERNED_APPROVERS, and the seat hands it over.


Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

Contract-review-claim: session_01AavokzJ5DndAwitDXvKy4U · head baa1740 · 2026-11-03T14:17Z

Taken on the maintainer's standing word in the triage session, 2026-11-03: 「skills#1 转来的都接」. This is an exception to #29667 for domain:skills#1's handoffs while that seat's tier answers 429; this one is handoff 6605225785.


Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: baa174075628c9cfda847c6e28a78b37d29f7b04
Local-runs: none
Scope: skills/objectstack-data/rules/relationships.md + .changeset/29801-related-list-placement-skill.md, packages/spec/src/data/field.zod.ts (:1925-1950, head and origin/main), docs/adr/0085-object-semantic-roles-over-surface-hint-blocks.md (:66-82), scripts/check-skills-token-ratchet.mjs (:714, :1518), .changeset/config.json, packages/skills/package.json, skills/objectstack-ui/rules/record-page.md (:17-27), skills/objectstack-ui/evals/record-page.json (:7), commit b4a9d047bf (PR #29781)

Taken by triage on the maintainer's word 「skills#1 转来的都接」 (exception to #29667; handoff 6605225785).

① Derived judgments

  • Right. 'primary' bullet (relationships.md:338-339) "part of the record's main content: a full-width table in the record's detail body" matches the merged describe at field.zod.ts:1950 ("'primary' = part of the record's main content, shown as a full-width table in the record's detail body"). The describe is identical on origin/main and the head. PR docs(spec): relatedList describe states each value's role, not the record page's tabs #29799's merge commit 138dacf6ce is an ancestor of the head.
  • Right. The bullet keeps "Default for a master_detail FK with inlineEdit". This matches field.zod.ts:1950 ("Absent on a master_detail field that sets inlineEdit, the list is 'primary' by default") and the JSDoc at :1934-1937.
  • Right. false bullet (:340) "the child object is not shown on the parent record page" is the describe's wording, verbatim.
  • Right. true/omitted bullet (:341-342) "an auxiliary panel on the record page" matches "true/absent = shown as an auxiliary panel on the record page". The "(except inline-edited master_detail)" carve-out matches "write true to keep it an auxiliary panel".
  • Right. The card asks for "layout per ADR-0085". The heading at :336 already says "placement (ADR-0085)", and the JSDoc at field.zod.ts:1931-1932 says the same ("How the record page lays these out is ADR-0085's to define").
  • Right. The bullets name no tab or column. The card's grep git grep -n -E "Details tab|Related\*\* tab|side card" prr-29929 -- skills/ returns nothing (exit 1).
  • Right. PR body: "every other line byte-identical". The net diff is one hunk at :335-345 (+5/-6), and the lines go from 414 to 413.
  • Right. PR body: "PR docs(skills): a user field's declared deleteBehavior is taught in the data skill's field-types and relationships rules #29781 merged before this branch was cut". b4a9d047bf is an ancestor of the head. Its added user-field deleteBehavior sentence is intact at relationships.md:175-181 ("…keeps the deleted user's id", :179). origin/main moved 4 commits past the merge base a04e9d76, and none touches skills/. GitHub reports mergeable_state: clean.
  • Not re-measured (Local-runs: none). PR body: "3844 → 3838 tokens, ceiling 3873". The CEILINGS row ['skills/objectstack-data/rules/relationships.md', 3873] at scripts/check-skills-token-ratchet.mjs:714 is unmoved; the diff touches no scripts/ file. The self-test fixture at :1518 uses the path only, with a synthetic count of 3778, not the file's content. Lint & Repo Gates passed on the head and is the token reading.

② Semver level

  • .changeset/29801-related-list-placement-skill.md: '@objectstack/skills': patch. @objectstack/skills is in the fixed group of .changeset/config.json. packages/skills/package.json describes it as "the repository's skills/** tree", so a teaching-text change publishes, and patch is the right level. There is no ! in the title, no other package, and no major bump.
  • Clause-② line: Clause-②: no and Metadata-protocol: none appear in both the PR body and the changeset. This is correct: no schema, key, default or runtime behaviour changes, and packages/spec is untouched.

③ Boundary flags

  • PR author: objectstack-fleet[bot] (attribution huangyiirene). Draft: true, as the claim requires for Tier H.
  • Dev's open item: the code comment // read side: a body table (relationships.md:327) was left alone. Answered: it names no tab or column, the grep does not match it, and it agrees with the describe. Nothing is owed.
  • Fable mandate (clause ①) waived by the maintainer (claim comment, 「没有fable可以用 opus,等契约复审」). This record is that contract review.
  • Session IDs differ. The commit trailer and PR footer carry session_01J8VVAkV4r9DLBV3JKUsdf5, while the claim names session_01J8VVAnMUWA9rufXzFaEh4J. This looks like the dev session versus the seat session. The commit-trailer gate passed (PR-body guards and repo gates green). Noted, not escalated.
  • Out-of-scope note, not owed by this card: skills/objectstack-ui/rules/record-page.md:17-21 describes the rendered layout as "related column", "body table in the details after the first field section" and "a panel in the right column". The eval at skills/objectstack-ui/evals/record-page.json:7 does the same. These are the UI skill's ADR-0085 layout teaching (the rendering side that relationships.md:356 points to), not the data skill's relatedList contract. The card's grep does not match them and they do not contradict the new bullets. If the seat wants the two skills worded alike, it would need its own card.

④ Design judgment

  • skills/objectstack-data/rules/relationships.md: holds. The card's scenario is an agent that loads objectstack-data and then explains a tab or side card the record page does not draw. After this change the agent reads the role-only wording of field.zod.ts:1950: body table, auxiliary panel, or not shown. The default stays tied to master_detail + inlineEdit, and order stays with the parent's relatedLists (:343).
  • Attempts to break it:
    • The three values are still exhaustive for z.union([z.boolean(), z.literal('primary')]).optional().
    • The omitted case is still split correctly between inline-edited master_detail ('primary') and everything else (panel).
    • No stale "own tab" or "Details tab" text survives anywhere in skills/.
    • The neighbouring prose (:315-319, :350-357) names no tab.
    • No ceiling was raised to pay for the change.
  • No must-fix. No should-fix.

Check-runs at record time: 46 total: 29 success, 17 skipped (Lint UI, Build & E2E UI, Type Check UI, Test UI matrix, UI Published Artifacts, Temporal Conformance, Dogfood Regression Gate matrix, Dogfood Verify CLI, Build Docs, Build UI Deps, Schedule gate, Auto Label, 18.x upgrade harness ×2, Check PR Size, Packed-tarball smoke ×2). 0 failure, 0 pending.

Implemented-by: claude/project-thread-xwv4ux
Reviewed-by: session_01AavokzJ5DndAwitDXvKy4U

VERDICT: PASS


Generated by Claude Code


Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#1 · huangyiirene · session_01J8VVAnMUWA9rufXzFaEh4J

维护者速读

席位核对 — ACCEPT · domain:skills#1 · head baa174075628c9cfda847c6e28a78b37d29f7b04

  1. 形态: draft → main,Fixes #29801;作者 objectstack-fleet[bot];文件在认领面内,附 @objectstack/skills patch changeset(⛔ 不挂 skip-changeset)。
  2. 前提实测: 复核记录逐条对过合并后的代码;本席核对复核结论与 PR 正文一致。
  3. 门禁(钉 head baa17407): check-runs skipped 17 / success 29,无失败。派生门禁见 PR 正文。
  4. 接受的偏差: 开发在 Opus 上进行、契约复核由分诊代审,均依维护者原话。
  5. 范围外去向: 无。
  6. 落地条款: Tier H。保持 draft,挂 needs-user-decision,请 os-zhuang、hotlong 审批;获批后本席过落地前检、清标、ready、auto-merge;维护者直合亦可。

Generated by Claude Code

@os-zhuang
os-zhuang marked this pull request as ready for review November 3, 2026 16:05
@os-zhuang
os-zhuang added this pull request to the merge queue Nov 3, 2026
Merged via the queue into main with commit 6a4737a Nov 3, 2026
52 checks passed
@os-zhuang
os-zhuang deleted the claude/project-thread-xwv4ux branch November 3, 2026 16:31
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 size/s tooling

Projects

None yet

2 participants