Gera, 2026-10-02: accurate ghosts, and a frame that does not blink between sections or modules.
2 Oct 2026 · branch feat/onboarding-module-frame-layout · captured against propflow-stage · at 233b3fa7c22
Data note. Every name and balance below comes from propflow-stage, which is anonymized by construction (ADR-0097/0110 — phones in the impossible +1000 NPA, emails @example.test). The identical capture against prod would carry real tenants' names and balances and is not safe to attach anywhere, which is why the generator refuses to run against one.
The status read is held open, so this is what a slow load shows. Everything static is already real: the title, the intro and flow strip, the section tabs, the section heading and Back/Next. The capture company is live, which the server already knows, so the read-only banner is drawn at once too. Only the questions are grey, one card per question this section asks. Before this PR the whole page was a wide seven-row form ghost. The next section is the same page loaded.
Asserted in the captured DOM — How Clara handles your leads · What Clara does here. · Fees & deposits · Next: Applying. The frame's words are checked on the loading page itself.
Loaded: the five fee cards replace the five ghost cards. Nothing above them moved.
Asserted in the captured DOM — How Clara handles your leads · What Clara does here. · Fees & deposits · Next: Applying · Application fee
Asserted in the captured DOM — How Clara handles your leads · What Clara does here. · Fees & deposits · Next: Applying
Asserted in the captured DOM — How Clara handles your leads · What Clara does here. · Fees & deposits · Next: Applying · Application fee
Asserted in the captured DOM — How Clara handles your leads · What Clara does here. · Fees & deposits · Next: Applying
Asserted in the captured DOM — How Clara handles your leads · What Clara does here. · Fees & deposits · Next: Applying · Application fee
Asserted in the captured DOM — How Clara handles your leads · What Clara does here. · Fees & deposits · Next: Applying
Asserted in the captured DOM — How Clara handles your leads · What Clara does here. · Fees & deposits · Next: Applying · Application fee
Start on Hours & contact, loaded. The next shot is taken right after clicking the Fees & deposits tab.
Asserted in the captured DOM — How Clara handles your leads · Hours & contact
The title, intro, flow strip and tabs never left the screen. The tab moved to Fees & deposits, and the section heading changed with it. Only the area under the heading is loading.
Asserted in the captured DOM — How Clara handles your leads · Fees & deposits
Moving to another module repaints the title, intro and tabs from the static menu at once. Only the questions wait.
Asserted in the captured DOM — Maintenance onboarding · Routing
The frame lives in settings/onboarding/(modules)/layout.tsx, which Next keeps mounted between module pages. Each section's loading.tsx draws only OnboardingSectionGhost, one card per question card. Each section's DOM test pins that count to the rendered section. onboarding-module-frame.dom.test.tsx pins three things: the frame is real while the read is in flight, the layout's fallback draws the same frame, and a module switch needs no second read.