refactor: unify capture-health on a single live source
Move capture-health derivation into `think/capture_health.py` as a pure
read-time pull from the observer registry. `/api/system/status` and the
home Pulse page now share this one function, and the thresholds live in
exactly one place. Exception-safe: falls back to "unknown" rather than
propagating observer-side errors.
Remove the `awareness.capture` cache key and the P1 "Capture may be
offline" chat-bar banner / triage injection — a frozen-cache read was the
only thing keeping it alive. The awareness-tender and triage/chat talents
no longer emit or advise on a capture section.
Home-page pulse vitals now use the live status vocabulary directly
(`active`/`stale`/`offline`/`no_observers`/`unknown`), and the dot-class
CSS renames `.ok` to `.active` to match. `no_observers` renders as
"no observers" in display text.