Skip to content

feat(plugin-list): a page list-view node is written data / type, and the metadata page reads properties.type as the list kind (objectui#12099) - #12668

Merged
objectstack-fleet[bot] merged 6 commits into
mainfrom
claude/issue-12099-list-view-data-type
Oct 16, 2026
Merged

objectstack-fleet[bot] merged 6 commits into
mainfrom
claude/issue-12099-list-view-data-type

Conversation

@objectstack-fleet

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

Copy link
Copy Markdown
Contributor

Fixes #12099
Clause-②: yes (narrowing)

Ruling: objectstack-ai/objectstack#22444, comment 6100463199 (ruling C). Claim: comment 6213954533 on objectui#12099. Written by the dispatched os-dev of the domain:ui seat 3, session session_01Vk15bz8xHtKGUfXfCm16h4.

What changes

  • Registration (packages/plugin-list/src/index.tsx). list-view and its view:list alias (one renderer, so one spelling) publish data (object: the spec's ViewData, { provider: 'object', object } names the object) and type (enum: the nine kinds a list view draws) in place of objectName and viewType. Neither is required: a dataSource binding can name the object. list-view's defaultProps are { data: { provider: 'object', object: '' }, columns: [], filter: [], sort: [], options: {} }. There is no type default: an absent kind is already the grid (the spec's list view type defaults to grid), absence lets a bound saved view's kind apply, and a type there would read as the registry key to anything that spreads the defaults onto a node.
  • How the kind travels (ListViewBlock). SchemaRenderer's hoist copies a node's properties onto the node, never copies the bag's type (the node's own type is the registry key), and keeps the bag on the node. So the list-view renderer reads properties.type itself and hands it to ListView as viewType, before the element-data-source gate, so a kind the node states outranks a bound saved view's kind. A value that names no kind a list view draws is dropped, and the list is a grid. HOIST_PROTECTED_KEYS is unchanged (hypothesis 2 below).
  • No fallback read. ListViewBlock removes a page node's own objectName and viewType, flat or hoisted from the bag, before the gate and ListView see the node. Each logs one console warning per process naming what to write instead. A node that names its object only as objectName therefore names none, and draws the "no object named" hint, which now names data.object. ListViewBlock draws that hint after the binding is applied; the gate's own requiresObject hint names the gate's object key, which is objectName.
  • The object. data passes through as authored. normalizeListViewSchema's existing object-provider fold (objectui#7477) lands it on ListView's objectName. A bound dataSource.object still lands on objectName through the gate and outranks data.object. objectName and viewType remain the hand-off keys between the gate and the ListView component; neither is read off the page node.
  • Docs. plugin-list README: a new section "On a page — data and type", and the page-binding section now names data. content/docs/guide/data-source.md: list-view's object key is data and its hint names data.object.
  • Changeset. .changeset/12099-list-view-page-spelling.md, @object-ui/plugin-list minor, with the breaking part for page nodes in the old spelling spelled out.

The PM's mechanism hypotheses, measured

  1. Holds at 8614705: the registration's inputs carried the shared objectName input and a viewType enum, its defaultProps objectName: '' and viewType: 'grid', and SchemaRenderer declared HOIST_PROTECTED_KEYS = new Set(['type', 'id']). A scratch probe (deleted) through the real SchemaRenderer and the real registration, with view spies: { type: 'list-view', properties: { data: { provider: 'object', object: X }, type: 'kanban', kanban } } drew a grid over X (the data half already bound; only the kind was lost), and the flat old spelling drew a kanban.
  2. Holds. The hoist keeps properties on the node after copying it, so the renderer can read properties.type itself. A global change would reach the two spec ComponentPropsMap rows that declare a type member, page:tabs (the tab style) and element:metadata_viewer (2 of 59 rows, read from the installed @objectstack/spec 18.0.0-next.1). Chosen: the narrow read in ListViewBlock.
  3. Partly holds. On the page path the object already resolved from data (the fold above) and from dataSource.object (the gate). What moved: the node's objectName is not read, and the hint judges data (an object provider counts only with a non-empty object; rows and any other provider count as a source). The gate still lands a binding on objectName, as the internal hand-off: landing it "into data" would either overwrite an authored rows or value-provider data or need a new gate option in @object-ui/react, outside this claim. ⚠️ The objectui validate record-source rule did not move: it lives in @object-ui/types (the list-view arm's requireRecordSource call). See the stop below.
  4. Holds, with the stop it predicts. The page path and the React component props are one type: ListViewBlock is a forwardRef over ListViewProps, whose schema is @object-ui/types' ListViewSchema, the zod-derived face that objectui validate and StrictAnyComponentSchema judge a list-view node with (type is the 'list-view' discriminator literal; objectName and viewType are its members; it has no properties member). Measured on that face at 8614705: the ruled page node is refused (strict: unrecognized_keys properties, plus RECORD_SOURCE_REQUIRED at objectName; tolerant: the record-source issue), a flat data-only node is refused the same way, and the flat old spelling is accepted. Separating the two needs a @object-ui/types change, a contract face, so it is not in this PR (open question below).
  5. Census below.
  6. Cross-repo consumers below.

Census: nodes written with objectName / viewType (hypothesis 5)

Instrument: a node-literal scan over git ls-files (a list-view or view:list type literal in TS or JSON, or the html tag) with objectName / viewType within the next 8 lines. Positive control: the first ListView example in packages/plugin-list/README.md (hit). The ruling's count of about 7 files and 45 mentions is its own reading. Non-test result at 8614705, 5 files and 12 sites:

  • packages/plugin-list/README.md, 8 sites: each one an example of the ListView React component's schema prop, not a page node.
  • packages/app-shell/src/views/InterfaceListPage.tsx and packages/app-shell/src/views/ObjectDataPage.tsx: each renders the ListView component directly with the schema it builds, not through SchemaRenderer and the registration.
  • packages/plugin-view/src/ObjectView.tsx: the schema handed to a host's renderListView; the console's host (app-shell ObjectView) renders the ListView component with it.
  • packages/plugin-list/src/ListView.tsx: one doc comment.

So no objectui source, README or guide writes objectName / viewType on a node that reaches the list-view registration, and no runtime-built node in this repository reaches it. The four component-prop sites stay as they are: on that type type is the discriminator, so the kind cannot be spelled type there without the @object-ui/types change. The page-path test fixtures that bound a list through the old spelling were respelled (Tests).

Stopped, not shipped: the @object-ui/types face

objectui validate (both faces) and this repository's own check:doc-json gate still judge a list-view node in the spelling before this PR: they accept a flat objectName / viewType node that the renderer no longer reads, and refuse the ruled page spelling, telling the author to declare objectName. The README's new page example therefore carries a doc-json: fragment declaration naming this; the gate re-judges it on every run, so it turns red (stale) the day the face accepts the page spelling. The decision request is in the os-dev report on the card.

Contract evidence (Clause-②)

  • The Clause-②: line: corrected by the dispatching seat from yes (widening, with the old spelling retired) to yes (narrowing), per the contract review of record 6216255338 (its ②). The diff widens and narrows; the closed pair takes one arm, and the narrowing arm is the one that decides the review owed (CONTRACT_REVIEW_TIER). Nothing in the tree moved.
  • @object-ui/plugin-list built dist, measured: built once with the 8614705 versions of src/index.tsx and src/ListViewBlock.tsx and once at this head. All 10 dist/*.d.ts files are byte-identical. The runtime contract moved in dist/index.js: list-view's inputs objectName and viewType became data and type (the same on view:list), and its defaultProps { objectName: '', viewType: 'grid', … } became { data: { provider: 'object', object: '' }, … }.
  • @object-ui/react: no file under packages/react or packages/types changed (an empty git diff 8614705 over both), so neither built output moves.
  • Widens: a page list-view reads properties.type as its kind, and the published inputs gain data and type. Narrows: a page node's objectName and viewType are no longer read, and the published manifest no longer lists them, so an html-tier objectName or viewType attribute now draws unknown-prop.

Cross-repo consumers (named, not changed here)

Tests

  • New pin packages/plugin-list/src/__tests__/ListViewBlock.pageCarrierSpelling-12099.test.tsx, through the real SchemaRenderer and registration: the card's kanban through properties.type (bound to the object properties.data names, queried, and the object-kanban node is the one ListView builds, so the node dispatched as list-view); a grid when properties.type is absent or names no kind; the same on view:list; ⛔ no read of objectName / viewType in the bag or flat (hint naming data.object, no query); a viewType beside a working data changes nothing; one warning per retired key per process; properties.type beside a dataSource binding, outranking a bound saved view's kind, with the view's kind applying when absent; the registrations' inputs and defaultProps.
  • Fixtures respelled (each used the old spelling only to bind the list; none pinned the old branch except where noted): plugin-list ListView.sharedGate (the authored-kind case now authors properties.type), ListView.elementDataSource, ListView.invalidationRefetch-10572, ObjectGallery.filterContextTokens-10666, htmlTierColumnSpellings-6598 (form 8a now expects the hint to name data.object), htmlTierListViewDefaultColumns-6598; console filterContextTokensSweep-10666, htmlTierDataSourceInputDeclaration-6678, objectname-neither-hint-11605 (list rows name their object in data, and a new row pins that the retired objectName draws the hint), objectname-binding-required-11605 (the object key read off the binding doc, plus a row pinning unknown-prop for the retired attributes), public-block-binding-reach (list-view left the population of blocks that declare objectName, with the reason).
  • Union run at the final head: at 9e4c5ee, pnpm exec vitest run --maxWorkers=2 over the whole packages/plugin-list/ plus 71 named files elsewhere that render a list-view through the registry or read its published inputs (console manifest and html-tier pins, app-shell list surfaces, plugin-view, react, components, sdui-parser, types): Test Files 212 passed (212) / Tests 2904 passed (2904) (lock verdict command-exit 0). pnpm --filter @object-ui/plugin-list type-check (both projects; the test project includes the new pin) exits 0 after pnpm --filter '@object-ui/plugin-list^...' build.
  • Ablations, each through ablation-replace.mjs with the restore proven by blob hash and an empty git diff HEAD, direction predicted before running:
    • drop the properties.type hand-off: predicted and observed 5 red (the kanban case, view:list, both binding cases, the sharedGate authored-kind case), 30 green.
    • keep the retired keys on the hand-off: predicted and observed 4 red (both objectName-only hint cases, the viewType-beside-data case, the warning case), 14 green.

Gates

Local subset, each exit code captured before any pipe, at 9e4c5ee:

  • 0: check:control-bytes, check:new-line-citations (0 new citation(s)), check:i18n-keys (the hint's inline default equals the en pack), check:doc-types, check:doc-json (the README page example sits in the declared bucket, re-judged as refused by the face), check:doc-fences, check:element-data-source-declaration, check:component-surface-parity, check:handler-key-reads, check:changeset-claims, check:pending-changeset-literals, check:test-path-roots, check:prompt-keys, check:registry-bare-names, check:spec-symbols, scripts/check-changeset-presence.mjs, scripts/check-changeset-no-major.mjs; eslint --no-inline-config over the 14 changed TS files: 0 errors (the warnings are the existing any patterns of the respelled files; the new pin carries none).
  • scripts/check-governed-queue-guard.mjs --test over the 17 changed paths: NOT GOVERNED.
  • NOT MEASURED locally, left to CI: check:doc-snippets (exit 2, precondition: 34 packages unbuilt; no ts fence changed), check:sdui-registration-pins (exit 2, needs a console build), check:readme-exports (exit 1 on 382 self-imports it could not judge, all in packages outside this build closure; plugin-list's README drew none, and the judged set has 0 wrong-path, 0 fabricated), the console type-check (its closure is the whole workspace; only test literals changed there), pnpm lint and the full test farm.

Acceptance notes

  • The html tier has no attribute for the kind. Its parser refuses a type attribute by design (the tag is the component), so an html-tier list-view tag cannot state a kind; a bound saved view's kind still applies. The type input is published and reachable on metadata pages and on the react tier (whose type attribute is parked as specType, unchanged).
  • check:doc-types reads properties.type as a node type: every type literal in a code block is judged against the registry, so a page example with "type": "kanban" in properties is flagged. The README states the kind in prose beside the example instead. Noted, not filed.
  • React tier, read from source, not run: ListView with type="kanban" and a dataSource naming a saved view parks the kind as specType, which normalizeListViewSchema reads only when viewType is absent, and the gate writes the view's kind to viewType first; so there the saved view's kind would win over the author's. Not changed here (the react tier's carrier), not filed (not reproduced).

Generated by Claude Code

…the metadata page reads properties.type as the list kind

The list-view and view:list registrations publish `data` and `type` in
place of `objectName` and `viewType`. ListViewBlock reads a metadata
page's kind from `properties.type` (the hoist never copies a bag's
`type` onto the node, whose own `type` is the registry key), and no
longer reads a page node's own `objectName` / `viewType`. A node that
names no record source draws the "no object named" hint naming
`data.object`.

Claude-Session: https://claude.ai/code/session_01Vk15bz8xHtKGUfXfCm16h4
Co-authored-by: Claude <noreply@anthropic.com>
…e; docs name the page spelling

Respells the page-path fixtures that bound a list-view through the
retired objectName / viewType to `data` / `properties.type`, teaches the
console's binding pins the list-view `data` key and its hint, and
documents the page spelling in the plugin-list README and the binding
guide.

Claude-Session: https://claude.ai/code/session_01Vk15bz8xHtKGUfXfCm16h4
Co-authored-by: Claude <noreply@anthropic.com>
…arrier pin without any

`check:doc-types` reads every `type` literal in a code block as a node
type, so the README example keeps the node's own `type` only and names
the `properties.type` kind in the prose beside it.

Claude-Session: https://claude.ai/code/session_01Vk15bz8xHtKGUfXfCm16h4
Co-authored-by: Claude <noreply@anthropic.com>
@github-actions github-actions Bot added documentation Improvements or additions to documentation plugin apps tests labels Oct 16, 2026
@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) 65.9 KB 350 KB
Entry file index-BA1FbVHK.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) 132.91KB 34.06KB
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

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 9e4c5eea2817746e1a956d92e8a4500cc2bf6987
Local-runs: none
Scope: packages/plugin-list/src/index.tsx, packages/plugin-list/src/ListViewBlock.tsx, packages/plugin-list/src/tests/ListViewBlock.pageCarrierSpelling-12099.test.tsx, packages/plugin-list/src/tests/ListView.sharedGate.test.tsx, packages/plugin-list/src/tests/ListView.elementDataSource.test.tsx, packages/plugin-list/src/tests/ListView.invalidationRefetch-10572.test.tsx, packages/plugin-list/src/tests/ObjectGallery.filterContextTokens-10666.test.tsx, packages/plugin-list/src/tests/htmlTierColumnSpellings-6598.test.tsx, packages/plugin-list/src/tests/htmlTierListViewDefaultColumns-6598.test.tsx, apps/console/src/tests/filterContextTokensSweep-10666.test.tsx, apps/console/src/tests/htmlTierDataSourceInputDeclaration-6678.test.tsx, apps/console/src/tests/objectname-binding-required-11605.test.ts, apps/console/src/tests/objectname-neither-hint-11605.test.tsx, apps/console/src/tests/public-block-binding-reach.test.tsx + packages/plugin-list/package.json (the exports map and files), packages/react/src/SchemaRenderer.tsx (the properties hoist and HOIST_PROTECTED_KEYS), packages/react/src/element-data-source/ElementDataSourceGate.tsx (the binding-to-schema mapping, requiresObject, the no-object panel), packages/react/src/hooks/useElementDataSource.ts, packages/react/src/index.ts, packages/core/src/utils/normalize-list-view.ts (normalizeListViewSchema, isListViewVisualization), packages/plugin-list/src/ListView.tsx (the hand-off reads), packages/sdui-parser/src/parse.ts (DISCRIMINATOR_ATTR), packages/sdui-parser/src/validate.ts (SDUI_BASE_PROPS), packages/types/src/zod/objectql.zod.ts (ListViewSchema, requireRecordSource), .changeset/config.json; the prose faces read too: .changeset/12099-list-view-page-spelling.md, packages/plugin-list/README.md, content/docs/guide/data-source.md. All at the head sha above (REST contents reads); the one local-checkout grep is named where it is cited.

Inputs: card objectui#12099 (body and all four comments, the os-dev report 6215866081 included), ruling C on objectstack-ai/objectstack#22444 comment 6100463199, the PR body, file list and net diff against main at the head, the head's check-runs, objectui#12670 and objectui#12649. The brief's own conclusions were not adopted; each item below was re-read in the cited code.

① Derived judgments

  1. Registration inputs / defaultProps, measured on what @object-ui/plugin-list publishes — RIGHT. package.json publishes one entry (. → dist/index.js, dist/index.umd.cjs, dist/index.d.ts) and files = dist, README.md, CHANGELOG.md, LICENSE. The built entry's export list (src/index.tsx: ListView, ListViewBlock, ViewSwitcher, ObjectGallery, ViewSwitcherDropdown, TabBar, TabBarSelect, UserFilters, the three normalizers, LIST_DEFAULT_TRANSLATIONS, the prop and handle types) is unchanged by the diff. Every new symbol in ListViewBlock.tsx (toListViewHandOff, namesRecordSource, ListViewNoObjectHint, PageNodeBag, RETIRED_PAGE_KEYS, the warn set) is module-private, and ListViewBlock's declared shape (elementDataSourceBlock over a forwardRef of ListViewHandle / ListViewProps) is as before, so the .d.ts closure does not move; the dev's reading (10 dist/*.d.ts byte-identical) is consistent with what the source exports. The contract moves in the registration side effect dist/index.js carries: on both list-view and view:list, inputs objectName + viewType become data (type object, the spec's ViewData) + type (enum of the nine kinds, not required); list-view's defaultProps { objectName: '', viewType: 'grid', … } become { data: { provider: 'object', object: '' }, columns: [], filter: [], sort: [], options: {} }. The README, in files, publishes with it. Pinned through the real registry in the new test's last describe.

  2. A page node in the old spelling at render — RIGHT, and no fallback read remains on the page path. toListViewHandOff runs before the gate: a node whose top-level objectName or viewType is !== undefined (the old default objectName: '' included) has both keys removed, and console.warn names the key and the remedy once per key per process. The hoist has already flattened properties.objectName / properties.viewType onto the node, so bag and flat are one case. A node whose only object is the retired key therefore names none: namesRecordSource, judged inside the gate's render-prop after the binding applied, draws the list-view-no-object panel with the gate's own view.noObject key and property: 'data.object', and ListView is never mounted, so nothing is fetched. Read for a remaining read: SchemaRenderer.tsx at head has zero objectName / viewType reads; useElementDataSource.ts has none live (its one mention is a doc comment); the gate WRITES them (next[objectKey] = composed.object unconditionally; next.viewType only when base.viewType === undefined); ListView.tsx reads only the hand-off schema (no props.objectName, no read of schema.properties); the retained properties bag is read by the block for type alone. The ruling's clause (stored nodes are carried by the spec's ADR-0087 D2 conversion, never a fallback read here) holds on this tree. Pinned in the new file (bag and flat, the warning count, the viewType-beside-data control) and the console objectname-neither-hint-11605 rows.

  3. How properties.type reaches the list without clobbering the node's type — RIGHT. HOIST_PROTECTED_KEYS = new Set(['type', 'id']) is untouched; the memo's hoist skips type and id, restores outerType / outerId, and keeps newSchema.properties = props on the node. So the block's narrow read — isConfigBag(bag) ? bag.type : undefined, then isListViewVisualization(kind) from @object-ui/core — is the only channel; a non-kind ('page', or the registry key itself) is dropped and the list is a grid. Chosen over a global hoist change that would have reached page:tabs and element:metadata_viewer, whose spec type members mean something else: the right narrowness. Pinned: the kanban spy receives the object-kanban node ListView builds and no "Unknown component" is drawn.

  4. A node-stated kind over a bound saved view's kind — RIGHT. The block writes viewType from properties.type before the gate; the gate's viewType branch only fills absence; absent, normalizeListViewSchema resolves authoredViewKind ?? 'grid'. So node kind outranks view kind, view kind applies when the node states none, grid otherwise — the README's standing rule (the component's key wins, filter excepted), now stated for the kind. Pinned three ways in the new file and re-spelled in ListView.sharedGate. The dev's out-of-scope note that the react tier's specType has the opposite precedence is a pre-existing read of another carrier, not this diff's.

  5. The html tier — RIGHT, as ruling C's consequence. parse.ts refuses a type attribute at parse (DISCRIMINATOR_ATTR = 'type', the existing forbidden-attr code: the tag is the component), and properties is not in SDUI_BASE_PROPS, so no attribute on that tier can state the list kind once viewType is gone: an html list-view tag draws a non-grid kind only through dataSource.view, and viewType= / objectName= now draw unknown-prop (pinned in objectname-binding-required-11605). data is both a declared input and a where-undeclared base prop, so data={{ provider: 'object', object }} compiles with zero diagnostics (pinned). Ruling C refused a carrier-specific envelope (its option B); an html-only kind attribute would be exactly that, so the loss is what C accepts.

  6. The dev's deviations.

    • defaultProps publish data but no type — RIGHT. Absence is the spec's own grid default and is what lets a bound saved view's kind apply; a type: 'grid' default would collide with the registry key in any consumer that spreads defaults onto a node (the designer's palette path stores a palette item's defaultProps as the node's props bag). The type input is published; the ruling's words ("publishes data / type instead") name the spelling, not a default value; the card's intent (new spelling in, old spelling out of both inputs and defaults) is met.
    • The gate still lands dataSource.object on objectName — RIGHT. That key is the hand-off between the gate and the ListView component's props (which still spell objectName / viewType; see ③), never a read of the page node, whose own keys are gone before the gate runs. normalizeListViewSchema's data → objectName fold is gap-fill only (a non-empty objectName wins), so a bound object survives the registration's empty data.object default and outranks an authored data.object, as the guide now says. Landing the binding into data would overwrite an authored rows / value-provider data or need a new gate option in @object-ui/react outside the claim.

Also read, not WRONG: toListViewHandOff reads properties only; the legacy props alias bag's type is never hoisted and is not read, which matches the ruling's own wording (properties.type). A grep of non-test type: 'list-view' literals in the local objectui checkout at 8614705c finds the four sites the dev's census names (plugin-view ObjectView.tsx, app-shell InterfaceListPage.tsx and ObjectDataPage.tsx, a doc comment in objectql.zod.ts), each a ListView component schema, none a page node; the ruling's "seven files" counted README and guides. view.noObject carries {{property}} in the locale packs; check:i18n-keys is inside the green Repo Gates.

Check-runs on the head (36): 32 success — Lint, Type Check, Repo Gates, Build & E2E, Test (shard 1/16 … 16/16), Test (dist pins), Test, Governed Surface Queue Guard, Changeset Declaration, Changeset Claim Re-read, Changeset Bump Policy, Changeset Fixed Group Check, Line Citation Gate, Build Docs, Bundle Analysis, label; 3 skipped — Test (coverage), the coverage shard matrix, dependabot; 1 failure — Live E2E (informational). Nothing in_progress at the last read: Test (shard 3/16) was in_progress at my first read and completed success 2026-10-16T12:57Z. On the red: its job log is not readable from this container (the log blob answers Forbidden through the proxy); its annotations are "No files were found with the provided path: test-results/, backend.log, console-preview.log" and "Process completed with exit code 1" — no spec ran and no artifact was uploaded, the shape objectui#12649 names (a cold live-backend npm install dying in arborist). This PR touches no e2e/** path. Read as the lane's standing red, not this PR's.

② Semver level

  • @object-ui/plugin-list: minor with the break in prose — RIGHT, the repo's correct spelling. objectui AGENTS.md §9 (版本号策略): the fixed group's major tracks @objectstack's, and 「changeset 里不要声明 major …… objectui 自身的破坏性变更也标 minor(在正文里写清 breaking 语义即可)」, enforced by scripts/check-changeset-no-major.mjs (Changeset Bump Policy: success). The body carries the FROM → TO mapping (objectName → data: { provider: 'object', object }, viewType → properties.type), the runtime symptom (the hint naming data.object, one warning per key), who converts stored nodes (the spec's ADR-0087 conversion), and that ListViewSchema's React props are unchanged. The fixed group (.changeset/config.json, plugin-list among its members) takes the minor together.
  • The PR body's Clause-②: line against the diff — WRONG as spelled, right in substance; a body correction before ready, not a re-review. The diff widens (publishes data / type, reads properties.type) and narrows (retires objectName / viewType from the inputs and from every page read — the changeset's own "Breaking" bullet). The declaration is yes|no plus at most one arm of the closed pair (widening) / (narrowing); (narrowing) is the arm with a consequence, since it is what makes a CONTRACT_REVIEW_TIER review owed, and yes (widening, with the old spelling retired) is not a closed-pair spelling. Measured: record-recognisers.mjs --template --paths over this file list says the paths decide no face and the Clause-②: line decides; read against this line it finds no (narrowing) arm and would route the PR to the declaration face (TIER_DEFAULT), under-stating the review owed. None of objectui's four changeset gates parses the arm (they judge structure), so nothing mechanical reds it. This record serves the higher tier regardless; the body's line should read Clause-②: yes (narrowing) — the widening half is already carried by yes → minor. The changeset body carries no Clause-②: line and objectui's rules do not ask for one there.

③ Boundary flags

Implemented-by: claude/issue-12099-list-view-data-type
Reviewed-by: session_01Vk15bz8xHtKGUfXfCm16h4

VERDICT: PASS

PASS is on the head above: the committed tree does what ruling C asks and nothing it forbids. Before ready, the PR body's Clause-②: line takes the (narrowing) arm (② above); that edit moves no commit and re-opens nothing here.


Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

席位核对 — ACCEPT · domain:ui seat 3 · session_01Vk15bz8xHtKGUfXfCm16h4 · 2026-10-16T13:17Z

Head reviewed: 9e4c5eea2817746e1a956d92e8a4500cc2bf6987 (one round, no patch round). Card objectui#12099; claim 6213954533 (Clause-②: yes, its reason naming the narrowing half); ruling C on objectstack-ai/objectstack#22444, comment 6100463199; contract review of record 6216255338 (CONTRACT_REVIEW_TIER, narrowing face, PASS, this head).
Implemented-by: claude/issue-12099-list-view-data-type
Reviewed-by: session_01Vk15bz8xHtKGUfXfCm16h4

1. Shape.

  • Draft PR against main. The body's first line is Fixes #12099, and the body has no other closing keyword (scanned in full).
  • 17 files, +698/−99.
  • Changeset .changeset/12099-list-view-page-spelling.md: @object-ui/plugin-list: minor, with the break and its FROM → TO mapping in the body. It declares no major (objectui AGENTS.md §9).
  • No content/docs/releases/.
  • No file under packages/types or packages/react changed.
  • Five apps/console/src/__tests__ files sit outside the claim's literal paths. Each pins the list-view registration's inputs, which this PR changes, so they are the claim's "tests beside each" (dev report 6215866081, deviations).
  • The body's Clause-②: line now reads yes (narrowing). The seat corrected it after the review (its ②). The old wording came from the seat's own dispatch order, not from the dev. No commit moved.

2. Premises measured.

  • Ruling C: both clauses the card quotes were re-fetched at the claim. The review read the page path for any remaining read of objectName / viewType and found none. It checked SchemaRenderer.tsx, useElementDataSource.ts, ElementDataSourceGate.tsx (it writes the keys and does not read them) and ListView.tsx (it reads only the hand-off).
  • Reach of the retirement, measured by the seat with git grep on objectstack origin/main 570f01d27, over examples/ and packages/ (console dist, tests and changelogs excluded):
  • No browser check. No page in either repo authors the changed node, so there is no screen to compare. The behaviour is pinned through the real registry:
    • ListViewBlock.pageCarrierSpelling-12099, its last describe: kanban kind, the hint, one warning per key, node kind over view kind;
    • the console's html-tier rows objectname-binding-required-11605 and objectname-neither-hint-11605.

3. Gates (check-runs pinned to this head, re-read at this stamp).

  • 36 runs: 32 success, 3 skipped (Test (coverage), its matrix row, dependabot), 1 red.
  • Among the successes: Lint, Type Check, Repo Gates (with check:i18n-keys), Test (shard 1/16) … (16/16), Test (dist pins), Build & E2E, Build Docs, Bundle Analysis, Changeset Declaration, Changeset Claim Re-read, Changeset Bump Policy, Changeset Fixed Group Check, Line Citation Gate, Governed Surface Queue Guard.
  • The red is Live E2E (informational). Its annotations show no test results, no backend log and exit 1: no spec ran. That is the shape of the anchor objectui#12649 (domain:devx, p1), red on every PR built on main f62b6ff. This PR touches no e2e/** path. It is not this diff's red.
  • The dev's local subset is in report 6215866081.

4. Accepted deviations.

  • defaultProps publish data but no type. Absence is the spec's grid default, and it lets a bound saved view's kind apply. The type input itself is published. (Review ①6.)
  • The gate still lands a bound dataSource.object on objectName. That is the internal hand-off to ListView's React props, never a read of the page node. (Review ①6.)
  • The html tier has no kind attribute: an html list tag states a kind only through dataSource.view. Open question 2 was answered A. It is ruling C's consequence. (Review ①5 and ③.)
  • The @object-ui/types face lags the renderer (open question 1). It is filed as objectui#12670, which triage graded p1 + target:v18 with option A (6216264566). The review judges that this PR may land before that face moves (③), and the grade meets the review's condition.
  • No browser check (2 above).
  • Prose checked sentence by sentence against the review's code readings:
    • the changeset's "Neither input is required", "now draws a kanban over deal", "A kind the node states outranks a bound saved view's kind" and "Each logs one console warning naming what to write instead";
    • the README's "A type that names no kind this list draws is a grid too", "The page renderer removes them before the list sees the node" and "objectui validate does not judge the page spelling yet";
    • the guide's "a bound dataSource.object outranks data.object" and the hint text "No object named: set data.object or dataSource.object.".

5. Out of scope (where each went).

  • The ListViewSchema authoring face (open question 1) → filed objectui#12670.
  • check:doc-types reads properties.type inside a code fence as a node type, so the README states the kind in prose. The README's doc-json: fragment declaration names this card and goes stale when the face moves. → A rider on objectui#12670, which restates the fence; it will be named in that card's claim.
  • React tier, read from source and not run: ListView with type and a dataSource naming a saved view parks the kind as specType, so the view's kind would win. A React prop is not stored metadata, and the case was not reproduced. → Acceptance notes.

6. Landing.


Generated by Claude Code

@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 70 chunks) 3119.0 KB 3119.4 KB
Main entry chunk (gzip) 66.0 KB 350 KB
Entry file index-uXMNRTtW.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.81KB 144.28KB
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) 132.91KB 34.06KB
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
objectstack-fleet Bot marked this pull request as ready for review October 16, 2026 14:36
@objectstack-fleet
objectstack-fleet Bot enabled auto-merge October 16, 2026 14:36
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 16, 2026
Merged via the queue into main with commit 5c0846e Oct 16, 2026
37 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/issue-12099-list-view-data-type branch October 16, 2026 14:50
os-elon-musk pushed a commit that referenced this pull request Oct 16, 2026
…12670-list-view-page-face

Brings in objectui#12099's renderer half of ruling C (5c0846e) and
objectui#12666's page view-data detach (15d8ca6). The two test files both
sides edited (imported-defaults-8317, spec-object-refinements-7715)
auto-merged, and each keeps both intents.

Claude-Session: https://claude.ai/code/session_01Vk15bz8xHtKGUfXfCm16h4
Co-authored-by: Claude <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

apps documentation Improvements or additions to documentation plugin tests

Projects

None yet

2 participants