Skip to content

fix(plugin-charts): an object-chart whose specType is a single-value or tabular family draws its routed form, not a silent bar; no default family (objectui#11520) - #11529

Merged
objectstack-fleet[bot] merged 5 commits into
mainfrom
claude/issue-11520-object-chart-spectype-routing
Oct 3, 2026
Merged

objectstack-fleet[bot] merged 5 commits into
mainfrom
claude/issue-11520-object-chart-spectype-routing

Conversation

@objectstack-fleet

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

Copy link
Copy Markdown
Contributor

Fixes #11520

Clause-②: yes (widening). The faces' accept sets do not move (both accept these documents before and after). One exported type widens: NormalizedChartSchema['chartType'] (@object-ui/plugin-charts) goes from the thirteen drawn families to the declared chart families, DeclaredChartFamily: the object-chart node's own chartType union (objectui#11513) together with its specType (the spec's ChartType), both read off ObjectChartSchema in @object-ui/types by reference, never restated. It now carries the family the schema names, drawn or not, and a misspelled family still fails to compile. The claim's no assumed no exported type would move; this is the flip it provided for.

Dispatched by the PM loop, round 1 (domain:ui seat 1), claim comment 5963741843, session https://claude.ai/code/session_01YLg8XqWGJ785fwQ5v4pH37. Triage ruling 5963338583 executed as written.

The defect, reproduced at BASE 8366accd1

An object-chart whose family is on specType (the react tier's key: the react-page wrapper parks the ObjectChart block's type="gauge" there) with gauge, solid-gauge, metric, kpi, bullet, table or pivot parses on both faces and draws a bar chart with no note. The new pin's BASE run, through the real SchemaRenderer, read every such cell as one bar mark on one value axis, categories across, no notice. The off-spec sunburst on specType drew a bar too.

Mechanism, measured as the card read it:

  1. normalizeChartSchema read specType, then kept the family only when RENDERABLE held it.
  2. ChartRenderer's schema.chartType ?? spec.chartType was then unset.
  3. AdvancedChartImpl defaulted an unset family to 'bar'. Its four refusal guards each restated that default (props.chartType ?? 'bar').

The fix

  • Which dispatcher. The one family to form decision this block makes is AdvancedChartImpl's family dispatch, keyed on SINGLE_VALUE_CHART_TYPES / TABULAR_CHART_TYPES / RENDERABLE in normalizeChartSchema.ts. It is the branch the chartType channel already reaches, and it draws exactly the forms the ruling names: the number card and the tabular notice. widgetDispatch lives in packages/plugin-dashboard/src. It routes dashboard widgets to dashboard node types (a metric-card node, a records table, a pivot) and has no tabular notice. plugin-dashboard depends on plugin-charts (as a dev dependency), and plugin-charts could not import it without a reverse dependency. So there is no fork: specType is routed through plugin-charts' own dispatch, with no new family list and no edit to either table.
  • normalizeChartSchema hands the named family on as named (chartType, else specType, else a bare type that is a spec family, else a registered keyword's family). It no longer filters by RENDERABLE. specType now reaches the dispatch with the same value chartType does.
  • AdvancedChartImpl: the = 'bar' default is removed. The four guard copies go with it, through one guardFamily helper that reads column as bar and nothing as nothing. An absent family is the existing unknown-type notice (data-testid="advanced-chart-unknown-type", role="note", the same element and the "nothing was drawn" string family), reading "This chart names no chart type — nothing was drawn." An off-spec family keeps that notice's existing sentence, which names the value.
  • AdvancedChartImplProps['chartType'] (internal, not on the package entry) and effectiveChartFamily's constraint take DeclaredChartFamily with it (patch round 1); no plain string remains on the family path. The cartesian root map moved below the dispatch, where the family is a drawn one. The emitted declarations of that last step are byte-identical.

Callers that relied on the default (Zone 2 item 3). Every source producer that reaches AdvancedChartImpl names its family explicitly:

  • DatasetPreview passes bar / combo;
  • DatasetWidget passes its map's family ?? 'bar';
  • DashboardRenderer / DashboardGridLayout pass the series family widgetDispatch resolved;
  • the list-view relays in app-shell, plugin-list and plugin-view pass chartType || 'bar';
  • the chatbot passes chart.chartType ?? 'bar';
  • the react-page wrapper passes specType.

No caller needed an edit. ChartRenderer.tsx is unchanged.

Pins

packages/plugin-charts/src/__tests__/object-chart-spectype-routing-11520.test.tsx (new), through the real SchemaRenderer and this package's registrations:

  • The matrix, 21 families x 5 node shapes = 105 cells, each family on specType: every family of the installed spec plus sunburst. The five shapes:

    1. the flat node with inline rows;
    2. the authored properties bag on the object path (the card's document);
    3. the dashboard producer's flat node;
    4. the react-page wrapper's own output ({ ...props, specType, type });
    5. a dataset-bound node.

    Each cell is held to its routed form, read off the dispatch's sets: the number card, the tabular notice, the family's OWN marks for a drawn family (so a silent bar fails), or the unknown-type notice naming an off-spec value.

  • The bar control: bar, column and horizontal-bar draw bars in every shape. A bare chart node naming bar draws a bar.

  • Unresolved family: an object-chart naming no family (both faces refuse it) and a bare chart naming none show the notice, with zero bar marks.

  • The two channels agree: per family, specType draws the form chartType draws (21 rows).

  • Premise: the card's document parses on both faces for all 20 spec families on specType, and sunburst does not.

  • Re-judged: normalizeChartSchema.test.ts's "leaves a family this renderer cannot draw unset" pinned exactly the removed branch. It is replaced by "hands a family this renderer draws no chart of to the dispatch as named", over metric, pivot, sunburst, and chartType winning over specType.

  • The objectui#11513 chartType refusals stay green: object-chart-declared-families-11513.test.tsx, object-chart-families-11513.test.ts and object-chart-properties-bag-11276.test.ts.

Reverse verification and ablation (predicted first)

All at committed states. The subject resolves to src through the vitest alias, so no dist leg applies.

leg prediction reading
BASE (the two source files at 8366accd1, the final pin) red on the 40 non-drawn cells (bars), the 8 non-drawn agreement rows and both no-family rows 50 failed, 80 passed (130). Every red matrix cell read marks:bar.
A1: restore the normalizer's RENDERABLE gate (ablation-replace.mjs, anchor 1 to 0, blob 3c1f8ba7 to df252daa) 48 red: 35 single-value / tabular cells, 5 sunburst cells, 7 agreement rows, 1 normalizer row 48 failed, 126 passed (174), exactly those rows. Direction: red, and the substitute was now the "names no chart type" notice, not a bar, because the default is gone.
A2: restore = 'bar' alone (anchor 1 to 0, blob b30ae64a to 2e1a7193) exactly the 2 no-family rows 2 failed, 172 passed (174), those two.

Each restore was proven by blob equality with HEAD and an empty git diff HEAD (the tool's own verdict, re-read by hand after each leg).

Gates (round 0 at a1e6721fa; patch round 1 at 514d71d1f below)

  • pnpm exec vitest run packages/plugin-charts/ plus the two packages/types 11513 / 11276 pins: 90 files, 1258 passed, 9 skipped. The skips are the existing describe.runIf(DRIVEN) block.
  • Downstream, by git grep -l:
    • every test outside plugin-charts naming object-chart, @object-ui/plugin-charts, ChartRenderer, AdvancedChartImpl, a chart node or chart:bar: 101 files, 3925 passed. They span apps/console, examples/schema-catalog, app-shell, cli, components, core, data-objectstack, plugin-chatbot, plugin-dashboard, plugin-designer, plugin-list, plugin-report, plugin-view, react, runner, sdui-parser, types and scripts.
    • a second set naming recharts / DatasetWidget / DashboardRenderer / DashboardGridLayout not already in the first: 101 files, 1097 passed.
  • pnpm --filter @object-ui/plugin-charts type-check (tsc --noEmit and tsc -p tsconfig.test.json), after its closure was built: exit 0. The rebuilt normalizeChartSchema.d.ts carried chartType?: string at a1e6721fa; after patch round 1 it carries chartType?: DeclaredChartFamily.
  • The console, as Bundle Analysis runs it: pnpm turbo run build --filter=./packages/* (39 of 39), then pnpm --filter @object-ui/console build (tsc, vite build, SDUI manifest, tsconfig.plugin.json): exit 0 at a1e6721fa, and at 1954b64a1 before it.
  • Exit 0 with their own verdict lines:
    • check:control-bytes and check:new-line-citations (0 new);
    • check-changeset-presence.mjs and changeset:check;
    • check:pending-changeset-literals, check:self-import and check:test-path-roots;
    • check:vi-mock-specifiers, check:vi-mock-inherit and check:vi-mock-override-shape;
    • check:spec-symbols, check:phantom-deps and check:unreferenced-sources;
    • check:esm-specifiers (specifier leg), check:sdui-registration-pins and check:element-data-source-declaration;
    • check:installed-pin-claims.
  • check:changeset-claims (report-only) named three pending changesets that cite an edited file: 6896-…, 7546-… and 7694-…. Each paragraph was read. Their claims (the categories coverage, the six series keys, the normalizeSeries limbs) are untouched. No pending changeset that mentions specType or the bar default is made false.
  • Lint, a declared narrowing. eslint --no-inline-config --format json ran over the 4 changed TS files, read as 4 entries: 0 errors.
    • AdvancedChartImpl.tsx has 44 warnings and normalizeChartSchema.ts has 5, the same counts as at BASE.
    • The new pin has 2, both no-explicit-any in the vi.mock('recharts') block, the sibling pattern.
    • eslint.config.js sets no parserOptions.project / projectService, so linting is not type-aware and this diff cannot move a verdict on an untouched file.
    • The repo-wide pnpm lint belongs to CI.
  • Not run: check:doc-types / check:doc-snippets. No doc moved.
  • Patch round 1 (head 514d71d1f, seat REWORK 5964370972, types only): NormalizedChartSchema['chartType'] and AdvancedChartImplProps.chartType take DeclaredChartFamily = NonNullable<ObjectChartSchema['chartType'] | ObjectChartSchema['specType']>, read off @object-ui/types by reference (already a dependency; no cycle), instead of string. There is one named JSON-boundary cast in normalizeChartSchema, and the runtime unknown-type notice is unchanged. Negative compile probe: { chartType: 'bra' } compiled at a1e6721fa and is TS2322 at the new head, while 'gauge', 'pivot' and 'sankey' compile. plugin-charts type-check, the console build (the Bundle Analysis program) and vitest packages/plugin-charts/ (88 files, 1173 passed; matrix 130/130) are green. main moved only by a docs commit, so no merge.

Acceptance notes

  • What an accepted document draws changes, so the changeset is @object-ui/plugin-charts minor:

    • specType single-value families draw the number card;
    • table / pivot draw the tabular notice;
    • an off-spec specType, or no family at all, draws a notice instead of a bar.

    Every drawn family draws what it drew before, on both keys.

  • "Located" notice, read as: rendered in the chart's place, naming the value (or saying none was named). There is no console-only signal.

  • The matrix's node shapes differ from the card's. The card measured three chartType spellings, one specType spelling and a dimensionless dataset node. This pin puts the family on specType in all five shapes, and holds the chartType channel to the same answer per family. Its dataset node carries one dimension, so the same mark predicates apply.

  • Docs: content/docs/plugins/plugin-charts.mdx says the single-value and tabular families are refused on chartType and draw no chart on this node. That is still true, and nothing on the page, in the package README or in the skills states a bar default or a specType behaviour, so no doc moves.

  • Out of scope, reported for the seat to file (class a): ObjectChart's compare-to gate is chartTypeIgnoresCompareTo(schema.chartType), used for both the comparison fetch and the overlay. It reads chartType only.

    • A throwaway probe (never committed), through the real SchemaRenderer, rendered a properties bag with compareTo: { kind: 'previousYear' } and correctly keyed rows. Both documents parse on both faces.
    • With chartType: 'scatter': 1 aggregate call, 2 scatter symbols.
    • With specType: 'scatter': 2 calls, and the scatter-multi-series refusal ("A scatter plots one measure. Keep exactly one series: amount, amount__comparison").
    • pie on specType costs a wasted comparison fetch with the same picture.
    • Not fixed here: it is not on this card's surface, and its fix shape (where ObjectChart reads the resolved family) is not pinned.
  • Noted, not filed:

    • widgetDispatch.METRIC_LIKE_TYPES (plugin-dashboard) and SINGLE_VALUE_CHART_TYPES (plugin-charts) name the same five families in two packages, with nothing tying them. Undrifted today. Carrier: none.
    • The console's dev-only preview sample dashboard has a { type: 'chart', title } widget that names no family. Read from source, not rendered: it now shows the no-family notice where AdvancedChartImpl drew an empty bar frame.
  • The compareTo gate in ObjectChart reads chartType only, so a family on specType gets the comparison fetch and overlay: specType: scatter renders the multi-series refusal, and pie wastes a fetch. Filed by the seat as objectui#11530, sequenced after this PR.


Generated by Claude Code

claude added 4 commits October 3, 2026 01:01
…ily dispatch; no silent bar default

normalizeChartSchema hands the named family to AdvancedChartImpl as named,
drawn or not, so a specType of gauge / solid-gauge / metric / kpi / bullet
draws the number card and table / pivot the tabular notice, exactly as the
same families on chartType do. AdvancedChartImpl's 'bar' default, and its
four restatements in the refusal guards, are removed: an absent family is
the unknown-type notice.

The 105-cell matrix pin (21 families x 5 node shapes, family on specType)
holds every cell to its routed form, read off the dispatch's own sets.

Claude-Session: https://claude.ai/code/session_01YLg8XqWGJ785fwQ5v4pH37
Co-authored-by: Claude <noreply@anthropic.com>
…e removed bar default (objectui#11520)

Claude-Session: https://claude.ai/code/session_01YLg8XqWGJ785fwQ5v4pH37
Co-authored-by: Claude <noreply@anthropic.com>
…spatch, where the family is a drawn one (objectui#11520)

AdvancedChartImplProps.chartType is now the family as named (a string), so
the literal map could no longer be indexed by it before the dispatch. It is
read only by the cartesian tail, which the dispatch guards, so it moves
there, typed as a record.

Claude-Session: https://claude.ai/code/session_01YLg8XqWGJ785fwQ5v4pH37
Co-authored-by: Claude <noreply@anthropic.com>
…type instead of a widened record (objectui#11520)

Keeps the map's own value types, and adds no explicit any. The emitted
declarations are byte-identical.

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

github-actions Bot commented Oct 3, 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/6896-retire-chart-inline-data.md

  • names packages/plugin-charts/src/normalizeChartSchema.test.ts → packages/plugin-charts/src/normalizeChartSchema.test.ts — edited by this change

    Pinned in packages/types/src/__tests__/chart-inline-data-retired.test.ts — both channels, the announcement itself, and a counter-probe that builds the deletion this retirement did not choose and measures the contrast in the same run — and in packages/plugin-charts/src/normalizeChartSchema.test.ts, where the categories read now has behaviour coverage it never had.

.changeset/7546-chart-series-keys-declared.md

  • names AdvancedChartImpl.tsx → packages/plugin-charts/src/AdvancedChartImpl.tsx — edited by this change

    Every one of the six is read by normalizeSeries (@object-ui/plugin-charts, normalizeChartSchema.ts:242-255) and does real work in AdvancedChartImpl.tsx — label names the legend entry, variant === 'comparison' selects the muted overlay, opacity / dashArray set stroke and fill, stack becomes Recharts' stackId, yAxis binds the secondary axis. Any consumer of the parse output — objectui check / objectui validate via safeValidateSchema, a JSON schema derived from the mirror, or any pipeline that keeps parse()'s result — lost them outright.

.changeset/7694-chart-series-chart-type-alias-refusal.md

  • names normalizeChartSchema.ts → packages/plugin-charts/src/normalizeChartSchema.ts — edited by this change

    chartType is the renderer's INTERNAL spelling of type: the first limb of normalizeSeries' str(raw.chartType) ?? str(raw.type) (@object-ui/plugin-charts, normalizeChartSchema.ts), written by the internal-shape producers that hand dataKey-shaped arrays straight to ChartRenderer (ObjectChart, DatasetWidget; core/utils/chart-presentation translates authored type into it) and by nothing an author writes. Re-measured at implementation time, series-level, with lit controls (dataKey / name / type / color): docs 0, fixtures 0, designer inputs 0 (the chart registration's series is one code input), src literals 0, tests 9 — every one an internal-shape array that never meets this mirror. Limb ablation over 304 files / 5817 tests: deleting str(raw.chartType) ?? left all green; deleting the ?? str(raw.type) sibling went 2 red.

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.

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

@github-actions

github-actions Bot commented Oct 3, 2026

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 330 chunks) 3551.1 KB 3574.6 KB
Main entry chunk (gzip) 150.3 KB 350 KB
Entry file index-CwSNxw23.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.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) 571.09KB 136.86KB
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) 261.51KB 66.22KB
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) 7.14KB 2.92KB
layout (index.js) 39.47KB 11.25KB
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.17KB 15.46KB
plugin-charts (index.js) 83.60KB 22.87KB
plugin-chatbot (index.js) 198.22KB 46.97KB
plugin-dashboard (index.js) 142.41KB 38.32KB
plugin-designer (index.js) 231.28KB 48.76KB
plugin-detail (index.js) 245.43KB 64.53KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 172.73KB 44.50KB
plugin-gantt (index.js) 179.16KB 45.06KB
plugin-grid (index.js) 233.13KB 63.89KB
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.12KB 12.29KB
plugin-timeline (index.js) 38.80KB 11.71KB
plugin-tree (index.js) 14.51KB 5.15KB
plugin-view (index.js) 90.23KB 22.73KB
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 (cloud.js) 0.20KB 0.18KB
types (complex.js) 4.14KB 1.96KB
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) 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

…amilies, not string (objectui#11520)

NormalizedChartSchema['chartType'] (exported) and AdvancedChartImplProps
.chartType take DeclaredChartFamily, the union of object-chart's two family
keys read off ObjectChartSchema by reference: its chartType union
(objectui#11513) and its specType (the spec's ChartType). A misspelled
family no longer compiles. The one assertion is the named JSON-boundary
cast in normalizeChartSchema; a value outside the type in unvalidated JSON
still reaches the dispatch and its unknown-type notice. The changeset's
Type paragraph says the member widens to the declared chart families.

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

github-actions Bot commented Oct 3, 2026

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 330 chunks) 3551.1 KB 3574.6 KB
Main entry chunk (gzip) 150.3 KB 350 KB
Entry file index-CwSNxw23.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.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) 571.09KB 136.86KB
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) 261.51KB 66.22KB
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) 7.14KB 2.92KB
layout (index.js) 39.47KB 11.25KB
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.17KB 15.46KB
plugin-charts (index.js) 83.60KB 22.87KB
plugin-chatbot (index.js) 198.22KB 46.97KB
plugin-dashboard (index.js) 142.41KB 38.32KB
plugin-designer (index.js) 231.28KB 48.76KB
plugin-detail (index.js) 245.43KB 64.53KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 172.73KB 44.50KB
plugin-gantt (index.js) 179.16KB 45.06KB
plugin-grid (index.js) 233.13KB 63.89KB
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.12KB 12.29KB
plugin-timeline (index.js) 38.80KB 11.71KB
plugin-tree (index.js) 14.51KB 5.15KB
plugin-view (index.js) 90.23KB 22.73KB
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 (cloud.js) 0.20KB 0.18KB
types (complex.js) 4.14KB 1.96KB
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) 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

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 514d71d1f5c98f3292bd6b4f0312792b48840d4f
Local-runs: none

Read for this record: card #11520 (body and all six comments; triage ruling 5963338583 governs; claim 5963741843 as amended by REWORK 5964370972; dev reports 5964341782 and 5964488618 and the seat's ACCEPT 5964543734 read as claims to test), PR #11529's body, its 5-file list, the net diff against the merge base (+490 / −46), the source at the head, and the 43 check-runs on the head after every one completed: 40 success, 3 skipped (dependabot, Test (coverage), Test (coverage shard)), 0 failure; the aggregate Test, Bundle Analysis and Spec Main Shape Gate are success. Not governed (5 paths), needs:contract-review on, PR draft.

① Derived judgments

  • Accept sets — unchanged, right. No path under packages/types or packages/spec is touched; the objectui#11513 / types: the flat arms flex / object-grid / object-chart refuse the spec's page-component properties bag, so the showcase's 18 producer nodes fail both faces; does triage's answer A on objectui#10872 extend to them? #11276 face pins are untouched and green in the head's shards. The PR's "both accept these documents before and after" holds.
  • Public surface — one widening, named right. index.tsx exports NormalizedChartSchema by name (beside normalizeChartSchema, ChartRenderer, ChartBarRenderer, ObjectChart, ObjectChartBlock, ObjectChartProps, BarChartSchema, chartComponents) and nothing else from normalizeChartSchema.ts. So NormalizedChartSchema['chartType'] widening from ChartFamily (13) to DeclaredChartFamily is the one public move; DeclaredChartFamily, AdvancedChartImplProps and effectiveChartFamily's constraint are not entry exports. The changeset's "not a new entry export" and the body's "internal, not on the package entry" are right.
  • The one dispatcher — the dev's reading is right; this is not a second table. widgetDispatch.ts is classifyWidgetType: a widget-type classifier that answers a family token (series / metric / table / pivot / custom / unsupported / passthrough) which DashboardRenderer and DashboardGridLayout map onto node types (object-chart / chart, object-metric / plugin-dashboard:metric, object-data-table / data-table, text). It draws no number card and carries no tabular notice. The two forms the ruling prescribes exist in exactly one place: AdvancedChartImpl's dispatch over SINGLE_VALUE_CHART_TYPES / TABULAR_CHART_TYPES / RENDERABLE, pre-existing since Tier 2 (#2901): spec values that validate and then render nothing #2942 and the branch the chartType channel already reached. @object-ui/plugin-dashboard lists @object-ui/plugin-charts in its package.json, so the import the parenthetical implies would be a cycle. The ruling named the wrong module for the forms it prescribed; the diff adds no set, edits no set, and sends specType to the branch chartType already reached — "no second routing table" is met as written. Pre-existing and untouched: METRIC_LIKE_TYPES (plugin-dashboard) and SINGLE_VALUE_CHART_TYPES (plugin-charts) name the same five with nothing tying them; correctly an acceptance note.
  • normalizeChartSchema hands the family on as named — right, and every drawn family draws what it drew. The read order (chartType, else specType, else a bare type in CHART_TYPES, else a chart:bar-style keyword) is unchanged; only the RENDERABLE filter on the result is removed. The 13 drawn families passed that filter, so their output is identical. For the other seven spec families and any off-spec string the output goes from unset to the string on both channels, and the chartType channel's picture does not move, because ChartRenderer always read schema.chartType ?? spec.chartType and so bypassed the filter for it. The str() helper treats an empty string as unset, so no empty family reaches the dispatch; for a single-value or tabular family the dispatch returns before any axis is drawn.
  • The removed 'bar' default — right; no shipped producer loses a bar it named. ChartRenderer is the only importer of AdvancedChartImpl. Producers of its schema and their family: DatasetWidget (CHART_TYPE_MAP[widgetType] ?? 'bar'), DatasetPreview ('combo' or 'bar'), the two dashboard composers (dispatch.chartType, always set on the series branch; the metric / table / pivot / custom / unsupported branches build other node types), the list-view relays in app-shell ObjectView, plugin-list ListView and plugin-view ObjectView (chartType || 'bar'), the chatbot (chart.chartType ?? 'bar'), the react-page Wrapper in @object-ui/components (parks the author's type as specType), and the package's examples/chart-examples.ts (each names chartType). Familyless reaches: the console's dev-only preview-samples.ts widget { type: 'chart', title } — classifyWidgetType('chart') is passthrough, so toDashboardNodeType({ type: 'chart', … }) reaches ChartRenderer with no family and now draws the notice instead of the empty bar frame; that widget is off-face on the dashboard faces as well (DashboardWidgetTypeSchema is the spec's chart families plus list / custom, no chart), so the move is the ruling's own prescription and belongs where the seat put it. The plugin-designer palette's { type: 'chart' } entry draws its own canvas box, never the renderer. Both faces refuse a bare chart node with no chartType (zod ChartSchema.chartType: ChartTypeSchema, required; TS chartType: ChartType) and an object-chart naming neither key (the zod one-of refinement on the flat node and on the properties bag); the pin holds the latter on both. The four guard copies become guardFamily, which reads column as bar and nothing as nothing. One precision note, not a falsity: a familyless chart with rows and no series used to be refused as undeclared (the guard judged it a bar) and now gets the no-family notice — a visible form replaced by the more fundamental one; the changeset's "It used to draw a bar chart" is the with-series case, which the BASE leg measured.
  • DeclaredChartFamily — faithful, by reference, and the cast is sound. In @object-ui/types, ObjectChartSchema['chartType'] is the spec's ChartType narrowed to the 13 drawn families (objectui#11513) and ['specType'] is SpecChartType, the spec's ChartType itself; the NonNullable union of the two is therefore exactly the spec's ChartType — the domain the specType channel and the bare chart node's chartType (ChartSchema.chartType: ChartType) carry, with the object-chart chartType channel as its subset. A misspelled family fails to compile. The one JSON-boundary assertion (chartType as DeclaredChartFamily, a string to a literal union, at the point unvalidated JSON enters) is named and commented, and the runtime unknown-type notice stays the guard for values outside it. The second assertion on the path, chartType as keyof typeof cartesianRoots, sits after the dispatch has returned for every non-RENDERABLE value and for none, with column already folded to bar, so the || BarChart residue is unreachable. stackModeOf's pre-existing effectiveChartFamily(chartType as any, …) is outside the diff.
  • The faces — unchanged, refusals kept; the docs sentences stay true. plugin-charts.mdx says the single-value and tabular families "are refused on chartType … this node draws no chart of them": still true on both counts, and the page states no specType rendering and no default family. The package README's defaults table is bar-chart's (ChartBarRenderer), not this component's. skills/ carries nothing on either.
  • Hooks and shape. The dispatch's early returns pre-existed; the moved cartesianRoots map is a plain constant; hook order is unchanged.

② Semver level

  • @object-ui/plugin-charts minor — right. What accepted documents draw changes, and an entry-exported type's domain grows. Clause-②: yes (widening) is the right line and the right arm: yes takes at least minor; the value set of NormalizedChartSchema['chartType'] grows while the faces' accept sets do not move; the exhaustive-consumer hazard is disclosed in the ⚠️ Type paragraph the way objectui#11513's own changeset disclosed its widening. objectui declares no major (AGENTS.md; Changeset Bump Policy and Changeset Fixed Group Check success).
  • Every face / validator sentence in the new changeset, checked against the source: "Both faces declare [specType] as the spec's whole ChartTypeSchema" (zod stripImportedDefaults(SpecChartTypeSchema).optional(); TS SpecChartType) ✓; "object-chart needs chartType or specType" (zod refinement, flat and bag) ✓; "chart needs chartType" (required on both faces) ✓; "an off-spec specType (both faces refuse it)" ✓, pinned; "thirteen drawn families" ✓ (the old union's count); the five single-value and two tabular names ✓ (the sets); "the tabular notice, which names the data-table and pivot components" ✓ (its text); "not a new entry export" ✓; "a misspelled family still fails to compile" ✓ (literal union). None names a wrong face.
  • Pending changesets — none falsified. 6896: the categories describe block is still in normalizeChartSchema.test.ts. 7694: str(raw.chartType) ?? str(raw.type) is unchanged in normalizeSeries. 7546: the six series keys are untouched; its normalizeChartSchema.ts:242-255 address was already stale at the merge base (normalizeSeries sat near line 390 there), so this PR falsifies nothing that entry had not already lost — AGENTS.md [WIP] Update documentation for project #11's banned shape, not this card's. 11513 ("specType … is unchanged … still the spec's whole ChartTypeSchema") and 10770 (the one-of floor) state the faces, which did not move. 7401's "fell to its 'bar' default" is the past tense of a fixed defect.
  • The PR body is current: the three passages the dev flagged as stale after patch round 1 were rewritten by the seat; line 1 is Fixes #11520, line 3 the Clause.

③ Boundary flags

  • Dev flags, each answered. (1) PR assignee: the dev's write was refused by its permission layer; the seat did not perform it; surfaced to the maintainer — mechanics, not a contract item. (2) Clause-② flip no → yes (widening): amended on the card by the REWORK; body, changeset and card agree. (3) Matrix interpretation — right. The ruling's pin reads "each family on specType draws its routed form"; 21 families (the installed spec's 20, read off ChartTypeSchema at test time, plus sunburst) × 5 node shapes with the family on specType is that pin literally, and 21 × 5 = 105 is the ruling's count. The card's three chartType spellings are objectui#11513's pins, which this card must not reopen; the 21 agreement rows hold the two channels to one answer per family instead. The dataset shape carries one dimension so the mark predicates apply (a dimensionless node meets the category-key refusal first). (4) First BASE leg on a draft pin, re-run on the final: hygiene, reported. (5) "Located" read as rendered in the chart's place, naming the value or saying none was named: that is the ruling's "visible, located notice"; there is no console-only signal. (6) Patch round 1's list of stale body passages: handled. open_questions: none in either report.
  • compareTo → objectui#11530 exists and is open with the finding's title; sequenced after this PR; its labels are the seat's.
  • Noted, not filed → the acceptance notes carry both (the duplicated five-family list; the preview sample).
  • Observed here, not flagged by the dev, no action needed: familyFromComponentType's docblock still ends "the caller's own default is a better answer than a guess" — a code comment that now speaks of the relays' own || 'bar', not of a renderer default.
  • Landing context. The head sits on merge base 8366acc; main has since taken a docs commit and objectui#11527 (types / plugin-dashboard, the DrillDownConfig.report retirement). No file overlap with this diff, and ObjectChartSchema lives in objectql.ts, untouched, so the derived type reads the same at today's tip.

Implemented-by: claude/issue-11520-object-chart-spectype-routing
Reviewed-by: session_01YLg8XqWGJ785fwQ5v4pH37

VERDICT: PASS

Rendered 2026-10-03T03:02Z from the diff, the card and the head's completed check-runs; nothing built, run or re-run locally.

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 3, 2026 03:05
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 3, 2026
Merged via the queue into main with commit 06634af Oct 3, 2026
45 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/issue-11520-object-chart-spectype-routing branch October 3, 2026 03:19
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

1 participant