Stateless conversation_history hydration:
- Dedup guard prevents double user-turn on stateless replays
- History hard-cap (max_messages) stops unbounded context growth
- null content normalised to '' (OpenAI tool_calls entries)
- Multipart/vision array content flattened to text in hydration + compactor
Robustness:
- askAI() and routeThroughPipeline() now catch \Throwable, not just \Exception
- RAG-to-orchestrator reroute unsets stale conversation_history key
- Conversational maxTokens configurable via options/config (was hard-coded 200)
- Caller contract documented on hydrateConversationHistory (lowercase roles required)
Tests:
- 12 new unit tests in ConversationHistoryHardeningTest
- Full suite: 1360 tests, 7684 assertions — all green