What an install requires

Supported systems

An install is possible only on a system below, where a prebuilt gate binary is published. Every joined system is built and installed on every push, on the runner images native/runners.list names.

System Minimum Binary Status
Linux on x86-64 (glibc), and WSL glibc 2.39 x86_64-unknown-linux-gnu joined
Linux on arm64 (glibc) glibc 2.39 aarch64-unknown-linux-gnu joined
Linux on x86-64 (any C library) Linux 3.2 x86_64-unknown-linux-musl joined
Linux on arm64 (any C library) Linux 4.1 aarch64-unknown-linux-musl joined
macOS on Apple silicon macOS 11 aarch64-apple-darwin joined
macOS on Intel macOS 10.12 x86_64-apple-darwin joined
Windows on x86-64 Windows 10 x86_64-pc-windows-msvc joined
Windows on ARM64 Windows 10 aarch64-pc-windows-msvc joined

joined means the current release publishes a binary for that system, at the floor shown; held means it is supported but not published yet, and names the run that would publish it. On any other system init refuses. On Linux, init takes the glibc binary where it runs and the static one everywhere else. Windows Subsystem for Linux (WSL) takes the Linux binary.

Installing and running the shipped gates

The tools each shipped gate runs. required binds every install. An optional row binds you only under the condition it names:

Tool Version Needed Why
bash ≥ 4.3 optional: if your docs mark a fence runnable or you register a shell gate canon-kit’s check-fence-run runs a marked fence with bash, and a shell gate sources the gate library, which uses a nameref (local -n)
git ≥ 2.15 required the gates read tracked files and the hooks fire at commit time; check-docs-cmd reads rev-parse --is-shallow-repository
curl ≥ 5.9 optional: if your profile includes delegation-kit its usage poller (--usage-poll) fetches its source with curl -fsS, and -S arrived in 5.9
shellcheck ≥ 0.6 optional: if you register a gate that runs it check-shellcheck and check-action-run-shell run ShellCheck with -S warning once you register them

The install itself and the optional docs gates need these as well. doctor does not probe them:

Tool Minimum Needed for Why
sh any POSIX sh required to install on Linux and macOS the one-line install and the bootstrap are POSIX sh throughout
curl 5.9 required to install on Linux and macOS the install line fetches with curl -fsSL, and -S arrived in 5.9
tar any GNU or BSD tar required to install on Linux and macOS tar -xzf unpacks the release tarball
sha256sum or shasum any required to install on Linux and macOS the release tarball and the gate binary are checked against their published digests
Windows PowerShell 5.1 required to install on Windows the one-line install, the install block and the bootstrap run under it; its Get-FileHash checks the digests
tar.exe Windows 10 version 1803 required to install on Windows the install block unpacks the tarball with System32\tar.exe
Git for Windows git at the floor above required to install on Windows it supplies git; bash only where a row above owes it
gh any carrying gh attestation optional: to check the build attestation the one-line install runs gh attestation verify when gh is signed in, and says so when it is not
Node 8.2 optional: only to install with npx the first Node to bundle an npm carrying npx
Ruby 2.3 optional: only if you register site-kit’s docs gates the two gems below need it
kramdown-parser-gfm any optional: only if you register site-kit’s docs gates check-docs-render-fidelity re-renders every page through it
liquid 4.0.4 exactly optional: only if you register site-kit’s docs gates check-docs-liquid-parse parses with the version GitHub Pages runs

The hook wiring the kits ship for Claude Code names the gate binary as the hook’s command and passes --hook and the member in an args array, so the harness starts it with no shell. That takes Claude Code 2.1.139 or later. The floor is read from Claude Code’s changelog, whose entry for that version adds the hook args field, and is not run here: the wiring was run on 2.1.292, and no build below the floor was tried. What an older build does with a registration carrying args is undocumented, so do not merge the wiring on one.

A missing tool comes from your distribution’s package on Linux or WSL, from Homebrew on macOS, or from Chocolatey on native Windows. To check your machine, run the gate binary with --emit env-probe: it writes an untracked ENV.local.md with each tool’s version and verdict. Building Checkwright itself takes more: see the contributing guide.

What a commit costs

The pre-commit hook runs the gates your profile registers whose triggers match the staged files. It runs them one after another and stops at the first red. The figure runs every gate whose triggers match a file over every tracked file, in a repository the one-line install has just initialized with full, the profile that contains every other. A gate that reads the staged set from git itself sees nothing staged, so the figure is a reference reading, not a ceiling.

On linux x86_64 with 14 logical CPUs, the hook ran 49 pre-commit gates over every tracked file in 2141 ms, the median of three, measured at v0.31.0.

To measure your own repository, run the gate binary with --measure-commit. It stages nothing and times the same run over every tracked file. Two costs sit outside the figure. First, the hook’s own start: git starts it with no shell on any OS, and the gates workflow’s probe step prints what that costs on each OS and architecture. Second, a gate you register yourself adds its own time.

Writing your own shell gates

A gate you write is a copy of gate-sdk’s templates/check-skeleton.sh. It is a bash script that sources gate-sdk’s library, so it needs the bash floor above on every system, whatever your profile. doctor checks it once your gates.list registers the gate. On native Windows that bash is Git for Windows’ bash: a gate cannot be written in PowerShell today. check-shellcheck lints your gate if you register it, and then shellcheck’s row binds you.

Writing your own Rust gates

There is no supported path today: a compiled gate is a subcommand of the published gate binary, and an install carries no crate to add one to. A fork that adds the subcommand and ships its own build can, since descriptors resolve consumer-first and so its own .gate descriptor runs. That fork then owns its own release, digest and upgrades, outside this project’s. gate-sdk/SPEC.md owns this.