Skip to content

refactor(types): burn down seven spec-symbol ledger entries, with the triage that decides the rest - #3042

Merged
os-zhuang merged 2 commits into
mainfrom
claude/zero-error-packages-ci-cleanup-1mgyew
Jul 30, 2026
Merged

refactor(types): burn down seven spec-symbol ledger entries, with the triage that decides the rest#3042
os-zhuang merged 2 commits into
mainfrom
claude/zero-error-packages-ci-cleanup-1mgyew

Conversation

@os-zhuang

@os-zhuang os-zhuang commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

objectstack#4115's ledger opened at 156 untriaged collisions. This is the first tranche: 149 remain.

The interesting part is not the seven. It is that the obvious way to pick them is wrong, in three distinct ways, all of which occur in this repo — so the durable output here is the triage, written into the ledger's burn-down instructions.


Why "are these two types the same?" is the wrong question

The natural test for "is this collision a safe re-export" is mutual assignability:

type A = [Local] extends [Spec] ? true : false
type B = [Spec] extends [Local] ? true : false   // A && B → "identical"

Run over @object-ui/types' 80 collisions, that reports 13 identical. Six of the thirteen are wrong, and acting on any of them would have made the codebase worse:

1. The spec's export resolves to anyNavigationItem, JoinNode, FormField. The spec annotates the recursive schemas behind them as z.ZodType<any>. any answers every extends question affirmatively, so the probe calls them identical and recommends binding to the spec — which would replace a precise, 118-line documented interface with any. A type-safety regression wearing a burn-down's clothes.

I had already converted NavigationItem and JoinNode before catching this, and reverted them. They stay in the ledger; the fix belongs upstream in the spec.

2. The local declaration resolves to anyFilterConditionSchema, NavigationItemSchema, both annotated z.ZodType<any> because they are recursive. Same mechanism, other side.

3. The local declaration carries [key: string]: anyFormField, AppSchema, PageSchema, ThemeSchema, and 12 more. This is the objectstack#4075 mechanism showing up in a new place: an index signature absorbs any extra member, so two types compare equal while accepting wildly different objects. Local FormField has one; the spec's does not.

And a zod schema needs one question more than a type does. FormFieldSchema has an identical _output and a divergent _input — the two schemas agree on what they produce and disagree on what they accept. Re-exporting it would have silently changed what authoring input parses, with no type error anywhere.

Detection probes for all four cases are now in the ledger comment, so the next tranche starts from the answer rather than rediscovering it.

The seven

Each was proved equivalent, not assumed equivalent because its doc comment said so — and four carried exactly such a comment: "Mirrors the server's ImportWriteMode (@objectstack/spec)", "(ObjectStack Spec v2.0.1)". That is the claim objectstack#4115 exists to make true.

symbol from form
BreakpointName spec/ui re-export
ExportJobStatus, ImportJobStatus, ImportWriteMode spec/api re-export
ValidationError spec/kernel re-export
JoinStrategy, WindowFunction spec/data z.infer — the spec exports these as zod enums, not types, so a re-export does not compile

All structurally unchanged, so no consumer changes.

The classification the rest of the burn-down starts from

For @object-ui/types' 80 collisions, after excluding the artifacts:

