Phase 3 push-wakeup mechanism without adding a new push channel.
Topic state transitions now post short messages to the same Fabric
announce channel used for the initial signup announcement. Agents
subscribed to announce + not currently busy get woken via the
existing Phase 1 inbound path; busy-discard already filters
appropriately. No SSE, no per-agent DM fanout, no plugin changes —
reuses existing infra end-to-end.
Changes:
- ticker.go: after signup_close transition, broadcasts signup_closed
(with pro/con/judge agent IDs + debate-start time) OR cancelled
(with reason). After debate_start transition, broadcasts debating
with debate-end time.
- announce.go: new PostLifecycleEvent helper - same headers/auth as
PostTopicAnnouncement, different format.
- verdict.go: after successful judge submission, broadcasts completed
with the judge id. Best-effort + async so a slow Fabric does not
slow the judge response.
- routes.go: instantiates the announcer once + passes to VerdictHandler.
Workflow participate-debate step 5 should be updated to expect
wakeups instead of polling - separate follow-up edit on lyn/ClawSkills.