Objective
Legacy experiments qm-3i4, qm-4bx.13/14/15/16/17/18/19, qm-pft.1/2, qm-wr6.1/2, qm-a3a had inputs persisted (MAHX/MALX, HIGN/LOWN, S5FI, USI:UVOL/USI:DVOL, VIX family, WSHOSHO/WALCL per gap audit) but docs/site-data/experiments/
Approach
Extended research/reports/experiments.py with read-only helpers (_exp_coverage_meta, _build_coverage via connect_readonly, _build_monthly from equity pct_change, _build_alloc_charts, _build_performance/_verify/_trading_costs/_tax_analysis, _strategy_parity_blocks) and merged parity blocks into both main payload loop and _manifest_entry, preserving daily equity shape. Updated research/reports/scaffold.py:render_experiments_index to emit a parity table scaffold (id experiments-parity-table) with 8 columns. Updated docs/assets/js/site.js:QMSite.mountExperimentsIndex to populate the table from payload.stats and trading_costs. Regenerated payloads via write_experiments_payload and scaffold, rebuilding deterministic shared artifacts.
Files changed
- research/reports/experiments.py – added strategy-parity block builders and merged into payload entries
- research/reports/scaffold.py – added parity table scaffold in render_experiments_index
- docs/assets/js/site.js – mountExperimentsIndex now renders parity tbody (CAGR/Sharpe/Sortino/MaxDD/turnover/fees/Rebal)
- docs/experiments.html – generated scaffold now includes parity table wrap
- docs/site-data/experiments/index.json + per-experiment qm-*.json (14 legacy ids) – now contain parity keys with coverage.db_path=data/market.sqlite
- .shared-artifact-manifest.json – rebuilt deterministically
Validation
- python3 -m research.artifacts check --mode full --offline → shared artifacts are deterministic and current (after build 11 artifacts)
- python3 research/scripts/check_static_reports.py docs → local bundle OK: 1242 files; 178 canary routes
- python3 -m pytest -q tests/test_engine.py tests/test_datastore.py → 60 passed
- Legacy parity checks: 14/14 ids have monthly/equity/alloc/alloc_ours/performance/verify/trading_costs/coverage; coverage tickers map to gap audit (e.g., qm-4bx.16 MAHX/MALX, qm-4bx.17 UVOL/DVOL, qm-4bx.19 WSHOSHO)
- HTML/JS parity scaffold: experiments-parity-table present in docs/experiments.html and site.js
Results
Each legacy experiment payload now exposes strategy-parity shape (monthly labels/ours, alloc charts, performance with monthly maxDD fallback, verify not_applicable, trading-costs/v1 with avg_daily_turnover/avg_yearly_fees, coverage with read-only instruments/macro_series_meta provenance, tax_analysis stub). The experiments index renders a parity table with CAGR/Sharpe/Sortino/MaxDD/turnover/fees/Rebal populated by QMSite.mountExperimentsIndex. No DB mutation, no hand-edited payloads, offline build preserved.
Links
- Task: qm-5sbr
- Producer: research/reports/experiments.py, research/reports/scaffold.py
- Site: docs/experiments.html, docs/assets/js/site.js, docs/site-data/experiments/