Skip to content

refactor(core)!: burn ledger batch 4 — 13 symbols stop wearing spec names (#3158) - #3188

Merged
os-zhuang merged 5 commits into
mainfrom
claude/objectui-spec-symbol-ci-rule-4r3xlc-batch4
Aug 2, 2026
Merged

refactor(core)!: burn ledger batch 4 — 13 symbols stop wearing spec names (#3158)#3188
os-zhuang merged 5 commits into
mainfrom
claude/objectui-spec-symbol-ci-rule-4r3xlc-batch4

Conversation

@os-zhuang

@os-zhuang os-zhuang commented Aug 2, 2026

Copy link
Copy Markdown
Contributor

Burns down ledger batch 4 of objectstack#4115 — the thirteen @object-ui/core collisions of objectui#3158. Closes objectui#3158 (on merge).

core is the render kernel every plugin depends on, so the cross-package rule from objectui#3100 applied throughout: turbo build --filter=@object-ui/core first, then type-check --force downstream — a per-package tsc resolves the pre-change dist and goes green on a break that CI would catch.

Verdicts

Six derived (the name is now bound to the spec at compile time), seven renamed (genuinely different concepts), zero ALLOW.

Derived — re-exported from the spec

symbol from why it was safe
StyleMap, ResponsiveStyles @objectstack/spec/ui member-for-member identical; both sides cite ADR-0065, and the spec's own doc names objectui's SchemaRenderer as the consumer
RowHeight @objectstack/spec/ui identical five-value enum
CONTEXT_TOKENS @objectstack/spec/data value- and type-identical
CrudAffordances, RowCrudPredicates @objectstack/spec/data spec is strictly more precise — see below

Renamed — the spec owns the name for something else

was now what the spec's same-named export actually is
ChartSeries ChartSeriesBinding authored dataset-binding descriptor (a measure name, no data)
ActionHandler ActionRunnerHandler the server-side objectql handler, (ctx) => unknown
PluginDefinition RegistryPluginDefinition the platform package manifest (id/slug/staticPath/install hooks)
ValidationError SchemaNodeValidationError plugin-manifest validation, keyed by field, no severity
ValidationResult SchemaNodeValidationResult ditto, both arrays optional
defineView defineSystemView the view-document factory: parses a ViewSchema, returns a validated View
resolveCrudAffordances resolveEffectiveCrudAffordances the object-level matrix, with no notion of server API operations

What the copies were actually hiding

Three of them said so in their own comments — which is the failure class this issue is about, not a hypothetical:

  • CONTEXT_TOKENS carried "mirrored here … because the installed @objectstack/spec predates that export. Keep the two in sync; the duplication is temporary until the next coordinated release." The installed spec already exported it, and the copy was byte-identical — so it passed every value comparison and every behavioural test for the entire interval in which its stated reason was false. This is the cleanest possible demonstration of why reference identity is the only check that works: toEqual passed on the fork and would pass on a re-fork tomorrow.
  • RowHeight advertised itself as "the spec's RowHeightSchema vocabulary" while being a hand-written union. It happened to still be correct; nothing would have caught the day it stopped being.
  • managedBy.ts described itself as a "UI-side mirror of the framework's resolveCrudAffordances()" and carried its own DEFAULTS table — a line-for-line copy of the spec's CRUD_AFFORDANCE_DEFAULTS, plus a copy of its override parser (normalizeRowCrudOverride).

And defineView had already planted the premise in a neighbouring package: app-shell/…/view-item-normalize.ts documents a "per-object defineView({ list, form, listViews, formViews }) document" — which is the spec's defineView, not core's freeze-and-mark helper that the name resolved to. Exactly the #2901 mechanism.

resolveCrudAffordances — delegate, don't just rename

Renaming alone would have left the copied bucket table in place. The bucket/userActions half now delegates to the spec's resolveCrudAffordances(), so the table has exactly one definition on the platform. What stays objectui's is the part the spec has no notion of — intersecting that matrix with the server-resolved effective API operation set (#3391) so the UI never offers a button the server would 405 — and the new name says that instead of claiming to be the spec's function.

Pinned by a parity test that compares objectui's output to the spec's across all seven managedBy values plus the #2614 override forms: if anyone reintroduces a local table, it diverges the first time the spec re-buckets an object class.

Deriving RowCrudPredicates also tightens it — the local copy typed visibleWhen/disabledWhen as unknown where the spec types them Expression | ExpressionInput. That was imprecision, not a deliberate dialect, and it caused zero downstream fallout.

Method notes worth adding to the templates

1. The "check the new name first" rule fired again — twice, on the obvious names. The validator pair's first choice was SchemaValidationError / SchemaValidationResult. SchemaValidationResult is itself a @objectstack/spec/contracts export; the fallback SchemaValidationReport is too. The whole SchemaValidation* namespace is spec-occupied, hence SchemaNodeValidation*. This is the third independent confirmation after PageComponentSchema (objectui#3074) and batch 3's three rejected candidates — and the pattern is now clear enough to state: the name that reads as most natural is the one most likely already taken, because the spec named the same concept the same way.

The tripwire test inverts the pin for those two rejected names (asserting they are still spec-owned), so the next person to reach for the obvious name reads the reason instead of rediscovering it through a red guard.

2. A green turbo type-check does NOT mean a rename is complete — test files are not type-checked. 78/78 was green while PluginSystem.test.ts and managedBy.test.ts still referenced the old names; only the test run surfaced them. Worth stating explicitly in the construction rules next to the "don't global-replace" rule.

3. Global replace corrupts the very comments the burn-down adds. A scoped re.sub over two files rewrote the contrast comments — "NOT the spec's ValidationError" became "NOT the spec's SchemaNodeValidationError", i.e. a fresh misdescription manufactured by the fix for misdescription. Caught on review, restored. The existing rule says don't global-replace across the repo; it should also say don't global-replace within a file that documents the collision.

Verification

Re-run in full after merging main (which bumped the spec to 17.0.0-rc.1 and added two ALLOW entries of its own — both preserved; the DEBT block was regenerated rather than hand-merged). All six derive verdicts still hold under rc.1 — the parity test re-checks mutual assignability against the installed spec, so the bump was validated rather than assumed.

  • Ledger: --ledger regenerated and diffed line by line — removed is exactly the 13 of this batch, added empty, and every other package byte-identical (several batches are in flight in parallel). @object-ui/core leaves the ledger entirely: 62 untriaged collisions in 17 packages, down from 77/18 at this branch's base.

  • Guard: green (8 declared dialects, 62 untriaged collisions in 17 packages).

  • Cross-package: turbo build --filter=@object-ui/core to rebuild dist, then turbo type-check --force → all packages green.

  • Tests: 9689 assertions passing, 0 failing across 821 files. (21 files report a file-level error rather than an assertion failure; plugin-charts was checked against a detached origin/main and shows the identical 1 failed | 25 passed (26) / 400 passed shape there, so these are pre-existing and unrelated — the count also drifted 23→21 across runs with no code change, under memory pressure from parallel worktrees.) The affected packages were also run in isolation and are fully green — core 61 files / 1335 assertions, and app-shell + plugin-form + plugin-grid + plugin-list 347 files / 3127 assertions.

  • New coverage: 21 assertions in packages/core/src/utils/__tests__/spec-symbol-batch4.test.ts — reference identity for CONTEXT_TOKENS (toBe, deliberately: toEqual cannot tell a copy from a re-export), mutual assignability for the five derived types, spec-delegation parity for the affordance resolver, and absence-from-spec tripwires for all seven new names.

  • Mutation test: two mutations, both red by name and by file:line.

    1. ChartSeriesBinding renamed back to ChartSeries → guard points at packages/core/src/utils/chart-series.ts:44.

    2. CONTEXT_TOKENS re-forked as the byte-identical local copy that was just deleted → guard points at packages/core/src/utils/filter-tokens.ts:61, and the new parity test fails with

      AssertionError: expected [ 'current_user_id', 'current_org_id' ]
                           to be [ 'current_user_id', 'current_org_id' ]  // Object.is equality
      

      Two identical-looking arrays, and the other 20 assertions in the same file still passed. That is objectui#3003's point reproduced on demand: a faithful copy satisfies every value comparison, and only reference identity separates a re-export from a fork.

    Both reverted; guard and tests back to green.

Cross-package decisions recorded

Registered on objectstack#4115 (comment) so batches 6 and 7 inherit them:

  • ValidationError/ValidationResult are three different concepts, not one shared name. core validates an SDUI schema tree (path + severity), sdui-parser validates a compiled tree against a manifest ({diagnostics, requires, bindings}), data-objectstack's is an Error subclass wrapping HTTP 400. What is fixed is the convention«what-is-validated»Validation«Error|Result» — with ManifestValidationResult suggested for batch 7 (verified free) and batch 6 to pick under the same rule, running the guard first.
  • ChartSeries is three different concepts, confirmed by re-reading all three: spec = authored dataset binding, @object-ui/types = inline static data (ChartDataSeries, batch 1), core = renderer-internal binding → ChartSeriesBinding. The plugin-charts comments naming ChartSeries.type/.stack refer to the spec's type and are deliberately untouched.

Not done here

content/docs/releases/ is untouched; the changeset (.changeset/core-spec-symbol-burn-down.md) is this PR's input to the release notes.

claude added 3 commits August 2, 2026 08:24
…core

Rescue commit after an OOM container restart — verification is NOT complete
yet (no ledger regen, no guard run, no tests, no mutation test).

Triage done, verdicts applied to source:

Derived (re-export from the spec — the only form that cannot drift):
  StyleMap, ResponsiveStyles  ← @objectstack/spec/ui (identical, ADR-0065)
  RowHeight                   ← @objectstack/spec/ui (identical enum; the local
                                doc comment already CLAIMED spec canonicity)
  CONTEXT_TOKENS              ← @objectstack/spec/data (value- AND type-identical;
                                its comment said the copy was "temporary until the
                                spec exports it" — the installed spec already did)
  CrudAffordances,
  RowCrudPredicates           ← @objectstack/spec/data (spec is strictly more
                                precise: Expression|ExpressionInput vs unknown)

Renamed (genuine name collisions — different concepts):
  ChartSeries      → ChartSeriesBinding          (renderer-internal {dataKey,label}
                                                  vs spec's authored dataset binding)
  ActionHandler    → ActionRunnerHandler         (client dispatch vs objectql server)
  PluginDefinition → RegistryPluginDefinition    (component registry vs package manifest)
  ValidationError  → SchemaNodeValidationError   (schema-tree walk vs plugin manifest)
  ValidationResult → SchemaNodeValidationResult
  defineView       → defineSystemView            (freeze+mark vs spec's view-document
                                                  factory; app-shell had already
                                                  conflated the two in a comment)
  resolveCrudAffordances → resolveEffectiveCrudAffordances
      Its DEFAULTS table was a line-for-line copy of the spec's
      CRUD_AFFORDANCE_DEFAULTS. The bucket half now DELEGATES to the spec's
      resolveCrudAffordances(); only the #3391 effective-API-operation
      intersection is objectui's, and the name now says so.

All new names were run through the guard's spec export set first —
SchemaValidationResult and SchemaValidationReport turned out to BE spec
exports, so the SchemaValidation* family was avoided (the PageComponentSchema
lesson from batch 3).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015Jdef6ZFhJmiNRhNCd4DW3
21 assertions in packages/core/src/utils/__tests__/spec-symbol-batch4.test.ts:
reference identity for CONTEXT_TOKENS (a copy passes toEqual, only toBe fails),
mutual assignability for the five derived types, spec-delegation parity for the
bucket table across all seven managedBy values plus the #2614 override forms,
and absence-from-spec tripwires for all seven new names.

The tripwire block also pins SchemaValidationResult / SchemaValidationReport as
STILL spec-owned — they were the first choices for the validator pair and both
turned out to be spec exports, so the next person to reach for the obvious name
sees why it was not used.

@object-ui/core drops out of the ledger entirely: 77 → 64 entries, 18 → 17
packages. Guard green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015Jdef6ZFhJmiNRhNCd4DW3
Test files are not covered by `turbo type-check` (78/78 was green while these
were still stale), so the renames surfaced only in the test run:
PluginSystem.test.ts (PluginDefinition) and managedBy.test.ts
(resolveCrudAffordances). Worth recording as a method note — a green
type-check does NOT mean the rename is complete.

The plugin-charts comments naming `ChartSeries.type` / `.stack` are left
untouched: those refer to the SPEC's ChartSeries, not the renamed core type.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015Jdef6ZFhJmiNRhNCd4DW3
@vercel

vercel Bot commented Aug 2, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
objectui Ignored Ignored Aug 2, 2026 9:23am

Request Review

@github-actions

github-actions Bot commented Aug 2, 2026

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Main entry (gzip) 28.1 KB 350 KB
Entry file index-9pJbBEtG.js
Status PASS

📦 Bundle Size Report

Package Size Gzipped
app-shell (index.js) 8.47KB 3.09KB
app-shell (runtime-config.js) 7.42KB 2.32KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 7.57KB 2.97KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 1.17KB 0.53KB
auth (AuthProvider.js) 22.10KB 4.37KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.12KB 3.41KB
auth (LoginForm.js) 17.86KB 5.29KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.43KB 2.09KB
auth (SocialSignInButtons.js) 9.60KB 3.89KB
auth (UserMenu.js) 3.40KB 1.22KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 35.76KB 9.11KB
auth (createAuthenticatedFetch.js) 4.37KB 1.69KB
auth (index.js) 2.35KB 1.07KB
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) 4.91KB 0.87KB
auth (useIsWorkspaceAdmin.js) 1.61KB 0.85KB
collaboration (CommentThread.js) 18.38KB 4.49KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 3.65KB 1.42KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.25KB 0.53KB
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) 475.95KB 104.41KB
core (index.js) 2.25KB 0.80KB
create-plugin (index.js) 9.28KB 2.98KB
data-objectstack (index.js) 136.20KB 34.74KB
fields (index.js) 223.45KB 54.66KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (currency.js) 1.22KB 0.64KB
i18n (i18n.js) 4.32KB 1.77KB
i18n (index.js) 2.46KB 0.96KB
i18n (pickLocalized.js) 1.70KB 0.83KB
i18n (provider.js) 5.37KB 1.72KB
i18n (useObjectLabel.js) 26.14KB 6.07KB
i18n (useSafeTranslation.js) 3.26KB 1.44KB
layout (index.js) 38.47KB 10.67KB
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.74KB
mobile (index.js) 1.50KB 0.62KB
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.71KB 0.42KB
mobile (useResponsiveConfig.js) 1.36KB 0.63KB
mobile (useSpecGesture.js) 4.05KB 1.53KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 8.75KB 3.06KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 3.67KB 1.12KB
permissions (evaluator.js) 4.41KB 1.44KB
permissions (index.js) 0.91KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.52KB
permissions (usePermissions.js) 1.55KB 0.71KB
plugin-ai (index.js) 15.71KB 3.79KB
plugin-calendar (index.js) 44.90KB 12.35KB
plugin-charts (index.js) 60.53KB 17.12KB
plugin-chatbot (index.js) 180.09KB 42.72KB
plugin-dashboard (index.js) 111.87KB 28.82KB
plugin-designer (index.js) 210.51KB 42.50KB
plugin-detail (index.js) 224.52KB 54.98KB
plugin-editor (index.js) 2.46KB 1.10KB
plugin-form (index.js) 111.39KB 26.93KB
plugin-gantt (index.js) 162.26KB 39.53KB
plugin-grid (index.js) 184.69KB 48.92KB
plugin-kanban (index.js) 47.82KB 13.18KB
plugin-list (index.js) 104.88KB 25.32KB
plugin-map (index.js) 16.80KB 5.24KB
plugin-markdown (index.js) 13.65KB 4.67KB
plugin-report (index.js) 40.48KB 10.57KB
plugin-timeline (index.js) 25.76KB 7.32KB
plugin-tree (index.js) 8.34KB 2.82KB
plugin-view (index.js) 83.54KB 20.39KB
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.71KB 3.53KB
providers (index.js) 0.44KB 0.22KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.67KB 2.37KB
react (LazyPluginLoader.js) 3.77KB 1.33KB
react (SchemaRenderer.js) 19.28KB 6.38KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 1.02KB 0.55KB
sdui-parser (codegen.js) 4.09KB 1.74KB
sdui-parser (index.js) 4.47KB 2.03KB
sdui-parser (parse.js) 10.04KB 2.82KB
sdui-parser (types.js) 0.29KB 0.24KB
sdui-parser (validate.js) 4.69KB 1.48KB
types (ai.js) 0.20KB 0.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 0.99KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 0.20KB 0.18KB
types (crud.js) 0.20KB 0.18KB
types (data-display.js) 0.20KB 0.18KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.87KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-retry.js) 4.32KB 2.02KB
types (index.js) 2.46KB 1.21KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 0.20KB 0.18KB
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 (spec-report.js) 5.05KB 1.93KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 0.20KB 0.18KB
types (ui-action.js) 3.40KB 1.71KB
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

main moved under this branch: it bumped @objectstack/spec to 17.0.0-rc.1 and
added two ALLOW entries of its own (@object-ui/types:FieldNode,
@object-ui/app-shell:InboxNotification). Both preserved — the DEBT block was
REGENERATED with `--ledger` rather than hand-merged, per the burn-down rules,
so the ordering is canonical and no other package's entries were disturbed.

The spec bump matters more than a routine merge: every one of this batch's six
DERIVE verdicts was triaged against rc.0. The parity test re-checks mutual
assignability against whatever spec is installed, so rc.1 was validated, not
assumed — all 21 assertions still pass.

Guard: 8 declared dialects, 62 untriaged collisions in 17 packages.
turbo build --filter=@object-ui/core then type-check --force: 80/80.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015Jdef6ZFhJmiNRhNCd4DW3

Copy link
Copy Markdown
Contributor Author

Post-merge re-verification (spec 17.0.0-rc.1)

main moved under this branch while it was in review prep — it bumped @objectstack/spec from 17.0.0-rc.0 → 17.0.0-rc.1 (objectui#3178) and added two ALLOW entries of its own. Merged and re-verified end to end; the numbers in the description above were from the pre-merge run, so here are the current ones.

The spec bump was the part that actually needed re-checking. All six DERIVE verdicts in this batch were triaged against rc.0, and a derive is only correct as long as the spec's shape still matches. Because the parity test asserts mutual assignability against whatever spec is installed rather than against a transcribed shape, rc.1 was validated rather than assumed — all 21 assertions pass unchanged. That is the property the burn-down was supposed to buy, tested on its first real occasion.

before merge after merge
guard 6 dialects / 64 collisions / 17 pkgs 8 dialects / 62 collisions / 17 pkgs
type-check (--force, after rebuilding core's dist) 78/78 80/80
full suite 9689 passed, 0 failed 9787 passed, 0 failed (824 files)
batch-4 parity + tripwires 21/21 21/21

The two extra dialects and the two fewer collisions are main's (@object-ui/types:FieldNode, @object-ui/app-shell:InboxNotification). Per the burn-down rules the DEBT block was regenerated with --ledger rather than hand-merged, so both of main's ALLOW entries are intact, the ordering is canonical, and no other package's entries were touched — @object-ui/core is simply absent.

The 21 file-level errors are unchanged in count and remain pre-existing (see the note in the description; plugin-charts shows the identical shape on a detached origin/main).


Generated by Claude Code

@github-actions

github-actions Bot commented Aug 2, 2026

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Main entry (gzip) 28.1 KB 350 KB
Entry file index-BwZ_tLfX.js
Status PASS

📦 Bundle Size Report

Package Size Gzipped
app-shell (index.js) 8.47KB 3.09KB
app-shell (runtime-config.js) 7.42KB 2.32KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 7.57KB 2.97KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 1.17KB 0.53KB
auth (AuthProvider.js) 22.10KB 4.37KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.12KB 3.41KB
auth (LoginForm.js) 17.86KB 5.29KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.43KB 2.09KB
auth (SocialSignInButtons.js) 9.60KB 3.89KB
auth (UserMenu.js) 3.40KB 1.22KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 35.76KB 9.11KB
auth (createAuthenticatedFetch.js) 4.37KB 1.69KB
auth (index.js) 2.35KB 1.07KB
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) 4.91KB 0.87KB
auth (useIsWorkspaceAdmin.js) 1.61KB 0.85KB
collaboration (CommentThread.js) 18.38KB 4.49KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 3.65KB 1.42KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.25KB 0.53KB
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) 475.95KB 104.41KB
core (index.js) 2.25KB 0.80KB
create-plugin (index.js) 9.28KB 2.98KB
data-objectstack (index.js) 136.20KB 34.74KB
fields (index.js) 223.45KB 54.66KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (currency.js) 1.22KB 0.64KB
i18n (i18n.js) 4.32KB 1.77KB
i18n (index.js) 2.46KB 0.96KB
i18n (pickLocalized.js) 1.70KB 0.83KB
i18n (provider.js) 5.37KB 1.72KB
i18n (useObjectLabel.js) 26.14KB 6.07KB
i18n (useSafeTranslation.js) 3.26KB 1.44KB
layout (index.js) 38.47KB 10.67KB
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.74KB
mobile (index.js) 1.50KB 0.62KB
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.71KB 0.42KB
mobile (useResponsiveConfig.js) 1.36KB 0.63KB
mobile (useSpecGesture.js) 4.05KB 1.53KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 8.75KB 3.06KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 3.67KB 1.12KB
permissions (evaluator.js) 4.41KB 1.44KB
permissions (index.js) 0.91KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.52KB
permissions (usePermissions.js) 1.55KB 0.71KB
plugin-ai (index.js) 15.71KB 3.79KB
plugin-calendar (index.js) 44.90KB 12.35KB
plugin-charts (index.js) 60.53KB 17.12KB
plugin-chatbot (index.js) 180.09KB 42.72KB
plugin-dashboard (index.js) 111.87KB 28.82KB
plugin-designer (index.js) 210.51KB 42.50KB
plugin-detail (index.js) 224.52KB 54.98KB
plugin-editor (index.js) 2.46KB 1.10KB
plugin-form (index.js) 111.39KB 26.93KB
plugin-gantt (index.js) 162.26KB 39.53KB
plugin-grid (index.js) 184.69KB 48.92KB
plugin-kanban (index.js) 47.82KB 13.18KB
plugin-list (index.js) 104.88KB 25.32KB
plugin-map (index.js) 16.80KB 5.24KB
plugin-markdown (index.js) 13.65KB 4.67KB
plugin-report (index.js) 40.48KB 10.57KB
plugin-timeline (index.js) 25.76KB 7.32KB
plugin-tree (index.js) 8.34KB 2.82KB
plugin-view (index.js) 83.54KB 20.39KB
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.71KB 3.53KB
providers (index.js) 0.44KB 0.22KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.67KB 2.37KB
react (LazyPluginLoader.js) 3.77KB 1.33KB
react (SchemaRenderer.js) 19.28KB 6.38KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 1.02KB 0.55KB
sdui-parser (codegen.js) 4.09KB 1.74KB
sdui-parser (index.js) 4.47KB 2.03KB
sdui-parser (parse.js) 10.04KB 2.82KB
sdui-parser (types.js) 0.29KB 0.24KB
sdui-parser (validate.js) 4.69KB 1.48KB
types (ai.js) 0.20KB 0.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 0.99KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 0.20KB 0.18KB
types (crud.js) 0.20KB 0.18KB
types (data-display.js) 0.20KB 0.18KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.87KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-retry.js) 4.32KB 2.02KB
types (index.js) 2.46KB 1.21KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 0.20KB 0.18KB
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 (spec-report.js) 5.05KB 1.93KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 0.20KB 0.18KB
types (ui-action.js) 3.40KB 1.71KB
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

@os-zhuang
os-zhuang marked this pull request as ready for review August 2, 2026 10:35
@os-zhuang
os-zhuang added this pull request to the merge queue Aug 2, 2026
Merged via the queue into main with commit 335041c Aug 2, 2026
16 checks passed
@os-zhuang
os-zhuang deleted the claude/objectui-spec-symbol-ci-rule-4r3xlc-batch4 branch August 2, 2026 10:35
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