Skip to content

test(types): drop eight unused schema imports from phase2-schemas.test.ts - #6013

Merged
yinlianghui merged 1 commit into
mainfrom
claude/issue-5824-phase2-unused-schema-imports
Aug 24, 2026
Merged

test(types): drop eight unused schema imports from phase2-schemas.test.ts#6013
yinlianghui merged 1 commit into
mainfrom
claude/issue-5824-phase2-unused-schema-imports

Conversation

@yinlianghui

Copy link
Copy Markdown
Collaborator

Fixes#5824

packages/types/src/__tests__/phase2-schemas.test.ts imported eight schema names from ../zod/index.zod that no test in the file uses. Each one mildly overstated the suite's pin coverage: an import-based coverage census saw them imported by the acceptance suite and could conclude they were pinned, when nothing asserts against them. Per the triage ruling the imports are dropped, not backfilled with new assertions — authoring coverage for schemas nobody asked this file to cover would turn an S card unbounded.

Verified at 81377502c.

The card's list of 10 was stale — re-derived, name by name

The card measured 10 names at ad404e057. Two of them no longer exist in the import block, so the real count is 8:

Card's nameStatus on main (11d3ab999)
AppActionSchemapresent, unused → dropped
AppMenuItemSchemapresent, unused → dropped
ThemePreviewSchemaalready gone — retired by #5823. Its only remaining occurrence in the file is a prose mention inside a comment at line 118, not an identifier
ReportViewerSchemapresent, unused → dropped
BlockEditorSchemapresent, unused → dropped
BlockInstanceSchemapresent, unused → dropped
ActionExecutionModeSchemapresent, unused → dropped
ActionCallbackSchemapresent, unused → dropped
ActionConditionSchemaalready gone#5981 retired the ActionCondition branch shape and replaced the export with a module-local predicate schema. Zero occurrences in the file
CRUDSchemapresent, unused → dropped

Delta against the card: 10 minus ThemePreviewSchema minus ActionConditionSchema = 8 dropped. The PM's assumption about #5981 held.

Measurement, not eyeballing

Instrument: @typescript-eslint/no-unused-vars (warning level in this repo), count read from --format json.

On the merge-base the file reported 8 warnings, 0 errors — and the eight names eslint flagged are exactly the eight above. Because typescript-eslint's no-unused-vars counts type-position usage as usage, a flagged name is unused as a value and as a type; none of the eight was load-bearing as a type-only import.

Counter-probe, both directions:

  • Each dropped name occurred exactly once in the whole file — the import line itself.
  • Positive control on the same grep: every kept name hits more than once (AppComponentSchema 7, ReportBuilderSchema 3, BlockLibrarySchema 3, ActionSchema 13, ListViewSchema 13, AnyComponentSchema 9, CrudActionSchema 2, …), so the zero-hit result is a real measurement and not a broken pattern.
  • After the edit, the file reports 0 warnings — a fall of exactly 8, no more and no less. A larger fall would have meant something in use went with them.
  • Package-wide, @object-ui/types moves 252 to 244 warnings across 115 files, 0 errors both ways — the whole package delta is this file's own 8, so no other file's verdict moved. The 244 remaining are pre-existing and out of scope for this card.

Reverse-verification

Direction predicted before running: re-adding one dropped name should raise the file's warning count from 0 to exactly 1 and name that name.

Observed: re-adding CRUDSchema produced exactly 1 warning, 'CRUDSchema' is defined but never used. The mutation was proven on disk in both directions rather than trusted to an editor's exit code — grep for the injected line returned 1, grep confirmed the anchor line was not clobbered, and grep confirmed no other dropped name had reappeared. Restoration ran under trap … EXIT INT TERM; afterwards git diff HEAD --stat was empty and git status --porcelain silent, so the tree is byte-identical to HEAD.

The same trap discipline covered the package-level base measurement, which mutates the file back to its merge-base content.

Gates

GateResult
pnpm --filter @object-ui/types type-checkTYPECHECK_EXIT=0 (tsc --noEmit + tsconfig.examples.json + tsconfig.test.json)
root-form vitest over packages/types/src/__tests__VITEST_EXIT=0 — Test Files 54 passed (54), Tests 591 passed (591)
the changed file alone under vitestVITEST_PHASE2_EXIT=0 — Tests 34 passed (34)
eslint on the changed file8 warnings to 0 warnings, 0 errors
node scripts/check-changeset-presence.mjsexit 0
node scripts/check-changeset-no-major.mjsexit 0 — "No changeset declares a major bump"

