Context and rules for AI agents working in this repository. Humans should start with README.md.
- Name: MLOps Coding Course — a Zensical documentation site with the classic Material appearance that teaches end-to-end MLOps in Python.
- Published: https://mlops-coding-course.fmind.dev via GitHub Pages (deployed by GitHub Actions).
- No application code: this repo builds a static site from Markdown in
docs/.
All work goes through mise (see mise.toml); git hooks (lefthook.yml) and CI call the same tasks. Run mise tasks for the full list.
- Gate:
mise run all—format, thencheck, thentest, thenbuild. This is exactly what CI runs; a change is not done until it passes. - Install:
mise trust,mise install, thenmise run install— sync dependencies (uv) and install git hooks (lefthook). - Format:
mise run format—dprintfor config/markup only; prose underdocs/is intentionally not reformatted. - Check:
mise run check— runscheck:actions(actionlint+zizmor),check:build(zensical build --clean --strict, which catches broken links and bad config),check:format(validate-pyproject,dprint check,uv lock --check),check:leaks(gitleaks),check:scan(trivy fs), andcheck:vuln(pip-audit). - Build:
mise run build—zensical build --clean --strict; Serve locally:mise run serve(live reload). mise run testexecutes the two maintained PEP 723 labs inexamples/using their committed script lockfiles. Include their source in lessons withpymdownx.snippetsinstead of copying it; do not add build-time code execution.
- Content lives in
docs/, one numbered folder per chapter; the sidebar order comes from the numeric filename prefixes (no explicitnav:), so keep prefixes consistent when adding pages. - Chapter indexes include an observable checkpoint and a question about the evidence. Each page follows a consistent What / Why / How question-and-answer structure.
- Numbered lists use
1.for every item so rendering stays dynamic;docs/**is excluded fromdprintso prose formatting is preserved. - Teach the current canonical stack:
uv, Ruff,ty,pytest,mise,lefthook,dprint,git-cliff, MLflow 3, Docker, Python 3.14. Keep tool versions and examples in sync with the cookiecutter-mlops-package and mlops-python-package. - Actions are pinned to full commit SHAs and retain version comments. Tool versions are pinned in
mise.tomland locked inmise.lock; Python dependencies are locked inuv.lock. Both lockfiles are committed andcheck:formatfails ifuv.lockdrifts frompyproject.toml. - Commits: Conventional Commits; no attribution. Releases use
git-cliff.
docs/— course chapters (0. Overview→7. Observability),assets/, plusCNAME(custom domain) androbots.txt, both copied into the built site.mkdocs.yml— site configuration (Zensical classic theme, preserved.htmlURLs,strict: true,redirectsfrom retired lesson URLs to their replacements, so indexed links keep working);pyproject.toml— Zensical dependencies and thedevdependency group (uv,package = false).mise.toml/mise.lock— tasks and pinned tools;lefthook.yml— git hooks;dprint.jsonc— config/markup formatter;trivy.yaml— scanner policy;cliff.toml— changelog.
GitHub configuration files and their roles:
workflows/ci.yml— runsmise run allon pushes tomainand on every pull request, then asserts the working tree is unchanged.workflows/pages.yml— runs the complete gate, then deploys the site to GitHub Pages on pushes tomain.workflows/security.yml— weekly (and manual) full-historygitleaksand full-checkouttrivyscan; the push-triggered checks only see recent commits.workflows/assign.yml— assigns newly opened issues tofmind. Issues only: a fork pull request gets a read-only token, so apull_requesttrigger would fail on every external contribution.dependabot.yml— security updates only (version updates off), one grouped pull request per ecosystem foruvandgithub-actions, prefixedfix(deps).FUNDING.yml— GitHub Sponsors link.
A change is complete only when it answers the original request, fixes root causes rather than masking symptoms, comments the reasoning at any non-obvious choice, keeps AGENTS.md and README.md in sync with what the repository actually does, and passes mise run all warning-free. Never weaken a check to make the gate green. Do not commit, push, or tag unless the user asks.