Files
Vijay Janapa Reddi e2458f311d feat(tools): Playwright smoke-test harness for live-site verification
Introduces tools/release-smoke/ — a headless-Chromium smoke harness for
validating the live state of every mlsysbook.ai sub-site after a publish.

Each site in sites.json declares expected title, optional H1, headings,
additional pages, and a wait-strategy hint (WASM-heavy sites like /labs/
use 'domcontentloaded' since 'networkidle' never settles on long-lived
marimo sockets). For each site the runner:
  - fetches the landing URL
  - asserts HTTP 200, title match, optional H1 match
  - verifies expected headings render
  - collects every same-origin <a href> and HEAD-checks each
  - fetches each declared additional page
  - captures a full-page screenshot
  - captures console errors, page errors, failed requests

Output: reports/smoke-<ISO>.json + screenshots/<site>-<ISO>.png.
Exit code is non-zero iff any site had a hard error (title mismatch,
missing expected heading, missing additional page, uncaught JS error).

Used to verify the initial release train of instructors, slides,
mlsysim, and labs. Cross-site broken links that point to not-yet-
launched sub-sites (/staffml/, /about/, /community/, /vol1/, /vol2/)
are reported but treated as soft warnings.
2026-04-21 18:20:02 -04:00

73 lines
1.7 KiB
JSON

{
"instructors": {
"url": "https://mlsysbook.ai/instructors/",
"titleIncludes": "Blueprint",
"expectedH1": "The AI Engineering Blueprint",
"expectedHeadings": [
"Course Materials",
"Teaching Resources",
"Syllabi"
],
"additionalPages": [
"course-map.html",
"getting-started.html",
"pedagogy.html",
"foundations-syllabus.html",
"scale-syllabus.html",
"tinyml-syllabus.html",
"ta-guide.html",
"faq.html",
"assessment.html",
"customization.html"
]
},
"slides": {
"url": "https://mlsysbook.ai/slides/",
"titleIncludes": "Slides",
"expectedHeadings": [],
"additionalPages": []
},
"staffml": {
"url": "https://mlsysbook.ai/staffml/",
"titleIncludes": "StaffML",
"expectedHeadings": [],
"additionalPages": []
},
"mlsysim": {
"url": "https://mlsysbook.ai/mlsysim/",
"titleIncludes": "MLSys",
"expectedHeadings": [],
"additionalPages": []
},
"labs": {
"url": "https://mlsysbook.ai/labs/",
"titleIncludes": "Labs",
"waitUntil": "domcontentloaded",
"expectedHeadings": [],
"additionalPages": [
"vol1/lab_00_introduction/",
"vol1/lab_01_ml_intro/",
"vol2/lab_01_introduction/",
"vol2/lab_02_compute_infra/"
]
},
"tinytorch": {
"url": "https://mlsysbook.ai/tinytorch/",
"titleIncludes": "TinyTorch",
"expectedHeadings": [],
"additionalPages": []
},
"book": {
"url": "https://mlsysbook.ai/book/",
"titleIncludes": "Machine Learning Systems",
"expectedHeadings": [],
"additionalPages": []
},
"kits": {
"url": "https://mlsysbook.ai/kits/",
"titleIncludes": "Kits",
"expectedHeadings": [],
"additionalPages": []
}
}