Skip to content

feat(types,plugin-form,plugin-charts,app-shell)!: dashboard widgets bind a dataset in the catalog and docs; FormulaFieldMetadata takes the spec's expression; three display-pointer readers read displayField alone (objectui#11070, round 6) - #11333

Merged
objectstack-fleet[bot] merged 6 commits into
mainfrom
claude/issue-11070-dashboard-formula-round6
Oct 1, 2026

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Refs #11070 · Refs #11228
Clause-②: yes (narrowing). FormulaFieldMetadata.formula retires for the spec's expression (typed by reference), sanitizeFormData stops reading formula, and three display-pointer readers (deriveColumns / hydrateColumns, ObjectChart, the action-param resolver, with its internal RuntimeField.display_field member) drop their display_field leg, under the startup no-gradualism rule. Item (i) alone, the dashboard round, was ruled Clause-②: no: it moves fixtures and docs only, and the strict face does not change. The break is priced in the changeset.

Round 6 of objectui#11070 (claim 5924126483). Four items in one PR: (i) objectui#11228's ruling C (5921018991, intake 5921153525); (ii) seat answer A on formula (5923126508); (iii) the three display_field consumer legs (round 5's out-of-scope finding); (iv) dated changeset notes.

What changed

(i) Dashboard widgets bind a dataset, everywhere objectui teaches one (objectui#11228 ruling C).

  • The six examples/schema-catalog/src/schemas/plugin-dashboard/filtered-dashboard*.json fixtures are in the ADR-0021 dataset form: every widget names a dataset with dimensions / values, and none carries rows. Each demo keeps its filter feature (dateRange presets, optionsFrom, text / number / lookup filters, targetWidgets, filterBindings overrides and opt-outs). No demo was dropped: the docs gallery's no-backend harness (apps/site/app/components/galleryDataSource.ts) answers queryDataset with placeholder rows, and the gallery render pin draws every widget title with zero dataset errors.
  • The dataset-widgets variant is re-titled in catalog-meta.json ("Widgets Over Two Datasets"), because "Dataset + Inline Widgets" became false; index.ts is regenerated from it.
  • content/docs/guide/dashboard-filters.md: the data-surface table becomes one paragraph (a widget binds a dataset) plus a "not an authoring surface" note naming the nine keys; the retired-shape callout, the "Dataset widgets" section, the working-examples note and Known limitations stop offering options.data.
  • content/docs/api/schema-reference.md's DashboardComponentSchema example: the metric, the component chart and the list widget become dataset-bound metric, area and table widgets, and the prose under it says what a widget's data is. The standalone chart component's own chartType / xAxisKey / series section is untouched.
  • The strict face is unchanged and keeps refusing the nine keys by name. Two new pins: strict-face-read-keys-11070.test.ts asserts each of the nine is refused by name (with a dataset-widget control that parses); plugin-dashboard-component-schema.test.ts asserts every plugin-dashboard catalog entry parses on StrictAnyComponentSchema.

(ii) FormulaFieldMetadata.expression replaces formula (seat answer A).

  • packages/types/src/field-types.ts: expression?: SpecField['expression'] (a CEL string or the spec's { dialect, source, … } envelope). Type-level pins: by-reference identity, and formula joins the retired-members list.
  • content/docs/fields/formula.mdx: the typed fence, the plaintext examples (rewritten in CEL against record.) and the prose. The backend section's pseudo-code goes; it said nothing true about how the platform evaluates a formula.
  • plugin-form/src/sanitize.ts: the if (fieldDef.formula) continue; guard is removed after measurement (below). A new case pins that a formula key marks nothing computed. The formArmsWritePayload-10563 fixture's formula column moves to expression.
  • objectui#6526 ruling B's Studio arm is byte-identical: ObjectFieldInspector's seed and clear, ObjectFormCanvas / FieldStub, object-fields-io.ts, clientValidation.ts and retired-field-keys.ts are not in the diff.

(iii) The three display_field consumer legs.

  • deriveColumns / hydrateColumns (plugin-form): d?.displayField || d?.reference_field. Before this change they had no displayField leg at all, so a spec-spelled lookup got no display pointer on its master-detail grid column; it does now (probe below).
  • ObjectChart's resolveGroupByLabels (plugin-charts): displayField, then reference_field, then 'name'.
  • resolveActionParams (app-shell): field.displayField ?? field.reference_field; the RuntimeField.display_field member goes.
  • Every comment around those reads is rewritten to be true. reference_field stays (FieldSchema declares no twin the fold could stamp it onto).
  • Tests: the fixtures feeding display_field move to displayField (deriveMasterDetail.test.ts, resolveActionParams.test.ts, expandableFamily.identity-5874.test.ts). The two "a display_field-only def still resolves" pins flip to "no longer resolves", and each consumer gains a pin that keeps the snake spelling as its INPUT and shows the ingestion fold (normalizeSchemaReferenceKeys, objectui#7650 ruling A) delivers it as displayField.

(iv) Changesets. .changeset/11070-dashboard-formula-round6.md (minor for types, plugin-form, plugin-charts, app-shell; the break measured and stated). Dated, append-only notes: .changeset/7166-retire-inert-fieldmeta-copies.md (its display_field sentence was already false: objectui#7155 retired the cell's leg) and .changeset/lucky-donkeys-shave.md (its KEEP verdicts for these three display_field reads are now false).

Files beyond the claim's named surface, each forced by the round

  • packages/plugin-dashboard/README.md and content/docs/plugins/plugin-dashboard.mdx taught the same inline dialect (options.data / xField / yField) in a TypeScript fence and prose, outside M3's JSON corpus. A bounded in-place fix: the same defect class, a mechanical move to the ruled form, no open PR holds either file, and the README's existing gate (readme-dashboard-examples-spec-valid.test.ts) judges it. The seat should append both to the claim's file surface.
  • scripts/check-doc-component-types.mjs: one exemption entry (area on schema-reference.md). check:doc-types refused the rewritten example's area widget kind, which is a widget family and not a node type; the dashboard pages already declare bar / line this way. The script's own tests and every test that names it ran green (25 files, 1393 tests).
  • examples/schema-catalog/src/catalog-meta.json and the regenerated index.ts (a title made false); comment-only edits in DashboardGridLayout.legacyRetired.test.tsx (it described filtered-dashboard.json's widgets as inline) and packages/core/src/utils/reference-keys.ts (it named deriveColumns' display_field read as a kept snake read; it now names reference_field).

Fork clause: not triggered

No real producer of the nine keys exists outside objectui's demo corpus.

  • objectstack (origin/main d67b94280): xField / yField 0 occurrences in the whole tree; the six dashboard files (app-crm, app-showcase ×3, app-todo, platform-objects) carry 60 dataset: bindings, and their widget options carry format / currency / color / suffix / showLegend / horizontal / showDataLabels, none of the nine (that is objectstack#20960's catchall class, not here). chartType / xAxisKey hits are chart, view and page-node keys, none on a dashboard widget. Control: the same channel finds dataset: in all six files.
  • objectui: no runtime host composes inline options.data. Writers of options: { data in non-test source: 0 (control: the same pattern, 25 in tests). The provider: 'object' writers (anchors.ts, runtime-metadata-persistence.ts) build list / form VIEW configs, not dashboard widgets. xField / yField in non-test source are renderer and helper reads only.

Census, base 0c6f9bb → head

reading base head
key-position xField / yField writes on authoring surfaces (content, examples, apps, skills, docs, package READMEs) 27 in 8 files 0
the nine keys in M3's corpus 44 occurrences, 7 documents (6 fixtures + the schema-reference.md example) 0
display_field code reads in packages/*/src + apps/*/src (non-test, non-comment) 5 reads + 1 RuntimeField member 0 (left: round 5's never tombstone and a register note)
formula code lines 10: the Studio arm 8, sanitize.ts 1, field-types.ts 1 8: the Studio arm, byte-identical
formula: writes in formula.mdx 9 0 (9 expression:)

Probes

Spec, installed @objectstack/spec 17.5.0. FieldSchema refuses formula on all 49 field types (unrecognized_keys, with the rename hint to expression); controls: a bare text def accepted, zzz_not_real refused, expression accepted both as a string and as { dialect: 'cel', source }. That is H4: no served definition can carry formula on a non-formula type, and every type: 'formula' field is dropped by COMPUTED_FIELD_TYPES anyway. Producer census: objectstack writes formula: on a field only in metadata-core's FLS test contract, on a type: 'formula' field.

CEL. The nine expressions formula.mdx now teaches all parse with @objectstack/formula 17.5.0's parseCelToAst; control: the old created_at + 7 days does not parse.

Display pointer (a scratch vitest file, copied into the worktree, run at base and head, removed by trap, never committed). A lookup whose pointer is title, read by deriveColumns / hydrateColumns, resolveGroupByLabels and resolveActionParams:

def, door base head
display_field, handed in raw (BYO) title · axis label from title · title none · axis label from name · none
display_field, through ObjectStackAdapter.getObjectSchema title · title · title title · title · title
displayField, raw none · title · title title · title · title
displayField, through the adapter none · title · title title · title · title

(Column order: master-detail column, chart axis, action param.) The first row is the BYO break the changeset states; the bold cells are the master-detail fix.

M3, scripts/measure-strict-authoring-face.mjs --json, plus the PR #11069 findUndeclaredKeys port for the pairs

reading base 0c6f9bb main 95bd23c head 2abe905 final 139a491
nodes 2228 2229 2229 2229
strict-refused nodes 99 94 87 87
strict-only refused 63 63 56 56
red today 36 31 31 31
documents / refused whole-tree 600 / 93 601 / 88 601 / 81 601 / 81
refused pairs (port) 60 60 51 51
dashboard pairs / occurrences 9 / 44 9 / 44 0 / 0 0 / 0

From main 95bd23c to the merged head 2abe905, exactly the nine dashboard pairs leave; no pair enters and no other pair moves. The last merge (5262f7d, objectui#11276) moved no M3 reading on this branch. H2 holds.

Hypotheses

  • H1 holds in substance, not as posed. The authors were the six fixtures and documentation only, with no real producer in either repository. But M3's seventh document was schema-reference.md's example, not dashboard-filters.md: the guide carried the dialect in a table row and prose, which M3's JSON-fence corpus does not read. The README and plugin-dashboard.mdx taught it too, outside that corpus (see "Files beyond the claim").
  • H2 holds (M3 above).
  • H3 holds. With the member removed, type-check is green in types, fields (the one importer, whose FormulaField reads returnType alone), plugin-form, plugin-charts, plugin-dashboard, app-shell and example-schema-catalog, so no typed read existed. The untyped formula reads were sanitize.ts and the Studio arm, as posed.
  • H4 holds (the spec probe above).

Checks

All at the final head 139a491 unless marked. Heavy runs went through os-verify-lock; exit codes were captured before any pipe.

  • Closure build (check-doc-snippet-types --build-filter, turbo --concurrency=2): 35 successful, at b126b7d (code identical to eddd18d) and again after the first merge; @object-ui/types rebuilt after the second.
  • type-check, exit 0: types, fields, plugin-form, plugin-charts, plugin-dashboard, app-shell, example-schema-catalog. Every touched test file is inside its package's tsconfig.test.json (--listFilesOnly).
  • vitest, repository-root form:
    • packages/types/ examples/schema-catalog/, the touched plugin tests, and 72 test files outside those packages that name a touched file or symbol: exit 0, 422 files, 12188 tests passed.
    • packages/plugin-form/ packages/plugin-charts/ packages/plugin-dashboard/ (at 2abe905; the last merge touched none of them): exit 0, 398 files, 4270 tests passed, 16 skipped.
    • packages/app-shell/ in full at eddd18d: exit 0, 965 files passed, 1 skipped; 9608 tests passed. After the merges, its 17 test files that name a touched symbol ran green in the first set, and the app-shell test the first merge brought in ran green at 2abe905.
  • Docs gates, exit 0: check:doc-fences, check:doc-snippets (698 of 698 judged, 0 failed), check:doc-types, docs:check-links, check:control-bytes, check:doc-examples, check:spec-symbols, check:doc-example-readers, check:doc-example-ids, check:new-line-citations (0 new), check:test-path-roots, regenerate-catalog-index.py --check.
  • Changeset gates, exit 0: check:changeset-claims (report-only; it names 26 pending changesets that cite a touched file. Each was screened for this round's keys and read where it matched; only 7166 and lucky-donkeys-shave are made false, and both carry a dated note), check:pending-changeset-literals, check-changeset-presence (15 source files of 6 released packages, 1 changeset), changeset:check (no major). Bump: minor for types, plugin-form, plugin-charts, app-shell. core (one comment) and plugin-dashboard (a README and a test comment) publish nothing new and take no bump.
  • Lint, the 18 changed .ts / .tsx / .mjs files, against the merge-base blobs (--stdin): 0 errors at head, warnings equal to base in every file, and 0 errors with --no-inline-config too. Population: the diff's changed script and TypeScript files, each matched by the root eslint.config.js (one result per file in the JSON output). Type-aware linting is off (no parser project in that config), so the diff cannot move an untouched file's verdict.
  • check-governed-queue-guard --test over the 33 paths: NOT GOVERNED.

Ablations, re-run at 139a491 with the same readings as at 2abe905 and eddd18d. Each prediction was written first, and each mutation went through objectstack's ablation-replace.mjs (anchor hit once, blob moved, restore blob equal to HEAD, git diff HEAD empty):

  • A1 (i): filtered-dashboard.json's first widget goes back to inline options. The catalog schema test has 1 failed and 29 passed, and the red is the strict-face case for that entry. M3 (measured in the eddd18d run): those three pairs re-enter at 1 occurrence each, and strict-refused goes 82 to 83. As predicted.
  • A2 (ii): FormulaFieldMetadata declares formula?: string again. types tsc on tsconfig.test.json exits 2 with one TS2344, on assertionRetiredMembersAreGone's FormulaFieldMetadata row. As predicted. (The first attempt was refused by the tool before anything ran, because its replacement contained its anchor. It is not counted.)
  • A3 (ii): sanitize.ts reads formula again. sanitize.test.ts has 1 failed and 5 passed ("expected {} to deeply equal { note: 'kept' }"). As predicted.
  • A4 (iii): deriveColumns reads display_field again behind displayField. deriveMasterDetail.test.ts has 1 failed and 39 passed. As predicted.
  • A5 (iii): ObjectChart's chain reads display_field again. The display-leg test has 1 failed and 5 passed. As predicted.
  • A6 (iii): resolveActionParams reads display_field again. The declared-legs test has 1 failed and 11 passed. As predicted.
  • A7 (ii, docs): formula.mdx's typed fence writes formula:. check:doc-snippets exits 1, with 1 of 698 blocks failed against the rebuilt dist. Predicted TS2561; observed TS2353 ("formula does not exist in type FormulaFieldMetadata"). The same refusal, without a did-you-mean.

NOT MEASURED:

  • Repository-wide lint and the test shards outside the sets above. CI runs them.
  • The full app-shell suite after the two merges. It was green in full at eddd18d, and the merges brought no app-shell source change.
  • M3 at the newest main 5262f7d on its own. Merging it moved no reading on this branch.
  • A browser dogfood against a live objectstack app. The probe used stub and adapter-wrapped DataSources.
  • CI convergence. Per the dispatch contract, it was not waited on.

Acceptance notes

  • options.description is in ruling C's nine, and the strict face refuses it. But DatasetWidget reads it on the dataset path as a metric tile's sub-caption (CONSUMED_WIDGET_OPTION_KEYS in sdui-parser). No producer writes it in either repository. It belongs to objectstack#20960's catchall census (a consumed key the strict face refuses), not to this round. Noted, not filed.
  • The dashboard renderer's inline read (options.data ?? widget.data, xField || 'name', …) is untouched, as ruled. It retires on its own card.
  • objectui#11228 stays pm:blocked on this card. It closes with a pointer once this is on main.

Generated by Claude Code

claude added 5 commits October 1, 2026 03:50
…ind datasets; formula -> expression; display_field legs retired (objectui#11070 round 6)

- (i) objectui#11228 ruling C: the six filtered-dashboard catalog fixtures,
  dashboard-filters.md and the schema-reference DashboardComponentSchema fence
  move to the ADR-0021 dataset form; the inline dialect is no longer taught
  (also plugin-dashboard.mdx and the plugin-dashboard README). The strict
  face is unchanged and keeps refusing the nine keys by name (pinned), and
  every plugin-dashboard catalog entry parses on it (pinned).
- (ii) FormulaFieldMetadata.formula -> expression (FieldSchema's member by
  reference); formula.mdx follows; sanitizeFormData drops its formula flag
  read. objectui#6526 ruling B's Studio arm is untouched.
- (iii) deriveColumns / hydrateColumns, ObjectChart and resolveActionParams
  read displayField, then reference_field; the display_field legs and
  RuntimeField.display_field are retired. Fixtures move to displayField; the
  fold pins keep the snake spelling as input.
- (iv) dated notes on the 7166 and lucky-donkeys-shave changesets.

Claude-Session: https://claude.ai/code/session_01TdiauJaVCHuj45EzZGUxHh
Co-authored-by: Claude <noreply@anthropic.com>
…d 6 (objectui#11070)

Claude-Session: https://claude.ai/code/session_01TdiauJaVCHuj45EzZGUxHh
Co-authored-by: Claude <noreply@anthropic.com>
… check:doc-types (objectui#11070 round 6)

The DashboardComponentSchema example's `component` chart is now a
dataset-bound `area` widget (objectui#11228 ruling C). `area` is a widget
family, not a node type, so the page declares it with its reason, the way
the dashboard pages already declare `bar` / `line`.

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

github-actions Bot commented Oct 1, 2026 •

Copy link
Copy Markdown
Contributor

changeset-claim-re-read

⚠️ 26 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/10108-form-payload-server-owned-fields.md

  • names sanitize.ts → packages/plugin-form/src/sanitize.ts — edited by this change

    What it was. The write-side roster in sanitize.ts and the render-side roster in autoLayout.ts were two hand-written copies of the same list, and they drifted. The render copy had learned to drop owner_id; the write copy never did. A form therefore showed the user business inputs only, and sent back every ownership and audit column it had read — owner_id, owning_business_unit_id, created_by, updated_by — while dropping created_at and organization_id from the same payload, because those two happened to be in the write copy.

.changeset/11068-grid-declared-keys.md

  • names schema-reference.md → content/docs/api/schema-reference.md — edited by this change

    What was wrong. ObjectGridSchema declared eight keys the grid never read. An author who wrote description, emptyState, name, placeholder, rowSpecActions or bulkSpecActions on an object-grid got no type error, no validator refusal and no effect. The reference example in schema-reference.md taught description and showFilters as if they worked. It now authors only keys the grid reads.

.changeset/3917-retire-action-condition-branch.md

  • names content/docs/api/schema-reference.md → content/docs/api/schema-reference.md — edited by this change

    • ActionCondition is removed from @object-ui/types (and from the barrel export). - ActionSchema.condition is retyped to the predicate the runtime actually honours: boolean | string | { dialect?: string; source: string } — the same three arms ActionRunner's own ActionDef.condition carries, and the same vocabulary visible and disabled use. - ActionConditionSchema is removed from @object-ui/types/zod (and from the zod barrel); the condition key now validates against that predicate union. - The two teaching sites (content/docs/core/enhanced-actions.mdx Conditional Execution, content/docs/api/schema-reference.md ActionSchema table) are rewritten to the live vocabulary: condition is a gate; a branch is expressed as separate actions with mutually exclusive conditions.

.changeset/6170-retire-timeline-dead-keys.md

  • names content/docs/api/schema-reference.md → content/docs/api/schema-reference.md — edited by this change

    Also in this change: the in-repo example packages/types/examples/data-display-examples.json (its timeline node authored all three) is migrated to items / variant; the two content/docs/api/schema-reference.md snippets that authored events: [] now author items: []; and the plugin-timeline docs callout says retired rather than deprecated.

.changeset/6329-actionparam-one-authority.md

  • names utils/resolveActionParams.test.ts → packages/app-shell/src/utils/resolveActionParams.test.ts — edited by this change

    ActionParam has one authority again (objectui#6329). The name was declared three times, not twice as the card counted: @object-ui/types publishes it — derived from the spec's ActionParamSchema input, with its own parity suite — and ActionDefaultInspector.tsx and ActionPreview.tsx each carried a module-local interface of the same name. app-shell already read the published one elsewhere (utils/resolveActionParams.test.ts), so both locals were shadows. They are deleted, not reconciled against each other, under the 2026-08-25 family ruling 甲A1.

.changeset/6896-retire-chart-inline-data.md

  • names content/docs/api/schema-reference.md → content/docs/api/schema-reference.md — edited by this change

    ⚠️ One correction to the record the ruling rests on. The ruling states zero authorship of a populated series[].data outside tests across packages/ / apps/ / examples/. The re-measurement finds one such site inside those roots — packages/types/examples/data-display-examples.json (2 series) — plus four outside them, in documentation: content/docs/api/schema-reference.md (3) and content/docs/core/report-schema.mdx (1).

.changeset/6939-kanban-column-cards.md

  • names content/docs/api/schema-reference.md → content/docs/api/schema-reference.md — edited by this change

    Breaking, deliberately. KanbanColumn declared its card list as items in complex.ts and in the zod mirror complex.zod.ts. Every board reads cards. Measured on origin/main 78a3cc238: KanbanImpl.tsx reads .cards on 12 lines, KanbanEnhanced.tsx on 8, and bucketCardsIntoColumns twice more as col.cards || []; .items had zero read sites in either board (a same-shaped .title control on the same two files returns 8 and 3, so those zeros are readings and not a mis-shaped probe). Both catalog entries, the plugin docs and content/docs/api/schema-reference.md all author cards.

.changeset/6951-tree-view-data-retired.md

  • names content/docs/api/schema-reference.md → content/docs/api/schema-reference.md — edited by this change

    What was measured, on this branch's base. TreeViewSchema declared two spellings for its one inline-nodes slot — nodes (read second) and data (read third: boundData || schema.nodes || schema.data || [] at renderers/data-display/tree-view.tsx:105), both declared by objectui#6150. data had been REQUIRED until 777e5c6f4 (PR fix(types): tree-view mirror stops requiring the limb it reads third (group 2 of objectui#6939) #7533) made it optional, so this retirement starts from a declared-and-optional member on both faces. The in-repo corpus at the retirement: seven tree-view nodes under examples/schema-catalog and packages/types/examples plus one content/docs fence — six on nodes, two on data (packages/types/examples/data-display-examples.json and content/docs/api/schema-reference.md), both rewritten; no package source authored either spelling.

.changeset/7664-kanban-arm-plugin-dialect.md

  • names content/docs/api/schema-reference.md → content/docs/api/schema-reference.md — edited by this change

    Migration. Author boards in the plugin dialect — objectName + groupBy for an object-bound board, or columns[].cards[] with badges for a static one. Replace DeclarativeKanbanSchema imports with KanbanSchema (from @object-ui/types, or the Zod KanbanSchema from @object-ui/types/zod; @object-ui/plugin-kanban re-exports the same KanbanSchema type). Delete draggable (drag-and-drop is always on) and column color (style a lane through className). content/docs/api/schema-reference.md's kanban section now documents this dialect.

.changeset/7997-detail-view-related-retired.md

  • names content/docs/api/schema-reference.md → content/docs/api/schema-reference.md — edited by this change

    Documentation. packages/plugin-detail/README.md and content/docs/api/schema-reference.md stop teaching the retired array and gain a migration block each.

.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.

  • names scripts/check-doc-component-types.mjs → scripts/check-doc-component-types.mjs — edited by this change

    Which type replaces it was read off the registry rather than guessed, using the repository's own derivation — deriveRegistryKeys() from scripts/check-doc-component-types.mjs, the 649-key universe that gate judges against:

.changeset/8268-testid-emitted-as-data-testid.md

  • names content/docs/api/schema-reference.md → content/docs/api/schema-reference.md — edited by this change

    The other direction — retiring the promise — was considered and declined. It is what c1fe272ad did for BaseSchema.hidden, but that key had a working behaviour to describe and zero named consumers, and the ruling's decline turned on exactly that. This promise already has carriers outside the type declaration: content/docs/api/schema-reference.md states it as a table row and authors testId in that page's own base-schema example, @object-ui/cli's OBJECTUI_STRUCTURAL_KEYS identifies a file as an ObjectUI schema node by this key, at this change ObjectGridSlotKey / ObjectFormSlotKey pin it, SchemaBuilder.testId() writes it, and ADR-0054 C4 — shipped — reads "the renderer emits data-testid … derived from metadata".

.changeset/8499-node-slot-registered-arms.md

  • names scripts/check-doc-component-types.mjs → scripts/check-doc-component-types.mjs — edited by this change

    The defect, and the direction it ran. Nine type spellings sat at DECLARED node slots in this repository's own corpora and resolved in no arm of the component union. Eight were registered renderers with fixtures proving they draw; the ninth (my-component) is the reader's own plugin component and carries a written exemption in scripts/check-doc-component-types.mjs. A reader following content/docs/utilities/runner.mdx's own instruction — "copy one, wrap it in a page document … and save it as src/app-data/pages/index.json" — got a document that renders correctly in the browser and is refused by objectui validate. That is the expensive direction: the likely reaction is to stop trusting the validator.

.changeset/8650-chart-foreign-dialect-retired.md

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

    Also deletes six (schema as any) casts that the published declarations had already made unnecessary — colors, categoryColors and categoryOrder on ChartRenderer, and colors, compareTo and series on ObjectChart (the objectui#8327 bucket-(b) class: declared, then read through a needless cast). No behaviour changes with them; ObjectChart.tsx now has no (schema as any) read left at all.

.changeset/8653-listview-title-retired-rowactiondefs-pinned.md

  • names content/docs/api/schema-reference.md → content/docs/api/schema-reference.md — edited by this change

    title — retired. ListView resolved its export filename through schema.label || (schema as any).title. @objectstack/spec/ui's ListViewSchema refuses title by name (unrecognized_keys: ['title']) while ObjectGridPropsSchema accepts it; packages/types mirrors the platform contract rather than ruling over it, so declaring title on ListViewSchema would have made this repo accept what the platform save gate rejects. That asymmetry is also why objectui#6639 could take the declare branch for ObjectGridSchema.title one package over and this site could not. A parse-based census of apps/ examples/ content/ and packages/ found zero list-view nodes authoring title, so the retirement costs no author a filename. Over that same corpus the instrument reports three object-grid nodes carrying the key: two authored ones, both in content/docs/api/schema-reference.md, plus one that is not authored at all — packages/plugin-view/src/ObjectView.tsx composes title: schema.table?.title onto a grid node it builds, so it is a producer writing the key rather than an author declaring it. ObjectGrid's own title reads are untouched — they remain declared, ruled and read.

.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.

.changeset/8801-object-kanban-allow-collapse-retired.md

  • names content/docs/api/schema-reference.md → content/docs/api/schema-reference.md — edited by this change

    • the declarations retired here — packages/types/src/objectql.ts and its mirror packages/types/src/zod/objectql.zod.ts; - the pins that assert the retirement — object-kanban-allow-collapse-retired-8801.test.ts and bare-kanban-node-key-retired-8802.test.ts; - a comment in packages/types/src/zod/complex.zod.ts, recording that the deleted retiredZeroReadKanbanKey helper once carried this spelling on the SIBLING arm; - one row of content/docs/api/schema-reference.md; - the .changeset/ release notes that discuss it — this one, the two historical entries covering the sibling arm's own spelling, and objectui#9629's note recording the correction to this paragraph.

.changeset/8885-object-chart-drilldown-title-compareto.md

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

    ObjectChart.tsx reads all three off schema, and until now neither published copy declared any of them: not the TS interface (packages/types/src/objectql.ts) and not the zod mirror (packages/types/src/zod/objectql.zod.ts). They rode BaseSchema's index signature / .passthrough() and arrived unvalidated. drillDown was the sharpest case — this component's registry inputs advertise it to the designer palette, and @objectstack/spec publishes ChartDrillDownSchema for exactly this carrier, so an author was offered a key that neither published shape mentioned.

.changeset/9187-record-highlights-layout-two-values.md

  • names content/docs/api/schema-reference.md → content/docs/api/schema-reference.md — edited by this change

    ⚠️ The census behind this narrowing covers this repository only, and it found no in-repo authoring to migrate: every in-tree layout: 'grid' belongs to a different component (detail-view in content/docs/api/schema-reference.md and phase2-schemas.test.ts, ai-recommendations in packages/plugin-ai/README.md), and the one in-repo consumer of this interface that writes a layout (p1-spec-alignment.test.ts) writes 'horizontal'. So no document in this repository stops type-checking. A TypeScript consumer outside this repo that wrote grid is not observable from here and gets a compile error (TS2322) naming the key — which is why the FROM/TO is spelled out above.

.changeset/9533-dashboard-bare-key-converge-plugin-namespace.md

  • names scripts/check-doc-component-types.mjs → scripts/check-doc-component-types.mjs — edited by this change

    What changed. The renderer registers as plugin-dashboard:dashboard, the namespace every sibling plugin, both console stubs and the CLI whitelist already use, so the console stubs are cleared on load and all three claimants of the bare key name ONE full type. The retired view:dashboard key answers RetiredDashboardNodeTombstone — an inline refusal, plus a console.error carrying the same text — registered with skipFallback: true so it claims no bare key. Its spelling is withheld from the derived key universe by declaration in scripts/check-doc-component-types.mjs, the same disposition the RETIRED_FIELD_TYPES tombstones take, so objectui check names it in a file it recognises rather than blessing it; packages/cli/src/utils/known-schema-types.ts regenerates and loses that one entry.

.changeset/calendar-view-schema-converge.md

  • names content/docs/api/schema-reference.md → content/docs/api/schema-reference.md — edited by this change

    Runtime renderer behaviour is unchanged. @object-ui/plugin-calendar's README and content/docs/api/schema-reference.md are repaired to the converged surface in the same change, so no copy of the old contradiction survives.

.changeset/humanize-label-single-home-5444.md

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

    humanizeLabel turns a stored value into a display string when nothing else resolves it — an option with no declared label, an object name, a chart axis member. It existed twice, byte for byte: once in @object-ui/fields (read by plugin-grid, plugin-gantt, plugin-detail and by that package's own renderers) and once as a deliberate local copy in plugin-charts' ObjectChart.tsx, whose comment said it was there "to avoid a dependency on @object-ui/fields".

.changeset/issue-5373-retire-crud-schema.md

  • names content/docs/api/schema-reference.md → content/docs/api/schema-reference.md — edited by this change

    crud had four declaration faces and no registered renderer, for the whole life of the key: the TS interface (packages/types/src/crud.ts), the zod mirror (packages/types/src/zod/crud.zod.ts), a dedicated branch in validateSchema that affirmatively PASSED it, and CRUDBuilder in @object-ui/core. A node spelling it painted the OBJUI-001 "Unknown component type" panel, and content/docs/api/schema-reference.md published it as reference material — so a reader (or an AI author) who copied the page got a red panel.

  • names api/schema-reference.md → content/docs/api/schema-reference.md — edited by this change

    Authoring crud is now REFUSED BY NAME rather than passed or silently ignored. validateSchema returns an error with code: 'RETIRED_TYPE' on schema.type — at any depth, since it is what validateChildren recurses with — so assertValidSchema throws and isValidSchema answers false. The message names the migration: object-grid for the record table with its toolbar, filters, pagination and row/batch actions, object-form for the create/edit form, and detail for the record view. api/schema-reference.md is rewritten around those shapes.

.changeset/object-view-unmirrored-keys-7779.md

  • names content/docs/api/schema-reference.md → content/docs/api/schema-reference.md — edited by this change

    listViews stays unmirrored, on the ruling's own fallback clause. The declaration's value is the local NamedListView — 64 declared top-level members (⚠️ re-taken at objectui#8980, which added the seventeen the protocol declares on this surface to the 47 this entry first measured), of which the renderer reads 21 off a named view. data is one of the 21 now: it used to reach the renderer through an as any cast on the named-view config in packages/plugin-view/src/ObjectView.tsx and be declared nowhere, and the objectui#8980 ruling declared it by name — objectui#7928's open half, answered. The spec's ViewSchema.listViews is a record of the STRICT ObjectListViewSchema, which requires columns and refuses options, ObjectQL tuple filters and default — that is, it refused the named views this package's own README and content/docs/api/schema-reference.md taught when this entry was written ({ label: 'All Users' } fails at columns; filter: [["owner", "=", "..."]] fails at filter.0), and objectui#8255 has since rewritten them in the spec shape. Mirroring the spec value would have lost documented behaviour; mirroring the local value would enforce 43 unread members (64 declared, minus the 21 that are both declared and read) into the contract — the very thing ruling B refused for the six local keys. The key therefore stays in the parity ledger with that measurement, pinned, until the maintainer decides its value type. It is not papered over with z.any().

.changeset/objectchart-schema-anchor-7946.md

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

    • ObjectChartProps.schema is ObjectChartSchema; the published .d.ts no longer says props: any. ObjectChartProps is exported. - The four keys are declared on BOTH copies, with value types taken from their READ sites (ChartRendererProps for xAxisKey / series, ObjectChart.tsx for filter) rather than copied from any producer's literal — except where @objectstack/spec already owns the shape, which is aggregate: that one is declared BY REFERENCE as ChartAggregate / ChartAggregateSchema, so the authoring door here and at the react-page publish gate are one shape and cannot drift into two dialects. - colors converges: the zod mirror has declared it since objectui#3913 and the TS interface did not, a drift no ratchet could see because a mirror-only key is in neither of the parity guard's two difference ledgers.

.changeset/table-renderer-declared-column-contract-5350.md

  • names content/docs/api/schema-reference.md → content/docs/api/schema-reference.md — edited by this change

    What makes this site different from its three siblings is that the alias was not merely tolerated, it was published. content/docs/api/schema-reference.md §TableSchema shipped a copyable { "name": "id", "label": "#" } example and a property row reading "Column definitions with name, label, …", while packages/types declared the opposite pair. Docs and type disagreed about one type they both call TableColumn, each internally consistent. Retiring the alias without correcting the page would have turned a documented, working example into a silently broken one, so both halves land together: the page now authors accessorKey/header. The same row also advertised a render property that TableColumn has never declared — the renderer's hook is cell — and that claim is dropped rather than re-spelled.

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 770cc5ba4 (merge-base with origin/main): 30 file(s) changed outside .changeset/, read against 1896 pending declaration(s) that publish a body (2508 pending in total). · run

@github-actions

github-actions Bot commented Oct 1, 2026

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 330 chunks) 3585.6 KB 3607.4 KB
Main entry chunk (gzip) 150.4 KB 350 KB
Entry file index-CNpCcPF3.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) 571.28KB 136.83KB
core (index.js) 10.00KB 3.96KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 229.96KB 63.80KB
fields (index.js) 261.05KB 66.23KB
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.40KB 12.91KB
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.95KB 11.48KB
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) 52.98KB 15.39KB
plugin-charts (index.js) 84.07KB 22.93KB
plugin-chatbot (index.js) 198.22KB 46.97KB
plugin-dashboard (index.js) 139.34KB 37.30KB
plugin-designer (index.js) 216.45KB 44.60KB
plugin-detail (index.js) 244.79KB 64.47KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 173.68KB 44.62KB
plugin-gantt (index.js) 173.11KB 43.10KB
plugin-grid (index.js) 231.53KB 63.58KB
plugin-kanban (index.js) 49.32KB 15.48KB
plugin-list (index.js) 116.63KB 28.97KB
plugin-map (index.js) 23.54KB 7.83KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 44.04KB 12.21KB
plugin-timeline (index.js) 33.91KB 10.00KB
plugin-tree (index.js) 11.20KB 3.89KB
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) 119.55KB 39.23KB
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 (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 (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) 4.74KB 2.26KB
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

CI red that is not this PR's: Spec Main Shape Gate. domain:devx seat 2 (objectui#10917), session_01TdiauJaVCHuj45EzZGUxHh, 2026-10-01T05:37Z.

@github-actions

github-actions Bot commented Oct 1, 2026

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 330 chunks) 3585.5 KB 3607.4 KB
Main entry chunk (gzip) 150.4 KB 350 KB
Entry file index-DUUmnLJH.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) 571.28KB 136.83KB
core (index.js) 10.00KB 3.96KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 229.96KB 63.80KB
fields (index.js) 261.05KB 66.23KB
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.40KB 12.91KB
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.55KB 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) 52.98KB 15.39KB
plugin-charts (index.js) 84.07KB 22.93KB
plugin-chatbot (index.js) 198.22KB 46.97KB
plugin-dashboard (index.js) 139.34KB 37.30KB
plugin-designer (index.js) 216.54KB 44.64KB
plugin-detail (index.js) 244.79KB 64.47KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 173.68KB 44.62KB
plugin-gantt (index.js) 173.11KB 43.10KB
plugin-grid (index.js) 231.53KB 63.58KB
plugin-kanban (index.js) 49.32KB 15.48KB
plugin-list (index.js) 116.63KB 28.97KB
plugin-map (index.js) 23.54KB 7.83KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 44.04KB 12.21KB
plugin-timeline (index.js) 33.91KB 10.00KB
plugin-tree (index.js) 11.20KB 3.89KB
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) 119.55KB 39.23KB
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 (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 (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) 4.74KB 2.26KB
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
objectstack-fleet Bot marked this pull request as ready for review October 1, 2026 07:13
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 1, 2026
Merged via the queue into main with commit 19f484f Oct 1, 2026
45 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/issue-11070-dashboard-formula-round6 branch October 1, 2026 07:28
huangyiirene pushed a commit that referenced this pull request Oct 1, 2026
Round 6 (PR #11333) and objectui#10859 batch 6 landed. Two test files
conflicted, each resolved by keeping both sides: the 11070 strict-face
pin keeps round 6's dashboard-dialect rows and round 7's node-level
object-chart binding row (round 6's "refused until declared" row is
superseded by the declaration), and the 10872 envelope census names
both object-gantt (batch 6) and object-chart (round 7).

Claude-Session: https://claude.ai/code/session_01TdiauJaVCHuj45EzZGUxHh
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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants