Repository navigation
Commit 6a4737a
docs(skills): objectstack-data teaches relatedList placement by each value’s role, not by record-page tabs or columns (#29929)
<!-- claude-projects-attribution: {"github_login":"huangyiirene"} -->
_Requested by **Irene** · [project
thread](https://claude.ai/code/project/chan_01TJXtQ1tVD26ecLDZxFS67x?thread=cmsg_01TJXtQ1tVD26ecLDZxFS67x3m7Q5P762q9G5xUUBGiGko)_
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 #29799(#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 #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`).
<details><summary>Local gates on baa1740: 42 derived, 41 run with exit
0, 1 NOT MEASURED (`dispatch-gates --ran`)</summary>
- `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.
</details>
## Human Minimum
- [x] 1. Schemas start as Zod; `packages/spec` holds no runtime logic.
(No schema touched.)
- [x] 2. Every name I added uses the casing for its kind.
- [x] 3. No formatter ran; `pnpm lint` is CI's repo-wide run.
- [x] 4. One issue, one branch off an up-to-date `main`, one pull
request.
- [x] 5. A change that publishes carries a changeset, and both
declaration lines are filled in here and in the changeset.
- [x] 6. `packages/spec` not touched.
- [x] 7. No hand edits to `content/docs/references/`,
`packages/*/CHANGELOG.md` or `content/docs/releases/`.
- [x] 8. Title, body and comments are in English (the 维护者速读 block is the
repo's own Chinese reading aid).
🤖 Generated with [Claude Code](https://claude.com/claude-code)
https://claude.ai/code/session_01J8VVAkV4r9DLBV3JKUsdf5
---
_Generated by [Claude
Code](https://claude.ai/code/session_01J8VVAkV4r9DLBV3JKUsdf5)_
Co-authored-by: Claude <noreply@anthropic.com>1 parent cde9a80 commit 6a4737a
2 files changed
Lines changed: 17 additions & 6 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
335 | 335 | | |
336 | 336 | | |
337 | 337 | | |
338 | | - | |
339 | | - | |
340 | | - | |
341 | | - | |
342 | | - | |
343 | | - | |
| 338 | + | |
| 339 | + | |
| 340 | + | |
| 341 | + | |
| 342 | + | |
344 | 343 | | |
345 | 344 | | |
346 | 345 | | |
| |||
0 commit comments