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
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:
site
file:line
gate above it
RequireOrganization (org exists, none active)
ConsoleShell.tsx:348 → :351
if (isOrganizationsLoading) return <LoadingFallback />
RequireOrganization (no org, multi-org on)
ConsoleShell.tsx:355 → :356
if (multiOrgEnabled === null) return <LoadingFallback />
RequireAiSurface
ConsoleShell.tsx:381 → :382
if (isLoading) return <LoadingFallback />
RootRedirect
ConsoleShell.tsx:415 → :416
if (loading) return <LoadingFallback />
SetupRedirect
ConsoleShell.tsx:513 → :515
if (loading) return <LoadingFallback />
AppContent no-accessible-app bounce
console/AppContent.tsx:821
the 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.
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:
<Navigate>rendersnulland 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 sameLoadingScreen, so the handoff changes no pixels — and applied it at the three redirects it had ledger evidence for:LoginRedirect,RootLandingRedirect, andApp.tsx's catch-all.What still carries the shape
All in
packages/app-shell/src/console/, read off1639bbe18: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 />AppContentno-accessible-app bounceconsole/AppContent.tsx:821LoadingScreenSystemRedirect(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.RootRedirectis worth calling out: it is byte-for-byte the shape ofRootLandingRedirect, which is where #6378 measured its widest window (147 ms). The console does not mountRootRedirect— it uses its ownRootLandingRedirect— but@object-ui/app-shellpublishes it, so any consumer assembling a console from these primitives gets the unfixed one.What is NOT established
App.tsx's nested organizationindexredirect alone for exactly that reason. Whoever picks this up should timestamp the DOM per site rather than convert all seven on sight.Reproducing
The harness is described in full in #6506: production
apps/consolebundle, boot endpoints mocked, CDPPage.startScreencastateveryNthFrame: 1with the card's white rule (no colour channel below 242), correlated against a DOM ledger onperformance.timeOrigin.e2e/console-boot-indicator.spec.tsonmainafter #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.