- Add _escape_braces() to all prompt builders to prevent str.format() crash
when user documents contain {placeholder} patterns
- Fix app_web.py display_query fallback to preserve clarification context
- Add empty-response guards to all 3 LLM providers (openai, anthropic, gemini)
- Replace all remaining direct dict access with .get() + defaults
- Add 2 regression tests for curly-brace format injection
- Expand query engine tests with display_query coverage
- 62 tests pass across 13 test files
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
fix: use .get() for all config access + add CLAUDE.md and docs to repo
- src/ingest.py: replace cfg["paths"]["vector_db"] and
cfg["paths"]["knowledge_base"] with .get() + defaults
- src/llm/__init__.py: replace cfg["llm"]["provider"] and
cfg["llm"].get(...) with safe llm_cfg = cfg.get("llm", {})
- src/search/__init__.py: replace r['authors'], r['title'], etc.
with .get() + defaults in web results formatter
- app_web.py: respect max_clarifications config (was hardcoded to
allow 1 round regardless of config)
- tests/test_setup.py: add missing assertions for retrieval.top_k
and retrieval.max_distance
- Add CLAUDE.md, docs/plans/, docs/WORKLOG.md to the repository
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Citation-verified research assistant with 6-layer anti-hallucination stack,
15 file format readers, 3 LLM providers, and dual CLI/Web interfaces.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>