Skip to content

feat(app-shell): one page header for every Setup page — sys_* lists, metadata types, settings and component pages (objectui#12606) - #12662

Merged
objectstack-fleet[bot] merged 5 commits into
mainfrom
claude/issue-12606-setup-page-header
Oct 16, 2026
Merged

objectstack-fleet[bot] merged 5 commits into
mainfrom
claude/issue-12606-setup-page-header

Conversation

@objectstack-fleet

@objectstack-fleet objectstack-fleet Bot commented Oct 16, 2026 •

Copy link
Copy Markdown
Contributor

Fixes #12606
Clause-②: yes

What changed

One header component, extended once: the console page header (ConsolePageHeader, packages/app-shell/src/layout/PageHeader.tsx, the objectui#12553 base). No second Setup header was built.

  • Target 1, the header. Inside the Setup app the header uses a Setup posture: a 32px icon tile, an 18px / 600 title, the kind chip after the title, a 13px muted description on its own line under the title, Refresh as an icon button, and the primary action at the right. The header reads the posture itself from the route's :appName (setup or com.objectstack.setup) through a new useInSetupApp() in console/setupApp.ts, so no page passes a prop for it. Outside Setup the header keeps the objectui#12423 one row. Three new optional props: badge (the kind chip, e.g. ManagedByBadge, words unchanged), breadcrumb (leading crumbs on the description line) and refresh (onRefresh, label, busy). The Setup description line is always drawn, so a page without a description keeps the same title position.
  • Target 2, metadata-type pages under Setup (Positions, Capabilities, Permission Sets, Datasources). They draw this header with no 'All Metadata Types' breadcrumb and no Items / Filtered tiles. The count is the description ('18 items'). The source and status selects are filter chips. Table headers are sentence case, rows are 36px, and cells are middle-aligned. The per-row Artifact chip is now plain text with its explanation in a tooltip. Outside Setup (the directory, Studio's Open in Setup target) the page keeps today's shape and its data-testids.
  • Target 3, sys_* record lists under Setup. There is no # row-number column. ObjectView reads the same route :appName and passes one new ListView host prop, defaultRowNumbers. It is a React prop, not a view key, so no authored metadata changes. Per the maintainer's ruling on the card (option C), the Display control stays on every list, Setup included.
  • Target 4, settings pages. They keep their form and take the same header. 'All settings' is now the first crumb on the header's description line instead of a button at the top of the form.
  • Component pages. Packages, Packaged automation, Approvals Inbox, Audit Log Browser and App Marketplace draw their title row through the header, with Refresh as its icon button. Only the header row changed. objectui#12609, objectui#12610, objectui#12607 and objectui#12637 are out of scope and untouched. The icon-only Filter / Sort / Display is objectui#12695, not this PR.

Deviations

  • SETUP_APP_PACKAGE_ID and SETUP_APP_NAME moved from console/ConsoleShell.tsx to console/setupApp.ts, so the header can read them without importing the console shell. ConsoleShell re-exports them, so the package root is unchanged.
  • metadata-admin/PageShell.tsx now exports WritabilityBadge. Metadata types have no managedBy bucket, so the existing writability badge (create-only / read-only / writable) is their kind chip.
  • Two engine-table keys (en and zh) in metadata-admin/i18n.ts: engine.list.itemCount and engine.list.itemCountOne.
  • packages/plugin-list/src/ListView.tsx gets the defaultRowNumbers host prop, because a plugin package cannot read the route.
  • The Packages page header lives in metadata-admin/PackagesPage.tsx, not under views/setup/.
  • Connect an Agent is not converted. It is an authored page whose header is a page:header node drawn by packages/components, which is outside this card's file surface.
  • SettingsView.pageHeader-12553.test.tsx is updated because 'All settings' moved from the body into the header.

Screenshots (HotCRM, fresh local backend, captured at 4803770)

Title getBoundingClientRect(), read from the DOM at capture time: x = 324, y = 60 on Users, Positions, Mail Delivery and Packages, the same at 1280 light, 1280 dark and 1024 light. The title is 18px / 600 and the description 13px. Each page has 1 header component and one h1, and no row-number cells. Sessions reads the same x and y, has the Display trigger, and has 0 row-number cells across 3 rows.

Test evidence (head 4803770, origin/main 023087f merged)

  • Full @object-ui/app-shell suite as 8 foreground shards (pnpm exec vitest run packages/app-shell/ --shard=K/8), every shard exit 0. Files: 1458 passed, 1 skipped. Tests: 13740 passed, 9 skipped.
  • packages/plugin-list/: 141 files, 1464 tests passed. Console settings and system pages: 47 files, 339 tests passed.
  • New pins: PageHeader.setupPosture-12606, ResourceListPage.setupPosture-12606, ObjectView.setupListChrome-12606 (no # column under Setup, Display present) and ListView.setupChrome-12606. Each was ablated once and turned red. For example: the Setup posture forced off gave 3 failed; ObjectView passing row numbers on gave 2 failed; the Display panel suppressed gave 5 failed. Each was restored with git diff HEAD empty.
  • type-check (app-shell, plugin-list, console), build (console and its dependencies), eslint on the changed files (0 errors), check:i18n-keys, check:i18n-designer-parity, check:new-line-citations and the changeset-presence check: all exit 0.

Acceptance notes

  • Below sm, the one-row posture hides the description line. Outside Setup, a phone therefore does not show the 'All settings' crumb. The Setup posture keeps it.

Session: https://claude.ai/code/session_01XvN7kN2b8z5CLTwmJJhhJF


Generated by Claude Code

Inside the Setup app the console page header takes a Setup posture: a 32px
icon tile, the title with the kind chip after it, the description under the
title, Refresh as an icon button and the primary action rightmost. The
posture is read off the route's :appName, so pages outside Setup keep the
one-row header.

- ConsolePageHeader gains badge, breadcrumb and refresh.
- The metadata-type page under Setup drops the breadcrumb and the stat
  tiles, says the count in the description, makes the source select a
  filter chip and the per-row source chip a tooltip.
- Record lists under Setup open without row numbers and draw Display only
  for an object with more than four views (two ListView host props).
- Settings pages take "All settings" as the header's first crumb.
- Packages, Packaged automation, Approvals Inbox, Audit Log Browser and
  App Marketplace draw their title row through the same header.

Claude-Session: https://claude.ai/code/session_01XvN7kN2b8z5CLTwmJJhhJF
Co-authored-by: Claude <noreply@anthropic.com>
…st (objectui#12606)

The Packages toolbar no longer carries a top margin when it is the body's
first child, and the metadata list's status select is a filter chip under
Setup like the source select beside it.

Claude-Session: https://claude.ai/code/session_01XvN7kN2b8z5CLTwmJJhhJF
Co-authored-by: Claude <noreply@anthropic.com>
…tup-page-header

# Conflicts:
#	packages/app-shell/src/views/setup/PackagedAutomationPage.tsx
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 70 chunks) 3118.6 KB 3119.4 KB
Main entry chunk (gzip) 75.3 KB 350 KB
Entry file index-Dl7GVlh7.js —
Status PASS —

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

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 21.19KB 7.76KB
app-shell (runtime-config.js) 22.59KB 7.89KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.11KB 3.87KB
auth (ActiveOrganizationStorage.js) 27.95KB 10.04KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.22KB 10.61KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 20.39KB 6.02KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.72KB 2.24KB
auth (SocialSignInButtons.js) 9.70KB 3.93KB
auth (UserMenu.js) 3.39KB 1.21KB
auth (auth-gate-events.js) 1.62KB 0.83KB
auth (authStyles.js) 5.27KB 1.86KB
auth (createAuthClient.js) 41.19KB 11.12KB
auth (createAuthenticatedFetch.js) 8.54KB 3.46KB
auth (index.js) 3.63KB 1.64KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 11.08KB 4.58KB
collaboration (CommentThread.js) 27.26KB 8.03KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.28KB 2.60KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (commentAuthorship.js) 1.39KB 0.78KB
collaboration (index.js) 1.93KB 0.85KB
collaboration (useCollaborationTranslation.js) 6.50KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 597.83KB 144.29KB
core (index.js) 10.18KB 4.04KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 248.20KB 69.22KB
fields (index.js) 290.12KB 74.14KB
i18n (LocalizationContext.js) 2.92KB 1.42KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 2.59KB 1.22KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 8.87KB 3.64KB
i18n (index.js) 5.52KB 2.39KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 39.35KB 12.88KB
i18n (translateFn.js) 0.20KB 0.18KB
i18n (useDisplayLocale.js) 3.52KB 1.76KB
i18n (useObjectLabel.js) 36.87KB 9.88KB
i18n (useSafeTranslation.js) 7.14KB 2.92KB
layout (index.js) 40.67KB 11.85KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 6.62KB 2.45KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 5.52KB 2.10KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 15.35KB 5.51KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.82KB 2.38KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.33KB 3.07KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 16.04KB 3.92KB
plugin-calendar (index.js) 54.94KB 16.05KB
plugin-charts (index.js) 84.97KB 23.36KB
plugin-chatbot (index.js) 201.89KB 48.13KB
plugin-dashboard (index.js) 146.15KB 39.55KB
plugin-designer (index.js) 233.95KB 50.08KB
plugin-detail (index.js) 262.91KB 69.49KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 180.92KB 46.73KB
plugin-gantt (index.js) 178.36KB 45.08KB
plugin-grid (index.js) 270.08KB 74.80KB
plugin-kanban (index.js) 59.42KB 18.48KB
plugin-list (index.js) 131.47KB 33.54KB
plugin-map (index.js) 27.07KB 8.96KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 46.66KB 13.13KB
plugin-timeline (index.js) 39.21KB 11.85KB
plugin-tree (index.js) 15.07KB 5.33KB
plugin-view (index.js) 93.43KB 23.94KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 12.07KB 3.68KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 120.63KB 39.56KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.50KB 2.06KB
react (schema-input.js) 4.31KB 2.07KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (body-dialect.js) 4.50KB 1.99KB
sdui-parser (codegen.js) 9.45KB 3.76KB
sdui-parser (dashboard-widget-options.js) 3.07KB 1.30KB
sdui-parser (index.js) 7.30KB 3.12KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 25.28KB 7.81KB
sdui-parser (provenance.js) 3.84KB 1.90KB
sdui-parser (types.js) 0.29KB 0.24KB
sdui-parser (validate.js) 23.87KB 7.83KB
types (ai.js) 4.39KB 2.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 4.12KB 1.61KB
types (authoring-nodes.js) 0.20KB 0.19KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (cloud.js) 0.20KB 0.18KB
types (complex.js) 4.44KB 2.07KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (dashboard-widget-layout.js) 2.06KB 0.96KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 1.13KB 0.65KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 5.78KB 2.70KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 5.00KB 2.39KB
types (navigation.js) 0.20KB 0.18KB
types (node-slots.js) 7.18KB 2.34KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 2.52KB 1.31KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-approval-decision.js) 0.20KB 0.20KB
types (record-components.js) 0.20KB 0.19KB
types (record-panels.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 4.99KB 1.96KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 19.93KB 7.26KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.48KB 3.50KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Live E2E (informational) red on 877cc8b · not this PR's · 2026-10-16T12:24Z


Generated by Claude Code

…ectui#12606)

The maintainer's ruling C on objectui#12606 withdraws the Display hide rule:
a Setup record list drops only the `#` row-number column. ListView's
`showDisplayControl` host prop and ObjectView's view-count gate are
removed with their pins; `defaultRowNumbers` stays.

Claude-Session: https://claude.ai/code/session_01XvN7kN2b8z5CLTwmJJhhJF
Co-authored-by: Claude <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 70 chunks) 3118.8 KB 3119.4 KB
Main entry chunk (gzip) 75.2 KB 350 KB
Entry file index-DaD6rg0n.js —
Status PASS —

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

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 21.19KB 7.76KB
app-shell (runtime-config.js) 22.59KB 7.89KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.11KB 3.87KB
auth (ActiveOrganizationStorage.js) 27.95KB 10.04KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.22KB 10.61KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 20.39KB 6.02KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.72KB 2.24KB
auth (SocialSignInButtons.js) 9.70KB 3.93KB
auth (UserMenu.js) 3.39KB 1.21KB
auth (auth-gate-events.js) 1.62KB 0.83KB
auth (authStyles.js) 5.27KB 1.86KB
auth (createAuthClient.js) 41.19KB 11.12KB
auth (createAuthenticatedFetch.js) 8.54KB 3.46KB
auth (index.js) 3.63KB 1.64KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 11.08KB 4.58KB
collaboration (CommentThread.js) 27.26KB 8.03KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.28KB 2.60KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (commentAuthorship.js) 1.39KB 0.78KB
collaboration (index.js) 1.93KB 0.85KB
collaboration (useCollaborationTranslation.js) 6.50KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 597.83KB 144.29KB
core (index.js) 10.18KB 4.04KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 248.20KB 69.22KB
fields (index.js) 290.25KB 74.19KB
i18n (LocalizationContext.js) 2.92KB 1.42KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 2.59KB 1.22KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 8.87KB 3.64KB
i18n (index.js) 5.52KB 2.39KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 39.35KB 12.88KB
i18n (translateFn.js) 0.20KB 0.18KB
i18n (useDisplayLocale.js) 3.52KB 1.76KB
i18n (useObjectLabel.js) 36.87KB 9.88KB
i18n (useSafeTranslation.js) 7.14KB 2.92KB
layout (index.js) 40.67KB 11.85KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 6.62KB 2.45KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 5.52KB 2.10KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 15.35KB 5.51KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.82KB 2.38KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.33KB 3.07KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 16.04KB 3.92KB
plugin-calendar (index.js) 54.94KB 16.05KB
plugin-charts (index.js) 84.97KB 23.36KB
plugin-chatbot (index.js) 201.89KB 48.13KB
plugin-dashboard (index.js) 146.15KB 39.55KB
plugin-designer (index.js) 233.95KB 50.08KB
plugin-detail (index.js) 263.43KB 69.61KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 180.92KB 46.73KB
plugin-gantt (index.js) 178.36KB 45.08KB
plugin-grid (index.js) 270.08KB 74.80KB
plugin-kanban (index.js) 59.42KB 18.48KB
plugin-list (index.js) 131.43KB 33.51KB
plugin-map (index.js) 27.07KB 8.96KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 46.66KB 13.13KB
plugin-timeline (index.js) 39.21KB 11.85KB
plugin-tree (index.js) 15.07KB 5.33KB
plugin-view (index.js) 93.43KB 23.94KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 12.07KB 3.68KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 120.63KB 39.56KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.50KB 2.06KB
react (schema-input.js) 4.31KB 2.07KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (body-dialect.js) 4.50KB 1.99KB
sdui-parser (codegen.js) 9.45KB 3.76KB
sdui-parser (dashboard-widget-options.js) 3.07KB 1.30KB
sdui-parser (index.js) 7.30KB 3.12KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 25.28KB 7.81KB
sdui-parser (provenance.js) 3.84KB 1.90KB
sdui-parser (types.js) 0.29KB 0.24KB
sdui-parser (validate.js) 23.87KB 7.83KB
types (ai.js) 4.39KB 2.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 4.12KB 1.61KB
types (authoring-nodes.js) 0.20KB 0.19KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (cloud.js) 0.20KB 0.18KB
types (complex.js) 4.44KB 2.07KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (dashboard-widget-layout.js) 2.06KB 0.96KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 1.13KB 0.65KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 5.78KB 2.70KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 5.00KB 2.39KB
types (navigation.js) 0.20KB 0.18KB
types (node-slots.js) 7.18KB 2.34KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 2.52KB 1.31KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-approval-decision.js) 0.20KB 0.20KB
types (record-components.js) 0.20KB 0.19KB
types (record-panels.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 4.99KB 1.96KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 19.93KB 7.26KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.48KB 3.50KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

席位核对 — ACCEPT · objectui#12606 · head 4803770 · 2026-10-16T15:50Z

Seat domain:ui#4, session session_01SJn1GEkrbbBQkhGC26wEDw. Checked against GitHub and the diff, not against the report (both rounds are relayed on the card, the second as 6219222856). The seat opened this PR from the dev's drafts (degraded channel) and replaced its body with the round-2 draft verbatim.

Checklist

  • Form:
    • Draft → main, assignee os-sales.
    • The first line is Fixes #12606, and the second is Clause-②: yes, as the claim 6211302311 declares.
    • The head 4803770 merges main 023087f. git merge-tree against current main 96fa4b9 is clean. 20 files, +979 / −262, no PNG on the branch.
  • Ruling C applied (6217025861, the maintainer's 「可以」):
    • showDisplayControl has 0 hits under packages/ at the head. The Display panel's wrap is back to toolbarFlags.compactToolbar && ( as on main, so Display renders on every list, Setup included.
    • defaultRowNumbers={!inSetup} stays, and is the only new ListView prop. The header refresh slot stays, nothing moved out of the Display panel, and the sys_* list passes no header Refresh.
  • Diff, against the card's targets:
    • Target 1. One header, ConsolePageHeader, gains the Setup posture, read off the route's :appName through useInSetupApp(). It takes three optional props: badge, breadcrumb and refresh.
    • Target 2. The metadata-type page under Setup drops the breadcrumb and the stat tiles, and shows the count as "18 items". Outside Setup it keeps its shape.
    • Target 3. No # column under Setup.
    • Target 4. "All settings" is the first crumb.
    • The component pages draw their title row through the same header.
  • Tests:
    • Four new pin files, and the Setup-chrome pins are rewritten for ruling C. Round 2 has three ablations, each red and each restored.
    • Full @object-ui/app-shell suite (8 foreground shards): 1,458 files, 13,740 tests, every shard exit 0.
    • plugin-list: 141 files, 1,464 tests. Console settings and system pages: 47 files, 339 tests.
    • type-check (app-shell, plugin-list, console), the console build, eslint on changed files, the i18n checks and changeset presence: all exit 0.
  • Changeset: @object-ui/app-shell, @object-ui/plugin-list, @object-ui/console, minor. The prose no longer mentions a Display rule.
  • Contract faces: Clause-②: yes. ConsolePageHeaderProps (exported) gains badge / breadcrumb / refresh, and ListViewProps (exported) gains defaultRowNumbers. The TIER_DEFAULT review is its own comment.
  • Screenshots (round 2, on the never-merged claude/issue-12606-evidence at 66df45d):
    • Users, Positions, Mail Delivery and Packages, light and dark, plus Users and Positions at 1024 px. The title reads x = 324, y = 60 on all four, after main's 48 px app bar.
    • Sessions, a three-view Setup list, shows Display and no # column.
    • Sent to the maintainer at 2026-10-16T15:50Z.
  • CI on 4803770: 36 runs, 33 green and 3 expected skips, none red.

Rulings

  1. Recapturing all ten acceptance shots on the new head: accepted. main's app bar moved every title from y = 68 to y = 60, and the evidence has to match the head.
  2. Sessions in place of Teams for the new shot: accepted. Teams is empty in a fresh HotCRM, so "no # column" would hold trivially there.
  3. The file-surface deviations from round 1 stay accepted. The Setup constants moved to console/setupApp.ts and are re-exported, so the package root is unchanged. WritabilityBadge is exported from PageShell.tsx but is not on the package entry. There are two engine-table keys, and the Packages header lives in PackagesPage.tsx.
  4. Out of scope: Connect an Agent's authored page:header is not converted; it is drawn by packages/components. objectui#12695 holds the icon-only toolbar, and objectui#12705 (the Setup header at 1024 px) can take this header once it lands.

Implemented-by: cloud session session_01XvN7kN2b8z5CLTwmJJhhJF, branch claude/issue-12606-setup-page-header
Reviewed-by: seat domain:ui#4, session_01SJn1GEkrbbBQkhGC26wEDw


Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: TIER_DEFAULT
Head-sha: 4803770a82e63461b0db4aea6f3effedb6a41e4a
Local-runs: none

Face: the Clause-②: yes declaration of the claim 6211302311 on objectui#12606. The PR's file list carries no packages/spec/src/** path and no governed path. Inputs read: the card, the claim, ruling C 6217025861, the diff at the head above, the changeset and the PR body. Nothing was built or run locally.

① Derived judgments

  • ConsolePageHeaderProps (exported from @object-ui/app-shell) gains three optional members: badge (a node), breadcrumb (a node) and refresh ({ onRefresh, label, busy? }). Every existing member keeps its type. That is an additive widening. Correct, and declared.
  • ListViewProps (exported from @object-ui/plugin-list) gains one optional defaultRowNumbers, default true, so a host that passes nothing behaves as before. Round 1's showDisplayControl is gone, so it never ships. Correct, and declared.
  • Package root: SETUP_APP_PACKAGE_ID and SETUP_APP_NAME are still exported under the same names. They are now defined in console/setupApp.ts and re-exported through ConsoleShell.tsx. useInSetupApp, isSetupAppSegment and WritabilityBadge are not on any package entry. Unchanged.
  • Behaviour: the Setup posture is read off the route, so no authored key, view key or schema changes. Console pages outside Setup keep the one-row header. Correct.

② Semver level

The changeset bumps @object-ui/app-shell, @object-ui/plugin-list and the console minor, in pre mode on tag next. Minor fits optional props and a new posture. Consistent.

③ Boundary flags

  • None to the maintainer. Ruling C is applied as recorded.

Implemented-by: session_01XvN7kN2b8z5CLTwmJJhhJF
Reviewed-by: session_01SJn1GEkrbbBQkhGC26wEDw

VERDICT: PASS


Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Landing · head 4803770 · 2026-10-16T15:51Z

  • Head unchanged since the ACCEPT: 4803770.
  • Checks on 4803770: 36 runs, 33 green and 3 expected skips, none red. That includes Type Check, all 16 test shards and the Test roll-up, Lint, Build & E2E, Repo Gates, Live E2E (informational) and Bundle Analysis. The eager-closure ceiling is now 3,744.1 KB after objectui#12653.
  • Contract review: TIER_DEFAULT, PASS at this head (the ## Contract review record above).
  • Action: mark it ready for review and enable auto-merge through the merge queue. Fixes #12606 closes the card on merge.

Generated by Claude Code

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 16, 2026 15:52
@objectstack-fleet
objectstack-fleet Bot enabled auto-merge October 16, 2026 15:52
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 16, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Setup: one page header and one list shell for sys_* lists, metadata-type pages and settings pages

2 participants