The pre-commit quality gate, run as one command — the project's mix quality alias.
mix quality # locally: every step, formatting the tree first
mix quality --check # CI: the same steps minus the formatting writeEach step is its own mix subprocess with an explicit MIX_ENV where it needs one, so the env
never flips mid-gate (mix test builds in :test, the rest in :dev — separate _build dirs,
warmed by the compile steps first). It stops at the first failing step and exits non-zero,
so the failing step's output is the last thing printed and a ❌ … FAILED banner is the final
line — legible even if the run is (wrongly) piped through tail.
Run it bare — never pipe it through tail, head or grep. A pipe hides the failing
step's output and, worse, makes the shell report the pipe's exit status (0), masking the
gate's non-zero failure. To iterate on one check, run that single mix task directly.
The steps come from the quality_steps project key in mix.exs; see Tack.Quality for
the shape, and the project's CLAUDE.md for what each step is for.