Skip to content

Commit 7bafab3

Browse files
docs(skills): objectstack-ui says placedActions is drawn, with an eval (#29951) (#30127)
<!-- claude-projects-attribution: {"github_login":"os-support-ai"} --> _Requested by **Yibo Wang** · [project thread](https://claude.ai/code/project/chan_01BVUyyPie8gHwoPM18iABwB?thread=cmsg_01BVUyyPie8gHwoPM18iABwB4xjiquevJqfBXiUoqfQwa1)_ Refs #29951 ## 维护者速读 - 改了什么:`objectstack-ui` 技能的 `rules/pages.md` 里,`page:header` 那一行去掉了 `placedActions: true` 的“not drawn yet”限定语;`evals/record-page.json` 新增一个评测,考 `placedActions: true` 的用法。 - 为什么改:#29951 的 ui 半边(#30097,已合并)让控制台页头真正读这个键了,#30028 当时写下的限定语和“等渲染器落地再补评测”的说明到这里兑现。 - 风险与回滚:只改技能文本和评测,不改代码和 spec。`pages.md` 在 token 上限处,改后 5668/5669,没有变长。回滚 = revert 本 PR。 - 先看:`skills/objectstack-ui/rules/pages.md` 一行,`skills/objectstack-ui/evals/record-page.json` 新增的第 3 个用例。 - 两分钟验证:`node scripts/check-skills-token-ratchet.mjs`,预期 `pages.md is 5668 tokens (ceiling 5669)`、整体通过。 - 需要你做的:`skills/**` 是受管文件(Tier H),请你复核后批准合并。 Clause-②: no Metadata-protocol: none ## What changes - `skills/objectstack-ui/rules/pages.md`: the component catalogue's `page:header` row now reads `` `placedActions: true` (all placed, read live) `` in place of `(all placed; not drawn yet)`. The console's header renderer reads the key since #30097 (`PageHeaderActions`, through `placedHeaderActions`), so the qualifier #30028 wrote is dropped. This is the sixth of the six qualifiers #30028 listed; #30097 dropped the other five. - `skills/objectstack-ui/evals/record-page.json`: a third case. The prompt asks for a custom `kind: 'full'` account record page whose header shows every action packages place on `account`, without listing ids. The expected answer keeps the page and its tab strip and sets `{ type: 'page:header', properties: { placedActions: true } }`, with no `actions` id list beside it (the two are refused together). Assertions: must contain `placedActions: true` and `page:header`; must not contain `slots.tabs` or `actions: ['`. - `skills/objectstack-ui/evals/README.md`: the `record-page.json` line names the new case. - Changeset `.changeset/29951-skills-placed-actions-drawn.md`: `@objectstack/skills` patch. ## Why #30028's Skills-docs line deferred both pieces to the reader: "no eval exercises it while no renderer reads it, so the eval and the qualifier drop ride with the reader." The reader landed in #30097. The seat split this Tier H file out of #30097 so that PR could land through the queue. ## Verification - `node scripts/check-skills-token-ratchet.mjs`: exit 0; `skills/objectstack-ui/rules/pages.md is 5668 tokens (ceiling 5669; headroom 1)`, so the row costs one token less than before. - `node scripts/pm/dispatch-gates.mjs --commands` on this diff: 42 commands, all run under `os-verify-lock` (VERDICT command-exit 0), every one exit 0; `--ran`: 42 derived, 42 run, 0 NOT-MEASURED, 0 UNRUN. They include the token ratchet and its self-test, `check:pm-skill-id-lint`, `check:skill-compatibility`, `check:skill-frame-sync` and `check:skill-identifier-liveness`. - The branch is `main` at a52761f (the #30097 squash) merged in, plus this one commit; `git diff origin/main` before the commit was empty. ## Human Minimum - [x] 1. Schemas start as Zod; `packages/spec` holds no runtime logic. (Not touched.) - [x] 2. Every name I added uses the casing for its kind. - [x] 3. No formatter ran; `pnpm lint` passes. (No TypeScript changed; CI's `pnpm lint` covers the tree.) - [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` touched: its generated artifacts are regenerated and committed. (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, except the `## 维护者速读` block, which is written in Chinese for the maintainer. - [x] The *Before Submitting* list in CONTRIBUTING.md is done. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01WGufzh8VRbTbBnqwnrXsSL --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent 2381085 commit 7bafab3

4 files changed

Lines changed: 31 additions & 3 deletions

File tree

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
---
2+
'@objectstack/skills': patch
3+
---
4+
5+
docs(skills): `objectstack-ui` no longer says `page:header`'s `placedActions: true` is not drawn, and an eval exercises it (#29951)
6+
7+
Clause-②: no
8+
Metadata-protocol: none
9+
10+
- `rules/pages.md`: the component catalogue's `page:header` row says `placedActions: true` draws every placed action, read live. The console's header renderer reads the key since #29951's ui half, so the "not drawn yet" qualifier #30018 wrote is dropped.
11+
- `evals/record-page.json`: a third case asks for a custom full record page whose header shows every action packages place on the object; the expected answer keeps the page and its tab strip and sets `placedActions: true` on the `page:header` node, with no `actions` id list beside it.

‎skills/objectstack-ui/evals/README.md‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,10 @@ view / page / dashboard / report metadata.
1010
must escalate to a stored field or app code, and when an ad-hoc
1111
in-page `<ObjectChart>` needs no dataset at all.
1212
- `record-page.json` — the record page as the object declares it: a child
13-
table placed first by `relatedList: 'primary'` (no page file), and
13+
table placed first by `relatedList: 'primary'` (no page file),
1414
`navigation: { mode: 'page' }` on the list view with the reader's own
15-
open choice left out of metadata.
15+
open choice left out of metadata, and `placedActions: true` on a full
16+
page's `page:header` so packaged header actions draw without an id list.
1617
- `report-period-export.json` — a non-`joined` report's `dateRange` (one
1718
`type: 'date'` dataset dimension) and `exportOptions` (csv / xlsx under the
1819
base object's `allowExport` permission).

‎skills/objectstack-ui/evals/record-page.json‎

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,22 @@
3535
"definePage"
3636
]
3737
}
38+
},
39+
{
40+
"id": 3,
41+
"prompt": "Our account record page is a custom `kind: 'full'` page with its own tab strip. Installed packages keep adding header actions to `account` (an 'Open in billing' link, for one), and none of them ever shows in the page header. Make the header show every action placed on the account's header, including ones a package adds later, without us listing ids.",
42+
"expected_output": "Keep the `kind: 'full'` page and its tab strip, and set `placedActions: true` on its `page:header` node: `{ type: 'page:header', properties: { placedActions: true } }`. The header then draws every action of `account` whose `locations` include `record_header` or `record_more`, read live, so a package's action appears without a page edit. No `actions` id list beside it: an authored list is the whole set, and `placedActions: true` beside one is refused. Not a return to a `slotted` page and never a `slots.tabs`.",
43+
"files": [],
44+
"assertions": {
45+
"must_contain": [
46+
"placedActions: true",
47+
"page:header"
48+
],
49+
"must_not_contain": [
50+
"slots.tabs",
51+
"actions: ['"
52+
]
53+
}
3854
}
3955
]
4056
}

‎skills/objectstack-ui/rules/pages.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ A `slotted` record page has no `tabs` slot — see [Record Page](./record-page.m
4343

4444
| `type` | Use |
4545
|:---------------------|:----|
46-
| `page:header` | `title` / `subtitle` templates + `actions` (ids of the bound object's actions, never action nodes) or `placedActions: true` (all placed; not drawn yet) |
46+
| `page:header` | `title` / `subtitle` templates + `actions` (ids of the bound object's actions, never action nodes) or `placedActions: true` (all placed, read live) |
4747
| `page:card` | Bordered/un-bordered card with `children: Component[]` (plus an optional `footer: Component[]` slot) |
4848
| `flex` | Generic styleable box (`properties.children`) — the workhorse for custom layout; style via `responsiveStyles` (see Styling below) |
4949
| `element:text` | Text node — `properties.content`; style via `responsiveStyles` |

0 commit comments

Comments
 (0)