diff --git a/PROJECT.md b/PROJECT.md
index a57631f..2ae3a8b 100644
--- a/PROJECT.md
+++ b/PROJECT.md
@@ -491,6 +491,16 @@ zombie (now an occasional opponent, `TUNE.racketEvery`, not the every-game fixtu
`RETURNED`, `DOUBLE KILL`) is a footnote to something you already watched happen. Sharing the loud
FACE with the milestone cards is right; sharing their SIZE made every footnote read as a milestone.
+## Session log: the boot gate learns about the profile (2026-08-29, same day, STAGING ONLY)
+
+Oliver: on a fresh load the player/build requests are still in flight while the splash is already
+interactive. The existing `#splash.busy` gate (sprites + fonts) now ALSO waits for the profile
+mirror's pull — capped at 4 s, because a dead network must never park the player on the title
+(the sprite loader's own rule). While busy the PLAQUE is a skeleton: ghost crest, blank pills
+where the words go, empty bar, no chevron, `pointer-events: none` — and the splash keyboard
+shortcuts respect the gate too (they didn't). Half-true numbers neither show nor navigate; the
+pull's `refreshSplash` repaints the real values the moment the gate lifts.
+
## Session log: THE CUP CLIMBS — the shuffle retires too (2026-08-29, same day, STAGING ONLY)
Oliver, straight after the draw screen went: "warum sollten wir noch mischen? wäre es nicht gut
diff --git a/index.html b/index.html
index 1b3f8e6..54a1faa 100644
--- a/index.html
+++ b/index.html
@@ -483,6 +483,16 @@ if (location.hostname !== 'splatter-tennis.wuwi.one' && !window.Capacitor?.isNat
font: 400 9px Silkscreen, monospace; color: var(--dim); letter-spacing: 2px; }
#splash.busy #boot { display: block; }
#splash.busy .btn, #splash.busy .two, #splash.busy #build { display: none; }
+ /* ...and the PLAQUE boots as a SKELETON: no tap, ghost crest, blank pills where the words go.
+ The profile mirror may still be in flight, and half-true numbers must neither show nor
+ navigate (main.js holds .busy until the pull settles or its 4 s cap fires). */
+ #splash.busy #plaque { pointer-events: none; }
+ #splash.busy #plaque em { visibility: hidden; }
+ #splash.busy #plBadge { opacity: 0.14; filter: grayscale(1); }
+ #splash.busy #plName, #splash.busy #plLv, #splash.busy #plGoal {
+ color: transparent; text-shadow: none; background: rgba(255,255,255,0.08);
+ border-radius: 4px; }
+ #splash.busy #plRow s i { width: 0% !important; }
#sSum, #brSum { display: flex; justify-content: space-between; gap: 8px; margin: 0 0 8px;
font: 400 9px Silkscreen, monospace; color: var(--dim); letter-spacing: 1px; }
.tabs { display: flex; gap: 6px; margin: 12px 0 14px; }
@@ -854,6 +864,6 @@ if (location.hostname !== 'splatter-tennis.wuwi.one' && !window.Capacitor?.isNat
-
+