Skip to content

finding(app-shell): six more boot gates still hand off from LoadingFallback to a null-rendering <Navigate> #6507

Description

@os-support-ai

Found while fixing objectui#6378 (PR #6506). Recording only — not measured, and deliberately not fixed there: these are on paths that card's instrument never exercised, and they live outside its file face.

The shape

objectui#6378 established, by correlating a CDP frame ledger against a DOM-state ledger on the same clock, that this pattern blanks the viewport:

if(loading)return<LoadingFallback/>;// splash on screenreturn<Navigateto={}replace/>;// renders NOTHING

<Navigate> renders null and navigates from an effect; react-router runs that navigation as a transition, so the destination renders at transition priority while the commit that already dropped the splash is what the compositor shows. Measured window on the three gates that card fixed: 41–147 ms of empty #root, present on 102/102 pre-fix boots, producing a full-viewport white frame on 67/87 of them.

#6506 introduced RedirectWithSplash (packages/app-shell/src/chrome/) — the same <Navigate> paired with the same LoadingScreen, so the handoff changes no pixels — and applied it at the three redirects it had ledger evidence for: LoginRedirect, RootLandingRedirect, and App.tsx's catch-all.

What still carries the shape

All in packages/app-shell/src/console/, read off 1639bbe18:

sitefile:linegate above it
RequireOrganization (org exists, none active)ConsoleShell.tsx:348:351if (isOrganizationsLoading) return <LoadingFallback />
RequireOrganization (no org, multi-org on)ConsoleShell.tsx:355:356if (multiOrgEnabled === null) return <LoadingFallback />
RequireAiSurfaceConsoleShell.tsx:381:382if (isLoading) return <LoadingFallback />
RootRedirectConsoleShell.tsx:415:416if (loading) return <LoadingFallback />
SetupRedirectConsoleShell.tsx:513:515if (loading) return <LoadingFallback />
AppContent no-accessible-app bounceconsole/AppContent.tsx:821the readiness gates above it render LoadingScreen

SystemRedirect (ConsoleShell.tsx:433) is the same null render without a loading gate — a pure redirect route element, reachable as a first navigation from a legacy /system/* deep link.

RootRedirect is worth calling out: it is byte-for-byte the shape of RootLandingRedirect, which is where #6378 measured its widest window (147 ms). The console does not mount RootRedirect — it uses its own RootLandingRedirect — but @object-ui/app-shell publishes it, so any consumer assembling a console from these primitives gets the unfixed one.

What is NOT established

  • Whether any of these is on a boot path in practice, and therefore whether the splash is even up when they fire. That distinction decides the fix: a redirect firing under an already-painted layout should keep that layout, not cover it with a splash — fix(app-shell,console): keep the splash painted across the console boot redirects #6506 deliberately left App.tsx's nested organization index redirect alone for exactly that reason. Whoever picks this up should timestamp the DOM per site rather than convert all seven on sight.
  • Any rate. No boot through these sites was measured; the 41–147 ms figure is from the three sites that were.

Reproducing

The harness is described in full in #6506: production apps/console bundle, boot endpoints mocked, CDP Page.startScreencast at everyNthFrame: 1 with the card's white rule (no colour channel below 242), correlated against a DOM ledger on performance.timeOrigin. e2e/console-boot-indicator.spec.ts on main after #6506 carries the deterministic reading — after React's first commit, the viewport centre must never stop being covered — which is the assertion these sites would need to be brought under.

Metadata

Metadata

Assignees

Labels

domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpm:dispatched

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions