The subscribe modal (shared across the book, site, labs, kits, and
mlsysim subsites) was a plain div overlay:
- No role="dialog", aria-modal, or accessible name, so screen readers
never announced it as a dialog and could wander into the page
behind the overlay.
- No focus trap: Tab walked out of the modal into the visually hidden
background page.
- Focus was never returned to the triggering element on close, dropping
keyboard users at the top of the document.
- Open/close animations played regardless of prefers-reduced-motion.
Changes to the canonical shared/scripts/subscribe-modal.js:
- role="dialog" aria-modal="true" aria-labelledby on the container,
with an id on the existing title.
- Tab/Shift+Tab now cycle within the modal's visible, enabled controls
(computed per keypress, so the trap also works on the post-submit
success view).
- The opener element is saved on openModal() and refocused on close.
- Animations are disabled under prefers-reduced-motion: reduce.
Mirrors regenerated with shared/scripts/sync-mirrors.sh (CI drift
check). Escape-to-close and overlay-click behavior unchanged.
DatasetProfile makes test_examples/num_classes Optional by design (MSWC
sources only the 23.4M corpus total), but the zoo table called
.magnitude unconditionally and crashed the MLSysIM docs-site build with
AttributeError on the MSWC row. Guard the optional fields the same way
the cell already guards image dimensions.
With [flop] as a real dimension, the paper's lst:units listing again
shows the honest headline behavior — compute rate + bandwidth raises —
and the 'count-like units are mutually convertible by design' caveat
is gone. for-engineers Type Safety demonstrates both raises live
(verified by execution); DATA_MODEL's validation invariant states the
dimension split. Paper rebuilt clean, 42 pages, all 7 anchors match.
No-backward-compat sweep, part 2. The module had been reduced to a
units-only re-export ('retired, do not add values'); per policy it is
now gone and every consumer reads the real home:
- 32 internal modules, the package __init__, and core/__init__ import
core.units (physics modules keep their own physics/constants)
- 43 book chapters' LEGO cells migrated (star imports, named imports,
and the appendix attribute style 'constants.VIDEO_*' -> units.*);
lego_focal_verify confirms identical pass/flag state to pre-sweep
(8 pre-existing structural flags, A/B-verified unchanged)
- tutorial/tools/test imports migrated (incl. binder test_units.py);
book tests' legacy-symbol scanner treats a missing constants.py as
'nothing defined'
- test_constants_allowlist.py rewritten as a deletion pin: the module
(and any shim for it) must never return; core.units must keep the
measurement surface (ureg, Q_, GB, BYTES_FP16, PRECISION_MAP, ...)
- test_mlsysim_registry_parity.py deleted: it compared registry values
against legacy constants 'before deletion' — that migration is
complete (registry gate list updated)
- Docs prose (DATA_MODEL, architecture, contributing) states the
deletion instead of describing a retired shim
749 passed; binder registry gate green; star import intact.
No-backward-compat policy: mlsysim.engine.solvers is the canonical
implementation package and mlsysim.solvers the public path — the
middle re-export module served no purpose once both ends derive
mechanically. All 16 internal/test import sites repointed; the module-
exports test now pins the shim's ABSENCE (ModuleNotFoundError) plus
exact public/engine surface identity; docstrings, CLI design doc, and
docs links updated. 751 passed.
- frozen=True on all registry pydantic types (hardware, models,
systems, infrastructure, datasets, platforms): registry entries are
shared singletons read by every LEGO cell in a render — a stray
assignment in any cell previously corrupted every downstream cell
silently; it now raises ValidationError at the assignment site
- The freeze immediately caught the one real mutation site:
SensitivitySolver's deepcopy-then-assign perturbation now builds
modified copies via model_copy(update=...) instead
- mlsysim zoo: the CATEGORY argument --help always marked optional now
actually is — omitting it renders both registries and exits 0
(previously errored); contract test re-pinned, cli-reference updated
751 passed; training/ml_systems/distributed_training chapters execute
clean against frozen registries.
User journey (every code block executed against the package):
- getting-started: Hardware.Tiny.ESP32 -> ESP32_S3 (raised
AttributeError as written); dev-install cd path fixed; index
carousel device count 19 -> 30+
- for-engineers: 'Type Safety' example claimed a DimensionalityError
that pint does not raise (bytes/flops are dimensionless aliases);
rewritten with a true example + the real require_unit_family checks
Developer path:
- contributing.qmd: solver home engine/solvers/, real test-gate
filenames, real check() signature, 32-solver count, retired
constants.py description
- architecture.qmd <-> DATA_MODEL.md now bridge each other (runtime
5-layer view vs data 8-zoo view); DATA_MODEL opener said 'Six zoos'
while its own table lists eight
- provenance.qmd core.calibration -> engine.calibration; accuracy.qmd
blesses mlsysim.solvers as the public import path
CLI reference (every command --help diffed against the doc):
- eval YAML example was unrunnable (missing required name:) and
asserted a nonexistent metric; exit-code example was wrong (renders
FAIL scorecard, exits 0) — replaced with verified exit-1/exit-3
examples and a note that exit 2 is reserved for hard OOMErrors
- schema/audit: documented -t/-w shorthands and defaults
README: PyPI/docs badges + quick-links row (standalone-package pitch).
- math.qmd: three GitHub links had a tripled mlsysim/ path segment
- models-and-solvers.qmd: DSE link pointed at deleted core/dse.py
(now engine/dse.py)
- data_engineering/benchmarking LEGO headers still cited retired
core.constants names (NETWORK_100G_BW, GPT3_TRAINING_TOKENS,
GPT3_TRAINING_ENERGY_MWH); comments now name the actual registry
sources the cells read
- book/tests/test_units.py: fmt_unit FLOP-count expectation updated to
the shared-label singular form ('GFLOP'), matching the fmt dedup
Add shared/config/_ecosystem-cards.qmd: one source of truth for the
'Part of the MLSysBook Ecosystem' section (full 7-member set). Each landing
page includes it; a small script marks the current site 'You are here' by
reading that site's own release-manifest meta, so one block shows each page
its own state. Replace the divergent inline sections in kits (3 hand-written
cards) and labs (prose paragraph); add the section to slides, instructors,
and mlsysim.
Add shared/config/footer-common.yml (mirrors navbar-common.yml) and point
slides, labs, kits, and instructors at it via metadata-files, replacing their
drifted inline footers. The release pill now lives in the footer right slot
(not dangling below the page) as a fixed muted-gray chip, pinned so it looks
identical regardless of each site's theme accent. mlsysim and the book keep
their own footers (dual license / build stamp) but carry the same pill span.
release-pill.html is now assets-only and populates every data-release-pill
span from each site's own release-manifest.
The MLSysIM taxonomy refactor moved the solver classes from core.solver to
engine.solver and regenerated the quartodoc API stubs accordingly
(api/engine.solver.*.qmd), but five hand-written doc pages still linked to the
old api/core.solver.* paths, breaking 43 internal links (caught by
check-internal-links).
- solver-guide.qmd, models-and-solvers.qmd, math.qmd, zoo/infra.qmd,
zoo/datasets.qmd: repoint every api/core.solver.<Model> link to the existing
api/engine.solver.<Model> stub; table links that pointed at the bare module
page now point at the specific model page matching their link text.
- The generic "Solver API Reference" link → api/engine.qmd.
- Stale GitHub source link mlsysim/core/solver.py → mlsysim/engine/solver.py.
Run quartodoc build against the refactored package (engine/ extracted from core/,
infra->infrastructure): regenerate the API reference so every stub points at the new
paths. Adds engine.*/infrastructure.* stubs, removes the 41 stale core.solver.* /
core.engine.* / core.scenarios.* / core.config.* / core.evaluation.* / infra*.qmd
orphans, and refreshes the package pages (core now primitives-only) + index.
Verified: all 47 documented symbols resolve in the new package; every index link
resolves; zero stale mlsysim.core.<engine-mod> / mlsysim.infra references anywhere in
docs/. (objects.json inventory is gitignored -- regenerated at build.)
Repoint mlsysim.core.<engine-mod> -> mlsysim.engine.<mod>, the
from-mlsysim.core-import-calibration form, and mlsysim.infra -> mlsysim.infrastructure
across the deferred consumers: docs prose + tutorials, tutorial slides/cheatsheet/
exercises, paper.tex, README, cli/DESIGN.md, and the mlsysim_constants audit README.
Also fix two docstrings inside the moved engine modules (calibration.py, pipeline.py)
that still named the old core paths. Update the quartodoc config (sections list) to
the new module paths and add the engine package.
NOTE: the generated quartodoc API stubs under mlsysim/docs/api/ (core.*.qmd,
infra*.qmd) still carry the old paths — they regenerate from the updated config via
`quartodoc build` (toolchain not installed in this worktree), so they are left
untouched here rather than hand-edited. Run `quartodoc build` to refresh them.
482 passed; import clean.
Pure rename so the package name matches its public namespace (Infrastructure).
All internal + example + doc importers repointed; public mlsysim.Infrastructure
unchanged. Generated docs/api/infra*.qmd stubs left for quartodoc regen (P10).
482 passed, import clean.
- Extracted all hardcoded repository and slide download URLs into a central _variables.yml configuration file.
- Replaced 100+ hardcoded URL strings across the website documentation (.qmd, .md, and _quarto-html.yml) with {{< var slides_latest >}} and {{< var github_repo >}} shortcodes.
- Ensures the website correctly points to the canonical cs249r_book repository while enabling instantaneous, single-file URL updates in the future.
- Updated all GitHub Actions workflows (build-pdfs, preview-dev, publish-live, update-pdfs) to loop over `tutorial_module1` through `tutorial_module4` instead of the legacy `part1`/`part2`.
- Updated Quarto documentation (`slides.qmd`, `_quarto-html.yml`) to correctly surface the 4 new module PDFs on the website.
- Updated the tutorial Makefile to compile all 4 modules.
- Updated `.gitignore` and instructor quickstart documentation to reflect the new slide outputs.
- Ensured 100 percent docstring coverage for all internal private methods and functions across the codebase.
- Documented private optimization backends, plugin loaders, CLI formatting hooks, and provenance auditing utilities.
- Makes the codebase fully self-documenting for open-source contributors navigating the internals.
- Added 'make docs', 'make docs-preview', and 'make audit' targets to Makefile for easier local development.
- Added comprehensive README.md to the vscode-ext workbench extension.
- Refactored test_engine.py to dynamically import calibration constants rather than hardcoding physics assumptions, ensuring tests don't break if base parameters are tuned.
- Fixed a registry path alias in philosophy.qmd caught by the doc drift linter.
- Replaced default light-blue stroke colors with the site's primary accent color (#0284c7) for consistency.
- Applied the highlighting style to the Solvers layer (Layer E) across all architectural diagrams.
- Added Mermaid diagram illustrating the Provenance chain in philosophy.qmd.
- Added Mermaid diagram illustrating the Demand vs. Supply abstraction in philosophy.qmd.
- Added Mermaid diagram illustrating the 3-Tier Resolver Architecture in models-and-solvers.qmd.
Set Quarto figure defaults, cap notebook image width in site CSS, export web plots at 120 DPI, and let Quarto capture matplotlib figures without fig.show().
Align part 1/2 slide imports with post-migration solver paths, add registry API stubs, extend doc CI to scan .tex slides, and fix release-note examples.
Resolve training.qmd conflicts: keep UtilizationGap ProfilingScenarios cell,
drop duplicate static tables in favor of LEGO-generated tables, fix loss-scaling
math to use MarkdownStr equation exports. Tutorial docs use shared includes.
Delete the catch-all defaults module and relocate assumptions into
Literature, Systems, Infrastructure, Ops, Platforms, and core.calibration.
Update textbook QMD cells, labs, audit tooling, and CI gates so registry
paths are authoritative with no package-root aliases or defaults shims.
Adds provenance_catalog records, metadata.provenance on every hardware/model
zoo entry, infra grid profiles, and catalog-linked TraceableConstants; CI
enforces via test_provenance_audit and audit_provenance --strict.