The dashboard__empty screenshot scenario showed the “No nodes yet” heading, subtitle, and “+ Add Server” button anchored to the top-left corner of a 1024×768 canvas, leaving ~450dp of unbroken dark void below. The screen read as a crash state rather than a designed empty state.
Two separate gaps: (1) DashboardSurface in Scenarios.kt (test scaffold) wrapped all content in a top-anchored Column, never centering the empty-state branch. (2) The production ClientScreen had no explicit centered empty-state UI at all — when servers is empty and the swarm has stabilised, the main canvas rendered as a blank void, relying entirely on the avatar speech bubble (top-left corner) for guidance. Users unfamiliar with the avatar paradigm saw nothing useful in the 90%+ of screen real estate below the speech bubble.
ClientScreen.kt: Added a Box(fillMaxSize, contentAlignment = Center) with “No nodes yet” + “Add a server to get started” text that renders once servers.isEmpty() && swarmStable. It sits below the avatar speech bubble and walkthrough overlay in Z-order, providing a centered backdrop for the empty canvas state.
Scenarios.kt (DashboardSurface): Restructured the composable to use Box(fillMaxSize, contentAlignment = Center) for the empty-state branch and a plain Column for the populated branch. The title moves inside the centered column for the empty case.
When a composable is the primary content of a fullscreen surface in the zero-items branch, always apply Box(fillMaxSize, contentAlignment = Center) — do not rely on the natural flow of a Column to position empty-state content. Screen-level empty states should feel designed, not blank. Screenshot tests (Scenarios.kt) surface these layout regressions visually; keep scenarios up to date with the production composable’s actual empty-state path.