- 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
Replace market data impact story with personal property tracking story.
Update data sources to be accurate (remove detailed MLS tables,
add clear descriptions of what is featured vs background).
Update suggestion chips to match new UI.
Update test count to 100 deterministic passing tests.
Add new tool and eval files to the file table.
Made-with: Cursor