v1.7.0 — live roster / presence
Who is on an A2A channel right now. announce(principal, channel) heartbeats a live seat; roster(channel, within=) lists subjects seen in the window. Gated by the same scopes as the messages (announce = post, roster = read), opaque denial, and soft state that ages off and is never a grant, so an orchestrator can dispatch only to live workers and notice a dark one. Additive; 301 tests, mypy --strict, ruff, catalog freshness green.