# Pinned tool versions for the conformance harness (R-TEST-02: deterministic). # The harness is only reproducible if the toolchain is pinned. Bumps flow through the # normal update path (ADR-0011) with the suite re-green as the gate — never bumped # silently. `run.sh` sources this file; the in-cluster Chainsaw Job image (see # incluster/chainsaw-job.yaml) MUST use the same CHAINSAW_VERSION. # Chainsaw — L1 rendering / L2 behavioral / L3 fault-injection runner (ADR-0011). CHAINSAW_VERSION="v0.2.12" # The UPSTREAM chainsaw image. It is NOT what the in-cluster Job runs — see # CONFORMANCE_RUNNER_IMAGE below. It carries the chainsaw binary and essentially nothing # else (no bash, no python3, no kubectl, no git), so `command: ["./run.sh"]` on this image # fails at exec. Kept only as the provenance of the chainsaw binary we rebuild from. CHAINSAW_IMAGE="ghcr.io/kyverno/chainsaw:v0.2.12" # kubectl — used by run.sh for cluster reachability preflight and by probe scripts. KUBECTL_VERSION="v1.36.4" # Kyverno CLI — L0 static/policy gate (owned by T-0.5, referenced here for a single # pinned toolchain view). Not invoked by run.sh yet. KYVERNO_VERSION="v1.19.0" # Python 3 — coverage generator + JUnit emitter use stdlib only (no pip deps), so the # only constraint is a modern interpreter. PYTHON_MIN="3.9" # --- In-cluster conformance runner image ------------------------------------- # Built from conformance/incluster/Containerfile by conformance/incluster/build-image.sh. # This — not CHAINSAW_IMAGE — is what the L2/L3 Job runs (bash + python3 + chainsaw + # kubectl + git). Closes docs/plans/l2-l3-conformance-ci-wiring.md §3 item 1. # # It ALSO carries /usr/local/bin/conformance-clone (0755 root:root, no argument surface) as the # init container's only entrypoint. That is a security fixture, not a convenience: the # admission policy never reads `initContainers`, so an init container with an inline shell # script is currently admitted with the privileged runner SA. The policy rule that makes the # fixed path REQUIRED is not in this branch — see conformance/incluster/README.md. # # THE REPOSITORY PATH IS NOT A PREFERENCE. platform/kyverno/admission/ # conformance-trigger-job-shape.yaml is a fail-closed Enforce ClusterPolicy (R-SEC-02) that # ADMITS a conformance-trigger Job only when its image matches # gitea.home.keithjackson.dev/home-network/conformance-runner@sha256:* # Any other path, and any TAG reference, is DENIED at admission. Do not "tidy" these values. CONFORMANCE_RUNNER_IMAGE_REPO="gitea.home.keithjackson.dev/home-network/conformance-runner" # Build handle only. Admission never sees the tag; a Job must reference the digest. CONFORMANCE_RUNNER_IMAGE_TAG="chainsaw0.2.12-kubectl1.36.4-fc44" # # ############################################################################ # # DIGEST DELIBERATELY EMPTY — THE IMAGE HAS NOT BEEN PUBLISHED YET. # # ############################################################################ # The image has been BUILT and its toolchain verified locally (non-root uid 65532, # read-only rootfs: bash 5.3.9, Python 3.14.7, git 2.55.0, kubectl v1.36.4, chainsaw 0.2.12, # and `./run.sh --layer l2 --no-cluster` completing with rc 0). It has NOT been pushed: # pushing needs a registry credential, and publishing the artifact a fail-closed security # boundary then trusts is an OPERATOR action, not an agent's. # # OPERATOR, to complete the pin: # 1. ./conformance/incluster/build-image.sh # rebuild, verify, print the commands # 2. podman login gitea.home.keithjackson.dev # 3. podman push --digestfile /tmp/conformance-runner.digest \ # "${CONFORMANCE_RUNNER_IMAGE_REPO}:${CONFORMANCE_RUNNER_IMAGE_TAG}" # 4. Set CONFORMANCE_RUNNER_IMAGE_DIGEST below to `cat /tmp/conformance-runner.digest` # — the digest the REGISTRY returned, not the local manifest digest the build printed. # 5. Land steps 4 in a PR (this file is GitOps input, not a live edit). # # UNTIL THEN: this is empty on purpose, NOT a placeholder to be guessed at. An empty value # makes any consumer that renders the Job fail visibly; a fake or stale digest would instead # produce an ImagePullBackOff that looks like a cluster fault. Do not invent one. CONFORMANCE_RUNNER_IMAGE_DIGEST="" CONFORMANCE_RUNNER_IMAGE="${CONFORMANCE_RUNNER_IMAGE_DIGEST:+${CONFORMANCE_RUNNER_IMAGE_REPO}@${CONFORMANCE_RUNNER_IMAGE_DIGEST}}" # # AFTERWARDS, TIGHTEN THE BOUNDARY: the header of conformance-trigger-job-shape.yaml asks for # its `@sha256:*` wildcard to be replaced with the LITERAL digest once the image exists — # that closes the residual "anyone who can push to this path" gap. Separate PR, human # reviewed, because it edits the security boundary itself.