- Shipped
- August 21, 2026 at 5:52 AM UTC
- Author
- kamo
- Commit
- a923bc1
The Details tab's loading state was one card of fourteen grey MUI pulse rows — a shape the pane never takes, on a per-element clock, replaced wholesale by a layout it looks nothing like. And it waited on `loading.insights`: a record that had already arrived sat behind placeholders until an unrelated communications count came back. The pane now shows its own layout while it waits — four stat tiles, the callbacks strip, two rows of three cards, at the real widths — under one band of brand light crossing the page on a diagonal, and the real cards hand off from their ghosts on that same order, so the record resolves along the path the light travelled. Only the record gates the pane; the counts and the task list resolve inside their own tiles, and the market's panes extend the entrance order when its configuration lands. The masthead joins the same sequence: a name-shaped ghost instead of the word "Loading", and a three-segment rail on its bottom edge — record, activity, configuration — where a segment fills white the moment its fetch lands. Real arrivals, not a timer. It is absolutely positioned so the tab underline stays flush with the content it labels. A skeleton that never resolves is the worst end state a loading design has, so a failed record now gives way to what happened and a Retry that re-runs the opening fetches, on the Details and Mortgage tabs both. The `kmail-*` choreography in globals.css becomes the house `kload-*` family — same rules, same reduced-motion contract, plus `kload-settle` for the handoff and the rail's segments. /messages, /notes and /network move over unchanged. No new i18n keys.