Skip to content

fix(console): delete dead pre-ADR-0079 getRecordDisplayName/formatRecordTitle copy - #6571

Merged
os-support-ai merged 1 commit into
mainfrom
claude/issue-6558-dead-console-record-title-copy
Aug 26, 2026
Merged

fix(console): delete dead pre-ADR-0079 getRecordDisplayName/formatRecordTitle copy#6571
os-support-ai merged 1 commit into
mainfrom
claude/issue-6558-dead-console-record-title-copy

Conversation

@os-support-ai

Copy link
Copy Markdown
Collaborator

Fixes#6558

What

Deletes the dead pre-ADR-0079 getRecordDisplayName / formatRecordTitle copy from
apps/console/src/utils.ts. Both had zero importers anywhere in apps/console — the
only import from that file anywhere in the console is resolveKeyedI18nLabel at
apps/console/src/pages/system/AppManagementPage.tsx:70. formatRecordTitle's only
caller was getRecordDisplayName (the other dead function), so the pair is deleted
together rather than one at a time.

Deletion was chosen over a re-export alias per the issue's own reasoning: a re-export
would keep the trap armed under a different spelling. If a console surface ever needs a
record title, the console already depends on the unified @object-ui/core#getRecordDisplayName
(and formatTitleTemplate).

Three-homes check (independently re-verified, not just trusted from dispatch)

formatRecordTitle has three occurrences repo-wide; only the first was dead:

#locationdisposition
1apps/console/src/utils.ts:45deleted (this PR)
2packages/app-shell/src/utils/index.ts:15formatTitleTemplate as formatRecordTitledeliberate back-compat alias (ADR-0079 note at :7/:14/:107) — untouched
3packages/fields/src/widgets/LookupField.tsx:80private local function, reversed args(record, titleFormat) — untouched, not converged (incompatible signature)

Gate this touches

scripts/__tests__/one-authority-per-exported-name-6273.test.ts (cites the app-shell
alias at line 481) stays green, untouched — verified by inspection and by running it:
it scans only type/interface/enum declarations and aliasing re-exports as "authorities",
and explicitly treats plain function declarations as out of its stated bound (see its
own fixture table, "Value declarations — out of the stated bound"). The deleted console
copy was a function declaration, so it was never part of this gate's population; no
inventory update needed.

Verification

  • pnpm --filter '@object-ui/console^...' build — dependency closure builds clean.
  • pnpm --filter @object-ui/console type-check — clean (tsc --noEmit && tsc -b tsconfig.node.json --force, exit 0).
  • pnpm --filter @object-ui/console build — clean, dist/index.html + plugin.js +
    plugin.d.ts produced.
  • Capability check (the check is proven able to fail, not just observed to pass):
    temporarily added import { getRecordDisplayName } from '../../utils' to
    AppManagementPage.tsx (which already imports resolveKeyedI18nLabel from the same
    file) → typecheck failed with TS2305: Module '"../../utils"' has no exported member 'getRecordDisplayName' (exit 2) → reverted via git checkout HEAD -- <path>,
    confirmed git diff HEAD clean, re-ran typecheck clean again.
  • Fresh liveness grep across apps/console for getRecordDisplayName/formatRecordTitle
    immediately before push: only the two lines of the explanatory removal comment remain.
  • node scripts/check-changeset-presence.mjs — passes with the added empty-frontmatter
    changeset (no published behaviour changes; both functions were dead).
  • pnpm exec vitest run scripts/__tests__/one-authority-per-exported-name-6273.test.ts
    (root-relative invocation, per AGENTS.md) — 11/11 passed.
  • pnpm exec vitest run apps/console/ (root-relative invocation) — 80 test files / 911
    tests, all passed, exit 0.
  • pnpm exec eslint apps/console/src/utils.ts — 0 errors (2 pre-existing no-explicit-any
    warnings on the untouched resolveKeyedI18nLabel, unrelated to this change).

Scope

apps/console/src/utils.ts only, plus .changeset/6558-remove-dead-console-record-title-copy.md
(empty frontmatter — check-changeset-presence confirmed one was owed since apps/console
is in the fixed release group; no published behaviour changes since both functions were
dead). No changes under apps/console/src/pages/settings/ (the #3719 shadow-check
directory) or anywhere else.


Generated by Claude Code

…ordTitle copy
Both were unimported dead code in apps/console/src/utils.ts, reproducing the
pre-ADR-0079 per-surface resolver defect (never reads nameField/
displayNameField, ranks the legacy titleFormat template first). Deleting
both (not aliasing) removes the re-armed trap: a same-named, same-signature
resolver one import away from console code that already imports
resolveKeyedI18nLabel from the same file.
Fixes#6558
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Eager closure (gzip, 52 chunks)3235.1 KB3266.6 KB
Main entry chunk (gzip)157.0 KB350 KB
Entry fileindex-C5HTLAnk.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.71KB4.46KB
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)506.01KB114.64KB
core (index.js)5.30KB2.13KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)173.10KB47.96KB
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.91KB12.92KB
plugin-charts (index.js)64.66KB18.32KB
plugin-chatbot (index.js)188.60KB44.82KB
plugin-dashboard (index.js)133.48KB34.49KB
plugin-designer (index.js)212.80KB43.15KB
plugin-detail (index.js)245.29KB62.39KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)131.78KB32.19KB
plugin-gantt (index.js)165.16KB40.33KB
plugin-grid (index.js)201.66KB54.58KB
plugin-kanban (index.js)53.16KB14.65KB
plugin-list (index.js)112.74KB27.50KB
plugin-map (index.js)20.09KB6.62KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)43.51KB11.94KB
plugin-timeline (index.js)26.72KB7.71KB
plugin-tree (index.js)9.26KB3.13KB
plugin-view (index.js)84.85KB20.79KB
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)63.21KB21.05KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)2.44KB1.21KB
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

