ADR-0006 — Mill 1.1.7 rather than the 0.12.x named in the style guide
- Status: accepted
- Date: 2026-08-01
Context
SCALA_CODE_STYLE.md §Tooling pins Mill at 0.12.x. CLAUDE.md §Toolchain
lists the commands the project actually uses:
mill mill.scalalib.scalafmt/
mill mill.scalalib.scalafmt/checkFormatAll
mill __.fix
Both of those forms belong to the Mill 1.x line: the
external.module/task slash syntax and the built-in fix (Scalafix) task do not
exist in 0.12, where formatting is mill.scalalib.scalafmt.ScalafmtModule/… and
Scalafix requires the third-party joan38/mill-scalafix plugin.
The two documents cannot both be satisfied, and the commands are the more load-bearing statement — they are what every contributor and CI job will run.
Decision
Pin Mill 1.1.7 in .mill-version, with the official bootstrap script
committed as ./mill so the version is reproducible without a global install.
Consequences
CLAUDE.md's command table works verbatim.- Scalafix is built in; no third-party build plugin to track.
mill-contrib-scoverage:1.1.7matches the Mill version, so coverage needs no separate version pin.- Mill 1.x renamed
ivyDeps→mvnDeps,ivy"…"→mvn"…"andT[_]→Task. Any Mill snippet found online for 0.11/0.12 needs translating; that is a one-time cost paid inbuild.mill. - The style guide's version table is now stale on this row. It is left unedited (it is derived from an upstream document) and this ADR records the divergence.
Note on .scalafmt.conf
project.git = true means Scalafmt only formats files Git already tracks. New
files must be git add-ed before mill mill.scalalib.scalafmt/ will touch them,
otherwise it fails with NoMatchingFiles. mill modules.__.reformat formats
module sources regardless. This surprises everyone once.