Skip to content

chore(runner): drop the unused "@app" vite alias and empty its ratchet - #6197

Merged
yinlianghui-tw merged 1 commit into
mainfrom
claude/issue-5380-app-alias-removal
Aug 25, 2026
Merged

chore(runner): drop the unused "@app" vite alias and empty its ratchet#6197
yinlianghui-tw merged 1 commit into
mainfrom
claude/issue-5380-app-alias-removal

Conversation

@yinlianghui-tw

Copy link
Copy Markdown
Collaborator

Fixes#5380

Implements triage's A′ re-ruling. All gates below were run on bbcc46e7a, the branch head.

What changed, and on what ground

packages/runner/vite.config.ts declared "@app" pointing at ./src/app-data. Two lines gone (the alias and its DX: App Data Symlink comment), on the narrower ground the re-ruling measured:

  • Zero importers. A repo-wide sweep for @app returns three hits: the declaration itself, and two prose lines in the ratchet file describing the carve-out. Nothing imports @app or any subpath of it.
  • The documented DX does not route through the alias.LocalBundleLoader in packages/runner/src/lib/MetadataLoader.ts reads the directory through relative import.meta.glob('../app-data/app.json') and siblings. packages/runner/README.md and content/docs/utilities/runner.mdx teach src/app-data/ as a path; neither mentions the alias.

So deleting the line changes no behaviour and breaks no documented workflow. Verified rather than assumed: pnpm exec vite build in packages/runner after the deletion — 4459 modules transformed, built in 5.49s, exit 0.

What is explicitly NOT the ground

src/app-data/ is not a dead target. It is git-ignored (packages/runner/.gitignore:1) and user-supplied — absent from a fresh checkout by design, and created by any reader who follows the Development Workflow the README documents. The dead thing was the unused alias, not the directory it named. This distinction is the whole history of the card and the reason the earlier reasoning was retired; the code comment now carries it so the next reader cannot re-derive the wrong version.

The same-PR obligation, and what an empty list does to the pins

#5168's shrink-only pin asserts each carved-out entry is still declared and still missing, so deleting the alias without touching the carve-out reddens it. Measured, not assumed — the intermediate state was run:

× the objectui#5168 carve-out still describes exactly the entries it was written for
Tests 1 failed | 288 passed (289)

That entry was the list's only member, so removing it empties the ratchet. Every consumer of KNOWN_MISSING_PACKAGE_ALIAS_TARGETS was read:

consumerbehaviour at zero
isCarvedOut, filtering the per-entry existence it.eachstronger — nothing is filtered out, so every package alias entry is now guarded with no exemptions
pin: declared compared with the listsilently vacuous — filters an empty list, compares [] with [], cannot fail for any repo state
pin: nowResolving (entries that are carved out and now resolve)silently vacuousisCarvedOut is false for everything, so this is [] unconditionally

Both of the pin's expectations become unfailable. Shipping that would be exactly the trap this file guards against elsewhere — the toBeGreaterThanOrEqual cases at the top of the same block exist because "a zero-hit parse would make every case below vacuous".

Fix, matching the shape #4820 already left on KNOWN_MISSING_TARGETS in this same file (that ratchet reached empty in cb83cec / #5966): the pin now asserts emptiness itself first, which does bite at zero, and states in-line that the two expectations after it are knowingly vacuous rather than accidentally so. The list itself is kept, not deleted — deleting it would remove the subject of that assertion and unwire isCarvedOut, making a future re-population an ordinary edit instead of a visible one; empty is its terminal state, and re-populating it needs a card.

The new assertion was ablated to prove it can fail. Re-populating the list with one probe entry, with the mutation confirmed on disk before the run (injected marker present 1, empty-list declaration present 0):

× the objectui#5168 carve-out is empty, so no package alias entry is exempt
AssertionError: KNOWN_MISSING_PACKAGE_ALIAS_TARGETS is a shrink-only ratchet that reached
empty when objectui#5380 landed. ...: expected [ { …(2) } ] to deeply equal []
Tests 1 failed | 288 passed (289)

The restore leg ran from a trap and was confirmed on disk by absent-marker (probe present 0, empty-list declaration present 1) with git status clean.

Gates

Derived from package.json and .github/workflows/, not from the dispatch order. Root vitest only, exit codes captured by redirect before any pipe.

gateresult
vitest run on both affected test files + packages/runner/exit 0 — Test Files 5 passed (5), Tests 332 passed (332)
pnpm lint:root (covers scripts/)exit 0 — 28 problems (0 errors, 28 warnings), all pre-existing no-explicit-any in untouched files
eslint . in packages/runnerexit 0 — 20 problems (0 errors, 20 warnings), same
pnpm type-check:scriptsexit 0 — and --listFiles confirms the edited test file is in that program, so the green is not vacuous
pnpm type-check in packages/runnerexit 0 after building the dependency closure (see note)
pnpm exec vite build in packages/runnerexit 0 — 4459 modules, built in 5.49s
pnpm check:control-bytesexit 0 — OK (scanned 5113 tracked text file(s))
pnpm changeset:checkexit 0
node scripts/check-changeset-presence.mjsexit 0 — see below

