Owner's rule: backtest must run as soon as there's enough data to estimate an
investment — it must NOT be blocked just because some sources lack deep PIT
history. Scoring is deliberately flexible (a theme uses whatever subset of
factors was knowable that day).
- backtest_readiness: readiness = usable window (price + Siamchart + >=1 factor),
not all-factors-present. Missing factors still reported (transparency) but no
longer block the run. recommended_start = oldest executable price (oldest
history the system holds); recommended_end = last complete trading day.
- pit_scorer.theme_surprise_report: flexible — skips factors not released by
as_of; blocked only when NO factor has a value. pit_meta.partial_pit reflects
themes scored from a partial factor subset.
- Verified end-to-end: readiness ready=true (recommended 2024-01-03 -> 2026-08-29);
POST /api/v1/backtest/run default window returns 201 full result (1M -> final
equity 1,117,243.95), no 400 from missing factors.
- test_backtest_readiness updated to earliest-runnable semantics; full suite 369 green.