Skip to content

chore(ci): pin scanner toolchain + mise + mise-action to exact versions across all surfaces (reproducible security suite) #722

Description

@scottschreckengaust

Problem

The security/lint scanner toolchain is pinned to floating latest in mise.toml [tools], so a scanner release can silently change findings between runs. This makes the scheduled security suite non-reproducible and hard to triage — a run can go red with no repo change (e.g. #542's masking count and #593's failing subtask both shifted over time as tools moved).

Current unpinned tools (mise.toml [tools]):

prek = "latest"
gitleaks = "latest"
semgrep = "latest"
osv-scanner = "latest"
grype = "latest"
"aqua:zizmorcore/zizmor" = "latest"

All surfaces are governed by mise.toml (good news)

CI installs these via jdx/mise-action (see security.yml, security-pr.yml, build.yml, etc.), so pinning in mise.toml propagates to all three surfaces at once: local dev, mise run, and CI. No per-workflow duplication to chase. (Exception: build.yml sets MISE_DISABLE_TOOLS=aqua:aquasecurity/trivy,grype,semgrep for that job — those simply aren't installed there; the pins still govern where they DO run.)

Requirements

1. Pin the 6 scanner tools to exact versions in mise.toml [tools] (mirror how knip and the Cedar engines are already exact-pinned). Capture the currently-known-good versions, e.g. at time of writing: semgrep 1.157.0, gitleaks 8.30.1, osv-scanner (current), grype (current), zizmor (current), prek (current) — verify each against a green run before committing.

2. Pin mise itself. Today mise.toml only sets min_version = "2026.2.6" (a floor, not an exact version) — local and CI can drift to different mise releases. Decide and implement one of: (a) tighten to an exact min_version cadence, or (b) document the intended mise version and how it is bumped. Note the existing constraint context: minimum_release_age interplay called out in mise.toml (#320) and jdx/mise#10279 — preserve that reasoning.

3. Bump jdx/mise-action — Dependabot appears to have MISSED this. All workflows pin jdx/mise-action@e6a8b39… # v4.2.0, but latest is v4.2.4 (2026-08-01). .github/dependabot.yml does cover github-actions (package-ecosystem: "github-actions", directory: "/"), so this should have been flagged. As part of this issue: bump the action to v4.2.4 (by pinned SHA) across all workflows, AND investigate why Dependabot didn't open a PR (grouping? schedule? SHA-pin handling?) — fix the config gap so future action drift is caught automatically.

Gotchas

Acceptance criteria

References

#329 (prek↔CI toolchain SoT — likely overlap, reconcile), #320 (mise release-age), #542/#721/#593 (the non-reproducibility symptoms), ADR-003 (governance).

Metadata

Metadata

Assignees

No one assigned

    Labels

    P2lowest priorityci-cdBuild pipeline, deploy.yml, CI perf/caching, GitHub Actions workflowssecurityCedar/HITL, IAM least-privilege, secrets, PII/DLP, guardrails, supply-chain/CVEtooling

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions