The DevOverlay panel has been silently rendering DevSnapshot.initial since
Phase 4 because three independent breaks left the data path open-circuit
(see .planning/audit-2026-05-12/devoverlay-diagnosis.md for the full trace).
Slice 2 closes all three:
1. AppDelegate constructs `DevSnapshotEmitter` in `installAgent` and
stores it on the delegate. Provider/model is set from configStore
so the header row shows the active provider rather than a blank.
2. The `.devOverlay` broadcaster subscriber that previously drained to
`/dev/null` now calls `emitter.apply(event)` for every event. This
produces real DevSnapshots that flow through the bounded output
channel (capacity 32, .dropOldest — AGENT-10 observational seam).
3. `DevOverlayWindow` now accepts the live emitter + BootHealthOrchestrator
+ a HudState reader closure. It instantiates its own DevOverlayBridge
and attaches the bridge to `emitter.output` so viewModel.apply is
actually called as snapshots arrive.
Also reshapes the SwiftUI surface as a TabView with three observational
panes (Agent, Tools, Health). The Health pane is read-only — the Status…
menu remains the place to trigger re-probes. The Logs pane lands in
Slice 3 (live log stream).
ViewModel extends with `bootHealth` + `hudStateLabel` slices, each with
its own single-writer mutator and `private(set)` enforcement.
Verification:
- swift test --package-path packages/DevOverlay → 14/14 pass
- swift test --package-path packages/AgentCore --filter DevSnapshotEmitterTests → 9/9 pass
- bash scripts/check-app-builds.sh → PASS
- 18/18 boundary gates green