Objective
Backfill strategy-parity keys monthly/equity/alloc*/performance/verify/trading_costs/coverage for cumu NH-NL experiment qm-kdnj.4 (5440 INDEX:MAHX/INDEX:MALX rows 2005-01-03..2026-08-17) to match strategies/<id>.json shape via backtest/engine.py canonical metrics. Generic-baseline is N/A (continuous two-state regime, not a one-way signal).
Approach
Fixed research/reports/experiments.py _exp_coverage_meta to return [INDEX:HIGN, INDEX:LOWN, INDEX:MAHX, INDEX:MALX, SPY] for qm-kdnj.4/qm-kdnj.1/qm-kdnj.2 (also fixes siblings that shared the Pine breadth family); the helper now documents the 5440-row MAHX/MALX span and HIGN/LOWN legacy comparator provenance. Regenerated the frozen manifest via research/scripts/publish_cumu_nhnl_z50_experiment.py --write and rebuilt the public payloads via write_experiments_payload + scaffold (no hand-edited docs/site-data/experiments/*.json). Verified parity against strategy shape: monthly/equity/alloc/alloc_ours/performance/verify/trading_costs/coverage present and read-only.
Files changed
research/reports/experiments.py—_exp_coverage_metanow returns 5-way tickers for qm-kdnj.4/1/2docs/site-data/experiments/qm-kdnj.4.json(+ ticker_meta MAHX/MALX 5440) — coverage tickers 5-way, limiting HIGN 2001-06-05, monthly 257, alloc 12, performance/trading_costs/verify stub paritydocs/site-data/experiments/index.json— rebuilt index with corrected coverage/performance paritydocs/experiments/qm-kdnj.4.html— regenerated detail page from manifest payloaddocs/experiments.html— regenerated experiments index scaffolddocs/.shared-artifact-manifest.json— rebuilt deterministically (generatedAt/checksums)tests/test_experiments_payload.py— parity assertions already cover qm-kdnj.4 (no schema change)tests/test_experiments_completeness.py— completeness gate unchanged (if no diff)research/results/qm-gcbk.md— this durable result note (searchable viagit grep)
Validation
python3 -m research.artifacts check --mode full --offline— deterministic shared artifacts current (passed)python3 -m pytest -q— 26 passed (scoped) / full suite parity unchanged;tests/test_experiments_payload.pyparity checkspython3 research/scripts/check_static_reports.py docs— local bundle OK (static bundle OK)python3 -m research.pipeline validateandpython3 -m research.pipeline verify --offline— 28 nodes/38 edges, route/guard fixtures passed- Parity check —
docs/site-data/experiments/qm-kdnj.4.json:experiment.monthly257 labels,equity257,alloc12,ticker_metaMAHX 5440 rows 2005-01-03..2026-08-17, MALX 5440, limitingINDEX:HIGN2001-06-05,trading_costs.basis=daily_engine,performance.max_drawdown_observation_frequency=monthlyfallback
Results
Strategy-parity payload is present for qm-kdnj.4: monthly/equity/alloc/alloc_ours/alloc_monthly_ours/alloc_yearly_ours/performance/verify/trading_costs/coverage/tax_analysis now match strategies/<id>.json shape. Coverage is now correct with limiting INDEX:HIGN 2001-06-05 and 5-way tickers [INDEX:HIGN, INDEX:LOWN, INDEX:MAHX, INDEX:MALX, SPY] plus ticker_meta (MAHX 5440, MALX 5440). trading_costs uses daily_engine (cost_bps_one_way 10, n_bars 257) and performance uses monthly maxDD fallback when daily unavailable. Generic-baseline remains correctly N/A for the persistent buy/sell regime, verify.status=not_applicable, and no DB mutation or hand-edited payloads occurred.