Skip to content

feat(app-shell): an object leaf's Studio panel edits its list view (objectui#11823, step 1) - #11868

Merged
objectstack-fleet[bot] merged 6 commits into
mainfrom
claude/issue-11823-list-view-inspector
Oct 8, 2026
Merged

objectstack-fleet[bot] merged 6 commits into
mainfrom
claude/issue-11823-list-view-inspector

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Refs #11823 (item 1)

Clause-②: no

What this does

An object leaf's Properties panel in Studio's Interfaces pillar now edits the list view its canvas shows: Columns (add, remove, drag, or select a row and move it up or down), Filter and Sort. Edits autosave to the package draft and show on the canvas at once: ADR-0084's "source + preview", with preview = runtime. Steps 2 (dashboard and report create flow) and 3 (page create flow) of objectui#11823 are not in this PR, and the card stays open for them.

  • Which view. The one the canvas opens, read off the nav entry as the runtime reads it (navEntryListTarget). An entry that lands on a named view edits that view (matched with resolveViewId; a name that matches nothing is OBJECT.NAME, created by the first edit). Any other entry edits the object's default list view: the merged view flagged isDefault, else OBJECT.default, the name expandViewContainer gives a container's default list.
  • What is written, and through what. A view item in its record shape, { name, object, viewKind: 'list', isDefault?, config: { type, data, columns, filter?, sort? } }, sent by client.save('view', name, body, { mode: 'draft', packageId }): the pillar's own MetadataClient, behind its own useDraftSaveGuard (objectui#11773), debounced by the pillar's useDraftAutoSave. Both are called as they are. No new endpoint and no new client.
  • A view that does not exist yet. The panel says so, and shows the columns the running app shows such an object (defaultListColumnsFromObject, imported from views/ObjectView.tsx). The canvas shows those columns too. The first edit creates the view from them.
  • Read-only package. Only the read-only note shows, every control is disabled, the autosave is blocked on the same readOnly, and nothing is written.
  • Not a list view. An item at the view's name that is not a list view (a form view, or a body with no columns) is shown as such, and is never edited or saved over.
  • A refused save reads as the pillar reads one: issueRefusal from metadataError.ts (imported, not edited) gives the author sentence, with the raw refusal under Details.
  • Control. A studio-canvas leaf of any other type keeps studioCanvasNoBlocks.

Measurements (H1 to H4)

