Backtest reporting checklist — ForexBot2 (XAU/USD)
==================================================
Every backtest report must record:
- The exact command line (window, --primary-tf, --spread, and any --set /
  --quality / --strategies / --confirm-tfs overrides) and the "Backend:" log line.
- Trades, total R, win rate, profit factor and max drawdown for the whole
  window AND for both halves, at both cost conventions ($0.65 measured-Oanda
  headline, $0.30 cross-book comparability) — CLAUDE.md rule 1.
- Per trade (the exported CSV already carries these): entry/exit time and
  price, exit reason, R multiple, MFE/MAE, entry reasons, and every
  indicator's signal / value / agreement at decision time.
- Breakdowns by session/hour, weekday, regime and volatility regime
  (backtest/research/book_report.py) and, for any candidate change, the
  removed/added/shifted trade diff against the control book
  (backtest/research/book_diff.py).
- The md5 of the exported book whenever the run is a parity or regression check.
Replays go through the real signal code (analyze_from_dataframes) — never a
re-implementation.


--- 2026-09-06: decision-time feature export ---
- `--export-features` appends stake_multiplier, r_sized and the 65 `f_*` decision-time
  features (position_sizing.FEATURE_ORDER) AFTER the 63 pinned columns; default export is
  byte-identical to the pinned books. Use backtest/research/book_report.py for weekday /
  hour x weekday / session / streak / rolling-WR / feature-quintile (both halves) tables,
  backtest/research/burst_map.py for the burst-by-hour map, and
  backtest/research/sizing_model.py for the walk-forward + shuffle-control harness.
- Any sizing report must show the FLAT book and the SIZED book side by side and the
  label-shuffle null; the 2026-09-06 campaign verdict (nothing ships) is the reference.
