33a6e77f0e
An opt-in whole-fleet observer, separate from the 250ms delivery poller. One AgentControl.list and one roster snapshot per tick, joined and fed to the FleetHealth classifier, because a fault is a disagreement between the two views at the same instant. Absent a health: block nothing is built and no herdr call is made. Adds bridge_list healthCoverage: off, detection-only, or full. Detection is deliberately separate from notification, so a single-lead setup with no webhook still gets detection and is told its coverage is partial rather than being refused. Two review fixes worth naming. tick() rescheduled itself as its last statement with no try/catch, and a ScheduledExecutorService does not re-run a task that threw — so the first agents.list failure would have stopped health permanently and silently, which is exactly when the control link is down. It now catches Throwable and reschedules in a finally. And the snapshot fields this unit cannot supply are the named constant NOT_YET_OBSERVED rather than bare false literals, because false means no fault to this classifier.