44888d6ede
feat(signal_v2-phase3b): main.py lifespan loads ChronosPredictor
...
AppContext.chronos field. lifespan: if KIS_APP_KEY set, load
ChronosPredictor(model_name=settings.chronos_model). Exceptions
during load logged + signal_v2 continues without chronos (other
endpoints unaffected). poll_loop receives chronos param.
45 tests pass.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-16 18:11:50 +09:00
b690900cfc
fix(signal_v2-phase3a): V1 KIS env pattern + test isolation fix
...
config.py: kis_env_type (virtual/real) + KIS_REAL_*/KIS_VIRTUAL_* env
variables (V1 호환). kis_app_key/kis_app_secret/kis_account properties
auto-select based on env type.
main.py: KIS not-configured warning uses descriptive message including
env type + expected var name.
test_main.py: monkeypatch load_dotenv to no-op + setenv empty string
(instead of delenv) — defeats .env re-read on importlib.reload.
Pre-existing test_startup_warns_if_webai_api_key_missing also fixed.
33/33 tests pass (was 31/33).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-16 10:25:58 +09:00
d85512d036
feat(signal_v2-phase3a): main.py lifespan integrates KIS client + WS
...
AppContext extended with kis_client + kis_ws. lifespan:
- If KIS_APP_KEY set: create KISClient + KISWebSocket, fetch portfolio,
subscribe WebSocket H0STASP0 for holdings.
- If unset: WARNING log, signal_v2 still serves /health (no KIS data).
- Shutdown closes kis_ws → kis_client → stock client in order.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-16 05:21:55 +09:00
e47947fb69
fix(signal_v2): await cancelled poll_task + public cache_size
...
Code review fixes:
- main.py lifespan: await poll_task after cancel() to avoid client
close racing with mid-fetch task (CRITICAL).
- stock_client: add public cache_size() method; main.py /health uses
it instead of private _cache attribute (IMPORTANT).
19 tests still pass. Deferred to Phase 7 backlog:
- _ctx singleton test isolation (importlib.reload provides isolation in practice)
- poll_loop interval floor (interval >= 60 by design)
- shutdown logging
- response schema validation
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-16 03:52:45 +09:00
94c684bab8
feat(signal_v2): pull_worker + FastAPI app + 2 integration tests
...
poll_loop: asyncio.gather parallel fetch of 3 endpoints (portfolio,
news_sentiment, screener_preview) + state update. main.py: FastAPI
lifespan creates StockClient/SignalDedup/shutdown.Event then spawns
poll_loop as background task. GET /health reports status, last poll
times, cache size.
Signal V2 test suite: 19/19 PASS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-16 03:49:50 +09:00