NVIDIA Model Promotion Gatekeeper
Purpose
Before a NIM container moves from staging to production, prove four things with runtime evidence, then emit a tamper-evident attestation:
- Signature is valid and from the expected NVIDIA identity - keyless cosign verify against the expected
--certificate-identityand--certificate-oidc-issuer. - Tag has not drifted -
crane digestresolution matches the operator-suppliedimage_ref@sha256:...pin. - SBOM and model card are present and pinned - SPDX or CycloneDX SBOM attestation present; model card present as a fetched OCI referrer with a recorded sha256. A documentation label alone is not enough.
- No CVE regression vs current-prod -
grypedelta against the current production digest; new critical or high CVEs block promotion.
The skill never mutates: no docker pull, no kubectl apply, no registry write. It reads, verifies, and emits a JSON attestation the operator signs with cosign sign-blob and hands to audit.
Default mode is dry-run
If the operator does not pass --mode runtime, the skill stays in static mode: it reads supplied fixture or sanitized JSON, runs the gate evaluator, but does not contact any registry or Sigstore endpoint. evidence_level is then documentation-only and verdict defaults to manual-review.
--mode runtime opt-in is per-session, never per-skill-default. The operator must hand the skill an explicit image reference plus a current-prod digest.
Operating rules
- Resolve
image_ref→digestviacrane digestfirst. If the operator-supplied pin (image_ref@sha256:...) does not match the resolved digest, emitverdict: blockwith reasondigest_drift. - The signer identity and OIDC issuer to expect must be supplied as inputs (never defaulted), so a future change in NVIDIA's signing posture cannot silently be auto-accepted.
- Treat any registry prefix other than
nvcr.io/asverdict: blockwith reasonunknown_registry. The allowlist regex enforces this; the skill must also assert it explicitly so the failure mode is auditable. - Treat a Fulcio cert with
notAfter < nowasverdict: blockwith reasonexpired_cert. A valid-looking signature on an expired cert is a replay artifact. - Treat missing SBOM attestation as
verdict: blockwith reasonmissing_sbom. Treat a missing model-card OCI referrer, a label-only model-card reference, or a model-card record without asha256:...digest asverdict: blockwith reasonmissing_model_card. - Treat a Grype delta showing one or more new CRITICAL or HIGH CVEs vs
current_prod_digestasverdict: blockwith reasoncve_regression. - If Rekor or Fulcio is unreachable (air-gapped or transient), do not auto-block. Emit
evidence_level: partialandverdict: manual-reviewwith reasonrekor_unreachable. Air-gapped deployments must promote on operator override, not on automatic ignore. - The attestation must include
provenance.executed_commands(exact argv, no env),provenance.egress_hosts_contacted,provenance.runtime_mode, and a 16+ charnoncewheneverruntime_mode=runtime. Anti-replay is the operator's responsibility downstream, but the gatekeeper provides the field. - Never write credentials. Never echo
$NGC_API_KEY. The attestationprovenance.executed_commandsarray must scrub any flag values that resemble secrets (no equals-form value capture for--password,--token,--auth).
Required inputs
| Field | Required | Example |
|---|---|---|
image_ref |
yes | nvcr.io/nim/meta/llama-3.3-70b:1.5.0 |
image_ref_pin |
yes (runtime mode) | sha256:abc123... (operator-supplied expected digest) |
current_prod_digest |
yes | sha256:def456... |
expected_signer_identity |
yes | https://github.com/nvidia/nim-builder/.github/workflows/release.yml@refs/tags/v1.5.0 |
expected_oidc_issuer |
yes | https://token.actions.githubusercontent.com |
mode |
optional | static (default) | runtime |
Response shape
The attestation JSON is the canonical response. The agent additionally surfaces, in plain text:
- Verdict -
promote|block|manual-review - Evidence level -
live|partial|documentation-only - Top reasons - verbatim from
verdict_reasons[] - Next action -
cosign sign-blob --bundle attestation.bundle attestation.jsonforpromote; remediation hints forblock; explicit operator decision request formanual-review - Attestation path - where the JSON was written
References
references/allowlist-commands.md- exact argv catalog with rationale per commandreferences/attestation-format.md- attestation schema walk-through with a worked example