No test verdict moved: the diff touches zero it(, describe( or expect( lines — it is eight deleted import lines and nothing else.

Changeset

Measured rather than assumed. check-changeset-presence.mjs failed on the bare edit, because the file sits under the src/ of a released package. This is test-only and publishes nothing, so it carries the repo's first-class empty-frontmatter declaration (AGENTS.md line 161) rather than a version bump. objectui has no skip-changeset label and none was created.

Noted, deliberately not acted on

The ruling says to name a suspicious omission rather than write the assertion, so, for the record: ReportViewerSchema sits beside a describe block that pins ReportComponentSchema and ReportBuilderSchema, and BlockEditorSchema / BlockInstanceSchema sit beside one that pins BlockSchema and BlockLibrarySchema — sibling families where some members are pinned and these are not. CRUDSchema has no describe block anywhere in the file. AppActionSchema and AppMenuItemSchema are the weakest candidates: the AppComponentSchema fixture exercises both shapes transitively through its menu and actions arrays, so they are covered in substance already. Whether any of that is a genuine coverage gap worth its own card is a triage call, not this card's.


Generated by Claude Code

…t.ts
The suite imported AppActionSchema, AppMenuItemSchema, ReportViewerSchema,
BlockEditorSchema, BlockInstanceSchema, ActionExecutionModeSchema,
ActionCallbackSchema and CRUDSchema without asserting against any of them, so
an import-based coverage census read them as pinned by this file when nothing
here exercises them. Each dropped name occurred exactly once in the file (the
import line itself); eslint's @typescript-eslint/no-unused-vars count on the
file falls 8 -> 0. No assertions added and no test verdict moves.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CSoz9uGhaaSgiq3hshtN7L
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Eager closure (gzip, 52 chunks)3232.9 KB3990.2 KB
Main entry chunk (gzip)153.6 KB350 KB
Entry fileindex-8RqDMlaT.js
StatusPASS

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

PackageSizeGzipped
app-shell (consoleActionDispatch.js)0.20KB0.19KB
app-shell (index.js)10.38KB3.90KB
app-shell (runtime-config.js)18.10KB6.51KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)10.06KB3.86KB
auth (ActiveOrganizationStorage.js)25.05KB9.16KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)2.07KB1.00KB
auth (AuthProvider.js)40.18KB10.59KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)12.21KB3.45KB
auth (LoginForm.js)18.15KB5.39KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.65KB2.22KB
auth (SocialSignInButtons.js)9.61KB3.89KB
auth (UserMenu.js)3.41KB1.23KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)40.21KB10.80KB
auth (createAuthenticatedFetch.js)8.46KB3.43KB
auth (index.js)3.19KB1.44KB
auth (invitation-status.js)1.22KB0.70KB
auth (org-roles.js)6.66KB2.78KB
auth (phone-identifier.js)1.11KB0.66KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)5.30KB1.02KB
auth (useWorkspaceAdminStatus.js)5.13KB2.35KB
collaboration (CommentThread.js)26.08KB7.56KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)6.49KB2.64KB
collaboration (PresenceProvider.js)2.79KB1.13KB
collaboration (index.js)1.68KB0.73KB
collaboration (useCollaborationTranslation.js)6.05KB2.52KB
collaboration (useCommentSearch.js)1.98KB0.88KB
collaboration (useConflictResolution.js)7.75KB1.86KB
collaboration (useMentionNotifications.js)1.81KB0.68KB
collaboration (usePresence.js)6.33KB1.84KB
collaboration (useRealtimeSubscription.js)7.91KB2.01KB
components (index.js)504.91KB114.42KB
core (index.js)4.92KB1.97KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)165.30KB45.79KB
fields (index.js)238.40KB59.89KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (i18n.js)4.28KB1.75KB
i18n (index.js)3.44KB1.39KB
i18n (pickLocalized.js)7.62KB3.26KB
i18n (provider.js)23.13KB7.63KB
i18n (useDisplayLocale.js)2.85KB1.45KB
i18n (useObjectLabel.js)33.40KB8.71KB
i18n (useSafeTranslation.js)7.77KB3.13KB
layout (index.js)38.95KB10.97KB
mobile (MobileProvider.js)0.92KB0.49KB
mobile (ResponsiveContainer.js)0.94KB0.38KB
mobile (breakpoints.js)1.51KB0.70KB
mobile (createOfflineDataSource.js)5.61KB1.75KB
mobile (index.js)1.55KB0.62KB
mobile (offlineQueue.js)3.91KB1.35KB
mobile (pwa.js)0.97KB0.49KB
mobile (serviceWorker.js)1.48KB0.62KB
mobile (serviceWorkerSource.js)3.41KB1.48KB
mobile (useBreakpoint.js)1.54KB0.65KB
mobile (useGesture.js)6.96KB1.98KB
mobile (useOfflineSync.js)1.99KB0.72KB
mobile (usePullToRefresh.js)2.53KB0.85KB
mobile (useResponsive.js)0.72KB0.42KB
mobile (useResponsiveConfig.js)1.37KB0.63KB
mobile (useSpecGesture.js)4.32KB1.64KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)9.53KB3.38KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)4.64KB1.50KB
permissions (evaluator.js)5.12KB1.74KB
permissions (index.js)0.93KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.53KB
permissions (usePermissions.js)1.93KB0.88KB
plugin-ai (index.js)15.75KB3.80KB
plugin-calendar (index.js)46.62KB12.83KB
plugin-charts (index.js)64.66KB18.32KB
plugin-chatbot (index.js)188.21KB44.67KB
plugin-dashboard (index.js)133.35KB34.44KB
plugin-designer (index.js)212.30KB42.80KB
plugin-detail (index.js)244.14KB61.88KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)125.63KB30.64KB
plugin-gantt (index.js)164.15KB39.88KB
plugin-grid (index.js)200.79KB54.26KB
plugin-kanban (index.js)52.93KB14.60KB
plugin-list (index.js)111.86KB27.22KB
plugin-map (index.js)20.10KB6.64KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)43.49KB11.93KB
plugin-timeline (index.js)26.49KB7.59KB
plugin-tree (index.js)8.50KB2.88KB
plugin-view (index.js)84.57KB20.74KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.90KB0.85KB
providers (UploadProvider.js)11.66KB3.50KB
providers (index.js)0.45KB0.23KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)5.62KB2.34KB
react (LazyPluginLoader.js)4.47KB1.63KB
react (SchemaRenderer.js)52.40KB17.45KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)1.35KB0.70KB
react (schema-input.js)2.32KB1.24KB
react (spec-input.js)0.20KB0.18KB
sdui-parser (codegen.js)5.41KB2.34KB
sdui-parser (dashboard-widget-options.js)3.08KB1.30KB
sdui-parser (index.js)4.93KB2.24KB
sdui-parser (input-type.js)2.84KB1.40KB
sdui-parser (parse.js)12.13KB3.65KB
sdui-parser (provenance.js)3.66KB1.82KB
sdui-parser (types.js)0.28KB0.23KB
sdui-parser (validate.js)7.54KB2.63KB
types (ai.js)0.20KB0.17KB
types (api-types.js)0.20KB0.18KB
types (app.js)2.87KB0.99KB
types (base.js)0.20KB0.18KB
types (blocks.js)0.20KB0.18KB
types (complex.js)2.74KB1.41KB
types (crud.js)0.20KB0.18KB
types (dashboard-filter-alias.js)6.23KB2.74KB
types (data-display.js)0.20KB0.18KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)1.87KB0.85KB
types (disclosure.js)0.20KB0.18KB
types (error-code.js)1.54KB0.88KB
types (feedback.js)0.20KB0.18KB
types (field-types.js)0.20KB0.18KB
types (form.js)0.20KB0.18KB
types (http-inflight.js)8.87KB3.73KB
types (http-retry.js)4.32KB2.02KB
types (index.js)4.13KB1.96KB
types (layout.js)0.20KB0.18KB
types (managed-by.js)0.19KB0.18KB
types (mobile.js)2.59KB1.31KB
types (navigation.js)0.20KB0.18KB
types (objectql.js)0.20KB0.18KB
types (overlay.js)0.20KB0.18KB
types (permissions.js)0.20KB0.18KB
types (plugin-scope.js)0.20KB0.18KB
types (record-components.js)0.20KB0.19KB
types (record-semantics.js)1.28KB0.67KB
types (registry.js)0.20KB0.18KB
types (reports.js)0.20KB0.18KB
types (spec-report.js)5.05KB1.93KB
types (spec-ui-namespace.js)0.20KB0.19KB
types (system-fields.js)3.33KB1.54KB
types (theme.js)6.28KB2.87KB
types (ui-action.js)3.40KB1.71KB
types (views.js)0.20KB0.18KB
types (widget.js)0.20KB0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

@yinlianghui
yinlianghui marked this pull request as ready for review August 24, 2026 13:09
@yinlianghui
yinlianghui added this pull request to the merge queueAug 24, 2026
Merged via the queue into main with commit 03af7cfAug 24, 2026
23 checks passed
@yinlianghui
yinlianghui deleted the claude/issue-5824-phase2-unused-schema-imports branch August 24, 2026 13:21
Sign up for freeto 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.

finding: phase2-schemas.test.ts imports 9 schemas no test uses — unused-import warnings overstate the file's pin coverage

2 participants

@yinlianghui@claude