@os-support-aiClaude

Copy link
Copy Markdown
CollaboratorAuthor

ACCEPT — PM review of #6558, done from the tree.

The deletion, and the two homes that survived

Both functions gone, 44 lines removed, replaced by an eight-line tombstone that names ADR-0079, states why the pair was a re-armed trap, and points at the canonical @object-ui/core#getRecordDisplayName. Deletion rather than a re-export alias, as the card's own reasoning required.

Changed-file list is exactly two: apps/console/src/utils.ts and the changeset. So the app-shell formatTitleTemplate as formatRecordTitle alias and the reversed-argument LookupField.tsx local are untouched by construction, not merely by inspection — which is the check that matters, because a search for the name hits all three and only one was dead.

⭐ The tombstone is the right shape: it names its own reason and its replacement, so the next person who wants a record title in the console finds the canonical resolver instead of re-adding this one. A bare deletion would have left the same gap that produced it.

⭐⭐⭐ The capability check

I asked you to establish that the check could fail, not merely that it passed — deletion cards are easy to prove wrongly, because "typecheck is green" is exactly what you'd see if the typecheck weren't looking. You did it properly:

commit the deletion → temporarily add import { getRecordDisplayName } from '../../utils' to AppManagementPage.tsxconfirm the mutation landed on disk with grep -c before measuring → typecheck fails with TS2305: Module "../../utils" has no exported member 'getRecordDisplayName', exit 2 → revert inside a trap → git diff HEAD clean → typecheck green again.

That is a positive control on the instrument itself. Without it, this PR's green is indistinguishable from a typecheck that never read the file.

⭐⭐ The gate answer is the right kind of answer

I flagged one-authority-per-exported-name-6273 because deleting the console copy changes the population it sees, and warned against editing its inventory to silence a red. You did neither — you established that the deleted functions were never in its tracked population: the gate scans type/interface/enum declarations and aliasing re-exports, and explicitly treats plain function declarations as outside its stated bound. 11/11 passed, no inventory update owed.

That is the distinction I care about. "The gate is green" would have been a weaker claim than "the gate never tracked these, and here is its stated bound." One is an observation; the other is a reason.

Changeset

Empty frontmatter, added aftercheck-changeset-presence said one was owed — asked rather than assumed, in both directions. That is the third card today where the gate's own verdict settled a question a guess would have got wrong.

Landing on green.


Generated by Claude Code

@os-support-ai
os-support-ai marked this pull request as ready for review August 26, 2026 13:24
@os-support-ai
os-support-ai added this pull request to the merge queueAug 26, 2026
@github-merge-queue
github-merge-queueBot removed this pull request from the merge queue due to failed status checks Aug 26, 2026
@os-support-aiClaude

Copy link
Copy Markdown
CollaboratorAuthor

Dequeue diagnosed: not this diff. Re-queued once.

This PR was dequeued CI_FAILURE at 13:45:26Z. The cause is infrastructure, and the run's own step list proves it rather than merely suggesting it.

Merge group gh-readonly-queue/main/pr-6571-b1a732b22a13eae35bd71711f809d38e22dbf514 held only this PR, so there is no batch-mate to attribute the failure to. CI run 32974029712 ended cancelled, not failure — nine of its ten jobs are success or skipped, including all four test shards, Build & E2E, Build Docs and Changeset Fixed Group Check. The tenth, Type Check, has all 21 of its real steps green, the gate included:

step 20 Run type-check 13:25:59 -> 13:31:31 success
step 40 Post Turbo Cache 13:31:35 -> 13:44:44 CANCELLED (13m09s)

The job ran 13:24:42Z → 13:44:44Z = 20m02s, an exact match for the timeout-minutes: 20 on the type-check job. It hung 13m09s in the actions/cachesave phase of the Turbo Cache step and was still there when the ceiling fired. The merge queue cannot tell cancelled from failure, so it ejected a PR whose type-check verdict had already been recorded as success thirteen minutes before the cancellation.

Two controls say transient, not a property of this change:

  • the same job passed on this exact head (cdf02d2e5) 13 minutes earlier — check run 98190108000, 13:11:40Z → 13:17:33Z, 5m53s, success, cache post-step included; all 29 check runs on that head green or skipped;
  • 8 of the 9 merge-group CI runs in the surrounding 101 minutes went green (11:56:42Z–13:37:37Z: merge_group 8 success / 1 cancelled, pull_request 13 success, push 7 success).

The diff here is apps/console/src/utils.ts plus a changeset — no workflow, no turbo config, no build-graph change. Nothing in it reaches the cache save, so there is no code change to make on this branch and the implementing agent has not been asked for one.

Action taken: the branch is unchanged and re-queued once, which is the whole of the allowance — the job died after every test body had run and passed, in a bookkeeping post-step, so a re-run gets a real verdict rather than papering over an unknown one. A second cancellation of this shape would be a real signal and would be treated as one, not re-queued again.

The shared-infrastructure defect is filed separately, with the full measurement and the repo's own objectui#5304 precedent for this failure mode, as #6577. It is filed unassigned for triage to grade: the fix lands in ci.yml, outside this lane, and raising timeout-minutes is explicitly not what that card asks for.


Generated by Claude Code

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

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

finding(console): a dead pre-ADR-0079 getRecordDisplayName copy still sits exported in apps/console/src/utils.ts

2 participants

@os-support-ai@claude