Repository navigation
feat(app-shell): Studio navigation details — Advanced keeps its name, a searchable Automations rail, Create app opens Interfaces (objectui#11794) - #12028
Merged
objectstack-fleet[bot] merged 4 commits intoOct 9, 2026
Conversation
… a searchable Automations rail, Create app opens Interfaces - The Data pillar's Advanced trigger always reads Advanced; the open panel is the checked radio item in its menu and the trigger keeps the active pill. - The Automations rail gains a search box (label or machine name, case-insensitive, with a no-match line), and a flow's name wraps instead of being truncated. - Create app navigates to the Interfaces pillar after its unchanged draft save, through the surface's leave guard. Claude-Session: https://claude.ai/code/session_01MgfduSkFrfM3eorB3UGfAU Co-authored-by: Claude <noreply@anthropic.com>
…elect Each item selects its panel as the plain items did; the radio group only marks the checked one. The four DataPillar suites that render the menu as passthroughs mock the two radio parts the same way they mock the item. Claude-Session: https://claude.ai/code/session_01MgfduSkFrfM3eorB3UGfAU Co-authored-by: Claude <noreply@anthropic.com>
…ead of any Claude-Session: https://claude.ai/code/session_01MgfduSkFrfM3eorB3UGfAU Co-authored-by: Claude <noreply@anthropic.com>
Contributor
✅ Console Performance Budget
The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it. 📦 Bundle Size Report
Size Limits
|
…ail search, Create app opening Interfaces The guide still drew the Data pillar as a seven-tab strip; main draws two tabs and an Advanced menu, whose trigger now keeps its name. Two Key Features rows describe the Automations rail's search and wrapping names, and Create app landing on the Interfaces pillar. Claude-Session: https://claude.ai/code/session_01MgfduSkFrfM3eorB3UGfAU Co-authored-by: Claude <noreply@anthropic.com>
Contributor
✅ Console Performance Budget
The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it. 📦 Bundle Size Report
Size Limits
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Part of #11794
Clause-②: no
Three of the card's five claimed findings are built here: the Advanced trigger keeps its name, the Automations rail is searchable and stops truncating names, and Create app opens Interfaces. Two findings and one half of a third are held. Each one needs a ruling or a new key, and the Held section below names what. Implemented by the
os-devsessionhttps://claude.ai/code/session_01MgfduSkFrfM3eorB3UGfAU(claim comment 6074378305).The five findings, re-measured on
main6694abe75before any editmainOVERFLOW_PILLARShas one entry (access), and the More popover renders that list and nothing elseactiveAdvancedTab.labelinstead of "Advanced"truncatespan in thew-52raildoCreateAppsaved, toasted, closed the dialog and bumped the draft nonce. It did not navigateRequireStudioAccess(apps/console/src/components/StudioRoute.tsx) answers a non-holder with aNavigateto the home path (replace), with no state and no messageWhat changed (
packages/app-shell/src/views/studio-design/StudioDesignSurface.tsx)aria-pressed) while one of its panels is open. Its items are nowDropdownMenuRadioItems in aDropdownMenuRadioGroupwhose value is the open panel, so the menu checks that panel (aria-checked). Each item still selects through its ownonSelect, as the plain items did.engine.list.emptyQueryline, and the empty-package line still means an empty package. Placeholder: the existingengine.studio.designer.search("Search…", in en and zh). No new key.min-w-0 flex-1 break-wordsinstead oftruncate./studio/PACKAGE/interfacesunless it is already there. The navigation passes throughconfirmLeavePillar, the guard a pillar link uses. If the pillar being left holds an unsent edit, the surface asks first, and choosing to stay keeps the author there with the app already created.H2 (no write path changes) holds: the create's one write,
save('app', NAME, buildAppSkeleton(...), { mode: 'draft', packageId }), is pinned byte for byte in every leg of the new create-app suite. The tab, search and navigation changes write nothing.Held: each needs a ruling or a key
Item 1: Access as a top-level tab. This contradicts a standing maintainer ruling. objectui#5813 (2026-08-24) item 3, verbatim apart from its bold markers:
The code comment on
OVERFLOW_PILLARScites the same ruling. Triage comment 6043000484 takes option A and routes the card out of the decision box ("no contract or product question is open"), but it does not cite objectui#5813, and a seat direction does not overrule a maintainer ruling. One measurement for that decision: the pillar row has four controls either way (Data · Automations · Interfaces · More, or Data · Automations · Interfaces · Access). The demotion therefore buys the "three maker pillars" model and costs one extra click. It does not reduce the count of controls. The options and a recommendation are in the dev report on the card.Item 3, grouping half: the list carries neither trigger kind nor object.
loadPackageSurfacesyields onlytype,nameandlabel, and a draft header carries only a name.GET /api/v1/automation/_statusrows carrytriggerTypeandobject, but only for flows the engine holds. Draft-only flows have neither.translateFlowMeta('type', …)returns the raw token (record_change) outside zh.Grouping would need the producer to carry the kind for draft rows, plus new engine strings (en and zh) for the group headings. Both are outside this claim's surface.
Item 5: no existing key says that Studio access is needed. Checked candidates:
capability.label.studio_accessis a label ("Studio Access"), not a sentence.errors.forbiddenis "Access denied.", with no subject.home.build.noCapabilitynames "Manage Metadata", the wrong capability.empty.appAccessDeniedis about an app.Item 5 needs one new
packages/i18nkey in all ten packs. The claim routes that asClause-②, so it stops here. The guard file is unchanged.Evidence (all at
042950889, repo-rootpnpm exec vitest run, under the container's verify lock)DataPillar.advancedKeepsName-11794.test.tsx(3)AutomationsPillar.railSearch-11794.test.tsx(5)StudioDesignSurface.createAppOpensInterfaces-11794.test.tsx(4: a clean create from Access lands on Interfaces and reads the new draft app; a dirty pillar with "stay" stays; a dirty pillar with "leave" lands; the control created from Interfaces does not move)StudioDesignSurface.servedDraftTakenAsIs-10765andDataPillar.hiddenSystemFields-11780now find Settings as amenuitemradio.celGate,panelGate,designerRegistryPopulated,inspectorBelongsToView-11781) mock the two radio parts the way they already mock the item.packages/app-shell/src/views/studio-design/, plusStudioRoute.*,registerStudioComponents.builderLazy-11798,App.uploadAltitude-10131,homeRecoveryRedirectsFollowDeclaration-7373,builtinDesigners.lateArrival-11939,observableRegistries-11939,spec-symbol-ledger-app-shell-7265,HomePage.aiStudioDisabled,column-identity.ratchetandone-authority-per-exported-name-6273. Four batches, allTest Files … passed: 37/37, 35/35, 45/45 and 59/59 files; 1,321 tests.ablation-replacewith blob equal to HEAD andgit diff HEADempty:truncaterestored: 1 of 5 red.pnpm --filter @object-ui/app-shell type-checkexits 0. Itstsconfig.test.jsonlists all ten touched test files.check-changeset-presence,check-changeset-no-major,check:new-line-citations(0 new) andcheck:control-bytespass.check:i18n-keyspasses: every in-scope key resolves.eslinton the touched files: 0 errors.apps/console,CI=true vite build,eagerGzipBytes): base6694abe753,238,198, head 3,238,234, so +36 B gzip (ceiling 3,281,467).ui-components+42 andvendor-radix+62 (the radio menu parts are now kept), and other chunks moved by a few bytes each.Acceptance notes
content/docs/guide/console.md, section "Object design (Studio Data tab)", still describes a seven-tab strip (stale since objectui#5813). The docs-driven rule would also want the rail search and the create-app landing written there. This claim's file surface does not include docs, so the docs are not edited here. Carrier: none.eslintwarnings: the four new mock lines inDataPillar.celGateandDataPillar.panelGatefollow those files' existing(p: any)passthrough style. No warning falls inside a changed hunk ofStudioDesignSurface.tsx.Generated by Claude Code