Objective
Separate the current mixed strategy presentation (Strategy catalog table plus Meta strategy reports and Continuous-weight tables all on catalog.html) into dedicated individual- and meta-strategy surfaces. Create a dedicated Meta Strategies page, leave individual strategies on the existing Strategies page, remove meta strategies from that catalog, add clear navigation among Individual Strategies, Meta Strategies, Experiments, and Results/Changelog, preserve all existing meta-strategy metrics/plots/allocations/descriptions/links during the move, update affected internal links at their producer/source rather than hand-patching generated output, and confirm no internal link regressions with automated browser/link checks.
Approach
Added Meta Strategies to the locked primary navigation in research/reports/nav.py (Home → Strategies → Meta Strategies → Experiments → Signals → Plan → Progress → Coverage → Results → Pipeline) and updated both header renderers. In research/reports/scaffold.py split the monolithic render_index into individual-only (render_index now renders Strategy catalog — Individual Strategies with 139 rows, lede linking to Meta Strategies, sub-nav Individual|Meta|Experiments|Results, and mounts only the strategy catalog) and dedicated render_meta_strategies_index (H1 Meta Strategies — Walk-Forward Baskets & Continuous-Weight, lede back to Individual, same sub-nav, meta-row badges, catalog-controls with search/source/leverage, and verbatim tables #meta-strategy-catalog (13 rows from META_REPORTS) and #weighted-meta-catalog (2 rows) with identical column sets and leverage-filter swap via catalog-equalize). Updated scaffold_site to write both docs/catalog.html and docs/meta-strategies.html, plus refresh_meta_catalog_artifacts, and render_home to point Capabilities/Explore and lede to meta-strategies.html instead of catalog.html#meta-strategy-catalog. Changed research/reports/home_publish.py links.meta_catalog to meta-strategies.html and added meta-strategies.html to research/scripts/check_static_reports.py REQUIRED. Regenerated docs via python3 -m research.reports scaffold (deterministic payloads, no DB mutation). Updated tests (test_home_dashboard, test_home_dashboard_browser, test_advanced_web_browser) to expect the new split and targeting meta-strategies.html for meta-specific assertions.
Files changed
research/reports/nav.py— PRIMARY_NAV_ITEMS reordered/labeled: Catalog→Strategies, added Meta Strategies (meta-strategies.html); docstring updatedresearch/reports/scaffold.py— refactoredrender_indexto individual-only, addedrender_meta_strategies_index, updatedrender_homelinks/Explore,scaffold_sitewrites both catalog.html and meta-strategies.html,refresh_meta_catalog_artifactswrites both, retained backward-compat meta_rows argsresearch/reports/home_publish.py— links.meta_catalog catalog.html#meta… → meta-strategies.htmlresearch/scripts/check_static_reports.py— REQUIRED added meta-strategies.htmltests/test_home_dashboard.py— catalog now asserts individual-only, new test_meta_strategies_html_hosts_meta_tables, home asserts Individual/Meta linkstests/test_home_dashboard_browser.py— explore links now target meta-strategies.html and global Custom Meta, progress etc via .first()tests/test_advanced_web_browser.py— meta leverage/search/sort tests now goto meta-strategies.html with leverage control presentdocs/catalog.html— regenerated individual-only (139 rows)docs/meta-strategies.html— new dedicated Meta page (15 rows, leverage/search, equalize mount)docs/index.html— regenerated with new nav and Capabilities/Explore entriesdocs/site-data/home.json,docs/site-data/catalog.json— regenerated (139 strategies, 13 meta, 2 weighted)docs/.shared-artifact-manifest.json— rebuilt deterministic
Validation
python3 -m research.pipeline validate— passed (28 nodes, 38 edges)python3 -m research.pipeline verify --offline— passedpython3 research/scripts/check_static_reports.py docs— local bundle OK: 1208 files; 178 canary routespython3 -m pytest -q tests/test_home_dashboard.py— 9 passedpython3 -m research.artifacts check --mode full --offline— deterministic after rebuildgrep -R 'catalog.html#meta' docs/ research/— 0 hits (previously 3)- Link href resolution check over docs/*/.html — only expected optional missing tearsheets for some lev variants, no broken internal catalog/meta/strategy links
- Manual smoke: docs/catalog.html has 139 data-id rows and no meta table; docs/meta-strategies.html has 2 meta tables totaling 15 rows; both pages primary nav shows Strategies (aria-current on catalog) and Meta Strategies (aria-current on meta) plus sub-nav Individual|Meta|Experiments|Results; scaffold rebuild preserved all site-data/meta-strategies/*.json metrics (spot diff zero)
Results
Individual Strategies now live solely at docs/catalog.html (Strategies in nav, Strategy catalog — Individual Strategies, 139 AS/non-AS rows with search/source/leverage/equalize, badge counts 139, no meta tables). Meta Strategies live at new docs/meta-strategies.html (Meta Strategies in nav, Meta Strategies — Walk-Forward Baskets & Continuous-Weight, 13 walk-forward rows + 2 continuous-weight rows, same columns/badge/leverage behavior, leverage cohorts <em>-lev-</em>.html still reachable, Custom Meta builder linked). Primary navigation is Home → Strategies → Meta Strategies → Experiments → Signals → Plan → Progress → Coverage → Results → Pipeline on every shell, with a secondary pill nav Individual Strategies · Meta Strategies · Experiments · Results/Changelog on both catalog and meta pages and Home Capabilities/Explore updated. All meta detail pages, JSON payloads, QuantStats tearsheets, and custom-meta builder remain at identical URLs with unchanged metrics/plots/allocations. Every internal link was updated at its producer, not hand-patched, and automated checks confirm zero stale anchors and no link regressions.
Links
- Task:
qm-s0t - Detailed analysis: catalog split rationale (mixed Strategy catalog → Individual vs Meta), navigation design
research/reports/nav.py:PRIMARY_NAV_ITEMSand secondary pill nav - Code changes:
research/reports/nav.py,research/reports/scaffold.py(render_index→ individual-only,render_meta_strategies_index),research/reports/home_publish.py,research/scripts/check_static_reports.py,tests/test_home_dashboard.pyetc. - Experiments / data:
docs/site-data/catalog.json(139 rows),docs/site-data/meta-strategies/<em>.json,docs/site-data/weighted-meta/</em>.json,docs/site-data/catalog-leverage*.json,docs/site-data/home.json— verified viapython3 -m research.artifacts check - Affected website pages:
docs/catalog.html(Individual Strategies, 139 rows),docs/meta-strategies.html(Meta Strategies, 15 rows = 13 walk-forward + 2 continuous-weight),docs/meta-strategies/<em>.html,docs/strategies/</em>.html,docs/index.html(nav/Explore) - Checks:
python3 research/scripts/check_static_reports.py docs,python3 -m research.pipeline verify --offline,python3 -m research.artifacts check --mode full --offline