Taken against a published @objectstack/* 17.7.0 server (objectstack dev --fresh, the release this repo resolves), with a writable Studio package (POST /api/v1/packages) and a code package, and this branch's console under Vite, driven by Playwright and Chromium.

  • H1: confirmed, with one more finding. On 59ce048 the panel of an object leaf showed only studioCanvasNoBlocks (browser reading). For a plain entry the canvas rendered { type: 'object-view', objectName } with no listViews. That is a grid of the object's fields (Title, Amount, Stage, Due, Owner), not the package's default list view. On the same data, the running app (/apps/pst_app/pst_order) rendered the published default view: Title and Amount, filtered and sorted. For an object with no view, the canvas also showed Owner, which the runtime's fallback list leaves out. For a viewName entry, the canvas rendered the cache's named view. The panel now edits the entry's named view, or else the default view. The canvas shows the panel's view in both cases.
  • H2: measured; the record shape is written. The runtime serves an object's list views as view records (GET /meta/view). A package's defineView container arrives expanded: OBJ.default with isDefault: true, and OBJ.KEY for each named view. GET /meta/object/NAME carries no listViews; the console merges view items into objectDef.listViews (mergeViewsIntoObjects). The draft door accepted both a record and a container body (PUT /meta/view/NAME?mode=draft&package=…, 200). But ?preview=draft listed the record and not the container, because containers are never listed. publish-drafts published the record, and GET /meta/view then served it. The door refused a sort entry spelled direction (422). It accepted a draft for a code package's view as a customization overlay, so the read-only gate is Studio's own readOnly, as for every other inspector. The object's embedded listViews (ObjectSchema.listViews, meant for system objects) is not written: it belongs to the object definition and the Data pillar.
  • H3: confirmed, and resolved inside the canvas body. The canvas read only the metadata cache (useMetadata, published rows), and only for a viewName entry, so a draft never showed there. StudioObjectRecordsCanvas's body now also reads a Studio-internal context, StudioCanvasListViewContext. It sits beside the published props, like StudioCanvasNavEntryContext, and holds the panel's buffer. The function's signature and StudioCanvasPreviewProps are unchanged, and nothing is added to index.ts.
  • H4: measured. The runtime grid's column picker lives inside plugin-list's ListView (ViewSettingsPopover, not exported), so it cannot be imported. Three editors are reused by import, unedited:
    • Columns: the Studio's FieldsListEditor.
    • Filter: the runtime FilterBuilder, through the designer's exported filter-builder widget, which writes the spec's ViewFilterRule[].
    • Sort: the runtime SortBuilder from @object-ui/components, inside a popover. Placed inline in the 18rem rail, its fixed label and direction widths leave the field select about 36px. It has no disabled prop, so the read-only state disables its trigger instead. Its row id is stripped on write, because the spec refuses id on a sort entry.

The saved shape (browser reading, writable package)

After removing one seeded column of an object that had no view:

PUT /api/v1/meta/view/pst_item.default?mode=draft&package=com.probe.studio
{"name":"pst_item.default","object":"pst_item","viewKind":"list","isDefault":true,"config":{"type":"grid","data":{"provider":"object","object":"pst_item"},"columns":["name","qty"]}}

Every saved body in the pins parses with the spec's ViewItemSchema (installed @objectstack/spec 17.7.0).

Real-browser reading (dev-only harness, not committed)

Console from this branch, backend @objectstack/* 17.7.0, Chromium (/opt/pw-browsers/chromium):

  • Orders, which has a published default view: the panel showed All Orders with columns title, amount, filter Stage, and sort "Amount descending". The canvas showed Title and Amount, rows Charlie 20 and Alpha 10, which is the runtime's own rendering.
  • Adding the Stage column put Stage on the canvas at once, and an autosave PUT …/view/pst_order.default?mode=draft&package=com.probe.studio followed. The header's Changes count went to 1.
  • Switching the sort to ascending reordered the canvas to Alpha 10, Charlie 20, and the PUT carried "order":"asc".
  • Changing the filter value to won changed the canvas to Bravo 30 and Delta 5, and the PUT carried {"field":"stage","operator":"equals","value":"won"}.
  • Items, which has no view: the panel said no list view exists yet and showed name, qty, color. The canvas showed Name, Quantity and Color, as the running app does (before this change, the canvas also showed Owner). Removing color created the view (the PUT above), and the canvas dropped the column. After the package's drafts were published, the running app listed Name and Quantity.
  • A code package (writable: false): the panel was read-only, with no drag handles, no remove buttons, no Add field button, and disabled Filter and Sort triggers. No PUT was sent.
  • Opening the Filter and Sort popovers wrote nothing.

File surface

Every file is on the claim's surface:

  • studio-design/ObjectListViewInspector.tsx (new): the panel, the buffer hook (load, the version guard, save) and the pure helpers.

  • studio-design/StudioDesignSurface.tsx:

    • the inspector body's studio-canvas branch;
    • in InterfacesPillar, the list view's draft write path, which the claim asked to be named before editing: one useObjectListViewDraft call and one useDraftAutoSave call, placed right after the leaf autosave;
    • the provider around the canvas;
    • the conflict dialog's render;
    • an import.

    None of seat 3's objectui#11786 regions is edited: the useDraftAutoSave definition, the Data pillar's doSave, the Automations save and doPublish.

  • studio-design/studio-canvas-preview.tsx: the new context, listViewsOf exported at module level (not from index.ts), and the body of StudioObjectRecordsCanvas.

  • metadata-admin/i18n.ts: new engine.studio.inspector.listView.* rows, en and zh.

  • Tests beside these, and .changeset/11823-list-view-inspector.md (@object-ui/app-shell patch).

Two existing pins changed meaning, because the object leaf's rail is no longer the no-blocks statement:

  • StudioDesignSurface.studioCanvasLeaf.test.tsx now takes the no-blocks pins on a stub report studio canvas, and adds an object-leaf pin for the new panel.
  • StudioDesignSurface.selectionLeafScope.test.tsx now waits for the panel instead of the statement. Its assertions are unchanged.

Tests and gates (local git rev-parse --short HEAD = f5610fa, which includes main at 5aa7f55)

Command Exit Verdict
pnpm --workspace-concurrency=2 --filter "@object-ui/app-shell^..." build (via os-verify-lock) 0 VERDICT command-exit 0, 29 of 47 projects
pnpm --filter @object-ui/app-shell type-check (tsc --noEmit && tsc -p tsconfig.test.json) 0 tsc -p tsconfig.test.json --listFiles lists all 5 touched test files
pnpm exec vitest run on StudioDesignSurface*, studio-canvas-preview* and ObjectListViewInspector* 0 Test Files 54 passed (54), Tests 341 passed (341)
pnpm exec vitest run on the other 44 studio-design test files, plus the 5 tests that read the designer i18n tables 0 Test Files 49 passed (49), Tests 381 passed (381)
pnpm check:control-bytes 0 check-control-bytes: OK
pnpm check:new-line-citations 0 VERDICT new-cross-file-line-citations: 0 new citation(s)
pnpm check:changeset-claims 0 No pending changeset names a file this change touches.
pnpm check:pending-changeset-literals 0 No test source names a pending changeset.
pnpm check:i18n-designer-parity 0 Every en row has a zh row, and every shared row carries the same placeholders.
pnpm check:spec-symbols 0 OK
pnpm check:i18n-keys / check:i18n-drift 0 / 0 keys resolve / No designer-table en value changed in this range.
pnpm check:vi-mock-specifiers / -inherit / -override-shape 0 / 0 / 0 OK
pnpm check:test-path-roots / check:metadata-write-doors / check:unreferenced-sources 0 / 0 / 0 OK
node scripts/check-changeset-presence.mjs / check-changeset-no-major.mjs 0 / 0 9 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s) / no major

Lint (narrowed, measured). eslint --format json ran over the 9 touched TS files, as the package script runs it (eslint . from packages/app-shell): 9 files, 0 errors, 26 warnings, all of them react-refresh/only-export-components or react-hooks/* warnings, of the kinds the sibling studio-design files already carry. The root eslint.config.js sets no type-aware parser options (project / projectService), so this diff cannot move a verdict on a file it does not touch. The repo-wide pnpm lint and the full test farm are CI's.

Reverse check. With the fix committed, StudioDesignSurface.tsx was set back to main's blob (git checkout 5aa7f55 -- …, under a trap restoring from HEAD). The new pin file then went red in the predicted direction: Tests 6 failed | 1 passed (7). Every panel pin failed with Unable to find an element by: [data-testid="studio-list-view-inspector"], and the rail rendered the no-blocks statement. The CONTROL pin stayed green. After restoring, the file's blob equals HEAD's (9cb25ec…) and git diff HEAD is empty.

Acceptance notes

  • A viewName entry naming a view that does not exist yet: the panel shows the seed columns and the not-created note, while the canvas keeps its existing fallback (the plain grid) until the first edit. The runtime's landing for an unresolved /view/NAME was not measured.
  • FieldsListEditor is reused as it is. A row shows a column's own label, else its field name. The add-field popover still offers a field that is already a column (badged "Added") and system fields. Adding one twice writes a duplicate column, which the draft door accepts. Carrier: none.
  • A draft read carries _packageId, a spec-declared protection field, and saves send it back, as the pillar's leaf drafts do.
  • A list-view edit left within the 1.5 s debounce is dropped, as the leaf draft's is. Only nav editing mirrors dirty state up to the header's leave guard.
  • An object of another package, opened from this package's nav, is edited as a draft under this package. The door accepts that as a customization overlay; the round trip was not measured.
  • No message locator maps a refused view issue to its control yet, so a refusal reads as "the server refused this draft", with the issues under Details.

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


Generated by Claude Code

claude added 4 commits October 8, 2026 02:00
The Properties panel of an `object` leaf in Studio's Interfaces pillar
edits the list view its canvas shows: columns, filter and sort, saved to
the package draft as a `view` item through the metadata draft door, with
its own version guard and the pillar's autosave. The canvas renders the
panel's buffer, so an edit shows there before it is published. A
read-only package shows the panel disabled and writes nothing. Other
studio-canvas types keep the no-blocks statement.

Step 1 of objectui#11823.

Claude-Session: https://claude.ai/code/session_01DrKzdPdyLLBW3qpZ4vtk7z
Co-authored-by: Claude <noreply@anthropic.com>
…lumns, and edits list views only

A default list view that does not exist yet shows on the canvas with the
columns the running app shows such an object, which the first edit
starts from. An item at the view's name that is not a list view (a form
view, or a body with no columns) is shown as such and never edited or
saved over.

Claude-Session: https://claude.ai/code/session_01DrKzdPdyLLBW3qpZ4vtk7z
Co-authored-by: Claude <noreply@anthropic.com>
…st-view-inspector

Claude-Session: https://claude.ai/code/session_01DrKzdPdyLLBW3qpZ4vtk7z
Co-authored-by: Claude <noreply@anthropic.com>
…r reads one

A refused list-view save shows the Studio's author sentence with the raw
refusal behind a Details disclosure, read in the designer locale at
render (the refusal readers of metadataError.ts), and a load failure
shows as its text. A read-only package shows only the read-only note.

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

github-actions Bot commented Oct 8, 2026

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 336 chunks) 3538.9 KB 3551.8 KB
Main entry chunk (gzip) 162.5 KB 350 KB
Entry file index-BX8xabz7.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) 17.82KB 6.58KB
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) 18.15KB 5.40KB
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.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.70KB 10.94KB
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.11KB 7.97KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.28KB 2.60KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
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) 582.41KB 140.21KB
core (index.js) 10.00KB 3.96KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 235.31KB 65.44KB
fields (index.js) 266.88KB 67.46KB
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) 38.37KB 10.31KB
i18n (useSafeTranslation.js) 7.14KB 2.92KB
layout (index.js) 41.50KB 11.82KB
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) 13.86KB 5.00KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.52KB 2.26KB
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) 53.39KB 15.52KB
plugin-charts (index.js) 84.71KB 23.25KB
plugin-chatbot (index.js) 199.63KB 47.46KB
plugin-dashboard (index.js) 144.82KB 39.17KB
plugin-designer (index.js) 231.46KB 48.87KB
plugin-detail (index.js) 248.57KB 65.47KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 176.62KB 45.75KB
plugin-gantt (index.js) 179.17KB 45.07KB
plugin-grid (index.js) 239.75KB 65.92KB
plugin-kanban (index.js) 52.17KB 16.37KB
plugin-list (index.js) 117.42KB 29.32KB
plugin-map (index.js) 25.60KB 8.62KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 44.12KB 12.29KB
plugin-timeline (index.js) 39.10KB 11.81KB
plugin-tree (index.js) 15.07KB 5.33KB
plugin-view (index.js) 91.07KB 22.93KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.81KB 3.58KB
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.08KB 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.80KB
sdui-parser (provenance.js) 3.84KB 1.90KB
sdui-parser (types.js) 0.28KB 0.23KB
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-components.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.25KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.11KB 3.32KB
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

claude added 2 commits October 8, 2026 02:55
…iew cache key

The panel buffer's identity was spelled `view:` + the view name, the
adapter's view cache key that only invalidateViewKeys may spell
(objectui#4373), so the structural guard in
viewCacheInvalidation.guard.test.tsx refused the file. One helper,
listViewBufferKey, now spells it `listView:` + the name at all three
sites.

Claude-Session: https://claude.ai/code/session_01DrKzdPdyLLBW3qpZ4vtk7z
Co-authored-by: Claude <noreply@anthropic.com>
…st-view-inspector

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

github-actions Bot commented Oct 8, 2026

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 333 chunks) 3347.7 KB 3363.9 KB
Main entry chunk (gzip) 70.6 KB 350 KB
Entry file index-C1t7LBtm.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) 17.82KB 6.58KB
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) 18.15KB 5.40KB
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.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.70KB 10.94KB
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.11KB 7.97KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.28KB 2.60KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
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) 584.59KB 140.69KB
core (index.js) 10.00KB 3.96KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 235.31KB 65.44KB
fields (index.js) 266.88KB 67.46KB
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) 38.37KB 10.31KB
i18n (useSafeTranslation.js) 7.14KB 2.92KB
layout (index.js) 41.50KB 11.82KB
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) 13.86KB 5.00KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.52KB 2.26KB
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) 53.39KB 15.52KB
plugin-charts (index.js) 84.71KB 23.25KB
plugin-chatbot (index.js) 199.63KB 47.46KB
plugin-dashboard (index.js) 144.82KB 39.17KB
plugin-designer (index.js) 231.46KB 48.87KB
plugin-detail (index.js) 248.57KB 65.47KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 176.62KB 45.75KB
plugin-gantt (index.js) 179.17KB 45.07KB
plugin-grid (index.js) 239.75KB 65.92KB
plugin-kanban (index.js) 52.17KB 16.37KB
plugin-list (index.js) 117.42KB 29.32KB
plugin-map (index.js) 25.60KB 8.62KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 44.12KB 12.29KB
plugin-timeline (index.js) 39.10KB 11.81KB
plugin-tree (index.js) 15.07KB 5.33KB
plugin-view (index.js) 91.07KB 22.93KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.81KB 3.58KB
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.08KB 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.80KB
sdui-parser (provenance.js) 3.84KB 1.90KB
sdui-parser (types.js) 0.28KB 0.23KB
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-components.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.25KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.11KB 3.32KB
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
objectstack-fleet Bot marked this pull request as ready for review October 8, 2026 03:42
@objectstack-fleet
objectstack-fleet Bot enabled auto-merge October 8, 2026 03:42
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 8, 2026
Merged via the queue into main with commit bee5d6f Oct 8, 2026
45 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/issue-11823-list-view-inspector branch October 8, 2026 03:58
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.

2 participants