Skip to content

chore(app-shell): delete the dead object-fields-bridge module - #6414

Merged
os-support-ai merged 1 commit into
mainfrom
claude/issue-6309-delete-object-fields-bridge
Aug 25, 2026
Merged

chore(app-shell): delete the dead object-fields-bridge module#6414
os-support-ai merged 1 commit into
mainfrom
claude/issue-6309-delete-object-fields-bridge

Conversation

@claude

@claudeclaudeBot commented Aug 25, 2026

Copy link
Copy Markdown
Contributor

Fixes#6309

Deletes packages/app-shell/src/views/metadata-admin/previews/object-fields-bridge.ts (bridgeFromDraft, commitToDraft, FieldsBridgeResult) and the three prose references that still described it as wired, per the triage ruling and the #6224 precedent.

Reference surface, re-measured on the merged base

Triage's review-side instruction — "dead-code deletions get the reference-surface re-verified on the merged base — rerun the grep with its control before flipping anything" — landed on this branch first. The filing measured origin/main @ 7ccb53a; this branch is cut from 062943f86, 53 commits later, so the reading was re-taken rather than inherited.

Same command shape for subject and control, over packages/ apps/ examples/ scripts/, --include=*.ts --include=*.tsx --include=*.mjs --include=*.json, excluding dist/, node_modules/ and the module's own file:

readingpatternbefore (062943f86)after (21ea083b0)
subjectbridgeFromDraft|commitToDraft|FieldsBridgeResult|object-fields-bridge4 hits / 3 files — all prose in comments, 0 imports, 0 calls0 hits / 0 files
control — live sibling object-fields-ioreadFields|writeFields|FieldsView|object-fields-io109 hits / 29 files, 23 of them a real from '…object-fields-io…' import109 hits / 29 files (untouched)

The control is the load-bearing half: a zero-hit grep with no control is equally consistent with a broken pattern. The instrument finds consumers when they exist — it found 109 for the sibling in the same directory with the same shape — and it found none here. The four subject hits before the change were, verbatim:

packages/types/src/designer.ts:715: * `object-fields-bridge` derives its editable-subset check from it instead of
packages/types/src/__tests__/designer-field-types.test.ts:14: * and app-shell's `object-fields-bridge` builds its editable-subset check
packages/types/src/__tests__/designer-field-types.test.ts:39: // (FIELD_TYPE_META + FIELD_TYPE_CATEGORIES), the object-fields-bridge
packages/fields/src/__tests__/richtext-cell-renderer-5452.test.tsx:15: * bridge already assumes (`object-fields-bridge.ts` maps `richtext` to the

A wider sweep — whole repo, every file type, no --include filter — returned the same four plus one historical mention in .changeset/6043-retire-designer-formula-control.md. That one is deliberately left alone: it is a past-tense record of what #6043 did to a file that existed then, not a claim that the bridge is wired. Editing another card's changeset is out of scope.

Two further reachability facts, both checked rather than assumed:

  • @object-ui/app-shell's exports map declares only . and ./styles.css, so the module was never addressable as a deep import from outside the workspace either.
  • After a full workspace build on this branch, packages/app-shell/dist contains 0object-fields-bridge* artifacts and still 2object-fields-io* artifacts — the deletion propagates, the live sibling is untouched.

Why the prose had to go with it

This is the reason the finding was a card and not a silent delete. The three comments gave a future reader in-repo pointers claiming the bridge mediates between the framework field record and FieldDesigner. Deleting the module and leaving them would have swapped dead code for false documentation — worse than either alone. Each was handled on its own merits:

  • types/src/designer.ts and typesdesigner-field-types.test.ts (header) named the bridge as the consumer that derives an editable-subset check from DESIGNER_FIELD_TYPES "instead of restating the list (objectui#3017)". That convention is alive and has a live exemplar: packages/plugin-designer/src/MetadataFieldsPage.tsx:97 does new Set(DESIGNER_FIELD_TYPES) under the same objectui#3017 anchor comment, and MetadataFieldsPage is exported from plugin-designer/src/index.tsx with five dedicated test files. Both comments are repointed at it, so the teaching survives with a true pointer.
  • designer-field-types.test.ts (body) told an editor changing the vocabulary to re-check "the object-fields-bridge round-trip". With the bridge gone that instruction has no referent, so the clause is dropped; the rest of the instruction (presentation + re-pin the inventory) is unchanged.
  • fieldsrichtext-cell-renderer-5452.test.tsx cited the bridge's richtexthtml mapping as the third of three corroborations that richtext stores HTML. The other two — the showcase seed and the field-type decision tree — are live and carry the argument on their own, so that clause is dropped rather than repointed: inventing a substitute claim about a module I had not verified would be the same defect one level up.

⛔ No new assertion, deliberately

The ghost-assertion guard does not apply in its usual form here, and no assertion was fabricated to satisfy it. There is no new behaviour to pin: the change removes a module nothing called and rewrites four comments. An assertion invented for the ritual would pin nothing and would read to a future maintainer as though something were guarded. What replaces it is the before/after reference-surface reading with its positive control, quoted above, plus the requirement that nothing else moves — a zero-importer claim is true exactly when the suites stay green without a single test edit. No test was adjusted to make the deletion fit; the only test-file edits in this diff are inside comment blocks.

Verification

All heavy legs ran serialized through the shared verify lock. The tree at 21ea083b0 is byte-identical to the tree they measured (git status --porcelain empty, git diff HEAD empty), and the gate union below was re-run at21ea083b0.

legcommandresult
build (dep closure + type-check)turbo run type-check --filter=@object-ui/app-shell --filter=@object-ui/types --filter=@object-ui/fields --concurrency=2Tasks: 32 successful, 32 total · VERDICT command-exit 0
full workspace buildturbo run build --filter=!@object-ui/site --concurrency=2Tasks: 43 successful, 43 total · VERDICT command-exit 0
tests · types + fieldspnpm exec vitest run packages/types/ packages/fields/Test Files 175 passed (175) · Tests 2562 passed (2562)
tests · app-shell 1/3pnpm exec vitest run packages/app-shell/ --shard=1/3Test Files 178 passed (178) · `Tests 1682 passed
tests · app-shell 2/3pnpm exec vitest run packages/app-shell/ --shard=2/3Test Files 178 passed (178) · Tests 1499 passed (1499)
tests · app-shell 3/3pnpm exec vitest run packages/app-shell/ --shard=3/3Test Files 178 passed (178) · Tests 1954 passed (1954)
lintturbo run lint --filter=@object-ui/app-shell --filter=@object-ui/types --filter=@object-ui/fieldsTasks: 4 successful, 4 total · 0 errors (2680 pre-existing warnings, none in the diff)

709 test files, 7697 tests passed, 1 skipped, 0 failed — with no test edited to accommodate the deletion, which is the evidence the zero-importer claim is true.

Test invocation follows AGENTS.md: from the repo root, paths relative to the repo root, never behind --, never pnpm --filter <pkg> test — the two shapes scripts/vitest-invocation-guard.mjs rejects. App-shell's 534 files are sharded only to stay under the container's foreground cap; the three shards cover the package with nothing excluded.

Coverage caveat, stated rather than glossed: a green type-check says nothing about test files unless they are in its file set. Both edited test files were confirmed present — tsc -p packages/types/tsconfig.test.json --listFiles | grep -c designer-field-types.test.ts1, and the same for richtext-cell-renderer-5452.test.tsx in packages/fields/tsconfig.test.json1.

Gate union at 21ea083b0, each exit code captured before any pipe:

check:control-bytes exit=0 scanned 5302 tracked text file(s)
check:designer-field-key-parity exit=0 designer-field-key-parity: OK
check:readme-exports exit=0 0 unbuilt, 378/378 self-imports real
check:esm-specifiers exit=0
check:self-import exit=0
check:spec-symbols exit=0
type-check:coverage exit=0 41/41 packages compile their tests
lint:coverage exit=0 46/46 packages linted, 0 errors
changeset:check exit=0
check-changeset-presence exit=0 4 source files / 3 released packages, 1 changeset

check:readme-exports failed on the first attempt with 69 entries, all of the class type entry ./dist/index.d.ts is not on disk -- run pnpm build first, and 0 naming anything in this diff. That is a prerequisite failure, not a red gate — it is recorded here rather than quietly re-run, and it cleared to green after the full workspace build above.

Scope

object-fields-io, the live sibling, is untouched — its 109-hit control reading is identical before and after. Nothing else in previews/ was "improved". Changeset: patch for the three packages whose src/ changed (app-shell, types, fields); no user-visible behaviour changes, since nothing could reach the deleted module.

⛔ Draft on purpose — the PM lands this. Not self-merged, not marked ready.


Generated by Claude Code

`previews/object-fields-bridge.ts` exported `bridgeFromDraft`, `commitToDraft`
and `FieldsBridgeResult` and had zero importers. Re-measured on the merged base
rather than inherited from the filing: the same command shape that returns 109
hits across 29 files for the live sibling `object-fields-io` returned 4 hits for
this module, all of them prose in comments and none an import or a call.
Deleting the module alone would have swapped dead code for false documentation:
three comments cited the bridge as a live corroborating source. The two that
named it as the consumer deriving an editable-subset check from
`DESIGNER_FIELD_TYPES` now name `MetadataFieldsPage`, which does exactly that
with the same idiom and the same objectui#3017 anchor. The third cited the
bridge's `richtext` -> `html` mapping as one of three corroborations that
`richtext` stores HTML; the other two are live and carry the point alone, so
that clause is dropped rather than repointed.
No behaviour changes. `@object-ui/app-shell` exports only `.` and
`./styles.css`, so the module was not reachable as a deep import either.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011SfZeFWrhGLHmfq61xbz4q
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Eager closure (gzip, 52 chunks)3230.8 KB3266.6 KB
Main entry chunk (gzip)156.1 KB350 KB
Entry fileindex-50RJFVxV.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)11.30KB4.28KB
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)505.84KB114.57KB
core (index.js)5.30KB2.13KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)173.18KB47.97KB
fields (index.js)238.89KB60.02KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (fallbackInterpolation.js)6.25KB2.77KB
i18n (i18n.js)4.28KB1.75KB
i18n (index.js)3.44KB1.39KB
i18n (pickLocalized.js)7.62KB3.26KB
i18n (provider.js)26.89KB9.04KB
i18n (useDisplayLocale.js)2.85KB1.45KB
i18n (useObjectLabel.js)33.40KB8.71KB
i18n (useSafeTranslation.js)5.60KB2.33KB
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.66KB12.84KB
plugin-charts (index.js)64.66KB18.32KB
plugin-chatbot (index.js)188.60KB44.82KB
plugin-dashboard (index.js)133.46KB34.48KB
plugin-designer (index.js)211.95KB42.75KB
plugin-detail (index.js)245.10KB62.31KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)131.78KB32.19KB
plugin-gantt (index.js)164.14KB39.87KB
plugin-grid (index.js)201.79KB54.60KB
plugin-kanban (index.js)52.87KB14.57KB
plugin-list (index.js)112.63KB27.45KB
plugin-map (index.js)20.09KB6.62KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)43.49KB11.93KB
plugin-timeline (index.js)26.70KB7.69KB
plugin-tree (index.js)9.26KB3.13KB
plugin-view (index.js)84.55KB20.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)54.84KB18.43KB
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)3.75KB1.85KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)1.85KB0.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 (icon-key-migration.js)4.26KB1.63KB
types (index.js)4.72KB2.24KB
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

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

Projects

None yet

2 participants

@os-support-ai@claude