Skip to content

fix(plugin-calendar,plugin-map): honour filter, sort and the row ceiling on inline value data - #9138

Draft
os-tesla wants to merge 2 commits into
mainfrom
claude/issue-9061-inline-data-short-circuit
Draft

fix(plugin-calendar,plugin-map): honour filter, sort and the row ceiling on inline value data#9138
os-tesla wants to merge 2 commits into
mainfrom
claude/issue-9061-inline-data-short-circuit

Conversation

@os-tesla

Copy link
Copy Markdown
Collaborator

DO NOT MERGE AS-IS — this pull request is a DECISION REQUEST. It is complete, measured and green on everything it set out to do, and it leaves three standing assertions RED on purpose. The red is the decision, not an oversight. See "The decision" below.

Part of objectui#9061. Deliberately not a closing keyword: the card must stay open until the decision below is taken.

What this does

ObjectCalendar and ObjectMap each held a hand copy of the provider: 'value' short-circuit objectui#8769 removed from ObjectGantt. Inside the record-fetch effect, the inline branch called setData(dataItems) plus setRowCeiling with truncated false and RETURNED — before the find a few dozen lines below, which is the ONE site in each file that lowers schema.filter onto $filter, schema.sort onto $orderby and the objectui#7210 ceiling onto $top.

Consequence, identical in both: an authored filter reached nothing and every authored row was drawn. The fail-OPEN direction — the key that was dropped is the key that NARROWS, so the view answered a wider question than the author asked. Nothing was exposed that was not already in the authored schema.

Not a literal transplant, and the difference is structural. ObjectGantt resolves ONE effectiveDataSource for every provider, so its repair was to delete the branch and let the inline case fall through. These two call find INSIDE their dataProvider === 'object' arm, behind an $expand projection an inline set has no metadata to build (and, on the calendar, behind an objectSchemaReady gate scoped to that same arm). Falling through would throw DataSource required for object/api providers on a view that needs no DataSource at all. So each resolves a ValueDataSource for the inline provider only; the api arm keeps exactly the behaviour it had, and no dependency array moves — nothing about WHEN either effect re-runs changes.

The decision this is blocked on

Routing inline rows through ValueDataSource passes them through that adapter's constructor, which deep-clones with JSON.parse(JSON.stringify(...)). That imposes a requirement these two renderers do not have today: inline rows must be JSON-serializable.

Measured, three surfaces, same input (a record carrying a back-reference to its own graph — what an expanded lookup looks like once a host hands the resolved rows to the block as inline data):

renderer before this PR after this PR
ObjectGantt (untouched here) already throws TypeError: Converting circular structure to JSON, from the render body, via its own JSON.stringify memo key unchanged
ObjectMap renders the marker — and objectui#6018 pins that it must ("the value never has to be serializable at all") error panel, no markers
ObjectCalendar renders the event (measured with a throwaway probe; nothing pins it) error panel, no events

So the platform is already inconsistent about this, and this PR makes the two siblings match the gantt — by retiring a pinned guarantee on the map. That is a ruling, not an implementation detail, and it is not this PR's subject, so it is left for a maintainer:

  • Option A — fix it upstream first, then land this unchanged. ValueDataSource clones "to prevent external mutation"; on a read-only query the clone is pure cost. Replacing the JSON round-trip in @object-ui/core (for example with structuredClone, which handles cycles and BigInt) makes every assertion below green with no change to this diff. ⚠️ It is a real behaviour change for every other ValueDataSource consumer (a Date value would survive as a Date instead of becoming a string), so it needs its own card and its own measurement. Recommended.
  • Option B — accept the requirement and retire the pin. ViewData.items is declared serializable metadata in @objectstack/spec, a circular record graph is off-contract, and the failure is LOUD (an error panel naming the cause) rather than silent. Then objectui#6018's third case is re-based, the two ObjectMap.filterConfig fixtures below are re-based, and this lands as written.
  • Option C — land neither renderer. The defect stays live on both.

⛔ An agent seat should not pick between A and B on its own: option B deletes a guarantee a previous card chose deliberately and recorded, and it does so as a side effect of a PR about something else.

The three RED assertions, named

