Status: Accepted (2026-07-03). Refines the FR-UI-1 landscape three-pane layout and extends ADR-0008 (Signal shell) and ADR-0009 (runtime session behind the seam). Scope: lib/app/shell.dart + lib/app/providers.dart only; no seam, wire, or feature-package change.
The Signal landscape shell renders a fixed three-pane IDE frame — Files sidebar | centre surface | Pin-reference pane, with a top toolbar and a bottom console strip — and "Connect" was plugged into the centre as one of four peer navigation surfaces (Connect / Editor / Console / Files). Two problems followed, both reported by the owner:
- The Files sidebar and Pin-reference pane flank Connect, so "Files" appears on the Connect screen (and, before the S-of-S3 fix, twice at once). But before a board is connected there are no files (no board), no chip pins (no
DeviceInfo), and no console output — the IDE chrome is meaningless pre-connection. - Treating Connect as a peer editing surface is the root cause: Connect is a mode (the pre-connection scan/connect experience), not a work surface you edit alongside files.
ConnState is a frozen 4-value enum (disconnected/connecting/ready/running) and the seam already yields a live, observable state (ADR-0009). So the shell can gate on it.
The shell is connection-gated. With no board connected the app is a full-screen Connect experience with NO IDE chrome; the three-pane / stacked IDE appears only once a board is ready (or running). Connect is removed from the IDE navigation entirely — it is the pre-connection surface, reached again by disconnecting. Concretely:
-
PybleShellwatchesconnStateProvider. When the state is notready/runningit renders_DisconnectedShell— the status toolbar over a full-screenConnectPage, with no Files sidebar, Pin-reference pane, or console strip.connectingstays on the Connect surface (which shows its own progress). Onceready/running, it renders the existing landscape or stacked IDE by width. -
The IDE navigation is Editor / Console / Files (
_ideNavSurfaces); Connect is not an IDE tab. In landscape the centre work surface is Editor or Console only (Files is the collapsible left sidebar, a rail toggle — see the FR-UI-1 sidebar note); it defaults to the editor. In the stacked layout Files is an ordinary destination and the default is likewise the editor. -
Disconnect lives on the toolbar. When a board is connected the toolbar's connection action is an active Disconnect (
connectionManagerProvider.disconnect()), which returns to the full-screen Connect flow. While disconnected it is an inert Connect slot (the live scan/connect flow is the surface below).
- Files/Pins/console never flank the pre-connection flow; the pre-connection state reads as a single, focused Connect screen (the owner's complaint is resolved at the layout level, not by hiding a pane).
- The connected experience is unchanged except that the rail no longer lists Connect and the toolbar gains Disconnect. Existing goldens were reseeded; a new
shell_ipad_landscape_disconnectedbaseline locks the pre-connection state. - The change is confined to the shell + providers; the
Connectionseam (D1/D2), the import boundary (no UI package importslib/ble, CON-8), Riverpod (ADR-0007), and every §1A.3 rejection are unchanged.
Unchanged rejection list, seam, and layering as in ADR-0009/ADR-0010.