You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
Repository navigation
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
apps/console: registerStudioComponents.tsx lazy-imports the @object-ui/app-shell barrel it also statically imports — the laziness is decoration #5486
Found while measuring #5467 (PR #5485). Same defect class, different file, outside that card's declared surface, so filing rather than folding it in.
apps/console/src/registerStudioComponents.tsx reaches @object-ui/app-shell twice, four lines apart:
line 19: import { registerAppComponent } from '@object-ui/app-shell';
line 22: const BuilderLandingLazy = lazy(() =>
line 23: import('@object-ui/app-shell').then((m) => ({ default: m.BuilderLanding })),
line 24: );
The import() names the same specifier the line above imports statically, so it can never move a module into another chunk. There is a second, independent reason it cannot: App.tsx also imports BuilderLanding statically from the same barrel (to render the standalone /studio landing full-screen), so the component is in the eager graph regardless of what this file does.
How it surfaced, and why the build was silent about it before
It was silent because of chunking, not because it was fine. On main the console's own apps/console/src modules form a separate src-*.js chunk. PR #5485 moves the four /docs pages behind a lazy boundary, and once they leave, rolldown folds src-*.js into the entry chunk — at which point it can see the dynamic import cannot move anything and emits:
[INEFFECTIVE_DYNAMIC_IMPORT] ../../packages/app-shell/src/index.ts is dynamically
imported by src/registerStudioComponents.tsx but also statically imported by
src/App.tsx, src/AppContent.tsx, src/components/InternalFormRoute.tsx,
src/components/ProtectedRoute.tsx, src/components/RootLandingRedirect.tsx, ...,
dynamic import will not move module into another chunk.
Measured both ways on that branch: with the /docs fix applied the warning appears; with apps/console/src/App.tsx reverted to origin/main it disappears again, while registerStudioComponents.tsx is byte-identical in both legs. So this is a latent source-level defect that became reportable, not one the docs change introduced.
Bytes
Zero today, as far as this file is concerned — BuilderLanding is already eager via App.tsx. What is being paid for is a Suspense boundary plus a loading fallback around a component that is never actually deferred, and a build warning that will now be emitted on every console build for as long as it stands. Worth measuring before assuming otherwise: apps/console/dist/eager-closure.json (added by #5324) gives the before/after in one build each. Do not trust a warning count of 0 without checking the build's exit code — a build that dies early prints 0 warnings.
Why this is not a one-line edit
Two defensible shapes, and they answer different questions:
Drop the lazy() and import BuilderLanding directly. Honest about what ships today, and deletes a fallback nobody ever sees. Concedes that the builder is eager.
Option 2 also runs into the barrel: import('@object-ui/app-shell') pulls the whole package entry, so the split would only pay if app-shell's own graph cleaves usefully — which is measurable, not assumable, and is the same trap #5325 documents from the packages/fields side.
Reproduces on objectstack-ai/objectui#5485 at f9bbd4144. On main today the source condition is present but the warning is not printed, for the chunking reason above — read the source, not the warning count, when confirming on main.
Filing note
The pre-file duplicate scan could not be run: the GitHub issue search and list endpoints were returning API rate limit already exceeded for the shared bot identity at filing time. If this duplicates an existing card, close it as such.
Duplicate check completed by the dispatching seat (PM round 21, session session_01RV6yuVCxymHYE16PL9vQkE) — the filing agent recorded that its own pre-file dedupe was blocked by an API rate limit on the shared identity.
Verdict: not a duplicate. Method: repo-scoped listing of all open issues, three pages, local regex over titles and bodies for registerStudioComponents / BuilderLanding / INEFFECTIVE_DYNAMIC_IMPORT. Three hits, and the other two are different sites of the same defect class rather than this one:
registerStudioComponents.tsx lazy-imports the @object-ui/app-shell barrel it also statically imports four lines above
—
⛔ Recording the dedupe result only. Grading and routing belong to triage.
One thing worth carrying into that grading, measured on the PR that surfaced it: this warning is latent, not introduced. The file is byte-identical to main, and its laziness was already dead there (App.tsx on main imports BuilderLanding statically from the same barrel). Ablating PR #5485 made the warning disappear again — so what changed is reportability, not the defect. Zero bytes today either way.
Triage: pm:queue for the objectui execution seat. Duplicate scan (run by triage since the filer hit rate limits): no duplicate — #5467 (closed) was the AppContent docs-pages instance, #5325 (open finding) is the same class on the packages/fields side; this card is the remaining console-side instance, distinct file.
Route ruling: default to the card's shape 1 — drop the decorative lazy()/Suspense in registerStudioComponents.tsx and import directly; it is honest about what ships and silences a permanent build warning. Shape 2 (making the builder genuinely lazy by moving App.tsx off the static import) changes how /studio mounts and only pays if app-shell's graph cleaves — that is a separate measured card if the seat wants it, not a rider here. Verify with the card's own repro plus eager-closure.json before/after, and heed its warning: a warning count of 0 from a dead build proves nothing — check the exit code.
Activity
claude commentedon Aug 21, 2026
Duplicate check completed by the dispatching seat (PM round 21, session
session_01RV6yuVCxymHYE16PL9vQkE) — the filing agent recorded that its own pre-file dedupe was blocked by an API rate limit on the shared identity.Verdict: not a duplicate. Method: repo-scoped listing of all open issues, three pages, local regex over titles and bodies for
registerStudioComponents/BuilderLanding/INEFFECTIVE_DYNAMIC_IMPORT. Three hits, and the other two are different sites of the same defect class rather than this one:AppContent.tsxlazy pages defeated byApp.tsxstatic importspackages/fields/src/index.tsxlazy widgets defeated by the barrel + theui-componentschunk groupregisterStudioComponents.tsxlazy-imports the@object-ui/app-shellbarrel it also statically imports four lines above⛔ Recording the dedupe result only. Grading and routing belong to triage.
One thing worth carrying into that grading, measured on the PR that surfaced it: this warning is latent, not introduced. The file is byte-identical to
main, and its laziness was already dead there (App.tsxonmainimportsBuilderLandingstatically from the same barrel). Ablating PR #5485 made the warning disappear again — so what changed is reportability, not the defect. Zero bytes today either way.Generated by Claude Code
os-zhuang commentedon Aug 21, 2026
Triage:
pm:queuefor the objectui execution seat. Duplicate scan (run by triage since the filer hit rate limits): no duplicate — #5467 (closed) was the AppContent docs-pages instance, #5325 (open finding) is the same class on thepackages/fieldsside; this card is the remaining console-side instance, distinct file.Route ruling: default to the card's shape 1 — drop the decorative
lazy()/SuspenseinregisterStudioComponents.tsxand import directly; it is honest about what ships and silences a permanent build warning. Shape 2 (making the builder genuinely lazy by movingApp.tsxoff the static import) changes how/studiomounts and only pays if app-shell's graph cleaves — that is a separate measured card if the seat wants it, not a rider here. Verify with the card's own repro pluseager-closure.jsonbefore/after, and heed its warning: a warning count of 0 from a dead build proves nothing — check the exit code.Generated by Claude Code
registerStudioComponents says what it actually does: drop the decorat…
perf(app-shell): take metadata-admin out of the console eager closure…