verdict n meaning
IDENTICAL 7 this PR
LOCAL⊂SPEC 4 binding widens — consumers with exhaustive maps break, which is where the real bugs are
LOCAL⊃SPEC 14 binding narrows — authoring sites may break
DIVERGED 33 a real fork, or a same-name-different-concept dialect
LOCAL-INDEX 16 unjudgeable until the index signature goes (objectstack#4075)
SPEC-ANY / LOCAL-ANY 6 unjudgeable; SPEC-ANY is not fixable here at all

The LOCAL⊂SPEC four are worth naming, because that bucket is where drift has already cost something. FeedItemType carries 7 of the spec's 13 members, and plugin-detail's RecordActivityTimeline builds two exhaustive Record<FeedItemType, …> maps from it — so the activity timeline is structurally unable to render file, sharing, note, record_create, record_delete or approval. PermissionAction is missing execute, manage, configure.

Three of the DIVERGED are not forks at all but genuine same-name-different-concept collisions, and belong in ALLOW rather than being "fixed": CacheStrategy (objectui: HTTP/SW fetch strategy; spec: cache eviction policy), FilterOperator (objectui: verbose snake_case UI operators; spec: mongo-style query operators), GestureType (objectui: kebab-case with directional swipes; spec: snake_case with a single swipe plus drag).

Inverted pin

spec-derived-unions.test.ts asserts the three spec-side any cases are still any. The day the spec types any of them properly, true satisfies IsAny<…> stops compiling and the failure is the instruction to re-run the triage and burn that symbol down. Same shape as the ActionDef index-signature pin from #3032.

Guard fix

referencesSpec walked the declaration's own name node, so a symbol whose name was also bound to a spec import counted as derived from itself. TypeScript rejects that particular pair as a duplicate identifier, so it was unreachable in compiling code — but a guard that depends on the compiler having run first is a guard with a hole in it. Found by writing the discrimination proof and watching it pass. The clean-tree result is unchanged (149 before and after), confirming it was masking nothing.

Discrimination proof — three ways this fails

1. Re-fork BreakpointName alongside the spec import (the hole just closed — passed before the fix):

❌  a spec-named symbol is hand-written, not derived:
    • @object-ui/types declares 1 spec-named symbol the spec already owns:
        type `BreakpointName`  packages/types/src/mobile.ts:32  (exported by `@objectstack/spec/ui`)

2. The realistic regression — revert the binding entirely:

        type `BreakpointName`  packages/types/src/mobile.ts:30  (exported by `@objectstack/spec/ui`)

3. The inverted pin, simulating the spec gaining a real type:

src/__tests__/spec-derived-unions.test.ts(167,44): error TS1360: Type 'true' does not satisfy the expected type 'false'.

Verification

  • pnpm type-check76/76 tasks successful (5m43s)
  • packages/types tests — 106 passed (14 files)
  • node scripts/check-spec-symbol-derivation.mjs — green, 156 → 149
  • node scripts/check-type-check-coverage.mjs — green, both halves
  • node scripts/check-changeset-fixed.mjs — green
  • eslint on all changed files — 0 errors (72 pre-existing no-explicit-any warnings in data.ts, none on touched lines)

Changeset: @object-ui/types patch — the seven are structurally unchanged, so no consumer sees a different type.

Scope note: objectstack#4115 is filed on objectstack-ai/objectstack; every change here is in objectui.

🤖 Generated with Claude Code

… triage that decides the rest

objectstack#4115's ledger opened at 156 untriaged collisions. This is the first
tranche: 149 remain. Every symbol removed was proved equivalent to the spec's
before being bound, not assumed equivalent because its doc comment said so —
four of the seven carried exactly such a comment.

Re-exported: BreakpointName, ExportJobStatus, ImportJobStatus, ImportWriteMode,
ValidationError. Derived with z.infer: JoinStrategy, WindowFunction, which the
spec exports as zod enums rather than as types. All seven are structurally
unchanged; full repo type-check passes 76/76.

Mutual assignability is the obvious test for "safe re-export" and it lies three
ways, all present in this repo:

  - The SPEC's export resolves to `any` (NavigationItem, JoinNode, FormField).
    Binding these replaces a precise local interface with `any`. A naive probe
    calls them identical and recommends exactly the wrong edit.
  - The LOCAL declaration resolves to `any` — recursive schemas annotated
    z.ZodType<any> (FilterConditionSchema, NavigationItemSchema).
  - The local declaration carries `[key: string]: any` — the objectstack#4075
    mechanism (FormField, AppSchema, PageSchema, ThemeSchema, +12).

And a zod schema needs one question more than a type: FormFieldSchema has an
identical _output and a divergent _input, so re-exporting it would have silently
changed what authoring input parses. All of this is now in the ledger's
burn-down instructions with the detection probe for each case.

spec-derived-unions.test.ts gains an inverted pin asserting the three spec-side
`any` cases are STILL `any`. The day the spec types one properly the assertion
stops compiling, and the failure is the instruction to burn that symbol down.

Guard fix: referencesSpec walked the declaration's own name node, so a symbol
whose name was also bound to a spec import counted as derived from itself.
TypeScript rejects that pair as a duplicate identifier so it was unreachable in
compiling code, but a guard that depends on the compiler having run first has a
hole in it. Clean-tree result unchanged, confirming it masked nothing.

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

vercel Bot commented Jul 30, 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 Jul 30, 2026 1:45pm

Request Review

@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

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

📦 Bundle Size Report

Package Size Gzipped
app-shell (index.js) 8.20KB 2.97KB
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) 457.97KB 100.09KB
core (index.js) 2.16KB 0.78KB
create-plugin (index.js) 9.28KB 2.98KB
data-objectstack (index.js) 134.67KB 34.24KB
fields (index.js) 222.07KB 54.35KB
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) 25.17KB 5.80KB
i18n (useSafeTranslation.js) 3.26KB 1.44KB
layout (index.js) 38.45KB 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) 6.84KB 2.42KB
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.52KB 17.11KB
plugin-chatbot (index.js) 180.09KB 42.72KB
plugin-dashboard (index.js) 111.59KB 28.74KB
plugin-designer (index.js) 210.73KB 42.59KB
plugin-detail (index.js) 221.50KB 54.15KB
plugin-editor (index.js) 2.46KB 1.10KB
plugin-form (index.js) 106.35KB 25.82KB
plugin-gantt (index.js) 162.26KB 39.53KB
plugin-grid (index.js) 183.96KB 48.23KB
plugin-kanban (index.js) 47.82KB 13.18KB
plugin-list (index.js) 102.39KB 24.18KB
plugin-map (index.js) 16.80KB 5.24KB
plugin-markdown (index.js) 13.65KB 4.67KB
plugin-report (index.js) 40.32KB 10.53KB
plugin-timeline (index.js) 25.75KB 7.32KB
plugin-tree (index.js) 8.36KB 2.81KB
plugin-view (index.js) 85.91KB 20.99KB
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) 3.47KB 1.54KB
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) 0.77KB 0.41KB
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 (index.js) 2.00KB 0.96KB
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.04KB 1.93KB
types (system-fields.js) 2.39KB 1.17KB
types (theme.js) 0.20KB 0.18KB
types (ui-action.js) 1.08KB 0.64KB
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

