Skip to content

docs(skills): page-builder guide drops the retired page:header breadcrumb and names placedActions - #30115

Merged
os-zhuang merged 5 commits into
mainfrom
claude/project-thread-5c51ya
Nov 5, 2026
Merged

os-zhuang merged 5 commits into
mainfrom
claude/project-thread-5c51ya

Conversation

@objectstack-fleet

@objectstack-fleet objectstack-fleet Bot commented Nov 4, 2026 •

Copy link
Copy Markdown
Contributor

domain:skills#1 · huangyiirene · session_01J8VVAnMUWA9rufXzFaEh4J

Requested by Irene · project thread

Fixes #30031

Clause-②: no
Metadata-protocol: none

The maintainer waived the model-tier mandate for skills/** while that tier had no quota; this PR was developed below it.

维护者速读

  • 改了什么:skills/objectui/guides/page-builder.md L100-101 的 page:header 标题行键表删掉已退役的 breadcrumb,并加上已上线的 placedActions: true,现为 (title, subtitle, actions or placedActions: true)。
  • 为什么改:PageHeaderProps.breadcrumb 自 spec 17 起是 retiredKey 墓碑(ADR-0087 D2),props lint 拒绝手写的 breadcrumb;fix(console): the record header reads placedActions, so a packaged sys_user header action draws again (#29951) #30097 合入后 header 渲染器已读取 placedActions。
  • 风险与回滚:一个文件改一行,token 3410/3411,不动上限、不付账;发布 @objectstack/skills patch;回滚即 revert。
  • 先看:page-builder.md L101。
  • 需要你做的:无;席位处理 ready 与合并队列。

What changes

  • skills/objectui/guides/page-builder.md L101: `breadcrumb`, is removed from the page:header title-row list, and placedActions: true is named as the alternative to actions. The sentence now reads "a title row (title, subtitle, actions or placedActions: true) that takes no children". The rest of the file is byte-identical to main.
  • .changeset/30031-page-builder-header-breadcrumb.md: '@objectstack/skills': patch with Clause-②: no and Metadata-protocol: none, its prose naming page-builder.md only. No skip-changeset label: a skills/** diff ships in @objectstack/skills (pr-automation.yml route 1).

An earlier head of this PR also changed the page:header row in skills/objectstack-ui/rules/pages.md L46, which said placedActions: true was "not drawn yet". PR #30127 (#29951) landed that fix on main ("(all placed, read live)"). The merge of main into this branch took main's line as is, so pages.md is no longer in this PR's diff.

Read off main at 9a53fc9f (merged into the branch, no rebase):

  • PageHeaderProps in packages/spec/src/ui/component.zod.ts: breadcrumb and showStar are retiredKey tombstones. Live keys: title, subtitle, actions, placedActions, recordChrome, showCopyId, maxVisible, mobileMaxVisible, aria.
  • placedActions is live. fix(console): the record header reads placedActions, so a packaged sys_user header action draws again (#29951) #30097 (console(record header): a url action placed at record_header on sys_user no longer renders in the 18.3 Console header menu, drawer or full page (18.2 rendered it) #29951) dropped the [PLANNED — not yet rendered] marker from its describe, which now reads "Draw every action of the page's object whose locations include record_header or record_more, read live from the object's metadata, in place of an authored actions list … Refused as true beside an authored actions list: keep one." The page:header renderer in ui/packages/components/src/renderers/layout/containers.tsx reads placedActions and draws the placed header actions. The .refine on PageHeaderProps refuses placedActions: true beside an authored actions list, so the guide spells the two as alternatives ("or"). The first head of this PR (d93cef6e) left placedActions out because the describe at its base still carried the PLANNED marker; that reason no longer holds on main.
  • recordChrome, showCopyId and maxVisible shape the record chip and the overflow menu, not what the title row holds, so the guide's sentence does not name them.
  • Sweep of skills/objectui/**: L101 was the only breadcrumb. showStar appears nowhere.

Token ratchet. page-builder.md: 13628 → 13639 bytes, 3410 tokens (ceiling 3411, headroom 1). No ceiling row moves, nothing was re-wrapped, and no payment is owed.

Why

The guide taught a key the props lint refuses, so a page authored from it would fail validation, and it did not name placedActions after #30097 made the header draw it.

Verification

Head 16145621: on top of 0f1ccaec, a merge of origin/main at 9a53fc9f (31fbfb98, pages.md resolved to main's line) and one commit scoping the changeset prose.

Local gates on 1614562: 44 derived, 44 run with exit 0, 0 NOT MEASURED (`dispatch-gates --ran`)
  • node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derived 44 commands for the two changed files. All ran after pnpm install --frozen-lockfile and a full pnpm build on the merged tree (exit 0), each under a 900 s timeout with its exit code captured before any pipe.
  • All 44 exited 0, among them check-skills-token-ratchet.mjs, check:skill-examples, check:skill-identifier-liveness, check:skill-frame-sync, check:doc-authoring, check:dts-closure, check:dual-build-cjs-loads and check-comment-mask-corpus.mjs.
  • --ran printed: 44 derived famil(ies) accounted for — 44 run, 0 NOT-MEASURED (a DERIVED zero — all 44 recorded an exit code and none of them is 3).
  • node scripts/check-commit-card-trailers.mjs --range origin/main..HEAD: exit 0 (5 commits) before the push.

Human Minimum

  • 1. Schemas start as Zod; packages/spec holds no runtime logic. (Not touched.)
  • 2. Every name I added uses the casing for its kind. (No names added.)
  • 3. No formatter ran.
  • 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 touched: its generated artifacts are regenerated and committed. (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 维护者速读 section is Chinese, per the lane template.)
  • The Before Submitting list in CONTRIBUTING.md is done.

Generated by Claude Code

…ui page-builder guide

PageHeaderProps.breadcrumb is a retiredKey tombstone since spec 17
(ADR-0087 D2); the guide's title-row sentence still named it.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01J8VVAjSbVpQUeFNuTTm3me
@github-actions github-actions Bot added size/s documentation Improvements or additions to documentation tooling labels Nov 4, 2026
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#1 · huangyiirene · session_01J8VVAnMUWA9rufXzFaEh4J

Contract-review-claim: session_01J8VVAnMUWA9rufXzFaEh4J · head d93cef6 · 2026-11-04T14:52Z

The seat review runs at CONTRACT_REVIEW_TIER in an isolated subagent. No review seat (lanes/review.md) is seated.


Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#1 · huangyiirene · session_01J8VVAnMUWA9rufXzFaEh4J

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: d93cef6ef7ffb96ab85aeb7f6e15ca55b49c9d4d
Local-runs: probe — on a detached worktree of the head under the scratch dir (merge-base with origin/main 1f13eb3; origin/main at a52761f when fetched, two commits past the merge-base: 987ff33 touches skills/objectstack-data / skills/objectstack-formula / one ADR, and a52761f is PR #30097, which edits packages/spec/src/ui/component.zod.ts (the placedActions docblock and describe of PageHeaderProps) and ui/packages/components/src/renderers/layout/containers.tsx (the page:header renderer) — neither commit touches skills/objectui/**, the ratchet script or the changeset dir): node scripts/check-skills-token-ratchet.mjs on the head (exit 0: skills/objectui/guides/page-builder.md 3404 / 3411, headroom 7) and again with the merge-base file swapped into the same worktree (exit 0: 3407 / 3411, headroom 4), then with a probe line that appends "or placedActions: true" to the title-row list (exit 0: 3410 / 3411, headroom 1), each time restored and cmp-verified byte-identical to the head file, git status clean; --self-test (exit 0, 97 cases); node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack (44 commands; sorted, the list is identical to the dev record's 44; the tool notes the tree is two commits behind origin/main and that nothing it derives from moved); node scripts/pm/check-governed-merges.mjs --branch HEAD and --pr 30115 (both exit 3, GOVERNED, Tier H, 1 of 2 paths hits skills/**, 12 changed lines, head repo = base repo on the --pr read); node scripts/check-commit-card-trailers.mjs --range 1f13eb31..HEAD (exit 0, one commit, model-free trailer pair); node scripts/check-empty-changeset.mjs --base <origin/main ref> (exit 0, one declaring changeset added, none from the merge-base modified); node scripts/check-changeset-no-major.mjs --base <origin/main ref> (exit 0, level axis not applicable locally); node scripts/pm/check-skill-id-lint.mjs (110 files clean, exit 0); node scripts/check-skill-identifier-liveness.mjs (486 citations over 71 published files, exit 0); check-closing-keyword-parity.mjs and check-doc-authoring.mjs (both exit 3 PREREQUISITE NOT MET in this container: no node_modules under the worktree; nothing measured, read from CI, where Lint · docs & code guards and PR-body guards are success on the head); wc -c on both trees; grep -rni 'breadcrumb\|showStar' skills/objectui/ on the head (no match, exit 1); git diff of component.zod.ts and containers.tsx between the merge-base and origin/main; gh api REST reads of the PR, its files, commits, comments, reviews and combined status, card #30031 and its comments, PRs #30097 and #30028 (merge times), and the head's check-runs three times (paginated, per_page=100). The worktree and the three fetch refs it used were removed after the runs and the main checkout was not touched; no GitHub write of any kind.
Scope: skills/objectui/guides/page-builder.md (the governed hit: the page:header sentence at L100–101) + read, not reviewed: .changeset/30031-page-builder-header-breadcrumb.md (the prose face, checked sentence by sentence here as the dispatch asked), packages/spec/src/ui/component.zod.ts L623–651 (PAGE_HEADER_PLACED_ACTIONS_BESIDE_LIST, the description guidance row), L632–862 (PageHeaderProps: title L679, subtitle L682, the breadcrumb tombstone L701, actions L738, placedActions L772 with its [PLANNED — not yet rendered] describe at the merge-base, recordChrome L794, the showStar tombstone L816, showCopyId L829, maxVisible / mobileMaxVisible L851–856, aria L858, the .refine L859–862) and the same file on origin/main (the placedActions docblock rewritten to LIVE, the marker gone from the describe), packages/spec/src/conversions/entries/18/page-header-breadcrumb-removed.ts (the D2 strip, retiredAfter: '17.5.0', toMajor: 18), ui/packages/components/src/renderers/layout/containers.tsx at the head (PageHeaderRenderer L2683–3145: title L2714, subtitle L2715, the "breadcrumb is deliberately NOT read" comment L2741–2747, recordChrome L2752, showCopyId L2759, actions L2765, maxVisible / mobileMaxVisible L2784–2785, aria L2688; the record layout's RecordTitleChip + subtitle <p> + data-page-actions-slot L3088–3117 and the bare layout's <h1> + subtitle + slot L3122–3144; the registry rows L3171–3197) and its origin/main diff (placedActions read at L2832 and L2851, drawsPlacedActions in PageHeaderActions), ui/packages/components/src/tests/page-header-breadcrumb-ignored-11166.test.tsx (the renderer pin that an authored breadcrumb renders as absent), skills/objectstack-ui/rules/pages.md L46 (the sibling catalogue row the body names as placedActions' teaching home), packages/skills/scripts/sync-catalog.mjs L5–30 (what @objectstack/skills ships), scripts/check-skills-token-ratchet.mjs L1042 (the ceiling row ['skills/objectui/guides/page-builder.md', 3411]), .github/PULL_REQUEST_TEMPLATE.md (the Human Minimum list), scripts/pm/record-recognisers.mjs L1359 (FOOTER_LINE), .claude/skills/pm-dispatch/references/lanes/skills.md, review-checklist.md and contract-review.md, card #30031 body, comments 6627848734 (triage) and 6632893302 (claim), PR #30115 body and its one comment 6633808134 (the seat's review claim on this head), the dev gate record pr-30031/gates-d93cef6e.txt (read as input)

Reviewer: an isolated contract reviewer at CONTRACT_REVIEW_TIER, read-only on GitHub (REST reads only; nothing written, pushed or commented), fed the card body and comments, the PR body, the diff against the merge-base, the head's check-runs, AGENTS.md, contract-review.md, review-checklist.md, lanes/skills.md and the example record cr42. The dev gate record was read as input, not as conclusions; every count and every claim about the spec and the renderer below is this review's own reading of the head tree, of main at the merge-base and of origin/main as fetched. No environment variable value is printed anywhere in this record.

① Derived judgments

  1. File surface. One commit (d93cef6, author and committer Claude, parent 1f13eb3, PR author objectstack-fleet[bot], head repo = base repo, draft, base main, trailers Co-Authored-By: Claude <noreply@anthropic.com> + Claude-Session:, no model identifier; the trailer's session differs from the reviewing session, so the independence pair holds). git diff --numstat 1f13eb31 d93cef6e, the REST file listing (+11 / −1, 2 files) and the PR body agree on exactly two paths: skills/objectui/guides/page-builder.md +1/−1 (349 lines both sides) and .changeset/30031-page-builder-header-breadcrumb.md +10/−0 (new). The claim (6632893302) named exactly these: the page:header sentence around L100 plus one '@objectstack/skills': patch changeset. Nothing else is touched; the ratchet script is not in the diff. Correct, and on surface.
  2. The cut, read against the spec at the merge-base. PageHeaderProps.breadcrumb is retiredKey(…) (component.zod.ts L701), its text "removed in @objectstack/spec 17 (ADR-0087 D2) — no renderer ever drew a trail for it", its docblock L684–700 recording the empty div[data-page-breadcrumb-slot] and the shell-drawn trail; the D2 strip page-header-breadcrumb-removed (retiredAfter: '17.5.0', toMajor: 18) removes both values from stored and built pages. The renderer confirms: PageHeaderRenderer says "breadcrumb is deliberately NOT read (objectui#11166, ruling RETIRE)" (containers.tsx L2741) and the registry row comment "No breadcrumb" (L3167); page-header-breadcrumb-ignored-11166.test.tsx pins that true, false and the absent key render the same header in both layouts. So the guide taught a key that strictObject refuses by name at the props lint and that draws nothing. Dropping it is right; the card's premise holds on the merge-base and on origin/main alike. Correct.
  3. What remains in the list — title, subtitle, actions — each read against the renderer at the head. title: read at L2714 (schema?.title ?? schema?.properties?.title), interpolated, drawn as the RecordTitleChip title in the record layout (L3088) or as the bare <h1> (L3133); the spec's title is optional so the chip may derive the heading from the record (L665–678 docblock), which the word "title row" covers. subtitle: read at L2715, drawn as a <p> in both layouts (L3101–3108, L3136). actions: read at L2765, handed to PageHeaderActions (L2782) and drawn into data-page-actions-slot in both layouts (L3117, L3140). All three are live declared keys (L679, L682, L738) and all three are drawn. Correct.
  4. placedActions, the dev's judgment call. At the merge-base the describe opens [PLANNED — not yet rendered] (L772) and its docblock says "PLANNED, not yet read: no renderer reads this key. Its reader is the objectui header half of console(record header): a url action placed at record_header on sys_user no longer renders in the 18.3 Console header menu, drawer or full page (18.2 rendered it) #29951" (L763–766); containers.tsx at the head reads no placedActions anywhere. On that tree the body's reasoning is exactly right: the sentence says what page:header renders, and naming a key the renderer did not read would have advertised an undelivered capability (Prime Directive chore: version packages #10's corollary, and the lane's own "who reads this line" test). The .refine (L859–862) refusing true beside an authored actions list is also as the body says (the body attributes that fact to the card; the card does not state it — immaterial). But origin/main moved under the PR: fix(console): the record header reads placedActions, so a packaged sys_user header action draws again (#29951) #30097 (card console(record header): a url action placed at record_header on sys_user no longer renders in the 18.3 Console header menu, drawer or full page (18.2 rendered it) #29951), merged about 46 minutes after the branch point and about five minutes before this PR opened, rewrote the docblock to "LIVE (console(record header): a url action placed at record_header on sys_user no longer renders in the 18.3 Console header menu, drawer or full page (18.2 rendered it) #29951, the objectui header half): the header renderer (PageHeaderActions …) reads it", dropped the marker from the describe, and the renderer now reads schema?.placedActions ?? schema?.properties?.placedActions (containers.tsx on origin/main L2832, L2851) and draws placedHeaderActions(registered). So on main as it stands today placedActions: true is the second live way to say which actions the title row's action slot draws, and the body's stated reason for leaving it out ("its describe still opens [PLANNED — not yet rendered]") is no longer true of main. The sentence as merged stays true — it names three keys and claims no completeness ("a title row (title, subtitle, actions)"), and an agent who writes those three writes nothing the platform refuses — so this is not a defect in the delivered text. It is an omission the card's first Wanted bullet made conditional ("if the guide lists header keys … and placedActions once feat(spec): page:header placedActions draws every placed header action, refused beside an actions list (#30018) #30028 lands") and that the claim left to the dev ("the dev reads the live key set off PageHeaderProps on main rather than off the card"). Measured cost of closing it: the probe line "actions or placedActions: true)" takes the file to 3410 / 3411, headroom 1, no ceiling row moves. S1 (④). Correct on the tree the dev read; stale against origin/main.
  5. The other live keys the card names — recordChrome, showCopyId, maxVisible — and whether the sentence owes them. recordChrome (L794) switches the whole header between the record-chip layout and the bare heading (renderer L2752, branch at L2796–2800); showCopyId (L829) is the copy-id button inside RecordTitleChip (renderer L2759, L3097), "part of the record chrome — no effect when recordChrome is false"; maxVisible / mobileMaxVisible (L851–856) are the inline-button budgets before the overflow menu (renderer L2784–2785, applied in PageHeaderActions L2280–2295); aria (L858) is the landmark's ARIA bag (L2688). None of these is a thing the title row shows; they shape how the chip, the action row and the landmark are drawn. The sentence sits in 3b. Pick the right layout primitive, a paragraph about which curated block gives a landmark, and lists what the header's title row holds; it is not the guide's key catalogue (the guide has none for page:header; the catalogue row is skills/objectstack-ui/rules/pages.md L46). A subset that claims no completeness is fine here, and adding four chrome switches to a landmark sentence would mislead more than it informs. The body's "belong to the record chip and the overflow menu, not this title-row list" is the right reading. Correct.
  6. Sweep. grep -rni 'breadcrumb\|showStar' skills/objectui/ on the head returns nothing (exit 1); on the merge-base the only hit was L101. The card's second Wanted bullet ("re-check the rest of skills/objectui/** for breadcrumb and showStar") is delivered and the body reports it truthfully ("L101 was the only breadcrumb. showStar appears nowhere"). skill-identifier-liveness (exit 0) agrees that no published skill cites a dead identifier. Correct.
  7. Token ratchet. Measured on both trees: 3407 → 3404 tokens (ceiling 3411; headroom 4 → 7), exit 0 both; self-test 97 cases; the ratchet script is not in the diff so the ceiling row (L1042) did not move. Bytes 13628 → 13614 (−14, the removed `breadcrumb`, and its space), as the body says. No re-wrap: the diff is one line, +/− of the same line with the segment removed; the line after it is untouched (the sentence now carries a short second line, which is a cosmetic ragged wrap, not a ratchet question). The body's "no payment is owed and nothing was re-wrapped" reproduces. Correct.
  8. Changeset. .changeset/30031-page-builder-header-breadcrumb.md: frontmatter '@objectstack/skills': patch; line-initial Clause-②: no and Metadata-protocol: none; prose: the sentence "named breadcrumb among the title row's keys" (true at merge-base L101), "retiredKey tombstone since @objectstack/spec 17 (ADR-0087 D2)" (the tombstone's own text, L702), "the props lint refuses an authored one" (the tombstone's refusal at validateComponentProps, as the conversion entry L28–30 records), "the row now lists title, subtitle, actions" (true, head L100–101), "No other text changes" (true: one line in the diff). @objectstack/skills ships skills/** through sync-catalog.mjs into dist/skills/<skill>/… (L5–30), so a change to this guide ships and a patch changeset is owed — the triage note (6627848734) and the claim agree, and skip-changeset would have been wrong. Labels on the PR are documentation, size/s, tooling: no skip-changeset. Check Changeset is success on the head; check-empty-changeset exit 0 here. Correct.
  9. Gates re-run here. The 44 derived commands are identical, sorted, to the dev record's 44. Of those re-run: token ratchet and self-test, skill-id-lint, skill-identifier-liveness, commit-card-trailers, empty-changeset, changeset-no-major all exit 0; governed-merges exit 3 by design. check-closing-keyword-parity and check-doc-authoring exit 3 PREREQUISITE NOT MET in this container (no node_modules) — read from CI, where Lint · repo & tooling gates, Lint · CI, release & engine gates, Lint · docs & code guards, Lint · PM dispatch-gates, Lint · ESLint and PR-body guards are all success on the head. The dev record lists all 44 at exit 0 after pnpm install --frozen-lockfile and a full build; nothing I could measure contradicts it. Correct.
  10. PR body against the head. First content line Fixes #30031: the card's Wanted is two bullets — drop breadcrumb (done) with a conditional half about naming live keys (answered by judgment, ①.4–5), and re-check skills/objectui/** for breadcrumb / showStar (done, ①.6) — so Fixes is the right verb; no other open card number sits beside a closing keyword (#30028, #29951 and #30097 do not appear in the body at all; pr-automation.yml route 1 is a file reference), and PR-body guards is success. Clause-②: no and Metadata-protocol: none are line-initial and right (no spec, no key). "Read off PageHeaderProps … on main at 1f13eb31" is honestly anchored and true of that tree (①.4 says what moved after). The live-key list the body gives (title, subtitle, actions, placedActions, recordChrome, showCopyId, maxVisible, mobileMaxVisible, aria) and the two tombstones reproduce exactly from L632–862. The byte and token figures (13628 → 13614; 3404 / 3411), "L100 and everything else are byte-identical to main", "44 derived, 44 run" and the sweep result all reproduce. The model note ("The maintainer waived the model-tier mandate for skills/** while that tier had no quota; this PR was developed below it") names no model, no family word and no identifier — the spelling cr42's S2 asked for. Human Minimum: eight items ticked against the template; item 3 drops the template's "pnpm lint passes" half (Lint · ESLint is success on the head, so nothing is hidden); items 1, 2 and 6 are annotated "not touched" / "no names added" (true). The 维护者速读 block is in Chinese as the lane template requires. The body's attribution tail is the harness form (a line with the Claude Code link, then a bare session URL) and not the _Generated by [Claude Code](https://claude.ai/code/session_<id>)_ line AGENTS.md names for PR bodies; the sibling PR docs(skills): list relatedListTitle under fields.{field_name} in the i18n skill #30068 carries both. No gate reads it (FOOTER_LINE in record-recognisers.mjs recognises review records, not bodies): S3, cosmetic. Correct except as S3.
  11. Governance. check-governed-merges.mjs --pr 30115: 1 of 2 paths hits skills/** (the changeset is not on the register), Tier H, 12 changed lines (+11 / −1) under the 3000 threshold, head repo = base repo, exit 3 as designed; the PR is a draft, no reviews, no assignee, no requested reviewer, auto_merge null, mergeable_state blocked. Landing is the maintainer's hand or an authorized approval; this record does not lift it.

② Semver level

Patch, and the changeset says patch. @objectstack/skills publishes skills/** through dist/skills/<skill>/…, so one sentence in a published guide is a user-visible fix with no protocol change: Clause-②: no, Metadata-protocol: none, '@objectstack/skills': patch. No packages/spec/src/**, no TypeScript, no skip-changeset; Check Changeset is success on the head.

③ Boundary flags

  • Dev open_questions: none in the body. The body's three acceptance notes — placedActions left out because its describe said PLANNED, the chrome keys left out because they are not title-row content, the sweep finding nothing else — are each confirmed by the diff and the trees (①.4–6), with the one qualification that the first note's premise is true of the merge-base and no longer of origin/main (S1).
  • S1, placedActions went live under the PR: fix(console): the record header reads placedActions, so a packaged sys_user header action draws again (#29951) #30097 landed between the branch point and the PR opening. The delivered sentence is still true and teaches nothing refused; what it now lacks is the second live way to fill the action slot, which the card asked for "once feat(spec): page:header placedActions draws every placed header action, refused beside an actions list (#30018) #30028 lands" and the claim said the dev "may name". Should-fix, not a blocker: the text is not wrong, the omission is cheap to close (headroom 1 after the probe, no ceiling move) and the dev's reasoning was correct on the tree it cited.
  • Pre-existing, not this PR's, in the sibling skill: skills/objectstack-ui/rules/pages.md L46 says "placedActions: true (all placed; not drawn yet)" — true at the merge-base, stale on origin/main for the same reason as S1, and the one place the body points an author to for that key. Outside the claimed surface (skills/objectui/** only) and outside the card; a skills-lane follow-up card, filed by the dispatch seat, not a rider on this PR. The [PLANNED]-to-LIVE flip in fix(console): the record header reads placedActions, so a packaged sys_user header action draws again (#29951) #30097 touched content/docs/** and the spec but no skills/** file, which is how both skills went stale at once.
  • Independence: PR author objectstack-fleet[bot], commit author Claude, commit session session_01J8VVAjSbVpQUeFNuTTm3me ≠ reviewing session; no off-relay author note is owed. The PR thread carries the seat's Contract-review-claim: for this head (6633808134) and no other record; no review seat is seated, as the claim says. The card's claim comment (6632893302) carries a model family word in its "Container & model" line — a card comment, not the PR body, written before this PR and outside its diff; noted, not graded here.
  • Tier H: this record does not lift the landing; the maintainer's hand or an authorized GOVERNED_APPROVERS approval does, and none is on the PR (reviews: none). The four in-progress runs at the third read (below), among them the TypeScript Type Check floor's remaining lane, must be read green before any Tier H act.

④ Design judgment

Per hits file, against the card's scenario (an agent composing a page from the guide must not write a key the props lint refuses, and should learn the header's live keys where the guide names any) and the code on main:

  • skills/objectui/guides/page-builder.md, the page:header sentence (L100–101): removing `breadcrumb` and nothing else is the right cut. The sentence's job is to say which curated block gives a header landmark and that it takes no children; the parenthetical is illustrative of what the title row holds, and after the cut every key it names is declared (L679, L682, L738) and drawn (①.3). Naming recordChrome, showCopyId, maxVisible here would have turned a landmark sentence into a half-catalogue of chrome switches, and the body is right to leave them to the spec and the sibling catalogue row. On the tree the dev read, leaving placedActions out was also right (a [PLANNED] key is not something the header renders); on origin/main it is the one live way to fill the action slot that the sentence does not mention. Holds, with S1.
  • No content was cut that had no other home: the only removed text was a retired key's name, whose "home" is the tombstone that refuses it. No example in skills/objectui/** set it (sweep, ①.6). The ratchet is paid downward (−3 tokens) with no re-wrap. Holds.

Must-fix: none. Should-fix: S1 — now that #30097 is on main, make the title row's action source read "(title, subtitle, actions or placedActions: true)", measured at 3410 / 3411 (headroom 1, no ceiling row moves); if the dev prefers to keep the sentence a strict subset, say so in the body in place of the now-stale "still opens [PLANNED — not yet rendered]" reason, which no longer describes main. S2 — the sibling catalogue row skills/objectstack-ui/rules/pages.md L46 ("not drawn yet") is stale for the same reason; a skills-lane follow-up card, not this PR. S3 — the PR body's attribution tail: the AGENTS.md form for PR bodies is the single _Generated by [Claude Code](https://claude.ai/code/session_<id>)_ line under a rule; cosmetic, no gate reads it.

Check-runs at record time: 54 check-runs on d93cef6 at the third read, 42 success, 8 skipped, 0 failure, 4 in progress (Test Core 1/8, Test Core 2/8, Lint UI, Type Check · consumer gates); three reads went 52 → 54 → 54 runs and 14 → 42 → 42 success with no non-success completion at any read (the first read had 30 in progress: the sixteen Test UI shards, Build & E2E UI, Live E2E UI, Lint UI, Type Check UI, the four Lint lanes, the four Type Check lanes and the two Test Core shards; all but the four named completed success by the second read). Success: Lint & Repo Gates (a required floor), Lint · repo & tooling gates, Lint · CI, release & engine gates, Lint · PM dispatch-gates, Lint · docs & code guards, Lint · ESLint, Lint · scoped · tooling self-tests, Lint · scoped · slot lookup & corpus, Lint · scoped · query-options erasure, Type Check · workspace / source gates / debt ledger, Build Core, Governed Surface Queue Guard, Dogfood Regression Gate, Test UI and its sixteen shards, Type Check UI, Build & E2E UI, Live E2E UI, Build UI Deps, Plan Test Core shards, PR-body guards, Check Changeset, Check PR Size, Auto Label, filter. Skipped by path filter or opt-in: Build Docs, UI Published Artifacts, Dogfood Verify CLI, Temporal Conformance, Schedule gate, 18.x upgrade harness, Packed-tarball smoke, and the matrix-templated placeholder row for the Dogfood shards. The TypeScript Type Check umbrella (the second required floor) had not yet reported at the third read — its consumer gates lane was still running — so the landing pre-check owes a read of it and of the two Test Core shards and Lint UI green before any Tier H act. Combined status pending (statuses API, 0 statuses). mergeable_state blocked, draft, auto_merge null, labels documentation, size/s, tooling; Tier H (skills/**), landing by the maintainer's hand or an authorized approval, not by this record.

Implemented-by: claude/project-thread-5c51ya
Reviewed-by: session_01J8VVAnMUWA9rufXzFaEh4J

VERDICT: PASS


Generated by Claude Code

PR #30097 made the header renderer read placedActions, so the objectui
page-builder guide names it beside actions and the objectstack-ui pages
catalogue drops "not drawn yet".

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01J8VVAjSbVpQUeFNuTTm3me
@objectstack-fleet objectstack-fleet Bot changed the title docs(skills): drop the retired page:header breadcrumb from the objectui page-builder guide docs(skills): page:header guides drop the retired breadcrumb and teach placedActions as live Nov 4, 2026
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#1 · huangyiirene · session_01J8VVAnMUWA9rufXzFaEh4J

Contract-review-claim: session_01J8VVAnMUWA9rufXzFaEh4J · head 0f1ccae · 2026-11-04T15:45Z

Delta review against the PASS at head d93cef6 (comment 6634141370). The delta is S1 and S2 in one new commit after a merge of main, with S3 and the title in the PR body. The seat review runs at CONTRACT_REVIEW_TIER in an isolated subagent. No review seat (lanes/review.md) is seated.


Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#1 · huangyiirene · session_01J8VVAnMUWA9rufXzFaEh4J

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 0f1ccaec8d7f59992b9f87c69ae767edc823110c
Local-runs: probe — on a detached worktree of the head under the scratch dir (merge-base with origin/main now 28ce3d1, the main the branch merged in e0de07b2; origin/main at 55337f4 when fetched, two commits past the merge-base, 5d7ada3 and 55337f4, neither of which touches skills/**, packages/spec/src/ui/component.zod.ts, ui/packages/components/src/renderers/layout/containers.tsx, the ratchet script or the changeset dir): git diff --numstat of the PR's net diff at both heads (1f13eb31..d93cef6e and 28ce3d1b..0f1ccaec), of the merge commit against its first parent restricted to the three PR files (empty), of the new commit e0de07b2..0f1ccaec in full and as --word-diff=porcelain, and of the head against the merge commit outside the three files (empty); node scripts/check-skills-token-ratchet.mjs on the head (exit 0: skills/objectui/guides/page-builder.md 3410 / 3411, headroom 1; skills/objectstack-ui/rules/pages.md 5665 / 5669, headroom 4), again with both files swapped for their merge-base versions in the same worktree (exit 0: 3407 / 3411 and 5669 / 5669, headroom 4 and 0) and once more with the prior head's page-builder.md swapped in (3404 / 3411), each time restored with git checkout -- and cmp-verified byte-identical to the head file, git status clean; --self-test (exit 0, 97 cases); node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack (44 commands; sorted, identical to the dev record's 44); node scripts/check-commit-card-trailers.mjs --range 28ce3d1b..HEAD (exit 0, three commits) and --range e0de07b2..HEAD (exit 0, the one new commit); node scripts/pm/check-governed-merges.mjs --branch HEAD and --pr 30115 (both GOVERNED, Tier H, 2 of 3 paths hit skills/**, 15 changed lines, head repo = base repo on the --pr read); node scripts/check-empty-changeset.mjs --base <merge-base sha> (exit 0, one declaring changeset added, none from the merge-base modified); node scripts/check-changeset-no-major.mjs --base <merge-base sha> (exit 0, level axis not applicable locally); node scripts/pm/check-skill-id-lint.mjs (110 files clean, exit 0); node scripts/check-skill-identifier-liveness.mjs (486 citations over 71 published files, exit 0); wc -c / wc -l on both files at the old merge-base, the new merge-base, the prior head and this head; diff of each file between the merge-base and the head with its one changed line removed (byte-identical remainders); awk line lengths around L101; grep -rni 'breadcrumb\|showStar' skills/objectui/ (no match, exit 1) and grep -rn 'not drawn yet\|PLANNED' skills/ (no match) on the head; grep of the PR body, title, changeset and the new commit message for model identifiers and family words; gh api REST reads of the PR, its files, commits, comments, reviews and timeline, card #30031 and its comments, PRs #30028, #30097 and #30109 (merge order), the three workflow runs behind the duplicated check-run rows, and the head's check-runs twice (paginated, per_page=100) plus combined status. check-closing-keyword-parity.mjs and check-doc-authoring.mjs were not run (no node_modules under the worktree; read from CI). The worktree and the two scratch fetch refs it used were removed after the runs and the main checkout was not touched; no GitHub write of any kind.
Scope: skills/objectui/guides/page-builder.md L101 and skills/objectstack-ui/rules/pages.md L46 (the two governed hits, each one line) + read, not reviewed: .changeset/30031-page-builder-header-breadcrumb.md (the prose face, both versions, checked sentence by sentence), packages/spec/src/ui/component.zod.ts at the merge-base 28ce3d1 (PAGE_HEADER_PLACED_ACTIONS_BESIDE_LIST L604–630, PageHeaderProps L632–863: the key list, the actions docblock and describe L720–740, the placedActions docblock L741–772 with its LIVE paragraph L763–772 and describe L773–775, the .refine L860–863; the file is unchanged from a52761f to current origin/main), ui/packages/components/src/renderers/layout/containers.tsx at the merge-base (reportRefusedPlacedActions L1695–1717, PageHeaderActions from L1844 with placedOptIn / placedRefused / drawsPlacedActions L1961–1963 and the placedHeaderActions(registered) return L1984, the page:header renderer's read L2832 and prop L2851, the registry row L3238), ui/packages/types/src/ui-action.ts L117–129 (placedHeaderActions), scripts/check-skills-token-ratchet.mjs L880 and L1042 (the two ceiling rows), .github/workflows/pr-automation.yml (the edited trigger and the pr-size / auto-label jobs' != 'edited' conditions), .github/workflows/lint.yml L3266–3267 (where check-closing-keyword-parity runs), AGENTS.md L427–450 (the footer forms and the model-identifier rule), scripts/pm/record-recognisers.mjs L1359 (FOOTER_LINE), card #30031 body and comments 6632893302 (claim) and 6634167280 (claim widened to pages.md L46), PR #30115 body and title as they read live, its comments 6633808134, 6634141370 (the full review being continued) and 6635078051 (the seat's claim on this head), the dev gate record pr-30031/gates-0f1ccaec.txt and the body copy pr-30031/body.md (read as input)
Delta review of 6634141370 on d93cef6

Reviewer: the same isolated contract reviewer at CONTRACT_REVIEW_TIER, read-only on GitHub (REST reads only; nothing written, pushed or commented). The full review on d93cef6 (PASS, should-fixes S1, S2, S3) stands as read; this record judges only the delta d93cef6e..0f1ccaec with the files main brought in through the merge set aside, and the PR body and title as they now read. The dev gate record was read as input, not as conclusions; every count and every claim about the spec and the renderer below is this review's own reading of the head tree and of main at the new merge-base. No environment variable value is printed anywhere in this record, and no clock time is typed.

① Derived judgments

  1. Delta surface. Two new commits on top of d93cef6: e0de07b2, a two-parent merge of origin/main at 28ce3d1 into the branch (no rebase; d93cef6 is still the first commit), and 0f1ccaec, author and committer Claude, subject "docs(skills): name the live placedActions on the page:header title row", trailers Co-Authored-By: Claude <noreply@anthropic.com> + Claude-Session:, no model identifier, the same session as the first commit. The merge brought 27 files from main and touched none of the three PR files (git diff d93cef6e e0de07b2 -- <the three> is empty); the new commit touches exactly the three (.changeset/30031-page-builder-header-breadcrumb.md +3/−2, skills/objectstack-ui/rules/pages.md +1/−1, skills/objectui/guides/page-builder.md +1/−1) and nothing outside them. The PR's net diff against its merge-base therefore moved from two paths (+11/−1) to three (+13/−2): the changeset +11/−0, pages.md +1/−1, page-builder.md +1/−1, which is what the REST file listing and check-governed-merges (15 lines) both read. The widened claim (6634167280) named exactly the addition: pages.md L46 and the changeset. On surface. Correct.
  2. S1, the title row. L101 now reads "actions or placedActions: true) that takes no children. The bare HTML sectioning" and the sentence across L100–101 is "a title row (title, subtitle, actions or placedActions: true) that takes no children", the exact spelling S1 offered. Against PageHeaderProps on main at the merge-base: placedActions is z.boolean().optional() (L773) whose describe opens "Draw every action of the page's object whose locations include record_header or record_more, read live from the object's metadata, in place of an authored actions list" and closes "Refused as true beside an authored actions list: keep one" (L774); the [PLANNED — not yet rendered] marker is gone and the docblock's status paragraph reads "LIVE (console(record header): a url action placed at record_header on sys_user no longer renders in the 18.3 Console header menu, drawer or full page (18.2 rendered it) #29951, the objectui header half): the header renderer (PageHeaderActions in …containers.tsx) reads it and draws placedHeaderActions" (L763–772). The .refine (L860–863) is !(header.placedActions === true && header.actions !== undefined) with PAGE_HEADER_PLACED_ACTIONS_BESIDE_LIST reported at placedActions: the two keys are alternatives, which is what "or" says. Against the renderer at the same tree: PageHeaderRenderer reads schema?.placedActions ?? schema?.properties?.placedActions (L2832) and hands it to PageHeaderActions (L2851), where placedOptIn = rawPlacedActions === true, placedRefused = placedOptIn && rawHeaderActions !== undefined, drawsPlacedActions = placedOptIn && !placedRefused (L1961–1963) and drawsPlacedActions returns placedHeaderActions(registered) (L1984) into the same gating / budget / overflow chain the id list runs through and the same data-page-actions-slot of the title row. So every key the sentence names is declared and drawn, and the one it names as an alternative is refused beside the other exactly as "or" implies. Resolved. One reading note, not a finding: a reader parsing "A, B, C or D" as a flat four-item list is still told nothing false (each is a title-row key), and the lint's refusal message says "keep one" at authoring; the changeset spells the exclusivity out ("the last two are refused together").
  3. S2, the catalogue row. pages.md L46's placedActions: true cell reads "(all placed)" where the merge-base read "(all placed; not drawn yet)"; the word-diff is the one deletion ; not drawn yet. "All placed" against the renderer: placedHeaderActions (ui-action.ts L117–129) keeps every action of the bound object for which actionRendersAt(action, 'record_header') || actionRendersAt(action, 'record_more'), first-of-a-name, in declaration order, and PageHeaderActions draws that set when drawsPlacedActions (①.2). The row's actions cell already says "ids of the bound object's actions", so "all placed" reads as all of the bound object's placed actions, which is the describe's "every action … whose locations include record_header or record_more" in the catalogue's shorthand; the spec is the long form and the row points nowhere false. "Not drawn yet" was true at 1f13eb3 and false from a52761f on; dropping it is the whole fix and nothing else in the cell moved. Resolved, and the claim widening that let this ride on the PR (6634167280) was on the card before the commit.
  4. Token ratchets, measured on four trees. page-builder.md: 3407 (merge-base) → 3404 (d93cef6) → 3410 (head), ceiling 3411, headroom 1, matching the probe the full review ran for S1 to the token; bytes 13628 → 13614 → 13639 (+11 net, the or `placedActions: true` segment less the removed `breadcrumb`,). pages.md: 5669 (merge-base, headroom 0) → 5665 (head), ceiling 5669, headroom 4; bytes 22674 → 22659 (−15, ; not drawn yet). Both ceiling rows (L880 5669, L1042 3411) are untouched and the ratchet script is not in the diff. No re-wrap: with L101 removed from both versions page-builder.md is byte-identical to the merge-base, and with L46 removed so is pages.md; 349 and 427 lines both sides. L101 now runs 86 columns against the paragraph's 67–77 (its neighbours L100 and L102 are 76 and 77), a ragged line no gate prices and the full review already called cosmetic; re-flowing it would touch L102–103 for nothing. Exit 0 on the head and on the merge-base swap; self-test 97. The body's "3410 tokens (ceiling 3411, headroom 1)", "5665 tokens (ceiling 5669, headroom 4)", "13628 → 13639", "22674 → 22659", "No ceiling row moves, nothing was re-wrapped, and no payment is owed" all reproduce. Correct.
  5. Changeset. Frontmatter still '@objectstack/skills': patch; Clause-②: no and Metadata-protocol: none still line-initial. Title line now "docs(skills): the page:header title row drops the retired breadcrumb and names the live placedActions: true". Bullet 1, sentence by sentence: "named breadcrumb among the title row's keys" (true at both merge-bases, L101), the tombstone and props-lint sentences unchanged from the reviewed head, "The row now lists title, subtitle, actions or placedActions: true" (true, head L100–101), "the last two are refused together" (true, the .refine, ①.2); the former "No other text changes" is rightly gone now that a second file is in. Bullet 2: "the page:header catalogue row no longer says placedActions: true is "not drawn yet"" (true, ①.3), "The header renderer reads it since fix(console): the record header reads placedActions, so a packaged sys_user header action draws again (#29951) #30097" (true: a52761f is fix(console): the record header reads placedActions, so a packaged sys_user header action draws again (#29951) #30097's merge commit and it is the commit that added L2832 / L2851), "and draws every action of the object placed at record_header / record_more" (true, placedHeaderActions, ①.3). The PR-number citation in a changeset is the dir's convention (32 of the changesets at the merge-base carry one; fix(console): the record header reads placedActions, so a packaged sys_user header action draws again (#29951) #30097's own changeset leads with "(console(record header): a url action placed at record_header on sys_user no longer renders in the 18.3 Console header menu, drawer or full page (18.2 rendered it) #29951)"), and check-skill-id-lint prices skills/**, not .changeset/**. check-empty-changeset exit 0 (one declaring changeset added, none from the merge-base modified); Check Changeset success on the head, twice (①.8). Correct.
  6. Gates. dispatch-gates --commands derives 44 commands on the head; sorted, the list is identical to the dev record's 44, and the dev record for this head is itself byte-identical to the record for d93cef6 (the same 44 commands, all :: exit 0, which is what identical commands at exit 0 produce; the merge added paths from main but the PR's own diff still names only skills/** and one changeset, so the derivation did not move). Of those 44, re-run here at exit 0: the token ratchet and its self-test, check-empty-changeset, check-changeset-no-major, check:pm-skill-id-lint, check:skill-identifier-liveness, check:pm-governed-merges (GOVERNED by design); check:doc-authoring and check-closing-keyword-parity need node_modules and are read from CI, where Lint · docs & code guards, Lint · repo & tooling gates, Lint · CI, release & engine gates, Lint · PM dispatch-gates, Lint · ESLint and the three scoped Lint lanes are success on the head. check-commit-card-trailers --range 28ce3d1b..HEAD: exit 0, "3 commit message(s) … carry no card relation and no model identifier in the trailer pair" (d93cef6, the merge, 0f1ccae); the same on the one new commit alone. The body's "44 derived, 44 run with exit 0, 0 NOT MEASURED", "the same 44 as on d93cef6e" and "check-commit-card-trailers.mjs --range origin/main..HEAD: exit 0" reproduce; the install-and-build sentence is the dev record's own account and nothing measured here contradicts it. Correct.
  7. PR body and title, live. Title retitled by the PR author to "docs(skills): page:header guides drop the retired breadcrumb and teach placedActions as live": covers both files, no #, no model word. Body, claim by claim against the head: "placedActions: true is named as the alternative to actions" and the quoted sentence (①.2); "cell reads "(all placed)" instead of "(all placed; not drawn yet)"" (①.3); "The rest of the file is byte-identical to main" for both files (①.4); the changeset bullet (①.5); "Read off main at 28ce3d1b (merged into the branch, no rebase)" (①.1); the live-key list title, subtitle, actions, placedActions, recordChrome, showCopyId, maxVisible, mobileMaxVisible, aria and the two tombstones breadcrumb, showStar reproduce exactly from the strictObject at L679–859; "fix(console): the record header reads placedActions, so a packaged sys_user header action draws again (#29951) #30097 (console(record header): a url action placed at record_header on sys_user no longer renders in the 18.3 Console header menu, drawer or full page (18.2 rendered it) #29951) dropped the [PLANNED — not yet rendered] marker" and the quoted describe are verbatim L774 with one elision; "the renderer … now reads placedActions and draws the placed header actions" and the .refine sentence (①.2); "The first head of this PR (d93cef6e) left placedActions out because the describe at its base still carried the PLANNED marker; that reason no longer holds on main" (true, and the stale reason the full review's S1 asked to replace is gone); the chrome-key sentence and the sweep sentence (unchanged, confirmed on the head: breadcrumb / showStar nowhere in skills/objectui/**, "not drawn yet" / "PLANNED" nowhere in skills/**); the ratchet paragraph (①.4); "Head 0f1ccaec: d93cef6e, a merge of origin/main at 28ce3d1b (e0de07b2), and one new commit for the review's S1/S2" (①.1); the gates block (①.6). Closing keyword: Fixes #30031 only; #30097 and #29951 appear as plain references with no keyword, and both rows of PR-body guards are success, the second one on the patched body (①.8). The model note is unchanged and names no model, family word or identifier; a grep of the body for claude-, the family words and "model" finds only the harness's attribution marker, the tier phrase and the product name in the footer. The 速读 block is updated to both files, both token readings and the "or" spelling, and is true. Human Minimum: eight items ticked, item 5 now true of both declaration lines in body and changeset. Correct.
  8. S3, the footer, and the check-run rows. The body ends with a blank line, ---, and the single line _Generated by [Claude Code](https://claude.ai/code/session_01J8VVAjSbVpQUeFNuTTm3me)_, the session-URL form AGENTS.md L432 names for PR bodies and the shape FOOTER_LINE (record-recognisers.mjs L1359) accepts; the harness's bare link plus bare URL tail is gone. Resolved. Because the body was patched and the PR retitled after CI first ran on the head, PR Automation and PR-Body Guards re-ran on the edited event: four names now carry two rows each (Auto Label, Check PR Size, Check Changeset, PR-body guards). On the rerun Auto Label and Check PR Size are skipped by their own github.event.action != 'edited' conditions (pr-automation.yml L154, L228: the labels and the size do not move on a body edit), and Check Changeset and PR-body guards ran to success; the first-run rows of all four are success. Nothing failed on either run.
  9. Review state on this head. The PR thread carries the seat's Contract-review-claim: for 0f1ccae (6635078051), the full review (6634141370, unedited) and the claim for the prior head; no record on this head yet; reviews: 0; draft, auto_merge null, mergeable true, mergeable_state unstable at the first read (the rerun's Check Changeset row was still in progress); no assignee or requested reviewer; labels documentation, size/s, tooling, no skip-changeset. Tier H (skills/** ×2); this record does not lift the landing.

② Semver level

Unchanged: patch, and the changeset still says patch. The delta is one line in each of two published skills (@objectstack/skills ships skills/** through sync-catalog.mjs) plus the changeset's own prose; no packages/** path, no TypeScript, no protocol key, no skip-changeset. Clause-②: no, Metadata-protocol: none on both the body and the changeset; Check Changeset success on the head and check-empty-changeset exit 0 here.

③ Boundary flags

  • S1 of 6634141370: resolved in the spelling offered, measured at 3410 / 3411 (①.2, ①.4); the body's stale "[PLANNED]" reason is replaced by a true account of what moved and when (①.7).
  • S2 of 6634141370: resolved on this PR rather than a follow-up card, which the seat's widened claim (6634167280) put on the card before the commit; the cell is true against the renderer and the ratchet headroom went from 0 to 4 (①.3, ①.4).
  • S3 of 6634141370: resolved; the body carries the one-line session-URL footer under a rule (①.8).
  • Dev open_questions: none in the body. Reading notes only: the "A, B, C or D" list can be read flat without being false (①.2); L101 is a long ragged line that no gate prices (①.4).
  • Independence: PR author objectstack-fleet[bot], commit author Claude on all three commits, commit session ≠ reviewing session; no off-relay author note is owed. No review seat is seated (6635078051); no assignee, requested reviewer or review on the PR.
  • Tier H: every check-run on the head has completed, the two required floors (Lint & Repo Gates, TypeScript Type Check) among the successes; landing is the maintainer's hand or an authorized GOVERNED_APPROVERS approval, not this record.
  • The [PLANNED]-to-LIVE flip in fix(console): the record header reads placedActions, so a packaged sys_user header action draws again (#29951) #30097 touched content/docs/** and the spec but no skills/** file; with this PR both skills that teach placedActions agree with the spec and the renderer, and the head's sweep finds no third place that calls the key undrawn.

④ Design judgment

Per hits file, for the delta only:

  • skills/objectui/guides/page-builder.md L101: naming placedActions: true as the alternative to actions, and nothing more, is the smallest true sentence. It adds the one live way to fill the action slot that the sentence lacked, keeps the parenthetical a title-row list rather than a key catalogue (the chrome switches stay out, as the full review's ④ held), and spends 6 tokens of a 7-token headroom with no ceiling move. "Or" is the spec's own relation between the two keys (the .refine), so the sentence teaches the refusal in passing without a second clause. Holds.
  • skills/objectstack-ui/rules/pages.md L46: deleting ; not drawn yet and leaving "(all placed)" is the right cut. The catalogue row's job is one line per type; "all placed" is the shortest true gloss of placedHeaderActions, and the spec's describe is where the long form lives. Nothing was added to say when it went live, which is history the skill's reader does not need. Holds.
  • Changeset: the prose names both files and the refusal, and drops the sentence ("No other text changes") that would have become false. Holds.

Must-fix: none. Should-fix: none remaining — S1, S2 and S3 of 6634141370 are all resolved on this head.

Check-runs at record time: 60 check-runs on 0f1ccae at the second read, 50 success, 10 skipped, 0 failure, 0 in progress; the first read had 60 runs, 49 success, 10 skipped, 1 in progress (the rerun's Check Changeset row, success by the second read). Four names carry two rows because PR Automation and PR-Body Guards re-ran on the body edit (①.8); the ten skipped are Build Docs, UI Published Artifacts, Dogfood Verify CLI, Temporal Conformance, Schedule gate, 18.x upgrade harness, Packed-tarball smoke, the matrix-templated Dogfood placeholder row, and the rerun's Auto Label and Check PR Size. Success includes both required floors (Lint & Repo Gates, TypeScript Type Check), every Lint and Type Check lane, Build Core, Build UI Deps, Test Core and its two shards, Test UI and its sixteen shards, Type Check UI, Lint UI, Build & E2E UI, Live E2E UI, Dogfood Regression Gate, Governed Surface Queue Guard, Plan Test Core shards, PR-body guards (both rows), Check Changeset (both rows), Check PR Size and Auto Label (first rows), filter. Combined status pending (statuses API, 0 statuses). Draft, auto_merge null, mergeable true, mergeable_state unstable at the first read; Tier H (skills/**), landing by the maintainer's hand or an authorized approval, not by this record.

Implemented-by: claude/project-thread-5c51ya
Reviewed-by: session_01J8VVAnMUWA9rufXzFaEh4J

VERDICT: PASS


Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#1 · huangyiirene · session_01J8VVAnMUWA9rufXzFaEh4J

维护者速读

  • 改了什么: skills/objectui/guides/page-builder.md L101 的 page:header 标题行去掉已退役的 breadcrumb,改为 (title, subtitle, actions 或 placedActions: true);skills/objectstack-ui/rules/pages.md L46 去掉 placedActions: true 的「not drawn yet」。附 '@objectstack/skills': patch changeset。
  • 为什么改: breadcrumb 自 spec 17 起是 retiredKey 墓碑,作者写了会被拒(skills(objectui): page-builder guide still teaches the retired page:header key breadcrumb #30031);placedActions 已由 fix(console): the record header reads placedActions, so a packaged sys_user header action draws again (#29951) #30097 上线,渲染器在画它,两份指南都应按已上线来教。
  • 风险与回滚: 只改两行技能文字和 changeset;page-builder 3410 / 3411、pages 5665 / 5669 token,天花板未动,无 re-wrap。可整 PR revert。
  • 先看: page-builder.md L101 与 pages.md L46。
  • 两分钟验证: 对照 PageHeaderProps 的 .refine(placedActions: true 与 actions 列表不能并存)读 L101 的「或」。
  • 需要你做的: skills/** 是受治理 Tier H 面,需 os-zhuang 或 hotlong 批准。契约复核:全量 6634141370(PASS,三处建议)→ delta 6635380355(PASS,建议全部解决),Head-sha 0f1ccaec8d7f59992b9f87c69ae767edc823110c。批准后本席落地。
  • 席位意见: ACCEPT。

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

  1. 形态: draft → main,Fixes #30031;作者 objectstack-fleet[bot];三个文件都在认领面内(含加宽评论里的 pages.md L46),附 @objectstack/skills patch changeset(⛔ 不挂 skip-changeset)。
  2. 前提实测: 复核对过 main 上 PageHeaderProps 的墓碑、.refine 与 describe,以及 containers.tsx 对 placedActions 的读取;skills/objectui/** 里已无 breadcrumb 与 showStar。
  3. 门禁(钉 head 0f1ccaec): check-runs success 50 / skipped 10,无失败、无进行中,两条必需底线均绿。派生门禁 44 条全过(--ran 记录在 PR 正文)。
  4. 接受的偏差: 开发在低于规定档位的模型上进行,依维护者原话(无额度时豁免)。
  5. 范围外去向: 无。
  6. 落地条款: Tier H。保持 draft,挂 needs-user-decision,同轮请 os-zhuang、hotlong 审批;获批后本席过落地前检、清标、ready、auto-merge;维护者直合亦可。

Generated by Claude Code

…-5c51ya

# Conflicts:
#	skills/objectstack-ui/rules/pages.md
…n the diff

main already carries the pages.md catalogue fix, so the changeset prose
names page-builder.md only.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01J8VVAjSbVpQUeFNuTTm3me
@objectstack-fleet objectstack-fleet Bot changed the title docs(skills): page:header guides drop the retired breadcrumb and teach placedActions as live docs(skills): page-builder guide drops the retired page:header breadcrumb and names placedActions Nov 4, 2026
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#1 · huangyiirene · session_01J8VVAnMUWA9rufXzFaEh4J

Contract-review-claim: session_01J8VVAnMUWA9rufXzFaEh4J · head 1614562 · 2026-11-04T20:43Z

Delta review against the PASS at head 0f1ccae (comment 6635380355), after the queue dropped the PR as dirty. The delta is a hand merge of main that keeps main's pages.md L46 from PR #30127, plus one commit narrowing the changeset, plus the PR body. The seat review runs at CONTRACT_REVIEW_TIER in an isolated subagent.


Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#1 · huangyiirene · session_01J8VVAnMUWA9rufXzFaEh4J

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 1614562113dacabdd474c47406b9ffe0bc221f87
Local-runs: probe — on a detached worktree of the head under the scratch dir (merge-base with origin/main now 9a53fc9, which is also origin/main as fetched: main has not moved past the merge-base; the twenty-two main commits between the prior merge-base 28ce3d1 and 9a53fc9 touch skills/objectstack-ui/rules/pages.md once, in 7bafab3 = PR #30127, plus two eval files under skills/objectstack-ui/evals/ and one platform eval, and none of them touches packages/spec/src/ui/component.zod.ts, ui/packages/components/src/renderers/layout/containers.tsx, ui/packages/types/src/ui-action.ts, the ratchet script or this PR's changeset): git merge-tree --write-tree <origin/main> <head> (a tree, no conflict lines, exit 0); git merge-tree --write-tree of the merge commit's two parents (the mechanical merge conflicts in pages.md, three stages listed, which is what the dev resolved by hand); git diff --numstat of the net diff against the merge-base, of the merge commit against main and against its first parent restricted to the PR files, of the narrowing commit, and of the head against main outside the two PR files (empty); git rev-parse of the page-builder.md and pages.md blobs on 28ce3d1, 0f1ccae, main and the head; node scripts/check-skills-token-ratchet.mjs on the head (exit 0: skills/objectui/guides/page-builder.md 3410 / 3411, headroom 1; skills/objectstack-ui/rules/pages.md 5668 / 5669, headroom 1, main's own line) and --self-test (exit 0, 97 cases); node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack (44 commands; sorted, identical to the dev record's 44); node scripts/check-commit-card-trailers.mjs --range <merge-base>..HEAD (exit 0, five commits) and --range 31fbfb98..HEAD (exit 0, the one new non-merge commit); node scripts/pm/check-governed-merges.mjs --branch HEAD and --pr 30115 (both GOVERNED, Tier H, 1 of 2 paths hits skills/**, 12 changed lines, head repo = base repo on the --pr read); node scripts/check-empty-changeset.mjs --base <merge-base sha> (exit 0, one declaring changeset added, none from the merge-base modified); node scripts/check-changeset-no-major.mjs --base <merge-base sha> (exit 0, level axis not applicable locally); node scripts/pm/check-skill-id-lint.mjs (110 files clean, exit 0); node scripts/check-skill-identifier-liveness.mjs (486 citations over 71 published files, exit 0); wc -c / wc -l on both files on four trees; grep -rni 'breadcrumb\|showStar' skills/objectui/ (no match, exit 1) and grep -rn 'not drawn yet\|PLANNED' skills/ (no match) on the head; grep of the PR body, title, changeset and the two new commit messages for model identifiers and family words; gh api REST reads of the PR three times, its files, commits, reviews, comments and timeline, card #30031 and its comments, PR #30127 and its files, the workflow runs behind the duplicated check-run rows, the head's check-runs twice (paginated, per_page=100) and combined status. check-closing-keyword-parity.mjs and check-doc-authoring.mjs were not run (no node_modules under the worktree; read from CI). The worktree and the two scratch fetch refs it used were removed after the runs and the main checkout was not touched; no GitHub write of any kind.
Scope: skills/objectui/guides/page-builder.md L101 (the one governed hit, unchanged from the reviewed head) + read, not reviewed: .changeset/30031-page-builder-header-breadcrumb.md (the prose face, before and after the narrowing commit), skills/objectstack-ui/rules/pages.md L46 on main and on the head (identical blobs; the line PR #30127 wrote), the merge commit 31fbfb9's resolution of that file, PR #30127's diff (pages.md +1/−1, two eval files, its own changeset .changeset/29951-skills-placed-actions-drawn.md), packages/spec/src/ui/component.zod.ts and ui/packages/components/src/renderers/layout/containers.tsx (confirmed byte-identical on main between the prior merge-base and this one, so the readings in 6635380355 ①.2–3 stand), scripts/check-skills-token-ratchet.mjs L880 and L1042 on main (the two ceiling rows, unmoved), .github/workflows/pr-automation.yml (the edited trigger and the two != 'edited' job conditions), AGENTS.md L427–450 (footer forms, model-identifier rule), card #30031 body and comments 6632893302, 6634167280 and 6640830762 (the seat's status note on the queue drop), PR #30115 body and title as they read live, its comments 6634141370, 6635078051, 6635380355 (the delta review being continued; its posted text equals the scratch record but for the platform's trailing newline) and 6635496280 (the seat's ACCEPT note, pinned to 0f1ccae), the dev gate record pr-30031/gates-16145621.txt and the body copy pr-30031/body.md (read as input)
Delta review of 6635380355 on 0f1ccae

Reviewer: the same isolated contract reviewer at CONTRACT_REVIEW_TIER, read-only on GitHub (REST reads only; nothing written, pushed or commented). The full review on d93cef6 (6634141370, PASS) and the delta on 0f1ccae (6635380355, PASS, nothing outstanding) stand as read; this record judges only the delta 0f1ccaec..16145621 with the files main brought in through the merge set aside, and the PR body and title as they now read. The dev gate record was read as input, not as conclusions. No environment variable value is printed anywhere in this record, and no clock time is typed.

① Derived judgments

  1. Delta surface. Two new commits on top of 0f1ccae: 31fbfb98, a two-parent merge of origin/main at 9a53fc9 into the branch (no rebase; the three earlier commits are unchanged and the PR still shows five), and 16145621, author and committer Claude, subject "docs(skills): scope the page-builder changeset to the one file left in the diff", trailers Co-Authored-By: Claude <noreply@anthropic.com> + Claude-Session:, no model identifier, the same session as the earlier commits. The merge commit's message records the one conflict (skills/objectstack-ui/rules/pages.md); the mechanical three-way merge of its parents confirms it (base 28ce3d1's "(all placed; not drawn yet)", ours 0f1ccae's "(all placed)", theirs main's "(all placed, read live)"), and the dev resolved it to main's blob: pages.md on the head is the same object as on main (68fbee9c), 22670 bytes, 427 lines. Against main, the merge commit differs in exactly the two PR files and nothing else, and so does the head (git diff <main> <head> outside the two files is empty). The narrowing commit touches only the changeset (−1 line). Net diff against the merge-base: .changeset/30031-page-builder-header-breadcrumb.md +10/−0 and skills/objectui/guides/page-builder.md +1/−1, which is what the REST file listing (+11/−1, 2 files) and check-governed-merges (12 lines, 1 of 2 paths on the register) both read. git merge-tree --write-tree of current origin/main and the head writes a tree with no conflict output: the queue's dirty reading is cleared on this head. On surface; nothing came in from main that the PR did not already carry, and nothing of main was dropped. Correct.
  2. L101 and the whole of page-builder.md. The head's page-builder.md is the same blob as 0f1ccae's (603d5a4d), 13639 bytes, 349 lines; L100–101 still read "a title row (title, subtitle, actions or placedActions: true) that takes no children", and against main the file's one changed line is still the `breadcrumb`, `actions`) → `actions` or `placedActions: true`) replacement. The spec and the renderer that line is judged against are byte-identical on main between the prior merge-base and this one (component.zod.ts, containers.tsx, ui-action.ts untouched by the twenty-two commits), so every reading in 6635380355 ①.2 — the LIVE docblock, the describe, the .refine refusing true beside actions, the renderer's read and placedHeaderActions — holds on this merge-base without re-measurement. Ratchet 3410 / 3411 (headroom 1), ceiling row L1042 unmoved, ratchet script not in the diff, no re-wrap (the file is unchanged). Unchanged and still true. Correct.
  3. pages.md, now main's. L46's cell reads "(all placed, read live)", the wording PR docs(skills): objectstack-ui says placedActions is drawn, with an eval (#29951) #30127 (card console(record header): a url action placed at record_header on sys_user no longer renders in the 18.3 Console header menu, drawer or full page (18.2 rendered it) #29951) merged to main after this PR's prior head was reviewed and before the queue tried to merge it. It is true against the same renderer (placedHeaderActions is every placed action, read from the object's metadata at render), it is a superset of the "(all placed)" the prior head wrote, and it costs 5668 / 5669 tokens (headroom 1) on main, which is main's own ratchet position and not this PR's to pay or to judge. The PR no longer changes the file; the one thing to check is that the merge took main's line rather than this branch's, which ①.1 confirms by blob identity. The sweep on the head finds "not drawn yet" and "PLANNED" nowhere under skills/, and placedActions is now named in pages.md L46, in the two objectstack-ui eval files docs(skills): objectstack-ui says placedActions is drawn, with an eval (#29951) #30127 added, and in page-builder.md L101, all as live. Correct, and out of this PR's surface.
  4. Changeset. Frontmatter still '@objectstack/skills': patch; Clause-②: no and Metadata-protocol: none still line-initial (L7–8); the title line "docs(skills): the page:header title row drops the retired breadcrumb and names the live placedActions: true" is true of page-builder.md alone; the one remaining bullet is unchanged from the reviewed head and still true sentence by sentence (the tombstone, the props-lint refusal, "The row now lists title, subtitle, actions or placedActions: true; the last two are refused together" — the .refine, ①.2). The removed bullet was the pages.md note, which would have claimed a change this PR no longer makes; the fact it recorded ("reads it since fix(console): the record header reads placedActions, so a packaged sys_user header action draws again (#29951) #30097 and draws every action … placed at record_header / record_more") lives in docs(skills): objectstack-ui says placedActions is drawn, with an eval (#29951) #30127's own changeset on main (29951-skills-placed-actions-drawn.md, also '@objectstack/skills': patch), so the release notes lose nothing. Ten lines, one declaring changeset added, none from the merge-base modified (check-empty-changeset exit 0); Check Changeset success on the head, twice (①.7). Correct.
  5. Gates. dispatch-gates --commands derives 44 on the head; sorted, identical to the dev record's 44, and that record is byte-identical to the two earlier records (the same 44 commands, all :: exit 0; the derivation keys on skills/** plus a changeset and does not change when the second skill file leaves the diff). Re-run here at exit 0: the ratchet and its self-test, check-empty-changeset, check-changeset-no-major, check:pm-skill-id-lint, check:skill-identifier-liveness, check:pm-governed-merges (GOVERNED by design); check:doc-authoring and check-closing-keyword-parity need node_modules and are read from CI, where every Lint lane is success on the head. check-commit-card-trailers --range <merge-base>..HEAD: exit 0, "5 commit message(s) … carry no card relation and no model identifier in the trailer pair"; the same on the one new non-merge commit. The body's "44 derived, 44 run with exit 0, 0 NOT MEASURED", "derived 44 commands for the two changed files" and "--range origin/main..HEAD: exit 0 (5 commits)" reproduce; the install-and-build sentence is the dev record's own account and nothing measured here contradicts it. Correct.
  6. PR body and title, live. Title retitled to "docs(skills): page-builder guide drops the retired page:header breadcrumb and names placedActions": one file, no #, no model word; it matches the net diff. Body, claim by claim: the L101 bullet and quoted sentence (①.2); "The rest of the file is byte-identical to main" (①.2); the changeset bullet "its prose naming page-builder.md only" (①.4); the new paragraph — "An earlier head of this PR also changed … pages.md L46 … PR docs(skills): objectstack-ui says placedActions is drawn, with an eval (#29951) #30127 (console(record header): a url action placed at record_header on sys_user no longer renders in the 18.3 Console header menu, drawer or full page (18.2 rendered it) #29951) landed that fix on main ("(all placed, read live)"). The merge of main into this branch took main's line as is, so pages.md is no longer in this PR's diff" — true in every clause (①.1, ①.3; 7bafab3 is on main and not an ancestor of 0f1ccae); "Read off main at 9a53fc9f (merged into the branch, no rebase)" (①.1); the live-key list, the tombstones, the quoted describe, the .refine sentence and the renderer sentence are unchanged from the reviewed body and still true on this merge-base (①.2); the chrome-key and sweep sentences (unchanged, re-confirmed); "Token ratchet. page-builder.md: 13628 → 13639 bytes, 3410 tokens (ceiling 3411, headroom 1). No ceiling row moves, nothing was re-wrapped, and no payment is owed" (①.2; the pages.md figures are rightly gone); "Head 16145621: on top of 0f1ccaec, a merge of origin/main at 9a53fc9f (31fbfb98, pages.md resolved to main's line) and one commit scoping the changeset prose" (①.1); the gates block (①.5). The Why paragraph now says the guide "did not name placedActions after fix(console): the record header reads placedActions, so a packaged sys_user header action draws again (#29951) #30097 made the header draw it", which is the PR's own second change and true. Closing keyword: Fixes #30031 only; #30097, #29951 and #30127 appear as plain references with no keyword, and both PR-body guards rows are success, the second on the patched body (①.7). The model note is unchanged and names no model, family word or identifier; a grep of the body finds only the harness's attribution marker, the tier phrase and the product name in the footer. The 速读 block now describes one file and one line, 3410 / 3411, and is true. The footer is the single session-URL line under a rule, as 6635380355 ①.8 read it. Human Minimum: eight items ticked; item 5 true of both declaration lines in body and changeset. Correct.
  7. Check-run rows and the body-edit rerun. Because the body was patched and the PR retitled after CI first ran on the head, PR Automation and PR-Body Guards re-ran on the edited event: four names carry two rows (Auto Label, Check PR Size, Check Changeset, PR-body guards); on the rerun Auto Label and Check PR Size are skipped by their own github.event.action != 'edited' conditions and Check Changeset and PR-body guards ran to success; all first-run rows are success. The one in-progress run at the first read (the rerun's Check Changeset) completed success by the second. Nothing failed on either run.
  8. Review and landing state on this head. Draft false (the maintainer os-zhuang marked it ready and enqueued it at 0f1ccae; the queue removed it as dirty after docs(skills): objectstack-ui says placedActions is drawn, with an eval (#29951) #30127 landed, which is the state 6640830762 reports), auto_merge null, mergeable true, mergeable_state unstable at the first read and clean at the second; requested reviewers hotlong and os-zhuang; reviews 0; labels documentation, size/s, tooling, needs-user-decision; no skip-changeset. The PR thread carries the seat's reviews and claims for the two earlier heads and no claim or record for 1614562 yet. Tier H (skills/** ×1); this record does not lift the landing.

② Semver level

Unchanged: patch, and the changeset still says patch. The net diff is one line in one published skill (@objectstack/skills ships skills/**) plus the changeset's own prose; no packages/** path, no TypeScript, no protocol key, no skip-changeset. Clause-②: no, Metadata-protocol: none on both the body and the changeset; Check Changeset success on the head and check-empty-changeset exit 0 here. #30127's sibling changeset is a second @objectstack/skills patch on main, not a conflict.

③ Boundary flags

  • Nothing from 6635380355 was outstanding; the delta is the queue's dirty reading, cleared by a hand merge that takes main's pages.md line (①.1, ①.3) and a changeset narrowed to match (①.4). Both are the smallest true change.
  • Dev open_questions: none in the body. Reading note: the body's 速读 says the seat handles ready and the queue ("席位处理 ready 与合并队列"). The PR is Tier H and the maintainer's own acts on it (ready, enqueue) were made on 0f1ccae; whether that enqueue stands as the maintainer's hand for a head that has since merged main and edited a changeset is a seat-and-maintainer question under AGENTS.md, not a question about the diff, and this record neither answers it nor lifts the landing. The needs-user-decision label and the two requested reviewers are on the PR for that purpose.
  • The seat's ACCEPT note 6635496280 pins head 0f1ccae and describes two changed files and 50 / 10 check-runs on that head; it is a comment about the prior head, true of it, and not the body. The body carries the current account (①.6).
  • Independence: PR author objectstack-fleet[bot], commit author Claude on all five commits, commit session ≠ reviewing session; no off-relay author note is owed. No review seat is seated; reviews 0.
  • Tier H: every check-run on the head has completed, both required floors (Lint & Repo Gates, TypeScript Type Check) success, mergeable_state clean at the second read; landing is the maintainer's hand or an authorized GOVERNED_APPROVERS approval, not this record.

④ Design judgment

Per hits file, for the delta only:

  • The merge resolution: keeping main's "(all placed, read live)" over the branch's "(all placed)" is right twice over — it is the line already published from main, and it says one more true thing. Carrying the branch's shorter cell would have re-opened a settled line for no gain and left a one-line diff against main in a file this card no longer needs to touch. Holds.
  • The changeset: dropping the pages.md bullet rather than rewording it keeps the changeset a description of this PR's diff, which is what a release note is for; the dropped fact is already on main in docs(skills): objectstack-ui says placedActions is drawn, with an eval (#29951) #30127's changeset. Keeping the title line unchanged is right because it was about page-builder.md all along. Holds.
  • page-builder.md: untouched in this delta; the judgment in 6635380355 ④ stands.

Must-fix: none. Should-fix: none.

Check-runs at record time: 60 check-runs on 1614562 at the second read, 50 success, 10 skipped, 0 failure, 0 in progress; the first read had 60 runs, 49 success, 10 skipped, 1 in progress (the body-edit rerun's Check Changeset row, success by the second read). Four names carry two rows because PR Automation and PR-Body Guards re-ran on the body edit (①.7); the ten skipped are Build Docs, UI Published Artifacts, Dogfood Verify CLI, Temporal Conformance, Schedule gate, 18.x upgrade harness, Packed-tarball smoke, the matrix-templated Dogfood placeholder row, and the rerun's Auto Label and Check PR Size. Success includes both required floors (Lint & Repo Gates, TypeScript Type Check), every Lint and Type Check lane, Build Core, Build UI Deps, Test Core and its shards, Test UI and its shards, Type Check UI, Lint UI, Build & E2E UI, Live E2E UI, Dogfood Regression Gate, Governed Surface Queue Guard, Plan Test Core shards, PR-body guards (both rows), Check Changeset (both rows), Check PR Size and Auto Label (first rows), filter. Combined status pending (statuses API, 0 statuses). Not a draft, auto_merge null, mergeable true, mergeable_state unstable at the first read and clean at the second; requested reviewers hotlong, os-zhuang; Tier H (skills/**), landing by the maintainer's hand or an authorized approval, not by this record.

Implemented-by: claude/project-thread-5c51ya
Reviewed-by: session_01J8VVAnMUWA9rufXzFaEh4J

VERDICT: PASS


Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#1 · huangyiirene · session_01J8VVAnMUWA9rufXzFaEh4J

维护者速读

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

  1. 形态: → main,Fixes #30031;作者 objectstack-fleet[bot];对 main 的净 diff 为 page-builder.md +1 / −1 与 changeset,pages.md 与 main 字节一致。
  2. 前提实测: git merge-tree 对当前 main 无冲突;placedActions 的 spec 与渲染器文件在两次合入基之间未变,前轮读数仍成立。
  3. 门禁(钉 head 16145621): check-runs success 50 / skipped 10,无失败、无进行中,两条必需底线均绿;mergeable_state clean。派生门禁 44 条全过,提交 trailer 五笔全过。
  4. 接受的偏差: 开发在低于规定档位的模型上进行,依维护者原话(无额度时豁免)。
  5. 范围外去向: 无。
  6. 落地条款: Tier H。保留 needs-user-decision,同轮重新请 os-zhuang、hotlong;获批后本席过落地前检、ready、auto-merge;维护者直接入队亦可。

Generated by Claude Code

@os-zhuang
os-zhuang added this pull request to the merge queue Nov 5, 2026
Merged via the queue into main with commit 07595c0 Nov 5, 2026
60 checks passed
@os-zhuang
os-zhuang deleted the claude/project-thread-5c51ya branch November 5, 2026 00:47
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

Development

Successfully merging this pull request may close these issues.

skills(objectui): page-builder guide still teaches the retired page:header key breadcrumb

2 participants