ADR-038: The CLI is the interface; the Makefile retires
Status Active · Filed 2026-08-07 · Issue #45
Context
The Makefile arrived with the extraction from strata-g carrying a doctrine
in its header: “Job bodies live here, not in the workflow YAML, so ‘run what
CI runs’ is always make <target> and the two can’t drift apart.” That was
true until ADR-029 moved the docs jobs into composite actions
(actions/generate, actions/lint) that invoke luria directly — after
which CI’s entire Makefile usage was one line, make test, itself a wrapper
for python -m pytest tests -q.
Everything else in the file restated a CLI one-liner, and the restatement
drifted on schedule: the ref-status and pending targets had to be chased
when ADR-030 removed their commands, the journal target when
ADR-036 replaced it. Review named the smell
(#45): a vestigial component of
the ancestor’s CI, dragged along as a fifth hand-maintained copy of the
command surface.
Decision
Delete the Makefile. ci.yml runs python -m pytest tests -q directly;
every documentation command is typed as itself; luria --help is the one
authoritative list of what you can run, derived from the dispatch table.
The Makefile also leaves the [luria.code] scan globs — there is no longer
a file for references to hide in.
Alternatives considered
- Keep it as a convenience layer. The convenience was five saved
keystrokes per command, purchased with a copy of the surface that drifted
twice in a week and a
make helpthat could quietly disagree withluria --help. The ADR-030 argument applies verbatim: an interface entry is documentation, and these entries’ claims kept going false. - Swap in a task runner (
just,tox, a scripts table). Same restatement, new syntax, plus a tool dependency — the problem was never Make’s syntax. - Status quo. Free until the next command change, which this week suggests is never far away.
Consequences
- “Run what CI runs” becomes:
python -m pytest tests -qandluria lint— both stated in CLAUDE.md’s map, both single commands. - One of #45’s four hand-maintained restatements of the command surface is gone with the file; the README table remains, tracked there.
- An adopter who copied the old Makefile keeps a working copy — it only ever called public commands — but the scaffold never shipped one, so nothing downstream changes.