ad800ea8cd
The REST prefetch and the gateway `session.resume` already ran concurrently, but the prefetch result was held until the runtime resume settled. A cold profile build (skills / MCP / memory) can keep `session.resume` pending past the hydration budget while the complete transcript is already in hand, so a Bot Chat sat on the loader and burned its retries with readable history off screen. - Publish the grafted REST snapshot as soon as the prefetch resolves and `isCurrentResume()` holds; the runtime path grafts only its live projection onto that same snapshot, and the post-resume `chatMessageArraysEquivalent` skip keeps reference identity when nothing changed (no second DOM build). - Stamp the eagerly painted page with persisted-display provenance on the runtime state so the warm-path gate admits it on the next switch. - REST fallback after a resume rejection skips the redundant re-publish when the early paint already shows the transcript. Live repro (Electron e2e, session.resume stalled 25s via a temporary backend shim): main never painted within 20s; with this fix the transcript painted 150ms after the row click. Supersedes #90130. Co-authored-by: Alexandre Roumieu <269586168+alexandreroumieu-codeapprentice@users.noreply.github.com>