All three are untouched in this diff — no fixture was edited to make anything green.

  1. packages/plugin-map/src/ObjectMap.dataConfigMemo.test.tsx — "renders inline data the serializer cannot handle — identity needs no round-trip" (objectui#6018). This one IS the decision.
  2. packages/plugin-map/src/ObjectMap.filterConfig.test.tsx — "really is the DEFAULT config that applies, not 'no config at all'". Collateral: it authors a legacy filter.map stash alongside inline rows and relied on the filter being DROPPED; honoured as an object-shaped $filter, it now narrows to zero markers.
  3. packages/plugin-map/src/ObjectMap.filterConfig.test.tsx — "applies schema.map when an array filter is authored alongside it". Same collateral: it authors filter: [['owner', '=', 'me']] against a row that has no owner.

2 and 3 are ordinary fixture triage under option B (give the row the field the filter asks for, or move the case onto an adapter that ignores $filter) — they are NOT a second decision, and they were left red only so that the diff shows exactly which standing assertions the port disturbs.

⭐ The row-ceiling measurement the brief asked for

An inline list that exceeds the ceiling now renders FEWER rows than the author supplied. Measured: 2,501 inline rows in, 2,000 drawn, on both renderers. Reported rather than buried, because "inline data is authored, not fetched" is a real objection.

It is shipped anyway, and the reason is that the cut is loud: both renderers already mount NonGridRowCeilingNote unconditionally at their top level, so the footnote naming BOTH numbers (2,000 of 2,501) renders on the inline path with no extra wiring. ceilingNote pins that in each file. objectui#7210 ruling a-prime's budget is measured in DOM elements per record, its own measurement table was taken over the inline value provider, and its text carves out no provider — an inline row costs the browser what a fetched row costs. The exemption that REMAINS is the host data React prop, and only it: those rows are not ours to cap and we issued no query whose total a footnote could name.

ceilingOrder pins the other half from the observable side: the ceiling is applied to the filtered set (2,400 rows, 800 of them matching, 800 drawn, no footnote), matching the fetching path where $filter and $top travel in one query.

Acceptance, and how each row is met

New: packages/plugin-calendar/src/ObjectCalendar.inlineQueryKeys-9061.test.tsx (8 cases) and packages/plugin-map/src/ObjectMap.inlineQueryKeys-9061.test.tsx (9 cases). 17 passed / 17 on the head of this branch.

  • filter applies, sort changes the order, asserted on the RENDERED ROWS. twoSidedFilter renders the SAME rows and the SAME filter twice — once inline, once through a context adapter that is itself a ValueDataSource over those rows — and reads the disagreement, so "the filter was ignored" cannot be confused with "the filter matched everything". inlineSort reads the drawn id order off the view (the calendar stub carries data-event-ids; the map stub carries each marker's longitude, which the marker array takes straight off the record).
  • Every author spelling. staticDataSpelling on both; arrayShorthandSpelling on the map only — see the divergences below.
  • The ceiling. ceilingCap, ceilingNote, ceilingOrder, per renderer.
  • ⭐ A control in the same render. providerBackedControl renders a NON-inline view with the same filter, the same sort and the same rows through the context adapter, and asserts the rows and their order are unchanged. It is green before this repair, after it, and on both ablation legs — that is what bounds the change to the inline path.
  • Regression guard. control renders an inline view authoring NONE of the three and asserts the authored rows, in the authored order, with no footnote.

Ablation — each renderer's fix removed SEPARATELY

Each leg restored the ONE file from the branch point, proved the mutation reached the disk before reading anything (repair marker 1 -> 0, pre-repair line 1 -> 2, blob hash changed), then restored with git checkout HEAD -- path and proved the tree clean by state, never by an exit code.

leg calendar suite map suite
ObjectCalendar.tsx reverted 6 redtwoSidedFilter, inlineSort, staticDataSpelling, ceilingCap, ceilingNote, ceilingOrder; control and providerBackedControl green 9 / 9 green
ObjectMap.tsx reverted 8 / 8 green 7 red — the six above plus arrayShorthandSpelling; control and providerBackedControl green

Neither renderer's repair covers the other. Both needed porting.

Restore proof, both legs: blob 460e680d… == HEAD blob 460e680d…; git diff HEAD empty and blob 42d8b312… == HEAD blob 42d8b312…; git diff HEAD empty.

Where the two files DIVERGE — verified per file, not assumed

The brief asked for this explicitly. The short-circuit itself is byte-identical in shape; four things around it are not.

  1. A third author spelling on the map. ObjectMap.getDataConfig normalizes a bare array under data into { provider: 'value', items } before delegating to the shared ladder (objectui#5305). ObjectCalendar has no such head — three spellings reach the repair on the map, two on the calendar. Hence the extra map-only case.
  2. A stale docblock on the map only. ObjectMap's rowCeiling state said "A host data prop and an inline value set are never truncated by us". Corrected here. ObjectCalendar's equivalent docblock never made that claim and is untouched.
  3. A mount guard on the calendar only. ObjectCalendar's effect guards every state write with isMounted; ObjectMap's does not. Each new branch follows its own file.
  4. No pin to invert on either. objectui#8769 had to invert ObjectGantt's "an inline set is never capped and never footnoted" case. Neither sibling has one — ObjectMap.rowCeiling-7210 and ObjectCalendar.rowCeiling-7210 both grade the object provider only — so the ceiling cases here are NEW coverage, not an inversion. Read both files' case lists before writing.

They do not need different repairs: the same shape lands on both, with the same three keys on the same query, and both pay the same serializability cost. The divergences above are about their surroundings.

The fourth surface — reported, not fixed

Triage asked whether any further surface carries this, because a short-circuit found on three components is one that was copied. It does: packages/plugin-tree/src/ObjectTree.tsx holds the same inline exit before the same $filter / $top query. ⚠️ With one measured difference — ObjectTree never reads schema.sort at all (zero hits for convertSortToQueryParams and for schema.sort in the whole file), so two keys are dropped there, not three. Filed as objectui#9136 and left alone, per this card's fence. It inherits the decision above unchanged.

Two further inline branches were looked at and are deliberately NOT graded: ObjectGrid (a grid, which pages its own rows and sits outside objectui#7210's non-grid ceiling) and ListView (an inline branch that applies its own search term and delegates to a child view). Each needs its own reading.

Clause-2 declaration holds

Declared no, and the diff keeps it: no declared type, registration input, exported symbol, authorable key or accept-set moves. OBJECT_CALENDAR_DATA_SOURCE and OBJECT_MAP_DATA_SOURCE are byte-identical — neither index.tsx is in this diff at all. filter and sort were already declared and already read on the object path; this is only about whether they are read on one more path.

Verification

  • pnpm exec vitest run packages/plugin-calendar/ packages/plugin-map/3 failed / 361 passed, and the 3 are exactly the named reds above. Every other case in both packages, including all 17 new ones, is green.
  • Blast radius outside the two packages: pnpm exec vitest run packages/plugin-view/ packages/sdui-parser/ examples/schema-catalog/ apps/console/src/__tests__/public-block-binding-reach.test.tsx packages/react/src/__tests__/SchemaRendererProvider.smoke.test.tsx85 files / 2704 tests, all green.
  • pnpm turbo run type-check --filter=@object-ui/plugin-calendar --filter=@object-ui/plugin-map — 17 tasks successful.
  • eslint . --no-inline-config --format json over the whole repo at 7bd112303: 4807 files judged, and all four files this PR touches under packages/ carry 0 errors (only pre-existing no-explicit-any warnings shared with their neighbours). The 79 error-carrying files are all untouched by this PR.
  • Gates run green: check:control-bytes, check:vi-mock-specifiers, check:vi-mock-inherit, check:vi-mock-override-shape, check:changeset-claims, check:new-line-citations, check:doc-fences, check:element-data-source-declaration, check:unreferenced-sources, check:shell-escape-residue, check-changeset-presence, check-changeset-no-major.
  • NOT MEASURED: check:readme-exports needs built dist/ for 36 packages and refused with "run pnpm build first" over packages this PR does not touch — a prerequisite, not a red. Declared to CI.

Acceptance notes

Out-of-scope observations, noted and not filed:

  • packages/plugin-map/src/index.tsx says the map's fetch "issues no $top", and packages/plugin-calendar/src/index.tsx says the calendar "fetches the whole window rather than a capped page". Both stopped being true at objectui#7210, before this card. Not corrected here: both sentences sit directly above an ElementDataSourceMapping declaration this PR's clause-2 declaration says it will not touch, and neither is made wrong by this change. The carrier would be whoever next edits those two registrations.
  • ObjectMap.filterConfig.test.tsx's "ignores a MapConfig stashed under filter.map and falls to the default config" still passes, but after this change it would pass for two reasons at once (the default config finds no coordinates, AND the legacy stash now narrows to zero rows as an object-shaped $filter). Worth re-basing alongside the two red cases if option B is taken. Carrier: whoever re-bases those fixtures.

Prepared by an automated developer seat, session session_01UzHd6hDYatoDn17BuwKxnZ.

🤖 Generated with Claude Code

https://claude.ai/code/session_01UzHd6hDYatoDn17BuwKxnZ


Generated by Claude Code

…ing on inline `value` data

Ports objectui#8769's repair off `ObjectGantt` to the two siblings that carry a
hand copy of the same short-circuit. Their fetch effect exited on
`provider: 'value'` with `setData(dataItems)` BEFORE the adapter query, which is
the one site in each file that lowers `schema.filter` onto `$filter`,
`schema.sort` onto `$orderby` and the objectui#7210 ceiling onto `$top`. An
authored `filter` therefore reached nothing and every authored row was drawn —
the fail-OPEN direction, because the key that was dropped is the key that
NARROWS.

Not a literal transplant: `ObjectGantt` resolves ONE adapter for every provider
and could delete the branch and fall through, while these two call `find` inside
their `dataProvider === 'object'` arm, behind an `$expand` projection an inline
set has no metadata to build. So each resolves `ValueDataSource` for the inline
provider only, leaving the `api` arm exactly as it was, and no dependency array
moves.

Part of objectui#9061. ⚠️ BLOCKED on a decision — see the PR body: routing the
inline rows through `ValueDataSource` makes them pass through that adapter's
`JSON.parse(JSON.stringify(...))` constructor clone, which retires
objectui#6018's pinned guarantee that a map's inline rows never have to be
serializable. Three standing assertions are left RED and untouched on purpose.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UzHd6hDYatoDn17BuwKxnZ
…ange which query keys apply

The changeset and both docs sets for objectui#9061: an authored `filter` / `sort`
narrows and orders inline rows on every provider, the objectui#7210 ceiling
applies to inline rows and is applied to the FILTERED set, and the two
consequences of routing inline rows through the in-memory adapter — deep-copied
row identity, and the JSON round-trip that makes inline rows have to be
serializable.

Part of objectui#9061.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UzHd6hDYatoDn17BuwKxnZ
@github-actions github-actions Bot added documentation Improvements or additions to documentation plugin tests labels Sep 11, 2026
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 50 chunks) 3491.7 KB 3512.7 KB
Main entry chunk (gzip) 144.2 KB 350 KB
Entry file index-DrNv3Nw4.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.69KB 6.21KB
app-shell (runtime-config.js) 20.68KB 7.36KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.06KB 3.86KB
auth (ActiveOrganizationStorage.js) 25.05KB 9.16KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.18KB 10.59KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.65KB 2.22KB
auth (SocialSignInButtons.js) 9.61KB 3.89KB
auth (UserMenu.js) 3.41KB 1.23KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.21KB 10.80KB
auth (createAuthenticatedFetch.js) 8.46KB 3.43KB
auth (index.js) 3.19KB 1.44KB
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) 26.08KB 7.56KB
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) 500.20KB 114.67KB
core (index.js) 8.28KB 3.31KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 209.08KB 57.84KB
fields (index.js) 247.14KB 62.34KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 1.22KB 0.64KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 6.57KB 2.76KB
i18n (index.js) 3.65KB 1.47KB
i18n (pickLocalized.js) 7.62KB 3.26KB
i18n (provider.js) 26.89KB 9.04KB
i18n (useDisplayLocale.js) 2.85KB 1.45KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 38.84KB 10.95KB
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) 2.53KB 0.85KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 4.39KB 1.66KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 13.52KB 4.88KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.24KB 2.16KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.39KB 3.10KB
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) 14.81KB 3.63KB
plugin-calendar (index.js) 49.23KB 13.98KB
plugin-charts (index.js) 71.52KB 19.98KB
plugin-chatbot (index.js) 195.32KB 46.51KB
plugin-dashboard (index.js) 131.21KB 34.62KB
plugin-designer (index.js) 215.68KB 44.27KB
plugin-detail (index.js) 252.08KB 65.41KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 136.79KB 34.19KB
plugin-gantt (index.js) 166.94KB 41.04KB
plugin-grid (index.js) 211.56KB 57.50KB
plugin-kanban (index.js) 46.10KB 14.33KB
plugin-list (index.js) 112.58KB 27.65KB
plugin-map (index.js) 20.70KB 6.88KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 43.42KB 11.92KB
plugin-timeline (index.js) 30.10KB 8.74KB
plugin-tree (index.js) 9.54KB 3.31KB
plugin-view (index.js) 84.42KB 20.80KB
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.66KB 3.50KB
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) 94.03KB 31.02KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.63KB 2.18KB
react (schema-input.js) 4.25KB 2.04KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 6.58KB 2.74KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 5.66KB 2.50KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (kanban-quick-add.js) 3.89KB 1.87KB
sdui-parser (parse.js) 25.28KB 7.80KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 14.82KB 4.99KB
types (ai.js) 0.20KB 0.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 1.00KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 2.93KB 1.49KB
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.25KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 4.73KB 2.28KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 0.20KB 0.18KB
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) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 14.27KB 5.47KB
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

Copy link
Copy Markdown
Collaborator Author

Director seat pointer (director seat, summon #22, session_01QsCVSivtpwT6ZXs5Rtvqxe (GitHub os-tesla), 2026-09-11T14:08Z): objectui#9061 was ruled A by the maintainer (batch #115, 「同意」) — the ValueDataSource clone is repaired upstream first (objectui#9175); this PR stays draft and lands unchanged once that merges. ⛔ No fixture re-basing, ⛔ no pin flipped here.


Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation plugin tests

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants