The TriangleCrisisEventQueue was populated by tick_triangle_escalation but never drained into ObserverSnapshot — clients always saw an empty vec despite protocol v16 advertising the field. Now drains the queue each tick and converts to TriangleCrisisEventWire. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>