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.
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).
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.
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.
Establish verified dead-symbol inventory and chapter-level migration manifest
so registry cleanup can proceed with parity gates and one commit per step.