- Vol II: close the margin note wrapping the storage-compute figure,
move the bandwidth figure out of its callout, and separate the NPU
figure from the preceding footnote so all three cross-references
resolve; widen Table 11.3 so it stays inside the page trim.
- Landing pages: hide the download card, star counter, and podcast from
EPUB output and point the cover and podcast at shared/assets.
- Vol I/II frontmatter image paths, table column widths, Vol III
equation labels, Vol IV lint fixes and SVG newline repairs, and
regenerated volume bibliographies.
- Bibliography integrity scan ignores math spans; currency check skips
render caches; Prentice Hall joins the canonical publisher list.
- Unprefixed chapter URLs publish redirect stubs to numbered pages.
- Remove stray test files, duplicate quiz files, unused cover options,
generated figure lists, and outdated review scripts; drop generator
metadata from quiz files.
- Repoint documentation at current chapter paths and deduplicate
pre-commit file patterns.
TinyTorch, MLSys·im, MLPerf EDU, the slides, and the instructor site return
from packages/ and materials/ to the top level, so each folder carries the
name of its site URL (tinytorch/ is mlsysbook.ai/tinytorch/). main still has
this layout, so the GitHub links on the published pages, existing tito
installs, and the release hashes keep working.
References follow: workflows, the binder toolchain, book configs, tests,
docs, contributor tooling, .gitignore, and pre-commit patterns. Relative
paths inside the moved projects drop the extra ../ they gained under
packages/ and materials/, which also repairs the MLSys·im contributing guide
and tutorial decks that pointed at the removed slides symlink. The TinyTorch
installer and updater return to a single sparse path. REPO_LAYOUT.md and
CI-VARIABLES.md describe the result.
The top-level mlsysim, tinytorch, mlperf-edu, slides, and instructors
entries were symlinks into packages/ and materials/. Every reference now
names the real path, and the symlinks are removed.
- Workflows: path filters, working directories, artifact and publish
paths, and the TINYTORCH_SITE, MLSYSIM_DOCS, SLIDES_ROOT, and
INSTRUCTORS_ROOT variables, which now carry fallbacks. The gh-pages
deploy trees and the site URLs keep their top-level names.
- Book builds: PYTHONPATH in the PDF configs and execute-env.yml points
at packages/mlsysim. The execute-env.yml value was still written for
the old publishing/quarto project root.
- The binder toolchain, labs, and tests load mlsysim from
packages/mlsysim, and the root pytest config puts it on sys.path. That
clears the binder test failures caused by importing the symlink as a
namespace package (now 362 passed).
- The TinyTorch installer and `tito system update` fetch packages/tinytorch
and fall back to tinytorch/ for tags that predate the move. Binder launch
links and postBuild open packages/tinytorch.
- READMEs, CONTRIBUTING, SECURITY, contributor tooling, area labels,
.gitignore, and pre-commit patterns name the real paths.
A repository variable that still holds an old top-level path overrides
the new fallback and breaks its workflow, so those variables need
updating before these workflows run.
The repository carried the book twice. publishing/quarto/contents/vol{1..4}/
was what every build and every check read; books/vol{1..4}/ was a second
tracked copy that fed nothing and had drifted badly, holding 3 vol3 chapters
against 30 in the live tree. A `book` symlink pointed at publishing/, so
book/quarto/ and publishing/quarto/ were one directory under two names, next
to a books/ that was a third thing. Editorial work kept landing in the copy
nothing rendered.
books/ is now the Quarto project root and the only place book sources live:
books/vol1..vol4 one directory per volume
books/shared/ frontmatter, backmatter, _partials, assets, tex,
filters, scripts, audits, publish, calc
books/config/ the per-volume quarto configs
books/_extensions/ Quarto needs these at the project root
books/index-vol{1..4}.qmd, references*.bib, _variables.yml, 404.qmd
books/_build/ render output, gitignored and disposable
The toolchain stays in publishing/ and is now unambiguous, since it no longer
contains any of the book. The `book` symlink is gone and the CLI is reached as
./binder from the repository root; publishing/binder resolves through the
symlink so invoking it from either place works.
Config paths are relative to the project root, so a chapter entry goes from
contents/vol1/introduction/introduction.qmd to vol1/introduction/introduction.qmd,
and shared material picks up a shared/ prefix. 5,204 path references were
rewritten across 401 files, plus 127 segment-built paths in Python that string
matching could not see, plus 795 ./book/binder references.
Verified rather than assumed: a single-chapter HTML render produces output
equivalent to the same build on dev, 432,901 bytes against 433,158, the same
18 images, zero unresolved cross-references on both. Scoped checks return
identical findings on both trees.
One behaviour genuinely changes. While the sources sat under contents/, the
checks resolved their default scan root to the Quarto project directory rather
than the content directory, so a bare `./binder check tables` matched no files
and always reported success. Now that the project root and the content root
are the same directory the default works, and it immediately surfaces 31
pre-existing findings in vol3 and vol4 that were always present and never
reported. Those are content issues to fix separately, not regressions from
this move.
docs/REPO_LAYOUT.md describes the result. docs/BOOKS_MIRROR_RETIREMENT.md
records what the retired mirror held, which commits landed only there, and how
to recover any of it from history.