f/AGENTS.md

2.1 KiB

Project notes for agents

Relaunch the Streamlit server after changing ANY module other than app.py

The UI server runs on the fixed port 8599 (started by run.sh or fundlab/server_watchdog.sh, which keeps it alive every 5 min).

Streamlit hot-reloads app.py on edit, but imported modules (metrics.py, data.py, portfolio.py, tax.py, fundlab/*, ...) stay cached in sys.modules for the process's whole lifetime. After editing any of those, the live server keeps running the OLD code paired with the NEW app.py — a classic symptom is a cryptic TypeError / AttributeError on the page even though tests/test_app.py passes (it spins up a fresh AppTest process).

After touching anything app.py imports, relaunch the server:

cd /mnt/Backup/prog/f
pkill -f 'streamlit run app\.py'; sleep 3
setsid nohup .venv/bin/streamlit run app.py --server.port 8599 \
  --server.headless true --browser.gatherUsageStats false \
  >> fundlab/streamlit.log 2>&1 < /dev/null & disown
# wait for health:
curl -s http://127.0.0.1:8599/_stcore/health   # -> ok

(Or just pkill it and let the watchdog relaunch within 5 min.) Note: setsid ... & from a short-lived shell may die with the shell in some harnesses — if the health check never answers, retry the relaunch from a longer-lived command.

Verify on the LIVE server with the browser test (server must be running):

.venv/bin/python tests/test_e2e_browser.py

Tests

  • .venv/bin/python tests/test_app.py — AppTest suite (no server needed).
  • .venv/bin/python tests/test_e2e_browser.py — Playwright against the live 8599 server.
  • Both back up / restore settings.json; neither starts the server (e2e) or needs it (test_app).

Conventions

  • Risk-free rate = BIL (SPDR 1-3 Month T-Bill) daily total return from the data bundle — the single tool-wide convention for rf (fundlab/decompose.rf_series() is the reference). Statistics tab Sharpe/Sortino/alpha are in excess of it (metrics.excess()). Do not introduce fixed/constant rf rates elsewhere.
  • Data root is ~/prog/fin/stocks; symbols in the bundle are lowercase.