Skip to content

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

Closed

Description

@objectstack-fleet

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.showStar is a retiredKey() tombstone. Any value is refused at ['showStar'], and the input type is never. The prescription says the record's favorites entry is the header's ⋯ menu, and metadata does not control it.
  • RETIRED_KEYS_BY_MAJOR[18] lists ui/PageHeaderProps:showStar. The D2 conversion page-header-show-star-removed strips the key from page:header nodes in os migrate meta --from 17.
  • The BREAKING changeset 23650-page-header-show-star-retired ships in the first @objectstack/spec release cut after ae0ca66f41.

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 own showStar React prop (default true). It is a component prop, not metadata, so whether it stays is this card's call. The star still draws only where the host wires onToggleFavorite.
  • 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, the settledUpstream row ['page:header', 'showStar']. It asserts that the spec's top-level keys (tombstones subtracted) contain showStar. 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 (the showStar row) and content/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

Dedupe words: showStar, page:header, registry-inputs-spec-parity, RecordTitleChip, favorites.


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    First grade · domain:ui · p2 · pm:queue · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-16T05:53Z

    Read in this act: the body in full (0 comments), and objectstack PR #23781 against 18.0.0-next.2's build.

    • Lane: domain:ui (packages/components, apps/console's parity test).
    • Grade: p2.
      • The ruling grades the renderer read "on its own (absence breaks no user)", so it is not p1.
      • But the card names its own fleet cost: registry-inputs-spec-parity.test.ts:5787 goes red on the first @objectstack/spec bump that carries the retirement. That would stall objectui's next spec bump, which carries the p1 protocol work.
    • State: pm:queue.
      • PR #23781 (ae0ca66f41, 2026-10-16T04:34Z) is not in 18.0.0-next.2: its build e5136ff10f is behind it. So the bump is the next release.
      • The body allows this change to land before the bump: the installed spec still carries showStar, so the parity row holds. Landing it first keeps the bump PR clean.
    • Objectstack side, noted: sdui.manifest.json drops showStar on the next .objectui-sha hop after this lands.

    ⛔ Not a claim.

  2. added
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    enhancementNew feature or request
    and removed on Oct 16, 2026
  3. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 3 (priority:p2; the consumer half of objectstack-ai/objectstack#23650's ruling item 2, record 6203775759)
    Session: session_01SJn1GEkrbbBQkhGC26wEDw
    Account: os-sales (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-12627-page-header-show-star
    Worktree: objectui-issue-12627 (in the cloud session's own container)
    Domain: domain:ui
    Seat: domain:ui#4
    File surface: packages/components/src/renderers/layout/containers.tsx (the page:header renderer's showStar read, its pass to the chip and its registration input only), packages/components/src/custom/RecordTitleChip.tsx (its showStar prop), packages/components/src/__tests__/page-header-star-host-toggle-12427.test.tsx, apps/console/src/__tests__/registry-inputs-spec-parity.test.ts (the showStar rows 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:header registration input and the chip's exported showStar prop 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.tsx renderer. Parallel by region; the later lander merges main. objectui#12626 (this seat, in flight) does not touch packages/components or the parity test. @objectstack/spec@18.0.0-next.2 (the newest next) does not carry objectstack#23781, so this card lands ahead of the bump that does.

  4. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    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 returned pr: null; the seat opened #12644 from pr_title_draft and pr_body_draft, and set pr above).


    Generated by Claude Code

  5. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed · PR #12644 merged as 608033b on main · read 2026-10-16T09:53Z

    probe on origin/main 608033b reading control
    showStar in containers.tsx 2, both comments no read, no pass to the chip, no registration input
    {onToggleFavorite && ( in RecordTitleChip.tsx 1 the star's one switch; the showStar prop is gone
    'page:header.showStar' in UNPUBLISHED_EXEMPTIONS (registry-inputs-spec-parity.test.ts) 1 self-disarms on the bump that installs objectstack#23781
    ['page:header', 'showStar'], in settledUpstream 0 the row left with the input
    showStar in content/docs/layout/page-header.mdx and content/docs/guide/layout.md 0 one sentence on the host toggle instead
    .changeset/12627-page-header-show-star-retired.md present —

    State change: the card closed as completed through Fixes #12627, and pm:dispatched is removed in this act. The cloud session session_01RP9ftxaq1x5KKbvFpDWptn is archived. The contract review of record is CONTRACT_REVIEW_TIER PASS at 485513c (6212663417).

    Carried to the seat that lands the @objectstack/spec bump carrying objectstack#23781 (the suite names each): delete the exemption entry, and add ['page:header', 'showStar'] to the HARVESTED pin. objectstack's sdui.manifest.json drops the input on its next .objectui-sha hop.


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatenhancementNew feature or requestpriority:p2

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions