Context
PR #156 introduced FactStore with TradeThesis persistence (Phase 1). The findings table schema is defined but not yet populated. Key analytical insights from ToolResult data are currently lost when the session ends.
Goal
Extract discrete Finding records from successful ToolResult objects during each query and persist them to fact_store.findings. This enables ticker-based recall of past insights (e.g. "what did we learn about AAPL's earnings last time?") without relying on free-text search.
Scope
- Implement
FactStore.save_finding() and FactStore.get_findings(entity, limit) CRUD methods
- Create the
findings DuckDB table (schema already sketched in Phase 1 plan)
- Extract findings from
ToolResult.data in ConversationEngine._persist_facts() — focus on trade_thesis, news, and fundamentals tool results
- Add unit tests to
tests/memory/test_fact_store.py
Non-goals
- LLM-based finding extraction (keep it zero-LLM-cost for now — parse structured
ToolResult.data directly)
- UserPreference extraction (separate Phase 3 issue)
Context
PR #156 introduced
FactStorewithTradeThesispersistence (Phase 1). Thefindingstable schema is defined but not yet populated. Key analytical insights fromToolResultdata are currently lost when the session ends.Goal
Extract discrete
Findingrecords from successfulToolResultobjects during each query and persist them tofact_store.findings. This enables ticker-based recall of past insights (e.g. "what did we learn about AAPL's earnings last time?") without relying on free-text search.Scope
FactStore.save_finding()andFactStore.get_findings(entity, limit)CRUD methodsfindingsDuckDB table (schema already sketched in Phase 1 plan)ToolResult.datainConversationEngine._persist_facts()— focus ontrade_thesis,news, andfundamentalstool resultstests/memory/test_fact_store.pyNon-goals
ToolResult.datadirectly)