Skip to content

Pinned toolchain

Tool Version source
Go .go-version
Node.js .nvmrc
Python (packaged Kraken/Zensical tooling only) .tool-versions and image build arguments
Terraform .tool-versions and workflows
ripgrep ci/install-ripgrep.sh version and platform checksums
yq ci/install-yq.sh version and platform checksums
Buf, sqlc, gosec, govulncheck make install-tools
Zensical requirements-docs.txt
Container bases Dockerfile tag plus digest
GitHub Actions immutable commit SHA

Renovate may propose upgrades, but a version change must update every runtime, CI image, checksum/digest, and documentation reference together. Do not replace an exact input with latest, a floating branch, or an unverified download.

make terraform-check uses the exact host Terraform version when present and falls back to the digest-pinned container when the host is missing or stale.

ShellCheck, actionlint, golangci-lint, and Trivy use the same rule: the scripts accept the reviewed host version and otherwise fall back to the digest-pinned container. If neither the exact host tool nor Docker is available, the quality gate fails instead of silently running a different release.

Workflow linting uses the host only when both actionlint and ShellCheck match the reviewed versions. Otherwise the actionlint image supplies both pinned tools, so embedded workflow scripts receive the same checks locally and in CI. Both paths explicitly load .github/actionlint.yaml; they do not depend on repository metadata being present for configuration discovery.

make install-shell-tools installs the reviewed ripgrep and yq releases under .tools/bin after verifying platform-specific checksums. OCR matrix generation and image resolution depend on this target in both local use and GitHub Actions; the workflow does not maintain a second tool-download path. The toolchain bootstrap contract itself uses only standard shell utilities, so it can verify the repository before any optional developer tool is installed.

Zensical and every transitive Python package are version- and artifact-hash locked for the digest-pinned Python 3.13 docs image. make docs-build builds that image and runs the strict site build; make install-doc-tools builds only the image. Architecture-specific wheels needed by the supported amd64 and arm64 build hosts are both hash-locked. The docs script does not perform an unreviewed runtime package resolution fallback.

Segmentor runtime dependencies are generated from config/segmentor-requirements.in; both the resulting runtime lock and the pip-tools resolver environment are exact wheel-hash locks. Regeneration runs inside the same digest-pinned Python image used by the segmentor runtime.

Repository automation is implemented in Go or Bash. Shell and workflow files may invoke the reviewed Kraken, pip, or Zensical command-line tools, but may not embed Python through -c, standard input, or heredocs. Node tooling is confined to the web and mirador-scribe frontend packages.