Skip to content

fix(plugin-dashboard): a dimensioned pie / donut / funnel / treemap / sankey says which measures it drops (objectui#11417) - #11433

Merged
objectstack-fleet[bot] merged 3 commits into
mainfrom
claude/issue-11417-single-series-drop-signal
Oct 2, 2026
Merged

objectstack-fleet[bot] merged 3 commits into
mainfrom
claude/issue-11417-single-series-drop-signal

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Part of #11417. What stays open is triage's item 2: at the pin bump that carries objectstack-ai/objectstack#21293, objectui's DashboardWidgetSchema mirror follows the refusal. Measured below (item 2): that needs objectui code at the bump, so the card stays open after this PR merges.

Clause-②: no

What changes

A dataset widget of the pie / donut, funnel, treemap or sankey family with a dimension and two or more measures hands every measure to the shared chart renderer as a series, and the renderer draws the first series only. The query ran both measures, every door accepted the document, and nothing said the second measure was dropped.

  • packages/plugin-dashboard/src/DatasetWidget.tsx: one new set, SINGLE_SERIES_CHART_FAMILIES, read off the family a widget renders AS (CHART_TYPE_MAP, so a stored pyramid is in it through funnel). renderedMeasures now says "the first measure only" for a chart of that family, and the existing dropped-measure diagnostic (objectui#8894, PR objectui#11416) names the dropped measures. ⛔ No change to what is drawn: the chart schema handed to the renderer is byte-unchanged (every measure is still a series).
  • The message for this shape ends with the cause, Its chart family "pie" draws a single series: the first declared measure., and points to no ADR-0087 entry. The tile's pointer (dashboard-widget-metric-family-multi-measure-refused) answers for "a one-number tile with several measures", which a chart with a dimension is not; no entry at spec 17.5.0 answers for this shape, and none is invented.
  • packages/plugin-dashboard/README.md, content/docs/plugins/plugin-dashboard.mdx and the pending .changeset/8894-dashboard-measures-not-rendered.md said this shape "draws only the first, with no warning (objectui#11417)"; they now say the warning covers it. New .changeset/11417-dashboard-single-series-dropped-measure.md (@object-ui/plugin-dashboard patch).

The PM's mechanism assumptions, measured

  1. One source for "what the chosen branch renders". The renderer exposes no declaration of the single-series families: its arms are chartType === … branches, and the one set it declares, SERIES_ONLY_CHART_TYPES (families that draw series.map(…) and nothing else), is not this set's complement (radar draws every series, scatter refuses). plugin-dashboard also reaches plugin-charts only as a devDependency. So the list lives once, in DatasetWidget, and a pin ties it to the renderer by behaviour, not by name: DatasetWidget.singleSeriesMeasures-11417.test.tsx, block "the TIE", renders every chart type @objectstack/spec's ChartTypeSchema declares (13 after the metric family and table / pivot) through the REAL chain (DatasetWidget → SchemaRenderer → registry chart → AdvancedChartImpl), changes the second measure's values, and requires the diagnostic to fire exactly when the drawn markup does not change. Controls per type: same rows twice give identical markup; changed FIRST-measure values give different markup (the plot painted).
  2. The arms. The five drawing arms are the pie / donut arm (const pieDataKey = series[0]?.dataKey || 'value'), the funnel arm, the treemap arm and the sankey arm (const rootName = series[0]?.label || dataKey). Two of the brief's six series[0] reads are not drawing arms of the five: one is the pie CLICK handler (handlePieClick), the other the metric-family single-value arm (SINGLE_VALUE_CHART_TYPES). scatter was measured and is NOT added: with two series it renders a visible refusal naming them (SeriesArityRefusal, data-chart-error="scatter-multi-series"), so nothing is dropped in silence; the tie pin accepts exactly that refusal for scatter and stays silent there.
  3. The message. The tile pointer sentence would have been false for this shape (it is about a one-number tile); see "What changes".
  4. README / docs / changeset. Corrected in this PR, as above.
  5. Item 2, the mirror. DashboardWidgetSchema in packages/types/src/zod/complex.zod.ts re-attaches the spec's object-level checks by NAMED import, one .superRefine(checkX) line per exported check (checkDashboardWidgetStageOrder, checkDashboardWidgetMetricMeasureArity), and packages/types/src/__tests__/spec-object-refinements-7715.test.ts reddens on any check the spec adds until a line and a census row are added. It does not follow new checks wholesale. objectstack main (4e6dc233) already exports a third, checkDashboardWidgetDimensionlessMeasureArity (objectstack#21053), which objectui does not chain yet; whether objectstack#21293 widens that export or adds a fourth, the bump carrying it needs at least one re-attachment line in objectui. Hence Part of.

Tests (final head 6d55dd12c)

  • New packages/plugin-dashboard/src/__tests__/DatasetWidget.singleSeriesMeasures-11417.test.tsx, 22 tests: five SUBJECT pins (triage's: each of the five types with a dimension and two measures names "cost" as dropped and "revenue" as rendered; both doors accept the document), a SUBJECT on the message (cause stated, no ADR-0087 entry, no advice, no other type named), a SUBJECT for a stored pyramid (the family decides), CONTROL one measure on a dimensioned pie (silent, triage's), CONTROL a dimensioned bar with two measures (silent), and the 13-row tie.
  • pnpm exec vitest run packages/plugin-dashboard/src/__tests__/DatasetWidget.singleSeriesMeasures-11417.test.tsx packages/plugin-dashboard/src/__tests__/DatasetWidget.unrenderedMeasures-8894.test.tsx at 6d55dd12c: Test Files 2 passed (2), Tests 34 passed (34).
  • Whole package, pnpm exec vitest run --maxWorkers=2 packages/plugin-dashboard/ at a83d34002: Test Files 160 passed (160), Tests 1527 passed | 6 skipped (1533). The only later commit (6d55dd12c) edits the new test file alone, re-run above.
  • pnpm --filter @object-ui/plugin-dashboard type-check (script name echoed: tsc --noEmit && tsc -p tsconfig.test.json), exit 0, after pnpm --workspace-concurrency=2 --filter '@object-ui/plugin-dashboard^...' run build (13 packages), exit 0. tsc -p tsconfig.test.json --listFilesOnly lists the new test file.

Ablations (implementation committed first; each through ablation-replace.mjs with an on-disk anchor count and a blob-hash restore to HEAD, git diff HEAD empty after each)

  • Empty the set (an empty string set, spelled with the generic STRING parameter, which the sanitizer would eat if written literally): 12 red — the five triage SUBJECTs, the message and pyramid SUBJECTs, and the five tie rows for the single-series types; controls and the other 8 tie rows green; the objectui#8894 file 12/12 green.
  • Over-include radar and bar: 4 red — both bar silence controls (this file and the objectui#8894 file) and the bar and radar tie rows. The tie catches a family wrongly added, not only one left out.
  • Message falls back to the tile pointer for a chart: 2 red — the message SUBJECT and the pyramid SUBJECT.

Gates

  • node scripts/check-changeset-presence.mjs ✅ 1 changeset declared for 2 source files of 1 released package; pnpm check:changeset-claims exit 0 (report-only: three pending changesets name a touched file, 7125-…, 8114-…, 8760-…; each paragraph read, none falsified by this diff); check-changeset-overwrite.mjs reports the 8894 correction as its case 2 (deliberate correction); pnpm check:pending-changeset-literals ✅; pnpm changeset:check ✅.
  • pnpm check:control-bytes ✅; pnpm check:new-line-citations VERDICT … 0 new citation(s); pnpm docs:check-links ✅; pnpm check:i18n-keys, check:doc-types, check:registry-bare-names, check:vi-mock-inherit, check:test-path-roots, check:phantom-deps, check:unreferenced-sources, check:installed-pin-claims, check:doc-fences, check:doc-example-ids, check:doc-example-readers all exit 0.
  • Readers of the changed markdown, derived with node scripts/markdown-test-inputs.mjs --list (20 files, readme-dashboard-examples-spec-valid among them): Tests 854 passed (854). Tests outside the package that name DatasetWidget (34 files): Tests 478 passed (478). Import judges examples/console-starter/test/vite-alias-closure.test.ts + scripts/__tests__/vite-objectstack-spec-dist.test.ts: Tests 96 passed (96) (the new test file imports only specifiers sibling tests in this package already import).
  • eslint, proven narrowing: eslint itself reports the four markdown files as File ignored because no matching configuration was supplied, so the linted population of this diff is the two .tsx files (--format json: 2 files, 0 errors; 10 warnings on DatasetWidget.tsx, the same 10 by rule as the base blob via --stdin; 0 on the test file). Invariance: the config enables no type-aware linting (no projectService / project) and no rule under eslint-rules/ reads the filesystem, so this diff cannot move any untouched file's verdict.
  • NOT MEASURED: check:readme-exports, check:doc-snippets, check:doc-examples — prerequisite not met (each needs every package's dist, exit 1/2 naming unbuilt packages); this diff adds no fenced code block to any README or doc. CI builds first.

Acceptance notes

  • Observation, not filed (read-only inference, carrier: none): with two dimensions and ONE measure, buildChartSeries pivots the second dimension into series, and these five arms draw the first group's column only. That drops groups, not declared measures, so the diagnostic (which compares measures) does not speak; not measured on a rendered chart.
  • Observation, not filed (carrier: the pin-bump PR that carries objectstack#21053 / #21293): MEASURE_AXIS_CHART_FAMILIES in DatasetWidget.tsx restates the set objectstack main exports as DASHBOARD_WIDGET_MULTI_MEASURE_TYPES, whose docblock says objectui's mirror is to import it rather than restate it; it is not in spec 17.5.0.
  • When the pin carries objectstack#21293, the two door assertions in this PR's SUBJECT pins go red on purpose; their messages say so, and the pin then becomes one about a stored document, as objectui#8894's stored-metric pin is.

Generated by Claude Code

claude added 2 commits October 2, 2026 02:18
… sankey says which measures it drops (objectui#11417)

The shared chart renderer draws one series on the pie / donut, funnel,
treemap and sankey arms, so a dataset widget of one of those families with
a dimension and several measures drew the first and dropped the rest in
silence. DatasetWidget now settles that in renderedMeasures from one set,
SINGLE_SERIES_CHART_FAMILIES, read off the family a widget renders as, and
the existing dropped-measure diagnostic (objectui#8894) names the dropped
measures. For this shape the message states the cause and points to no
ADR-0087 entry: the metric-family entry answers for a one-number tile.
What is drawn does not change.

The README, the docs page and the pending 8894 changeset said this shape
draws the first measure with no warning; they now say the warning covers
it.

Claude-Session: https://claude.ai/code/session_01YLg8XqWGJ785fwQ5v4pH37
Co-authored-by: Claude <noreply@anthropic.com>
…pec refusal arrives; the tie accepts only the scatter's arity refusal

Claude-Session: https://claude.ai/code/session_01YLg8XqWGJ785fwQ5v4pH37
Co-authored-by: Claude <noreply@anthropic.com>
@github-actions github-actions Bot added documentation Improvements or additions to documentation plugin tests labels Oct 2, 2026
@github-actions

github-actions Bot commented Oct 2, 2026 •

Copy link
Copy Markdown
Contributor

changeset-claim-re-read

⚠️ 3 pending changeset(s) describe a file this change touches

Their bodies publish verbatim into the CHANGELOG at the next release, so this is a request to re-read them against your diff — addressed here because you are the one seat that can answer it without re-deriving anything.

⛔ Nothing here blocks, and nothing here is a verdict on your change. This gate exits 0, is not a required context, and judges name resolution, never meaning: it asked whether a pending body names a file you touched. "Is this sentence still true?" is the one question it will not answer, and the one you are being asked to answer.

.changeset/7125-dashboard-empty-state-keys-retired.md

  • names DatasetWidget.tsx → packages/plugin-dashboard/src/DatasetWidget.tsx — edited by this change

    Not touched: table.noRows ('No rows to display') and engine.form.noRows (packages/app-shell/src/views/metadata-admin/i18n.ts, read at widgets.tsx) — two different, same-named keys in different namespaces. Nor the comments in WidgetEmptyState.tsx, DatasetWidget.tsx, ObjectDataTable.tsx and PivotTable.tsx that record WHY three widgets with three strings became one shared empty state; the packs' own comment keeps that rationale and now names the retirement instead of a row that is gone.

.changeset/8114-detail-tab-activity-timeline.md

  • names plugin-dashboard/README.md → packages/plugin-dashboard/README.md — edited by this change

    README.md ships in this package's files, so the example went out in every tarball. DetailTabs renders a tab's content through ANGLE-BRACKETS(SchemaRenderer schema={toRenderableSchema(tab.content)} /), which makes content.type an SDUI node position judged by the component registry — so a reader copying the tab got the registry's Unknown component type panel (OBJUI-001) where the timeline should be. Same shape as the line-chart widget in plugin-dashboard/README.md (objectui#7896's census; fixed by objectui#7951) and the fourth known instance.

.changeset/8760-unfulfilled-chart-stubs.md

  • names content/docs/plugins/plugin-dashboard.mdx → content/docs/plugins/plugin-dashboard.mdx — edited by this change

    • At render. SchemaRenderer's lazy branch re-checks hasLazy(type) on every pass and returns the Loading ANGLE-BRACKETS(type)… placeholder. Registry.register() deletes a lazy entry only for keys the loaded module actually registers, so for an unfulfilled key the entry SURVIVES the load and every later pass takes the same branch. Measured on b775500af through the real chain: { "type": "line-chart" } painted role="status" / data-lazy-loading="line-chart" / Loading line-chart…, permanently. Not the OBJUI-001 panel the card expected — no alert, no error, no console warning. A skeleton that never resolves reads to a user as a slow network. - At authoring. A stub is enough to put a key into getKnownTypes(), so check:doc-types and the CLI's generated KNOWN_SCHEMA_TYPES snapshot both blessed all three. content/docs/plugins/plugin-dashboard.mdx taught "type": "line-chart" inside a card body, and every gate was green on it.

Read the paragraph, not the line: both false halves of the objectui#8617 claim sat in one paragraph, and correcting either alone would have left it asserting the same wrong thing.

If a claim did go false, correct the body. That is precedented and prose-only, frontmatter untouched; check-changeset-overwrite.mjs will report the correction as its own case 2 ("correcting a declaration on purpose … legitimate"), which is the intended shape — one gate asks for the read, the other records the write.

Not covered, stated so nobody reads this as more: a born-false claim that spells no line address at all (objectui#9495 coordinated one by ORDINAL — "a grep finds that member first" — and deciding that means reading what the sentence means), a claim spelled as a symbol or a package rather than a backticked file name, and a file named ambiguously.

Angle-bracketed names in the quoted prose above are rewritten as ANGLE-BRACKETS(name): GitHub deletes tag-shaped fragments from a stored body, and a quote that silently loses the identifier it is about is worse than a visible repair.

Compared the checked-out tree with c681b9ff2 (merge-base with origin/main): 4 file(s) changed outside .changeset/, read against 1969 pending declaration(s) that publish a body (2594 pending in total). · run

@github-actions

github-actions Bot commented Oct 2, 2026

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 330 chunks) 3552.9 KB 3574.6 KB
Main entry chunk (gzip) 150.3 KB 350 KB
Entry file index-Di4U0MrT.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) 16.88KB 6.25KB
app-shell (runtime-config.js) 20.68KB 7.36KB
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.17KB 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.13KB 7.95KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.49KB 2.64KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.05KB 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) 570.62KB 136.73KB
core (index.js) 10.00KB 3.96KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 230.46KB 63.94KB
fields (index.js) 260.97KB 66.19KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
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.24KB 2.27KB
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) 34.49KB 9.23KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 40.40KB 11.41KB
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.01KB 3.93KB
plugin-calendar (index.js) 53.17KB 15.46KB
plugin-charts (index.js) 84.07KB 22.93KB
plugin-chatbot (index.js) 198.22KB 46.97KB
plugin-dashboard (index.js) 141.24KB 37.99KB
plugin-designer (index.js) 217.44KB 45.02KB
plugin-detail (index.js) 245.70KB 64.54KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 173.14KB 44.58KB
plugin-gantt (index.js) 178.38KB 44.94KB
plugin-grid (index.js) 231.72KB 63.65KB
plugin-kanban (index.js) 49.51KB 15.54KB
plugin-list (index.js) 116.63KB 28.97KB
plugin-map (index.js) 25.60KB 8.62KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 44.04KB 12.21KB
plugin-timeline (index.js) 38.80KB 11.71KB
plugin-tree (index.js) 14.58KB 5.17KB
plugin-view (index.js) 90.32KB 22.76KB
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.25KB 2.04KB
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) 6.06KB 2.68KB
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) 21.42KB 7.05KB
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 (complex.js) 3.19KB 1.62KB
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) 0.20KB 0.18KB
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.07KB 2.39KB
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 (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) 21.59KB 7.71KB
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

… bullet, not "the list above", for the dimensionless tile shape (objectui#11417)

The new fourth bullet names pie / donut / funnel / treemap / sankey, so
"a dimensionless widget of a type outside the list above" read as if a
dimensionless pie were inside the list and outside the warning. It takes
the tile and warns; the sentence now points at the third bullet.

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

github-actions Bot commented Oct 2, 2026

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 330 chunks) 3553.0 KB 3574.6 KB
Main entry chunk (gzip) 150.4 KB 350 KB
Entry file index-CiLopwL3.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) 16.88KB 6.25KB
app-shell (runtime-config.js) 20.68KB 7.36KB
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.17KB 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.13KB 7.95KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.49KB 2.64KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.05KB 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) 570.62KB 136.73KB
core (index.js) 10.00KB 3.96KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 230.46KB 63.94KB
fields (index.js) 260.97KB 66.19KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
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.24KB 2.27KB
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) 34.49KB 9.23KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 40.40KB 11.41KB
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.01KB 3.93KB
plugin-calendar (index.js) 53.17KB 15.46KB
plugin-charts (index.js) 84.07KB 22.93KB
plugin-chatbot (index.js) 198.22KB 46.97KB
plugin-dashboard (index.js) 141.24KB 37.99KB
plugin-designer (index.js) 217.44KB 45.02KB
plugin-detail (index.js) 245.70KB 64.54KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 173.14KB 44.58KB
plugin-gantt (index.js) 178.38KB 44.94KB
plugin-grid (index.js) 231.72KB 63.65KB
plugin-kanban (index.js) 49.51KB 15.54KB
plugin-list (index.js) 116.63KB 28.97KB
plugin-map (index.js) 25.60KB 8.62KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 44.04KB 12.21KB
plugin-timeline (index.js) 38.80KB 11.71KB
plugin-tree (index.js) 14.58KB 5.17KB
plugin-view (index.js) 90.32KB 22.76KB
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.25KB 2.04KB
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) 6.06KB 2.68KB
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) 21.42KB 7.05KB
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 (complex.js) 3.19KB 1.62KB
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) 0.20KB 0.18KB
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.07KB 2.39KB
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 (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) 21.59KB 7.71KB
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