The three symbols the ledger cannot burn down — NavigationItem, JoinNode,
FormField — are blocked on the spec exporting them as `any`. Filed as
objectstack#4171 (4 of the spec's 2240 exported types), so the inverted pin and
the burn-down instructions name where the fix lives instead of just saying
"upstream".

Comments only; no behaviour change.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rvv6qysks2dRLaGfpTdgEy
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

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

📦 Bundle Size Report

Package Size Gzipped
app-shell (index.js) 8.20KB 2.97KB
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) 457.97KB 100.09KB
core (index.js) 2.16KB 0.78KB
create-plugin (index.js) 9.28KB 2.98KB
data-objectstack (index.js) 134.67KB 34.24KB
fields (index.js) 222.07KB 54.35KB
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) 25.17KB 5.80KB
i18n (useSafeTranslation.js) 3.26KB 1.44KB
layout (index.js) 38.45KB 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) 6.84KB 2.42KB
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.52KB 17.11KB
plugin-chatbot (index.js) 180.09KB 42.72KB
plugin-dashboard (index.js) 111.59KB 28.74KB
plugin-designer (index.js) 210.51KB 42.50KB
plugin-detail (index.js) 221.42KB 54.12KB
plugin-editor (index.js) 2.46KB 1.10KB
plugin-form (index.js) 106.54KB 25.88KB
plugin-gantt (index.js) 162.26KB 39.53KB
plugin-grid (index.js) 184.01KB 48.28KB
plugin-kanban (index.js) 47.82KB 13.18KB
plugin-list (index.js) 102.39KB 24.18KB
plugin-map (index.js) 16.80KB 5.24KB
plugin-markdown (index.js) 13.65KB 4.67KB
plugin-report (index.js) 40.32KB 10.53KB
plugin-timeline (index.js) 25.75KB 7.32KB
plugin-tree (index.js) 8.36KB 2.81KB
plugin-view (index.js) 85.95KB 21.02KB
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) 3.47KB 1.54KB
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 (index.js) 2.07KB 0.99KB
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.04KB 1.93KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 0.20KB 0.18KB
types (ui-action.js) 1.08KB 0.64KB
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 July 30, 2026 13:52
@os-zhuang
os-zhuang merged commit 3a6cf24 into main Jul 30, 2026
16 checks passed
@os-zhuang
os-zhuang deleted the claude/zero-error-packages-ci-cleanup-1mgyew branch July 30, 2026 13:52
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