Skip to content
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
This repository was archived by the owner on Nov 4, 2026. It is now read-only.

Studio pillar nav: Access sits in the segmented control and the More overflow retires while it holds a single pillar (reverses the objectui#11794 More ruling; decision anchored in the epic) #12452

Closed

Description

@objectstack-fleet

Source

Epic #12446, open decision A. Measured on objectui main a2225f91: OVERFLOW_PILLARS holds exactly one entry, Access, so the More trigger (data-testid="studio-nav-more") opens a one-item menu. objectui#11794 ruled that the trigger keeps the name More whichever overflow pillar is open, and StudioDesignSurface.moreKeepsName-11794.test.tsx pins that.

Prior ruling this card reverses

objectui#11794, "the trigger keeps its own name, More". The reason recorded in the source comment: renamed to the open pillar it hid the one word that says this is the overflow menu. That reasoning holds for an overflow of several pillars. With one pillar there is nothing to overflow, and the maintainer-reviewed canvas places Access as the fourth segment.

Decision A was answered on 2026-10-15: as designed, Access in the nav and More retired. The ruling comment on the epic quotes the maintainer's words and names the premise to re-check first (OVERFLOW_PILLARS holds exactly one pillar). This card is dispatched once the layout skeleton #12459 lands, since that card rewrote the shell header this one changes.

Target

  • The pillar segmented control reads Data, Automations, Interfaces, Access; Access carries the shield icon the Access pillar already uses.
  • OVERFLOW_PILLARS and the More popover are removed together with studio-nav-more and engine.studio.more; the dirty-guard onClick the overflow links carried moves onto the Access link exactly as the primary pillars have it.
  • The package-less scope (objectui#11553) still shows its single pillar and nothing else.
  • If a second overflow pillar is ever added, the More menu returns with the objectui#11794 behavior; leave a one-line comment at the pillar list saying so, so the ruling is not lost.

File surface

packages/app-shell/src/views/studio-design/StudioDesignSurface.tsx (pillar list, PILLARS / OVERFLOW_PILLARS, the shell header's nav), packages/app-shell/src/views/metadata-admin/i18n.ts (retire engine.studio.more in every locale), StudioDesignSurface.moreKeepsName-11794.test.tsx (replaced by a test that pins Access as a first-class segment and the dirty guard on it).

Acceptance

  1. Four segments at 1280 px, Access active when /studio/app.objectstack.hotcrm/access (any package id) is open.
  2. Leaving a dirty pillar through Access prompts exactly as through Data (the confirmLeavePillar path), pinned by a test.
  3. No studio-nav-more in the DOM; engine.studio.more absent from every locale file.
  4. StudioDesignSurface.accessGuard.test.tsx and pillarNavGuard stay green.

Constraints

  • Tailwind utilities and theme tokens only.
  • Gates: pnpm --filter @object-ui/app-shell test, lint, build, pnpm check:i18n for the retired key.
  • The objectstack pin bump is not part of this card.

Reference artboard

every artboard's shell header, docs/design/studio-redesign/data-records.html first (Access as the fourth segment, no More) on objectui main (landed in #12458); data-records.png is its 1280 px render. The folder's README carries the shared numbers and what a pull request against this card must show: two screenshots per artboard it touches (light and dark, 1280 px, cropped to the artboard's region), a deviation list with a reason per line, and the card's named tests green or updated. Where this card and the artboard disagree, this card's numbers win and the disagreement is reported here.

Blocked-by: #12459

Body refreshed 2026-10-15T09:53Z by the epic PM session: a Reference artboard section added now that #12458 is on main. Earlier refresh 2026-10-15T09:13Z: decision A answered; a Blocked-by line on the layout skeleton added.

Parent: #12446

Activity

  1. added
    enhancementNew feature or request
    pm:epicParent delegated to a dedicated epic PM — other PMs never dispatch into its subtree
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    area:studioChanging a running app without code — authoring, publish, docs and the portal
    on Oct 15, 2026
  2. objectstack-fleet commented on Oct 15, 2026

    @objectstack-fleet
    ContributorAuthor

    Decision A answered · 2026-10-15

    Maintainer, in the epic PM session on 2026-10-15, verbatim:

    A、B、C 三项全按设计稿裁定:权限进导航、More 退役;Advanced 扁平成七个标签;权限页改五个标签。记到专题卡上。

    Decision A is the first clause: Access becomes the fourth segment of the pillar nav and More retires. The full record, with the premise to re-check (OVERFLOW_PILLARS holds exactly one pillar), is on the epic #12446. This card is no longer held on a decision; it stays blocked on #12459 (#12460, enqueued) and is dispatched once that lands. The body's hold sentence is refreshed in the same stroke.

    Written 2026-10-15T09:12Z by the epic PM session session_cdb7a717-def7-4e71-9988-f089fbaa18ff.

  3. objectstack-fleet commented on Oct 15, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1 (epic #12446 subtree)
    Session: session_01SJn1GEkrbbBQkhGC26wEDw
    Account: os-sales (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-12452-access-in-pillar-nav
    Worktree: objectui-issue-12452
    Domain: domain:ui
    Seat: domain:ui#4
    File surface: packages/app-shell/src/views/studio-design/StudioDesignSurface.tsx (region: the PILLARS / OVERFLOW_PILLARS declarations and the shell header's pillar nav inside StudioDesignSurface), StudioDesignSurface.moreKeepsName-11794.test.tsx (replaced by the new pin), packages/app-shell/src/views/metadata-admin/i18n.ts (retire engine.studio.more in every locale), the screenshots under docs/design/studio-redesign/after/ named 12452-*.png (the light and dark pairs the reference README asks for, filed as the skeleton PR filed its own), one .changeset/12452-*.md (stop on breach; explain in the report)
    Container & model: M, mode:subagent, model: opus
    Clause-②: no
    Responsibility: n/a — not a defect card
    Thread-read: 6188627851
    Serial constraints cleared: objectui#12459 merged as PR objectui#12460 (cf430cd), which rewrote the shell header this card edits. In flight on the same file at claim time: objectui#12450 (DataPillar) and objectui#12454 (AutomationsPillar), both this seat, regions disjoint from the shell nav. objectui#12453 (app chip) follows this card in the shell header region. No other open PR touches studio-design/ (3 open PRs read).
    Ruling-ref: 6188627851

  4. objectstack-fleet commented on Oct 15, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report
    {
    "issue": 12452,
    "status": "done",
    "branch": "claude/issue-12452-access-in-pillar-nav",
    "pr": "#12470",
    "session": "session_01SJn1GEkrbbBQkhGC26wEDw",
    "premise_still_valid": true,
    "summary": "Premise of ruling A re-checked on cf430cd and it holds: OVERFLOW_PILLARS was exactly [{ key: 'access', label: 'Access', Icon: Shield }], and the header was its only reader. PILLAR_FOR_SURFACE_TYPE, the deep-link channel and the pillar dispatch spell out 'access' themselves and never read the list. Access is now the fourth entry of PILLARS (shield glyph, same segment markup, same narrow-viewport icon rule, same confirmLeavePillar guard). OVERFLOW_PILLARS, the More popover, studio-nav-more and engine.studio.more (en and zh blocks of metadata-admin/i18n.ts) are removed, and a comment at PILLARS keeps the objectui#11794 rule on record in case More ever returns. Each pillar link now has aria-current=page while its pillar is open, matching the artboards and keeping the a11y signal the overflow's Access link had. The package-less scope still shows only its one pillar. PM mechanism assumptions 1, 3, 4 and 5 hold as stated. Assumption 2 holds too: the skeleton's segment markup is what Access now uses. The More test retires and StudioDesignSurface.accessSegment-12452 replaces it. Draft PR #12470 includes 1280x900 light and dark after-screenshots and an app-shell minor changeset. Run resumed after the 10:00Z weekly-limit 429 by re-reading state; nothing was redone.",
    "tests": "Final head 13afa58: pnpm exec vitest run on accessSegment-12452, pillarNavGuard, accessGuard, packageLessFlows-11553, zhPillarNames-11801 and createAppOpensInterfaces-11794 (repo root, --maxWorkers=2, under os-verify-lock) → 'Test Files 6 passed (6) / Tests 44 passed (44)', VERDICT command-exit 0. The 6 accessSegment cases are green by name under the verbose reporter. On 36254fe, which has the same code (36254fe..13afa58 adds only .changeset/12452-access-in-pillar-nav.md and two PNGs): all 76 StudioDesignSurface..test.tsx files plus metadata-admin/studio-locale.i18n.test.tsx ran in three batches, 26 files/120 tests + 25/167 + 26/232, all passed, each VERDICT command-exit 0. Ablation on the new pin, once, on 36254fe, with source-resolved imports so no build was needed, both legs through objectstack scripts/ablation-replace.mjs (anchor x1 → x0, blob changed, restored blob == HEAD d00192a62e79, git diff HEAD empty). (a) Access link skips the guard (p.key !== 'access' && inserted before confirmLeavePillar()): the new guard case went red with 'expected "vi.fn()" to be called 2 times, but got 1 times', the other 5 new cases stayed green, and pillarNavGuard stayed 7/7 green, so no older test caught this loss. (b) Access deleted from PILLARS: new file 6/6 red, pillarNavGuard 3/7 red.",
    "gates": "Local subset, each exit captured by redirect-then-$? before any pipe. On 13afa58: pnpm check:i18n-keys 0; check:i18n-drift 0 (designer table '0 key(s) added, 1 removed'); check:i18n-dead-keys 0; check:i18n-designer-parity 0; check:new-line-citations 0 ('0 new citation(s)'); check:changeset-claims 0; check:pending-changeset-literals 0; check:test-path-roots 0; node scripts/check-changeset-presence.mjs 0 ('declares 1 changeset(s)'); node scripts/check-changeset-no-major.mjs 0. pnpm check:i18n (the card's name) → 254 'Command "check:i18n" not found', which confirms the PM's reading. On 36254fe, all under os-verify-lock: turbo build of the closure --filter='@object-ui/app-shell^...' --concurrency=2 → 28/28 successful, VERDICT 0; pnpm --filter @object-ui/app-shell run type-check (tsc --noEmit && tsc -p tsconfig.test.json) → VERDICT 0, and tsc --listFilesOnly shows the 3 edited or new test files; pnpm --filter @object-ui/app-shell run build → VERDICT 0 ('dist completeness: 1 package(s) complete'). eslint on the 5 touched app-shell files → exit 0 with 0 errors; the 18 warnings were already on cf430cd and none is in a changed hunk. objectui has no dispatch-gates derivation, so the list was hand-derived from the root package.json check:
    scripts for the i18n, changeset, doc and test-path families. PR #12470 check-runs, read once at 13afa58 right after open (36 total): success = Changeset Bump Policy, Build Docs, Changeset Fixed Group Check, label; skipped = dependabot, Test (coverage), Test (coverage shard matrix); in_progress = Spec Main Shape Gate, Changeset Overwrite Report, Test (shard 1..16/16), Test (dist pins), Lint, Type Check, Build & E2E, Line Citation Gate, Repo Gates, Governed Surface Queue Guard, Bundle Analysis, Live E2E (informational), Changeset Declaration, Changeset Claim Re-read. CI convergence is the PM's; I did not poll.",
    "deviations": [
    "File surface: two test files outside the claim got test-only edits. StudioDesignSurface.pillarNavGuard.test.tsx: its clickAccessInOverflow helper clicked studio-nav-more, so acceptance 4 (stay green) and acceptance 3 / ruling A (no More) conflict unless the helper changes. It became clickAccessInNav, which clicks the Access segment, and no assertion changed. StudioDesignSurface.packageLessFlows-11553.test.tsx: its 'no studio-nav-more' line would have gone vacuous, so it now asserts no Access link (PM assumption 4). Both edits are named in the PR body. When pushed, no open PR touched either file and sibling branches 12450/12454 were still at cf430cd. The claim's file-surface line needs the PM to amend it; I do not write claims.",
    "aria-current=page added to every pillar link, not only Access. The card text does not ask for it, but the artboards' header does, and the overflow's Access link had it.",
    "Some evidence was measured on 36254fe, not the final head (full StudioDesignSurface batches, closure build, type-check, build, lint). The only commits after it are the changeset and the two PNGs. The named tests and all check:* gates were re-run on 13afa58.",
    "Lint ran as pnpm exec eslint on the touched files from packages/app-shell (the package script is eslint . over the whole package).",
    "Commit trailers are the model-free pair from objectui AGENTS.md (Claude-Session + Co-authored-by: Claude). The harness reminder's model-named Co-Authored-By was not used, because the agent contract makes the harness reminder yield.",
    "Screenshot backend: hotcrm worktree at 63db83e running objectstack dev --fresh on :4152, console on :5252. The app chip shows HotCRM as Read-only (objectui#12453's region, not this card's). Both the server processes and the hotcrm worktree were stopped and removed after use."
    ],
    "files_changed": [
    ".changeset/12452-access-in-pillar-nav.md",
    "docs/design/studio-redesign/after/12452-header-dark.png",
    "docs/design/studio-redesign/after/12452-header-light.png",
    "packages/app-shell/src/views/metadata-admin/i18n.ts",
    "packages/app-shell/src/views/studio-design/StudioDesignSurface.accessSegment-12452.test.tsx",
    "packages/app-shell/src/views/studio-design/StudioDesignSurface.moreKeepsName-11794.test.tsx",
    "packages/app-shell/src/views/studio-design/StudioDesignSurface.packageLessFlows-11553.test.tsx",
    "packages/app-shell/src/views/studio-design/StudioDesignSurface.pillarNavGuard.test.tsx",
    "packages/app-shell/src/views/studio-design/StudioDesignSurface.tsx"
    ],
    "line_budget": "n/a: no skills/** surface",
    "mcp_calls": "0",
    "api_writes": "2 relay strokes (each one POST /repos/objectstack-ai/objectstack/dispatches via scripts/pm/with-fleet.sh --via dispatch, executed as objectstack-fleet[bot]): (1) pr_create → POST /repos/objectstack-ai/objectui/pulls (draft) + POST /repos//issues/12470/assignees [os-sales], read-back 8260 bytes sent = stored; (2) comment → POST /repos//issues/12452/comments (this report). Zero label writes. git push x4 (not REST).",
    "open_questions": [],
    "out_of_scope_findings": [
    "carrier: none · noted, not filed · the comment just above the Studio shell header (it opens with 'overflow-x-auto — none of Package/pillars/Publish shrink') still describes the scrolling strip objectui#12459 retired. Comment drift outside this card's region; recorded in the PR's Acceptance notes."
    ]
    }


    Generated by Claude Code

  5. objectstack-fleet commented on Oct 15, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT → PR #12470 comment 6190131598 (head 13afa58, read 2026-10-15T10:39Z). Landing waits for green CI on that head.


    Generated by Claude Code

  6. objectstack-fleet commented on Oct 15, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed · PR #12470 merged as d25585c on main · read 2026-10-15T11:03Z

    probe on origin/main d25585c reading control
    OVERFLOW_PILLARS in StudioDesignSurface.tsx 0 hits const PILLARS 1 hit
    { key: 'access', label: 'Access', Icon: Shield } in PILLARS 1 hit —
    'engine.studio.more' in metadata-admin/i18n.ts 0 hits 'engine.studio.saveDraft' 2 hits
    studio-nav-more in app-shell source (non-test) 0 files —
    StudioDesignSurface.accessSegment-12452.test.tsx / moreKeepsName-11794 present / absent —
    merge-queue branch for PR 12470 gone —

    State change: the card closed as completed through Fixes #12452; pm:dispatched is removed in this act, while pm:epic, domain:ui and area:studio stay. No other open child of objectui#12446 changed state.


    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

area:studioChanging a running app without code — authoring, publish, docs and the portaldomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatenhancementNew feature or requestpm:epicParent delegated to a dedicated epic PM — other PMs never dispatch into its subtreepriority:p2

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions