- 根拠:
src/formula_screening/cli.pyはpayloadが空だとreturnし、docs/assets/screening.jsonと--json指定先の保存処理まで到達しない。ARCHITECTURE.mdはscreen実行後にdocs/assets/screening.jsonを常に生成すると説明している。
- 影響:
- 実際には該当銘柄が 0 件でも、GitHub Pages は前回の銘柄一覧を表示し続ける。
--jsonを使う自動処理でも、0 件の正しい結果ではなく未更新ファイルまたは古いファイルを読む可能性がある。
- 改善方針:
- 空配列でも
_GH_PAGES_JSONとargs.jsonへ必ず保存してからメッセージ表示へ進む。 payload=[]のときに両方の保存先へ[]が書かれる CLI テストを追加する。
- 空配列でも
- 根拠:
ARCHITECTURE.mdは diagnostics をログ用途で、結果生成自体は継続すると定義している。rust/src/lib.rsは payload 生成前に全対象銘柄へcollect_missing_metric_diagnostics()を実行する。rust/src/lib.rsは diagnostics 内でpreferred_share_flag(stock)?を呼び、has_preferred_shares=2.0のような不正値を即エラーにしている。
- 影響:
- フィルタで落ちる銘柄に不正な優先株フラグが 1 件あるだけで、本来表示できるヒット銘柄まで返せなくなる。
- diagnostics 追加前より通常 CLI の失敗条件が広がっており、設計説明とも一致しない。
- 改善方針:
- diagnostics は失敗を伝播させず、
invalid_fieldsのような診断へ落とすか、少なくとも payload 生成と切り離す。 - 「非ヒット銘柄に不正
has_preferred_sharesがあってもヒット payload は返る」回帰テストを追加する。
- diagnostics は失敗を伝播させず、
- 根拠:
ARCHITECTURE.mdはmagic_numbers.tomlでfcf_years/peg_trailing_years/peg_blended_actual_yearsを管理すると説明している。config/magic_numbers.tomlもその値を持つ。- Python 比較経路は
src/formula_screening/screener.pyで設定値を使っている。 - 一方、通常運用の Rust 経路は
rust/src/lib.rsとrust/src/lib.rsで10/6/5を直接埋め込んでいる。
- 影響:
- 設定値を変えても、実際にユーザーが使う CLI と公開 API の結果は変わらない。
- Python 比較経路との乖離が静かに広がり、将来の検証が誤った前提で通る。
- 改善方針:
- Rust 側へ typed config を渡すか、期間値を戦略/CLI の明示入力に寄せて、主経路と比較経路で同じ source of truth を使う。
- 設定値を変更した fixture で Rust-backed 経路の期間が追随する契約テストを追加する。
- 根拠:
src/formula_screening/screener.pyのrun_screening(conn, ...)は ticker と name だけを受け取ったconnから読み出す。- 実データ読み込みは
src/formula_screening/screener.pyの_screen_chunk()で行い、ここでは常にget_connection(STOCKS_DB_PATH)を開いている。
- 影響:
- 呼び出し側が一時 DB や検証用 DB を渡しても、財務値と価格だけは本番 DB から読み込まれる。
- names/tickers と metrics の出所が分かれ、比較経路の検証結果を信用できない。
- 改善方針:
run_screening()から DB path または connection factory を_screen_chunk()へ明示的に渡す。- 一時 DB を渡したときにその DB だけが使われるテストを追加する。
formula_screeninguv run pytest -q-> 50 passedcargo test-> 4 passednpx tsc --noEmit-> passed
stock_db関連契約uv run pytest -q tests/storage/test_prices.py tests/test_market_calendar.py-> 22 passedcargo test screening-> 0 tests matched
stock_web_ui関連契約uv run pytest -q tests/test_serve.py tests/test_page.py tests/test_handler.py-> 12 passednpm run typecheck-> passednpm run test:ui-> 10 passed
stock_db/rust/src/screening.rsには直接の unit test がなく、cargo test ... screeningでも該当テストは走らない。Rust-backed 主経路のデータ組み立ては、現状ほぼformula_screening側の E2E 契約テストに依存している。