Objective
Maintenance_execution for qm-yn3d: full end-to-end validation of the static site after the Results/Changelog, strategy-class separation, leverage/rolling-lookback, and experiment-chart changes. Constraints: profile maintenance with modifiers web and public_artifact — do not mutate data/market.sqlite, do not log secrets, do not hand-edit docs/research/catalog-canary/**, docs/strategies/index.html, or docs/.shared-artifact-manifest.json; use only canonical producers.
Approach
- Served
docs/locally viapython3 -m http.server --directory docs --bind 127.0.0.1 8788(8787/8765 were occupied by unrelated bundlers; 8788 is the validated origin). Smokedindex.html,results.html,allocatesmartly-strategies.html,other-strategies.html,allocatesmartly-meta.html,other-meta.html,meta-strategies.html,experiments.html,research.html,catalog.html, plus 2–3 detail pages each ofresults/,strategies/,meta-strategies/,experiments/,research/catalog-canary/via HTTP 200 checks over 22 URLs. - Browser-exercised with real Playwright Chromium (headless,
--no-sandbox) at desktop1280x800and mobile375x812. For each viewport visited the same 23 pages, waited fornetworkidle, measuredcanvas/svg/tablepresence, captured full-page screenshots to/tmp/qm-yn3d-evidence/{desktop|mobile}-*.png, and recorded console errors and 4xx responses tosummary.json. Used the same harness to verify Historical Results/Changelog newest-first ordering againstsite-data/results.json(517 entries, firstqm-b6tc2026-08-22T15:49:00Z), strategy-class separation againstsite-data/catalog.json(133family=asvs 6family=other), and JS routing viadocs/assets/js/site.js. - Checked Meta pages (3) for charts/canvas (5–6), tables (2–4), allocations, and links; checked experiment pages (3) for signal plots (
canvas/svgpresent, 2 each, no JS errors); verifiedresearch/catalog-canary/index.htmlmanifest and payload rendering. - Ran gates:
python3 research/scripts/check_static_reports.py docs→ local bundle OK: 1415 files; 183 canary routespython3 -m research.artifacts check --mode full --offline→ shared artifacts deterministic and currentpython3 -m pytest -q tests/test_reports_coverage.py tests/test_reports_export.py tests/test_reports_pages.py tests/test_reports_scaffold.py tests/test_site_ia.py tests/test_site_internal_links.py tests/test_as_verify.py→ 118 passed
Regression Found and Fixed
Playwright reported 6 failures: every docs/results/*.html detail page loaded results/assets/css/site.css (404) instead of ../assets/css/site.css, with console error "Failed to load resource: the server responded with a status of 404". Root cause was research/reports/results.py::_render_detail using render_site_header(current="results") with empty root_prefix and inline <link rel="stylesheet" href="assets/css/site.css" />. The fix was a producer-only change:
research/reports/results.py—_render_detailnow callsrender_site_header(root_prefix="../", current="results")and emits<link rel="stylesheet" href="../assets/css/site.css" />, matching theexperiments/detailpattern (root_prefix="../").
No hand-edits to generated docs/ were made; the site was rebuilt via canonical producers:
python3 -m research.reports.results(equivalentlypython3 -m research.reports build --render)
Re-ran the 23-page Playwright harness after rebuild: all 46 viewport-page loads returned 200 with 0 failed requests and 0 console errors; strategies/<em>.html retained 6 canvases/2 tables, meta-strategies/meta-</em>-lev-<em>.html 5 canvases/4 tables, experiments/</em>.html 2 canvases each, with correct payload payloads.
Files Changed
research/reports/results.py— fix Results-detail asset/header prefix (CSS andrender_site_headernow../)research/results/qm-yn3d.md— this durable task note (new)docs/site-data/results.json— regenerated (517 → 518 entries; newestqm-yn3d)docs/results.html— regenerated index (518 entries, newest-first)docs/results/qm-yn3d.html— new detail page for this validationdocs/results/*.html(517 existing detail pages) — regenerated with corrected../assets/css/site.cssand../index.htmlbrand link
No changes to data/market.sqlite, docs/research/catalog-canary/**, docs/strategies/index.html, or docs/.shared-artifact-manifest.json beyond deterministic rebuilds.
Validation
python3 research/scripts/check_static_reports.py docs— 1415 files OK post-rebuildpython3 -m research.artifacts check --mode full --offline— deterministic (11 artifacts)- Focused pytest suite (reports/site/as_verify) — 118 passed
- HTTP smoke — 22 URLs 200 OK,
site-data/results.jsonnewest-first,site-data/catalog.jsonfamily/tab/source counters verified - Playwright browser evidence at 1280x800 and 375x812 — 46 screenshots in
/tmp/qm-yn3d-evidence/,summary.jsonwith 0 404s post-fix, charts/tables proven viacanvas/svgcounts: strategies/aaa.html,haa-simple.html,sixty-forty.html— 6 canvases eachmeta-strategies/meta-target-risk-6040-lev-2.html,meta-target-cagr-sp500-lev-2.html— 5 canvases, 4 tablesexperiments/qm-kdnj.2.html,qm-wpx5.html,qm-aaaz.html— 2 canvases each (signal plots) with no JS errorsresults/qm-b6tc.html,qm-wpx5.html,qm-g7jk.html— body renders, metadata badges correct,../assets/css/site.cssloadsresearch/catalog-canary/index.html— canary table renders
Results
All acceptance criteria were exercised with executable browser proof at both viewports; gates pass without drift; the single Results-detail CSS regression was repaired via the producer and reverified; research/results/qm-yn3d.md and docs/site-data/results.json now reflect the validation and appear newest-first in results.html.
Risks / Limitations
The full python3 -m pytest -q suite is heavy and times out at 300s in this environment; the smallest-relevant focused suites were used per Main's guidance (reports + site + as_verify) and the browser harness covers the remaining web-contract proof. Existing data/market.sqlite (74.9 MiB) was preserved read-only throughout.