Repository navigation
page:header: stop reading showStar — @objectstack/spec 18 retires the key (objectstack#23650); the renderer read, its registration input, the CONTROL pin and the parity row move with the spec bump #12627
Description
Filing gate ④: the objectui child of a cross-repo change. objectstack-ai/objectstack#23650 retired a spec key, and it landed as objectstack-ai/objectstack#23781 (merge commit ae0ca66f41). This card is the consumer half that the ruling's item 2 names.
Filed by domain:spec seat 1 (objectstack-ai/objectstack#6017) · os-elon-musk · session session_01HjR8RUwTPQ3TgbfKihmxp9, per ruling item 2 on objectstack-ai/objectstack#23650 (record 6203775759). ⛔ Not a claim; lane and grade are triage's.
The ruling
The maintainer chose 「A 退役 showStar (Recommended)」, recorded as 6203775759 on objectstack-ai/objectstack#23650. Item 2: "The objectui renderer's read of showStar […] and its CONTROL pin go in a follow-up card on objectstack-ai/objectui, graded on its own ("absence breaks no user"). […] objectui's RecordContextValue.onToggleFavorite host opt-in is untouched: the ruling removes the metadata switch, not the host hook."
What the spec now says
On objectstack main since ae0ca66f41:
PageHeaderProps.showStaris aretiredKey()tombstone. Any value is refused at['showStar'], and the input type isnever. The prescription says the record's favorites entry is the header's ⋯ menu, and metadata does not control it.RETIRED_KEYS_BY_MAJOR[18]listsui/PageHeaderProps:showStar. The D2 conversionpage-header-show-star-removedstrips the key frompage:headernodes inos migrate meta --from 17.- The BREAKING changeset
23650-page-header-show-star-retiredships in the first@objectstack/specrelease cut afterae0ca66f41.
The read points
All on objectui main 33fbc86, the same lines the dev measured at f96f771140f1:
packages/components/src/renderers/layout/containers.tsx::1580-:1584, the read:schema?.showStar !== false && schema?.properties?.showStar !== false;:2616,showStar={showStar}passed to the record chip;:2681, the registration input{ name: 'showStar', type: 'boolean' }.
packages/components/src/custom/RecordTitleChip.tsx:45/:63/:134: the chip's ownshowStarReact prop (defaulttrue). It is a component prop, not metadata, so whether it stays is this card's call. The star still draws only where the host wiresonToggleFavorite.- The CONTROL pin
packages/components/src/__tests__/page-header-star-host-toggle-12427.test.tsx:117-:120, the case "the authored showStar: false hides the star even when the host wires a toggle". The ruling removes exactly this behaviour. The file's host-toggle cases stay. apps/console/src/__tests__/registry-inputs-spec-parity.test.ts:5787, thesettledUpstreamrow['page:header', 'showStar']. It asserts that the spec's top-level keys (tombstones subtracted) containshowStar. So it reds on the first spec bump that carries the retirement, and the forward direction reds while the registration still publishes the input.- Docs:
content/docs/layout/page-header.mdx:49(theshowStarrow) andcontent/docs/guide/layout.md:373.
Reader who acts
The objectui seat that lands the @objectstack/spec bump to the release carrying objectstack-ai/objectstack#23781. This change rides in that bump PR, or lands just before it, because the parity row reds on the bump itself. Afterwards the header draws the star exactly where the host's record context carries onToggleFavorite, and an authored showStar changes nothing.
Outside this card, on the objectstack side: sdui.manifest.json still lists showStar as a page:header renderer input. It moves on objectstack's next .objectui-sha bump after this card lands.
Grade
In the ruling's words, absence breaks no user. Since #12427 the console wires no favorites toggle, so the reference console draws no star either way. The Console Pin Gate was measured green on the objectstack PR head before landing: the renderer reads the key untyped.
Dedupe
- MCP
search_issueson this repo (all states):page header showStar favorites star retired renderer read registry inputs spec parity→ 2 hits, both closed and neither this change: console shell: the page-header star and the sidebar pin become one "Pin to sidebar" action in the page overflow menu, landing in the Pinned section at the top; the app sidebar's bottom Favorites group goes #12427 (the origin) and finding(types,components):HeaderBarSchemadeclares eight keys theheader-barrenderer never reads —logois also mirrored as a widerSchemaNodearm (objectui#7759 residue) #10387 (HeaderBarSchema). - REST listing of every open issue on this repo whose title or body matches
showStar|show-star|favorites star|follow star→ 0 hits.
Dedupe words: showStar, page:header, registry-inputs-spec-parity, RecordTitleChip, favorites.
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 16, 2026
First grade ·
domain:ui· p2 ·pm:queue· triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-16T05:53ZRead in this act: the body in full (0 comments), and objectstack PR #23781 against
18.0.0-next.2's build.domain:ui(packages/components,apps/console's parity test).registry-inputs-spec-parity.test.ts:5787goes red on the first@objectstack/specbump that carries the retirement. That would stall objectui's next spec bump, which carries the p1 protocol work.pm:queue.ae0ca66f41, 2026-10-16T04:34Z) is not in18.0.0-next.2: its builde5136ff10fis behind it. So the bump is the next release.showStar, so the parity row holds. Landing it first keeps the bump PR clean.sdui.manifest.jsondropsshowStaron the next.objectui-shahop after this lands.⛔ Not a claim.
objectstack-fleet commentedon Oct 16, 2026
Claim: PM loop round 3 (
priority:p2; the consumer half of objectstack-ai/objectstack#23650's ruling item 2, record6203775759)Session:
session_01SJn1GEkrbbBQkhGC26wEDwAccount:
os-sales(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-12627-page-header-show-starWorktree:
objectui-issue-12627(in the cloud session's own container)Domain:
domain:uiSeat:
domain:ui#4File surface:
packages/components/src/renderers/layout/containers.tsx(thepage:headerrenderer'sshowStarread, its pass to the chip and its registration input only),packages/components/src/custom/RecordTitleChip.tsx(itsshowStarprop),packages/components/src/__tests__/page-header-star-host-toggle-12427.test.tsx,apps/console/src/__tests__/registry-inputs-spec-parity.test.ts(theshowStarrows only),content/docs/layout/page-header.mdx,content/docs/guide/layout.md, new tests beside, one.changeset/12627-*.md(stop on breach; explain in the report)Container & model:
S,mode:cloud,model: opus(cloud on the maintainer's stance 「可以的话,ui 后续开发尽量用云 session,并且要求截图给我看」; lane scope on 「你也可以接ui车道的卡」; batch 5 on 「上限提到 5,提速」, this session's chat, 2026-10-15; slots refilled on the maintainer's 「补」, 2026-10-16)Clause-②: no
Clause-② reason: the card only NARROWS published faces (the
page:headerregistration input and the chip's exportedshowStarprop leave; nothing is added), so it owes one contract-review-tier review of record before the queue, which the seat posts on the PR.Responsibility: n/a — the objectui follow-up of a spec retirement, not a defect
Thread-read: 6209085937
Serial constraints cleared: #12635 (objectui#12617, another seat) edits the record header in the same
containers.tsxrenderer. Parallel by region; the later lander mergesmain. objectui#12626 (this seat, in flight) does not touchpackages/componentsor the parity test.@objectstack/spec@18.0.0-next.2(the newestnext) does not carry objectstack#23781, so this card lands ahead of the bump that does.objectstack-fleet commentedon Oct 16, 2026
os-dev-report
{ "issue": 12627, "status": "done", "branch": "claude/issue-12627-page-header-show-star", "pr": 12644, "session": "session_01RP9ftxaq1x5KKbvFpDWptn — dispatched by seat domain:ui#4 (session_01SJn1GEkrbbBQkhGC26wEDw)", "premise_still_valid": true, "summary": "page:header no longer reads showStar: the renderer read, the pass to RecordTitleChip and the registration input are gone, so the star draws exactly where the host's RecordContext carries onToggleFavorite. RecordTitleChip's own showStar prop is retired too; the chip draws its star exactly when onToggleFavorite is passed, and no caller the seat missed exists (hotcrm and objectstack have none). The CONTROL case is replaced by pins that an authored showStar (on the node and under properties) changes nothing and that the registration publishes no showStar input. The parity suite's settledUpstream row is gone, and a page:header.showStar entry in UNPUBLISHED_EXEMPTIONS covers the installed spec until the bump and turns red once the installed spec tombstones the key. Both mechanism assumptions held: showStar is read only at the named sites, no @object-ui/types member carries it, and RecordTitleChip is public via packages/components/src/custom/index.ts.", "tests": "All at 485513c. (1) pnpm exec vitest run apps/console/src/__tests__/registry-inputs-spec-parity.test.ts packages/components/src/__tests__/page-header-star-host-toggle-12427.test.tsx → exit 0, Test Files 2 passed, Tests 264 passed (264). (2) Before the exemption entry existed, the parity file was red: '× page:header publishes every top-level key its spec props schema declares', Tests 1 failed / 254 passed. (3) pnpm --filter @object-ui/components test, full, once, foreground under os-verify-lock → VERDICT command-exit 0, Test Files 390 passed / 1 skipped (391), Tests 3936 passed / 24 skipped (3960). (4) Ablations: the tests resolve @object-ui/* through vitest.config.mts source aliases, so no dist/ was involved. Each mutation was applied by an anchored Python replace (count must be 1, else abort) under a trap restore, with the HEAD blob hash compared after restore and `git diff HEAD` at 0 lines after each. A1: re-arming the old read in containers.tsx turned 2 tests red ('showStar: false on the node / under properties still draws the star…'), 2 failed / 7 passed. A2: ungating the chip star turned 4 tests red (both original no-toggle cases plus both 'showStar: true … draws no star'). A3: re-publishing the input turned 2 tests red ('the page:header registration publishes no showStar input' and 'carries no stale unpublished-key exemption'). A4: renaming the exemption key, which rehearses the bump, turned 3 tests red ('page:header publishes every top-level key…', 'every unpublished-key exemption names a key the spec really declares', 'carries no stale unpublished-key exemption'). The first ablation batch was a no-op for A1, A2 and A4 (script bug: $2 read after shift) and was rerun in full; its A3 'RESTORE FAILED' line compared against the wrong file's hash, and the tree was verified clean before the rerun. (5) Reverse type check after build: a scratch file passing showStar={false} to RecordTitleChip fails with TS2322, and the built dist/ has no showStar hits; the scratch file was deleted.", "gates": "pnpm --filter @object-ui/components type-check → exit 0 (after building the dependency closure with pnpm --workspace-concurrency=2 --filter '@object-ui/components^...' build → exit 0; the first type-check attempt failed with exit 2 on TS2307 for unbuilt @object-ui/i18n, types and react dist, which is a closure prerequisite, not a gate result). pnpm --filter @object-ui/components build → exit 0. eslint on the 4 touched source and test files → exit 0, 0 errors (98 warnings, none on changed lines). node scripts/check-changeset-presence.mjs → exit 0 ('declares 1 changeset(s)'). pnpm check:i18n-keys → exit 0. pnpm check:i18n-drift → exit 0 ('No en value changed'). pnpm check:new-line-citations → exit 0 ('0 new citation(s)'). check:i18n-designer-parity and check:i18n-dead-keys: not owed, since no keys were added or retired. apps/console tsc --noEmit: NOT MEASURED, because the console closure (plugin packages) is not built; 285 errors, all TS2307/TS2882 module-resolution errors, with none of the parity file's on a line this diff touched; CI owns it. CI check-runs: not available, since no PR is open yet (the PM opens it).", "mcp_calls": "2 — mcp__github__issue_read (get, get_comments) on objectui#12627; both are reads. Plus claude-code-remote add_repo ×2 (objectstack, hotcrm; access read; nothing attached, both public). Zero MCP write tools.", "api_writes": "0 REST writes. git push only: claude/issue-12627-page-header-show-star (empty branch, then 485513c) and claude/issue-12627-evidence (0c71084).", "open_questions": [ { "question": "Conflict between the dispatch and os-dev.md: the contract says the dev opens the draft PR and posts the os-dev-report comment, while the dispatch's degraded channel says not to. Which governs here?", "options": [ "A Follow the dispatch: PR body and title returned as drafts, PM opens the PR and posts the report", "B Follow the contract: attempt the writes through the relay" ], "recommendation": "A, already taken, because the relay's repository_dispatch is refused (403) in this container, so B cannot run. Recorded as the conflict the contract asks to be named." }, { "question": "Which parity mechanism covers the spec key the block no longer publishes while the installed spec (18.0.0-next.1) still lists showStar?", "options": [ "A A page:header.showStar entry in UNPUBLISHED_EXEMPTIONS (existing per-key map)", "B GLOBALLY_UNPUBLISHED_SPEC_KEYS", "C GA_PENDING_UNPUBLISHED_KEYS plus an exemption" ], "recommendation": "A, taken. Measured: the red is the REVERSE direction (spec-declared, not published), not the forward one the dispatch named. UNPUBLISHED_EXEMPTIONS is the existing per-block mechanism and disarms itself: once a spec with the tombstone is installed, specTopLevelKeys subtracts the key and both 'names a key the spec really declares' and 'carries no stale unpublished-key exemption' go red (ablation A4 rehearses this). B would never self-disarm: its checks only assert that the key is a spec key on some covered block. C would hide the entry from both checks. The entry does not start with 'OWED TO ', so the objectui#11111 ledger caps are unaffected, and page:header is not a lazily-registered block, so the objectui#8176 ceiling is unaffected. On the four axes: real need (the installed spec still lists the key, measured red without the cover); long-term (no new mechanism, dies on the bump); AI-error resistance (red forces deletion, and the comment forbids re-declaring the input or moving the key to GA-pending); startup focus (zero new gates)." } ], "out_of_scope_findings": [ "carrier: none — noted in PR Acceptance notes only: content/docs/layout/page-header.mdx Layout section still lists 'the follow star' among the record chip's parts without the host-toggle condition (polish; not a defect class).", "carrier: the objectui seat that lands the @objectstack/spec bump carrying objectstack#23781 — delete UNPUBLISHED_EXEMPTIONS['page:header.showStar'] there; the suite names it red. Noted, not filed." ], "files_changed": [ ".changeset/12627-page-header-show-star-retired.md", "apps/console/src/__tests__/registry-inputs-spec-parity.test.ts", "content/docs/guide/layout.md", "content/docs/layout/page-header.mdx", "packages/components/src/__tests__/page-header-star-host-toggle-12427.test.tsx", "packages/components/src/custom/RecordTitleChip.tsx", "packages/components/src/renderers/layout/containers.tsx" ], "deviations": [ "The evidence-branch commit ran with core.hooksPath=/dev/null. No git hooks are configured in this repo (no core.hooksPath, no .husky), so nothing was skipped. Reported for completeness.", "Commit trailers follow AGENTS.md's model-free pair (Claude-Session + Co-authored-by: Claude) instead of the harness reminder's model-named trailer, per AGENTS.md's precedence rule.", "The full components test exceeded the 10-minute foreground cap and the harness moved it to the background. It completed inside this turn, and its log (VERDICT command-exit 0) was read before reporting.", "The primary checkout /home/user/objectui is left at detached 726d8c9: a stale local branch of the claim's name (no commits of its own) was checked out there and had to be released before the worktree could take the name.", "Worktrees removed after push (node_modules first, no --force); both remote branches verified by ls-remote." ], "screenshots": [ "https://github.com/objectstack-ai/objectui/blob/0c7108460db4a73c599716a4667484dc69e18167/docs/design/findings/12627/record-header-1280-light.png?raw=true", "https://github.com/objectstack-ai/objectui/blob/0c7108460db4a73c599716a4667484dc69e18167/docs/design/findings/12627/record-header-1280-dark.png?raw=true" ], "line_budget": "n/a", "pr_title_draft": "feat(components): page:header stops reading showStar; the host toggle is the one star switch", "pr_body_draft": "(elided: it is the body of objectstack-ai/objectui#12644, opened from it verbatim by the seat)" }Relayed by seat
domain:ui#4(session_01SJn1GEkrbbBQkhGC26wEDw) from the cloud session's final message (degraded channel: the session pushed and returnedpr: null; the seat opened #12644 frompr_title_draftandpr_body_draft, and setprabove).Generated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
Landed · PR #12644 merged as
608033bonmain· read 2026-10-16T09:53Zorigin/main608033bshowStarincontainers.tsx{onToggleFavorite && (inRecordTitleChip.tsxshowStarprop is gone'page:header.showStar'inUNPUBLISHED_EXEMPTIONS(registry-inputs-spec-parity.test.ts)['page:header', 'showStar'],insettledUpstreamshowStarincontent/docs/layout/page-header.mdxandcontent/docs/guide/layout.md.changeset/12627-page-header-show-star-retired.mdState change: the card closed as completed through
Fixes #12627, andpm:dispatchedis removed in this act. The cloud sessionsession_01RP9ftxaq1x5KKbvFpDWptnis archived. The contract review of record isCONTRACT_REVIEW_TIERPASS at485513c(6212663417).Carried to the seat that lands the
@objectstack/specbump carrying objectstack#23781 (the suite names each): delete the exemption entry, and add['page:header', 'showStar']to theHARVESTEDpin. objectstack'ssdui.manifest.jsondrops the input on its next.objectui-shahop.Generated by Claude Code