Note on the runner type-check. It first failed with TS2307: Cannot find module '@object-ui/types' and implicit-any fallout — the unbuilt-dependency-dist trap in a fresh worktree, not this diff. Attribution was established before rerunning: tsc --listFiles shows packages/runner/vite.config.ts is not in that program at all (tsconfig.json includes only src), and every erroring file is one this PR never touches. After turbo run build --filter=@object-ui/runner^... (14 tasks successful) the same command exits 0.

No changeset. The presence gate reports it directly: "2 file(s) changed, 0 of them published source of a package the release covers ... No source of a released package changed in this range, so no changeset is owed." A build config and a pin test are not published source; nothing user-visible ships here.

Shared-surface coordination

#4820's KNOWN_MISSING_TARGETS lives in the same file. It is not in flight — it already landed as cb83cec (#5966), and its list is already [] on main. This PR does not touch it: git diff BASE..HEAD | grep -c KNOWN_MISSING_TARGETS returns 0. A scan of the 40 most recently active remote branches for commits touching either of my two files since their merge-base with main returned nothing, so there is no union to declare.

#5968 (the fs.existsSync checkout-state dependence class) is untouched and stays its own card. Emptying this ratchet removes the only entry that exhibited that shape, but the class is #5968's subject, not this PR's — and the code comment says so, so nobody reads the empty list as a fix for it.


Generated by Claude Code

`packages/runner/vite.config.ts` declared `"@app"` pointing at
`./src/app-data`. The alias had ZERO importers: a repo-wide sweep finds
`@app` only in the declaration itself and in the ratchet prose below it.
The documented App Data Symlink DX does not route through it. `LocalBundleLoader`
(`packages/runner/src/lib/MetadataLoader.ts`) reads that directory through
relative `import.meta.glob('../app-data/…')`, and README.md / runner.mdx teach
`src/app-data/` as a path, never `@app`. So deleting the line changes no
behaviour and breaks no documented workflow.
Note what is NOT the ground here: `src/app-data/` is not a dead target. It is
git-ignored (`packages/runner/.gitignore:1`) and user-supplied — absent from a
fresh checkout BY DESIGN, created by any reader who follows the documented
Development Workflow. The dead thing was the unused alias, not the directory
it named.
Same PR, as objectui#5168's shrink-only pin requires: the
`KNOWN_MISSING_PACKAGE_ALIAS_TARGETS` carve-out entry goes with it. That entry
was the list's only member, so the ratchet reaches empty — every package alias
entry is now guarded with no exemptions.
Emptying it makes both of the carve-out pin's existing expectations vacuous:
each compares [] with [] and can no longer fail for any repo state. Rather than
ship a pin that cannot fail, the pin now asserts emptiness itself first — which
does go red if the list is re-populated — and says in-line that the two below
it are knowingly vacuous at zero. Same shape objectui#4820 left on
`KNOWN_MISSING_TARGETS` in this file.
Part of #5380
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Eager closure (gzip, 52 chunks)3221.2 KB3990.2 KB
Main entry chunk (gzip)153.7 KB350 KB
Entry fileindex-CkDtppwq.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)505.15KB114.53KB
core (index.js)5.30KB2.13KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)168.48KB46.47KB
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.45KB
plugin-designer (index.js)212.30KB42.80KB
plugin-detail (index.js)244.14KB61.94KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)125.86KB30.71KB
plugin-gantt (index.js)164.15KB39.88KB
plugin-grid (index.js)201.05KB54.38KB
plugin-kanban (index.js)52.89KB14.59KB
plugin-list (index.js)111.86KB27.22KB
plugin-map (index.js)20.11KB6.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)9.26KB3.13KB
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)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)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 (icon-key-migration.js)4.26KB1.63KB
types (index.js)4.49KB2.14KB
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-tw
yinlianghui-tw marked this pull request as ready for review August 25, 2026 00:27
@yinlianghui-tw
yinlianghui-tw added this pull request to the merge queueAug 25, 2026
Merged via the queue into main with commit c6d47c4Aug 25, 2026
24 checks passed
@yinlianghui-tw
yinlianghui-tw deleted the claude/issue-5380-app-alias-removal branch August 25, 2026 00:47
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.

packages/runner/vite.config.ts 的 "@app" 别名指向不存在的 src/app-data(全仓唯一引用),与已关闭的 #3593 同一形态

2 participants

@yinlianghui-tw@claude