Copy link
Copy Markdown
Contributor Author

Live E2E (informational) is red at a6071defc for a reason outside this PR; one re-run follows now.

domain:ui seat 1 · session_01YLg8XqWGJ785fwQ5v4pH37 · 2026-10-02T03:21Z.

  • Failing step: "Start ObjectStack backend (published packages)", job 110684138628. It stopped on npm error notarget No matching version found for @objectstack/spec@17.6.0.
  • Cause: the job's backend fixture missed the cache and installed published @objectstack/* while objectstack's 17.6.0 release (run 36955885276) was mid-publish. cli, core and runtime 17.6.0 were already on npm and require spec@17.6.0, which was not yet.
  • Why it is not this PR's: this diff touches no backend, fixture or install input.
  • Now: that release's npm step has completed, and spec, core, cli, runtime, types and client all answer 17.6.0. No fix is needed on either side. The failed job is re-run once now; a second failure would be treated as real.

Every other check on this head is green or an expected skip. The review record is on the card (objectui#11417, ACCEPT 5944785446).


Generated by Claude Code

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 2, 2026 03:25
@objectstack-fleet
objectstack-fleet Bot enabled auto-merge October 2, 2026 03:25
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 2, 2026
Merged via the queue into main with commit 175df47 Oct 2, 2026
45 of 46 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/issue-11417-single-series-drop-signal branch October 2, 2026 03:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation plugin tests

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants