Skip to content

refactor(console): retire the dormant object-detail page factory and its seven widgets - #4365

Merged
yinlianghui merged 1 commit into
mainfrom
claude/issue-3731-3736-retire-detail-factory
Aug 11, 2026
Merged

refactor(console): retire the dormant object-detail page factory and its seven widgets#4365
yinlianghui merged 1 commit into
mainfrom
claude/issue-3731-3736-retire-detail-factory

Conversation

@yinlianghui

Copy link
Copy Markdown
Collaborator

Fixes#3731
Fixes#3736

The ruling

Maintainer ruling of 2026-08-11, recorded on #3736 and quoted verbatim:

Ruling: REMOVE, same ruling as pair card objectui#3731 — the bespoke factory's embedded CJK copy (60+4 lines) goes with the factory; nothing consumes either. One PR, both cards, Fixes both. State: findingpm:queue.

Zero-caller evidence, re-measured at this branch point (ca269fecd)

$ grep -rn 'buildObjectDetailPageSchema' --include='*.ts' --include='*.tsx' apps packages | grep -v node_modules
apps/console/src/schemas/objectDetailPageSchema.ts:10: * const schema = buildObjectDetailPageSchema('account', metadataItem);
apps/console/src/schemas/objectDetailPageSchema.ts:36:export function buildObjectDetailPageSchema(
packages/react/src/hooks/usePageAssignment.ts:126: // (`buildObjectDetailPageSchema`) and must NOT be picked up here —

Three hits, zero calls: the definition, its own docblock example, and one comment. Unchanged from the three HOLD re-verifications on the cards, so the ruling's premise had not drifted.

The seven registered widget types were then swept individually across the whole tree rather than only .ts/.tsx — every hit lands inside the deleted files, the guide, or CHANGELOG history. No fixture, snapshot, test or e2e file names one, so there was no consumer hiding behind a type string.

CJK counts re-measured at the same point: 56 lines in objectDetailWidgets.tsx and 4 in ObjectDetailTabsWidget.tsx — the 60 the ruling names.

Deleted

FileWhy it goes
apps/console/src/schemas/objectDetailPageSchema.tsthe factory itself (#3731)
apps/console/src/components/schema/objectDetailWidgets.tsx5 widgets, 56 CJK lines (#3736)
apps/console/src/components/schema/ObjectDetailTabsWidget.tsxtabs container, 4 CJK lines (#3736)
apps/console/src/components/schema/ObjectFieldDesignerWidget.tsxthe 7th registered widget — same chain, zero other importers
apps/console/src/components/schema/registerObjectDetailWidgets.tsthe registration chain, all 7 ComponentRegistry.register() calls

Both directories (schemas/ and components/schema/) held nothing else and are gone. main.tsx's registration import went with them.

ObjectFieldDesignerWidget.tsx is not named on either card, so to be explicit: it is registered only by the deleted registerObjectDetailWidgets.ts and referenced only by the deleted ObjectDetailTabsWidget.tsx. Keeping it would have left a file with zero importers — it is inside the chain the dispatch says to delete whole, not an extension of scope.

Collateral edits

  • packages/react/src/hooks/usePageAssignment.ts — comment only, guard untouched. The must-NOT-match comment named the deleted factory, and it was already stale before this PR: the factory emitted pageType: 'record', not 'record_detail', having been changed when record_detail was dropped from PageType in framework#2265. Reworded to the history it actually documents. The filter itself (pt === 'record') is byte-identical.
  • skills/objectui/guides/console-development.md — the chapter positioning the factory as the bespoke-editor recipe is retargeted at the live specimen (PermissionMatrixEditPage, registered in packages/app-shell/src/services/builtinComponents.tsx), and both retired names are recorded in the "Retired names" table following its existing row convention. The rows cite the issue numbers rather than a commit hash, since a squash-merge hash is not knowable at authoring time and docs(skills): console-development.md 的「Retired names」表称 config/metadataTypeRegistry.ts「从未存在过」—— git 可证它确实以该路径落过地(d601ef693 加入 / ff9a0d9e9 删除) #3859's lesson is that these claims must be git-accurate. "Extending object management" was a 4-step recipe in which every step named a deleted file; it now points at the type: 'object' registry override, verified live at builtinComponents.tsx:61.
  • skills/objectui/evals/console-development.json — eval 2's expected_output told the reader to mirror the two deleted files. Retargeted to the live specimen; its assertions were already on live APIs and are unchanged.
  • .changeset/retire-object-detail-factory-3731-3736.md@object-ui/console patch. apps/console/src/** is guarded by check-changeset-presence.mjs (console is in the fixed group), and the gate confirms the declaration.

Verification

StepResult
pnpm --filter '@object-ui/console^...' --filter '@object-ui/react^...' buildgreen (build closure first, in a fresh worktree)
turbo run type-check --filter=@object-ui/console --filter=@object-ui/react36 tasks successful, 36 total
pnpm exec vitest run apps/console/ packages/react/Test Files 81 passed (81), Tests 1008 passed (1008)
pnpm exec vitest run …/inspectors/__tests__/nav-target.test.ts16 passed — the one test referencing usePageAssignment
turbo run lint --filter=@object-ui/console --filter=@object-ui/react0 errors (205 pre-existing no-explicit-any warnings)
node scripts/check-skills-paths.mjsOK, 84/85 stated paths resolve
node scripts/check-control-bytes.mjsOK, 4079 files
check-changeset-presence.mjs / check-changeset-no-major.mjsOK / no major
gate self-tests (check-skills-paths, both changeset gates)69 passed

No test pinned the registration count or any widget type, so the deletion needed no pin updates — that absence was measured, not assumed.

Reverse verification is the zero-consumer evidence plus the green ladder after deletion, as the dispatch specifies. The residual-reference sweep after deleting confirms the only surviving mentions of the deleted symbols are the intentional ones (the "Retired names" rows, the chapter's blockquote, this changeset, and CHANGELOG history); and no object-detail-tabs / object-properties / object-field-designer / object-relationships / object-keys / object-data-experience / object-data-preview registration remains anywhere in the tree.

Note for triage — observed, not acted on

#3731's own ruling comment does not describe this card: its text rules on removing "the second mergeViewsIntoObjects in @object-ui/core", which is a different finding. #3736's ruling names objectui#3731 as the factory's pair card and the dispatch is the factory retirement, so this PR follows that reading; nothing about mergeViewsIntoObjects is touched here. Flagging it so the mis-recorded ruling text can be corrected on the card rather than silently inherited by whoever reads #3731 next.


Generated by Claude Code

…its seven widgets (#3731) (#3736)
`buildObjectDetailPageSchema()` had zero callers: its only consumer, the
registry-driven `MetadataDetailPage`, was deleted when the console moved onto
the metadata-admin engine, and the factory outlived it as unreachable code.
The seven widgets it fed were still registered in `ComponentRegistry` at
startup, reachable in principle by any schema naming those types and in
practice by none — nothing in the repository produces one.
That unreachability is also why 60 lines of hardcoded Chinese UI copy sat in
`objectDetailWidgets.tsx` (56) and `ObjectDetailTabsWidget.tsx` (4) against the
English-only rule with no gate seeing them: the strings are bare literals, never
`t()` keys, and all three i18n gates judge keys.
Maintainer ruling of 2026-08-11 on both cards: REMOVE.
- Deleted: schemas/objectDetailPageSchema.ts, components/schema/{objectDetailWidgets,
ObjectDetailTabsWidget,ObjectFieldDesignerWidget}.tsx, registerObjectDetailWidgets.ts,
and the main.tsx registration import.
- packages/react/src/hooks/usePageAssignment.ts: the must-NOT-match comment named
the deleted factory. The guard is unchanged (comment only); the reference is
reworded to the `PageType` history it actually documents.
- Guide sync: console-development.md's bespoke-editor recipe now points at the
live specimen (PermissionMatrixEditPage), with both names recorded in the
"Retired names" table; the companion eval's dangling pointer is retargeted.
Fixes#3731Fixes#3736
@vercel

vercelBot commented Aug 11, 2026

Copy link
Copy Markdown

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

1 Skipped Deployment
ProjectDeploymentActionsUpdated (UTC)
objectuiIgnoredIgnoredAug 11, 2026 10:04pm

Request Review

@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Main entry (gzip)24.7 KB350 KB
Entry fileindex-BrmL1uHQ.js
StatusPASS

📦 Bundle Size Report

PackageSizeGzipped
app-shell (index.js)9.56KB3.59KB
app-shell (runtime-config.js)7.42KB2.32KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)8.92KB3.41KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)1.17KB0.53KB
auth (AuthProvider.js)22.10KB4.37KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)12.21KB3.45KB
auth (LoginForm.js)18.13KB5.39KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.64KB2.21KB
auth (SocialSignInButtons.js)9.60KB3.89KB
auth (UserMenu.js)3.40KB1.22KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)35.76KB9.11KB
auth (createAuthenticatedFetch.js)4.37KB1.69KB
auth (index.js)2.35KB1.07KB
auth (org-roles.js)6.66KB2.78KB
auth (phone-identifier.js)1.11KB0.66KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)4.91KB0.87KB
auth (useIsWorkspaceAdmin.js)1.61KB0.85KB
collaboration (CommentThread.js)26.07KB7.56KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)6.49KB2.64KB
collaboration (PresenceProvider.js)2.79KB1.13KB
collaboration (index.js)1.65KB0.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)489.12KB108.41KB
core (index.js)3.04KB1.15KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)150.04KB39.79KB
fields (index.js)228.37KB56.62KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (i18n.js)4.32KB1.77KB
i18n (index.js)3.35KB1.38KB
i18n (pickLocalized.js)3.69KB1.73KB
i18n (provider.js)23.12KB7.62KB
i18n (useDisplayLocale.js)2.33KB1.20KB
i18n (useObjectLabel.js)27.59KB6.63KB
i18n (useSafeTranslation.js)4.52KB1.96KB
layout (index.js)38.98KB10.85KB
mobile (MobileProvider.js)0.92KB0.49KB
mobile (ResponsiveContainer.js)0.94KB0.38KB
mobile (breakpoints.js)1.51KB0.70KB
mobile (createOfflineDataSource.js)5.61KB1.74KB
mobile (index.js)1.50KB0.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.71KB0.42KB
mobile (useResponsiveConfig.js)1.36KB0.63KB
mobile (useSpecGesture.js)4.32KB1.64KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)8.75KB3.06KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)3.67KB1.12KB
permissions (evaluator.js)4.41KB1.44KB
permissions (index.js)0.91KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.52KB
permissions (usePermissions.js)1.55KB0.71KB
plugin-ai (index.js)15.71KB3.79KB
plugin-calendar (index.js)45.23KB12.45KB
plugin-charts (index.js)62.18KB17.67KB
plugin-chatbot (index.js)180.33KB42.79KB
plugin-dashboard (index.js)121.60KB31.63KB
plugin-designer (index.js)210.91KB42.67KB
plugin-detail (index.js)238.95KB59.76KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)114.58KB27.68KB
plugin-gantt (index.js)164.14KB39.98KB
plugin-grid (index.js)188.00KB49.94KB
plugin-kanban (index.js)48.60KB13.41KB
plugin-list (index.js)110.10KB26.74KB
plugin-map (index.js)18.05KB5.80KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)40.60KB10.58KB
plugin-timeline (index.js)26.21KB7.52KB
plugin-tree (index.js)8.50KB2.88KB
plugin-view (index.js)84.03KB20.55KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.90KB0.85KB
providers (UploadProvider.js)11.71KB3.53KB
providers (index.js)0.44KB0.22KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)5.67KB2.37KB
react (LazyPluginLoader.js)3.77KB1.33KB
react (SchemaRenderer.js)23.71KB7.96KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)1.23KB0.66KB
react (spec-input.js)0.20KB0.18KB
sdui-parser (codegen.js)4.09KB1.74KB
sdui-parser (index.js)4.47KB2.03KB
sdui-parser (parse.js)10.04KB2.82KB
sdui-parser (types.js)0.29KB0.24KB
sdui-parser (validate.js)4.69KB1.48KB
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)0.20KB0.18KB
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-retry.js)4.32KB2.02KB
types (index.js)3.05KB1.52KB
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 (system-fields.js)3.33KB1.54KB
types (theme.js)0.20KB0.18KB
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 11, 2026 22:19
@yinlianghui
yinlianghui added this pull request to the merge queueAug 11, 2026
Merged via the queue into main with commit 275d7dfAug 11, 2026
21 checks passed
@yinlianghui
yinlianghui deleted the claude/issue-3731-3736-retire-detail-factory branch August 11, 2026 22:19
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

2 participants

@yinlianghui@claude