- auto_detect_facts() scans chat turns for factual content (IPs, paths,
services, config changes, hardware refs) using pattern matching
- check_fact_conflicts() cross-references detected facts against stored
FTS5 memories — when a contradiction exists (same topic, diff value)
the system surfaces a rag_update_suggestion in the done SSE payload
- Frontend shows a floating notification banner comparing old vs new
fact with Update/Dismiss buttons
- confirm_fact_update() replaces the memory + re-embeds/re-indexes
the Qdraft entry on user confirmation
- Silent auto-ingest (memories + Qdrant) when no conflict exists
- Frontend: msg-toolbar opacity 0→0.35 for visibility
- Move all eviction logic (evict_batch, maybe_evict, EVICTION_LOG,
get_collection_count/stats, get_rag_operational_stats) into eviction.py
- Move QDRANT_URL, RAG_COLLECTION into config.py to break circular dep
- rag.py re-exports eviction symbols for backward compatibility
- Router imports updated to use eviction module directly
- All 130 tests pass
EMBED_URL in rag.py hardcoded the IP and port instead of using
LLAMA_SERVER_BASE, so the env var JARVISCHAT_LLAMA_SERVER_BASE
was ignored for embedding requests.