- Fix#1 (Critical): evaluate_retreat() deadlock — changed _retreat_lock to
threading.RLock() to allow reentrant acquisition when evaluate_retreat()
calls get_429_rate() while holding the lock
- Fix#2 (Major): Dashboard queue chart now uses snap.queue.per_priority
instead of Math.random() mock data
- Fix#3 (Major): structlog uses JSONRenderer instead of ConsoleRenderer
for JSON-format output as required by acceptance criteria
- Bonus: webui.py _build_snapshot() now async and includes queue data
with per-priority depth for dashboard consumption
Reviewed-by: 梁思筑 (architect)
Co-authored-by: multica-agent <github@multica.ai>