Backend:
- Full multi-round LLM Council debate (4 agents + Supervisor) with real-time Firestore writes
- Council runs before report generation; report uses council consensus as context
- 10-key Groq pool with immediate rotation on rate limit (no blocking wait)
- PDF parsing: top-5 only, concurrent via asyncio.gather, 8s timeout (was 30s sequential)
- Endpoint returns session_id instantly, no blocking Firestore write in async handler
- Knowledge graph: CITES, REPLICATES, CONTRADICTS, RAISES_QUESTION edges + OpenQuestion nodes
- Chat agent: conversational RAG across all fetched papers with history
- Council + chat + debug endpoints added to research router
- CORS: allow_origins=["*"] to prevent preflight stalls on Windows
Frontend:
- LLM Council Debate Lab page (/session/[id]/council) with live Firestore subscription
- ChatPanel: conversational interface alongside papers tab
- KnowledgeGraph: concentric ring layout, custom nodes with icons, 7 edge types, stats bar, full legend
- Stepper…