Every fix so far only applied to reports generated after deploy. The cached report is served verbatim, so it keeps the recommendation the OLD build stored — quoting the legacy policy book, naming a rejected exit as "recommended", and carrying no basis_lookback, which let the lookback selector default to 3y and put 3-year tiles beside an all-history recommendation with no divergence notice. Exactly the contradiction the last three commits set out to remove, silently present on the first page load after deploy and until the next scheduled run overwrote it. The recommendation is a pure function of the numbers already in the report — its own note says it is derived from them on every run — so it is now re-derived on read. A corrected recommendation appears immediately instead of after the next backtest. On failure it is dropped rather than falling back to the stored one, which is the stale derivation this replaces. The test drives the real shape: an old-build report with a legacy recommendation written straight to the settings row, read back through get_backtest_report. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>