Makefile Interface
Every harnessed repo has a root Makefile that includes the harness's Makefile.core:
include Makefile.core
The contract
Target names are fixed and language-agnostic. The command each target runs lives in an overridable ?= variable. To adapt a repo to a different toolchain, set the variable in your root Makefile before the include:
LINT_CMD = ruff check .
TEST_CMD = pytest -q
TYPECHECK_CMD = mypy .
include Makefile.core
Do not redefine the targets themselves — only the *_CMD variables.
Targets
| Target | Meaning | Default command |
|---|---|---|
check | the gate: everything below, convergence test last | — |
build | produce the deployable artifact | wrangler deploy --dry-run |
lint | lint | biome check . |
format | format check (not write) | biome format . |
typecheck | type check | tsc --noEmit |
test | unit / integration tests | vitest run |
deadcode | unused exports / files / deps | knip |
smoke | hit /health + key routes | scripts/smoke.sh |
harness-check | convergence / invariant test | scripts/harness-check.sh |
init | one-time per-repo setup (installs hooks) | scripts/init.sh |
release | tag + git-cliff CHANGELOG + push tag | scripts/release.sh |
Rules the harness enforces
- Deterministic, non-interactive output: no spinners, no truncation.
- Exit non-zero on failure; raw output to stdout/stderr (it is pasted verbatim into PR comments).
make checkis the single gate and must finish in under ~5 minutes.
make (no target) runs check — that is the default goal.