- Fix HP007/HP013: add 'drawdown', 'biggest holding', 'top holdings' to
performance keyword lists so these queries route to portfolio_analysis
- Fix MS005: use word-boundary regex for short city tokens (sf, atx, dfw)
to prevent 'sf' substring-matching inside ticker symbols like 'MSFT',
which was incorrectly routing to real_estate_snapshot
- Fix MS010: route full_report_kws to performance+compliance+activity
(was 'compliance' only, missing transaction_query for 'recent activity')
- Fix sc-004: add common 'portfolio' typos (portflio, porfolio, etc.) to
natural_performance_kws for robustness against misspellings
- Fix MS005 (part 2): add 'worth today', 'worth now', 'currently worth'
to market_kws so cost-basis-vs-current-price queries trigger both
portfolio_analysis and market_data
All eval suites now pass: 182/182 pytest, 60/60 run_evals, 25/25 golden sets
Made-with: Cursor
Follow-up questions like 'how does this compare to inflation?',
'is that good?', 'what does this mean?' were NOT being detected
as context_followup because the old check only had 8 hardcoded
phrases (e.g. 'how does that compare' but not 'how does this compare').
This caused every follow-up to fall through to 'performance',
call portfolio_analysis again, and return the same portfolio
summary regardless of what the user actually asked.
Added a broader _broad_followup_phrases list (35 patterns) covering:
- 'how does this/that/it compare'
- 'what does this/that mean'
- 'is that good/bad/normal/high/low'
- 'compared to inflation/the market'
- 'why is that', 'break that down', etc.
Confirmed with runtime logs: old_phrase_matched=false for the
follow-up, broad_phrase_matched=true, tools_used=[] (correct).
Made-with: Cursor
- Market calendar event chips: change flex-wrap from nowrap to wrap
so chips that don't fit stack to the next line instead of overflowing
off the right edge of the screen
- Market calendar container: switch overflow-x:auto → hidden + flex-wrap
so the strip itself never causes horizontal scroll
- Empty state: change justify-content from center to flex-start + add
overflow-y:auto so tall quick-grid content scrolls instead of being
clipped above/below the viewport on shorter screens
Made-with: Cursor
package.json in repo root caused Nixpacks to detect Node.js instead
of Python, breaking the uvicorn start command. nixpacks.toml pins
the provider to python so the agent deploys correctly.
Made-with: Cursor
The merge commit accidentally deleted apps/api/src (NestJS backend),
libs/common/src/lib, libs/ui/src/lib, package.json, nx.json, and all
tsconfig files — causing the API server to fail at build time.
Restored all 667 files from pre-merge commit cdee7514d so the
Ghostfolio API starts cleanly on port 3333 and ghostfolio_reachable=true.
Made-with: Cursor
- Created agent/evals/conftest.py: autouse fixture patches teleport_api._fetch_from_teleport
and search_city_slug to bypass all live HTTP calls during tests
- Tests now use HARDCODED_FALLBACK data for all cities (deterministic, instant)
- Created agent/pytest.ini with asyncio_mode=strict and testpaths=evals
- All 126 tests collected and passing: 0 failures, 0 skips
Made-with: Cursor
Remove 'total net worth' and 'everything i own' from wealth_net_worth_kws
so they fall through to property_net_worth_kws which runs property tracker
and shows the complete financial picture template.
Add 'show my total net worth' and related phrases to property_net_worth_kws.
Made-with: Cursor