name: inverse layout: true class: center, middle, inverse


class: center, middle, title-slide

From Mild To Wild

How Hot Can Your SLSA Be?

Andrew McNamara (Conforma) • Adolfo "puerco" García Veytia (AMPEL)

Conforma logo conforma
AMPEL logo
Open Source SecurityCon · March 23, 2026

???

Andrew and puerco briefly introduce themselves. “I’m Andrew, I am a SLSA maintainer and I work on Konflux, a CI system built on Tekton. We also built Conforma, a Rego-based policy engine.” / “And I’m puerco, I work on AMPEL.” One sentence each — get right to the talk.


layout: false

Attestations in One Slide

artifact predicate + signature attestation
{
  "subject": {
    "name": "registry.k8s.io/kube-proxy:v1.36.0-beta.0",
    "digest": { "sha256": "5f013cc6fb21eb60820bfc4a925fddb710a70acecd56166874da8ef2c13d3933" }
  },

  "predicateType": "https://in-toto.io/attestation/promotion-record/v1",
  "predicate": {
    "srcRef": "us-central1-docker.pkg.dev/k8s-staging-images/kube-proxy:v1.36.0-beta.0",
    "dstRef": "registry.k8s.io/kube-proxy:v1.36.0-beta.0",
    "digest": "5f013cc6fb21eb60820bfc4a925fddb710a70acecd56166874da8ef2c13d3933",
    "promotedAt": "2026-03-21T19:56:27Z",
    "builderId": "htts://sigs.k8s.io/promo-tools/v4.0.9"
  }
}
in-toto Attestations = signed statements about an artifact (who built it, from what, how).
Often in-toto: predicate (e.g. SLSA provenance) + signature.

???

One-line setup: we’re talking about signed metadata (provenance, etc.). Don’t dwell — next slide is “you have these, now what?”


You Have SLSA Attestations. Now What?

✅ You've signed your artifacts.
✅ Provenance exists.
But how do you actually use them to enforce policy?
👉 You get provenance and other predicates — the hard part is using them.
SLSA SPDX CycloneDX
Today: three levels of policy enforcement · two policy engines · one conclusion
Heat scale: mild, medium, wild

???

Andrew sets up the problem space. We’re not talking about generating attestations today — that’s covered elsewhere. We’re talking about what you do with them once they exist. A signed artifact with provenance is only useful if something checks that provenance. Today we walk through three levels of sophistication for that checking, and show how two different policy engines handle each level.


Two Policy Engines Walk Into an Attestation…

Conforma logo conforma
AMPEL logo
Rego-based policy engine
incubated with Konflux
Policy engine for in-toto attestation evaluation
produces VSAs
Coming up:
🌶 Mild
simple verification
🌶🌶 Medium
combining attestations
🌶🌶🌶 Wild
digging into attestations

???

Playful framing — introduce the “game.” Puerco will demo a feature with AMPEL, Andrew will show that “Conforma does that too.” Then the challenger ups the ante to the next level. At mild, puerco leads and Andrew challenges. At medium, puerco leads and Andrew challenges. At wild, Andrew leads again, puerco closes. Tell the audience: at each level we’ll show both engines so you see they’re interchangeable; same attestations, same policies.


class: center, middle, inverse

🌶 Mild

Verify provenance properties</span> ??? Puerco introduces this level. As mentioned before, an attestation is a signed statement about your software — produced by your build system, your CI pipeline, or a verification tool. At mild, we verify fundamental provenance properties: is provenance present, is the build type recognized, does it come from a trusted builder, were materials properly tracked? This is where everyone should start. --- layout: false ## 🌶 Mild: Verify Provenance Properties
Consuming any OCI artifact with SLSA provenance — regardless of build system.
Checks
  1. Provenance attestation is present
  2. Build type is in the accepted list
  3. Builder identity matches expected builder
  4. Source materials are version-controlled with SHAs
  5. External parameters are restricted
??? Puerco introduces the mild checks. These are the foundational properties every consumer should verify. They're entirely build-system-agnostic — they work with provenance from GitHub Actions, Tekton, or any other system that produces SLSA-formatted attestations. --- ## 🌶 Mild: AMPEL PolicySet ```hjson { id: set-base-verification frameworks: [ { id: SLSA, name: "Supply-Chain Levels for Software Artifacts" } ] policies: [ { id: slsa-builder-id source: { location: { uri: "git+https://github.com/carabiner-dev/policies#slsa/slsa-builder-id.json" } } meta: { controls: [ { framework: SLSA, class: BUILD, id: LEVEL_3 } ] } } { id: slsa-build-type source: { location: { uri: "git+https://github.com/carabiner-dev/policies#slsa/slsa-build-type.json" } } meta: { controls: [ { framework: SLSA, class: BUILD, id: LEVEL_3 } ] } } { id: slsa-build-point source: { location: { uri: "git+https://github.com/carabiner-dev/policies#slsa/slsa-build-point.json" } } meta: { controls: [ { framework: SLSA, class: BUILD, id: LEVEL_3 } ] } } ] } ``` **Result**: pass / fail per rule. Works with any build system that produces SLSA provenance. ??? Puerco walks through the AMPEL policy for mild. Two tenets: the first checks that SLSA provenance exists, the second verifies the VSA declares at least Build Level 1. No hardcoded builder identity or build type. CEL expressions keep the policy compact and readable. --- ## 🌶 Mild: AMPEL Policy ```hjson { id: slsa-build-point context: { buildPoint: { required: true, type: string } buildPointAllowRepo: { required: false, type: bool, default: true } buildPointCommit: { required: false, type: string, default: "" } } tenets: [ { predicates: { types: ["https://slsa.dev/provenance/v1"] } outputs: { uri: { code: "has(predicate.data.buildDefinition) && has(predicate.data.buildDefinition.resolvedDependencies) && predicate.data.buildDefinition.resolvedDependencies.exists(dep, has(dep.uri) && (dep.uri.contains('@') ? dep.uri.split('@')[0] : dep.uri) == (context.buildPoint.contains('@') ? context.buildPoint.split('@')[0] : context.buildPoint)) ? predicate.data.buildDefinition.resolvedDependencies.filter(dep, has(dep.uri) && (dep.uri.contains('@') ? dep.uri.split('@')[0] : dep.uri) == (context.buildPoint.contains('@') ? context.buildPoint.split('@')[0] : context.buildPoint))[0].uri : ''" } commitMatch: { code: "context.buildPointCommit != '' && has(predicate.data.buildDefinition) && has(predicate.data.buildDefinition.resolvedDependencies) && predicate.data.buildDefinition.resolvedDependencies.exists(dep, has(dep.uri) && (dep.uri.contains('@') ? dep.uri.split('@')[0] : dep.uri) == (context.buildPoint.contains('@') ? context.buildPoint.split('@')[0] : context.buildPoint) && has(dep.digest) && dep.digest.exists(k, dep.digest[k] == (context.buildPointCommit.contains(':') ? context.buildPointCommit.split(':')[1] : context.buildPointCommit)))" } } code: "outputs.uri != '' && (context.buildPointAllowRepo || outputs.uri == context.buildPoint) && (context.buildPointCommit == '' || outputs.commitMatch)" assessment: { message: "Expected build point found: " } error: { message: "Build point mismatch" guidance: "The attested build point does not match the expected reference" } } ] } ``` **Result**: pass / fail per rule. Works with any build system that produces SLSA provenance. ??? Puerco walks through the AMPEL policy for mild. Two tenets: the first checks that SLSA provenance exists, the second verifies the VSA declares at least Build Level 1. No hardcoded builder identity or build type. CEL expressions keep the policy compact and readable. --- ## 🌶 Mild: Run the AMPEL Policy ```shell ampel verify sha256:734d6c22b80cdf9bd21c6b13d3475cf02c888d4a0b00d2e092a735 \ # Path to policy --policy "1-mild/ampel/policy.hjson" \ # SLSA Attestation --attestation "slsa.json" ```
+-------------------------------------------------------------------------------------------------------------------------------------------------+ | AMPEL: Evaluation Results | +------------------+-----------------------+--------+---------------------------------------------------------------------------------------------+ | PolicySet | set-base-verification | Date | 2026-03-21 15:03:22.255829 +0100 CET | +------------------+-----------------------+--------+---------------------------------------------------------------------------------------------+ | Status: PASS | Subject | - sha256:734d6c22b80cdf9bd21c6b13d3475cf0... | +------------------+-----------------------+--------+---------------------------------------------------------------------------------------------+ | Policy | Controls | Status | Details | +------------------+-----------------------+--------+---------------------------------------------------------------------------------------------+ | slsa-builder-id | BUILD-LEVEL_3 | PASS | Authorized builder ID detected | | slsa-build-type | BUILD-LEVEL_3 | PASS | Expected buildType found: tekton.dev/v1/PipelineRun | | slsa-build-point | BUILD-LEVEL_3 | PASS | Expected build point found: git+https://gitlab.com/redhat/rhel/containers/ubi10-minimal.git | +------------------+-----------------------+--------+---------------------------------------------------------------------------------------------+
--- ## 🌶 Mild: Run the AMPEL Policy ```shell ampel verify "$(crane registry.access.redhat.com/ubi10/ubi-minimal:latest)" \ # Policy code --policy '1-mild/ampel/policy.hjson' \ # Read attestations attached to the image --collector 'coci:registry.access.redhat.com/ubi10/ubi-minimal:latest' \ # Pass the build point to check --context 'buildPoint:git+https://gitlab.com/redhat/rhel/containers/ubi10-minimal.git' \ # Output an attested copy of the resutls --attest-results=true \ # Output the results as a VSA --attest-format 'vsa' ``` --- ## 🌶 Mild: "Conforma Does That Too" Same checks, different engine: ```rego # Conforma policy — verify foundational provenance properties deny contains result if { count(lib.slsa_provenance_attestations) == 0 result := lib.result_helper(rego.metadata.chain(), []) } deny contains result if { some att in lib.slsa_provenance_attestations build_type := _build_type(att) # handles both SLSA v0.2 and v1.0 allowed := lib.rule_data("allowed_build_types") not build_type in allowed result := lib.result_helper(rego.metadata.chain(), [build_type]) } # Plus upstream rules for: builder identity, source materials, external params ``` **Same checks. Different engine.** Attestation formats follow open standards (in-toto / SLSA), so engines are substitutable. ??? Andrew's "me too." The Conforma policy does the same checks in Rego. Two custom rules: provenance must exist, build type must be in the allowed list. The allowed list is configurable — not hardcoded to any build system. Upstream rules handle builder identity, source materials, and external parameters. About 30 seconds. --- ## 🌶 Mild: Run Conforma ```shell ./1-mild/conforma/verify.sh ``` ```shell === Mild: Verifying base image === Image: registry.access.redhat.com/ubi10/ubi-minimal:latest --- Step 1: Verify release signature Key: 1-mild/conforma/cosign-release.pub Success: true Result: SUCCESS Violations: 0, Warnings: 0, Successes: 15 [...] --- Step 2: Verify provenance Policy: 1-mild/conforma/policy.yaml Key: 1-mild/conforma/cosign-provenance.pub Success: true Result: SUCCESS Violations: 0, Warnings: 0, Successes: 50 [...] === Output files === output/mild/conforma/signature-report.json — image signature verification result output/mild/conforma/provenance-report.json — SLSA provenance policy evaluation ``` ??? Walk through the transcript: two `ec validate` passes (release key, then policy + provenance key), multi-arch index components, JSON reports under `output/mild/conforma/`. This is literal sample output from `mild-to-wild-samples` on a recent run. --- ## "But What About Multiple Attestations — and a Portable Summary?"
Raising the bar
So you verified one artifact's provenance.
What about its dependencies? Base image, other attestations — can you combine and verify them together?
And produce a signed summary so downstream doesn't have to re-verify all of them?
??? Puerco raises the bar. Medium does two things: combine multiple attestations (e.g. built image + base image) and verify them together, and produce a VSA so downstream consumers don't have to re-fetch and re-verify every attestation — they check the one summary. This is the transition to medium — Puerco leads with AMPEL. --- class: center, middle, medium

🌶🌶 Medium

Combine multiple attestations · produce a VSA</span> ??? Puerco takes the lead. Medium combines and verifies multiple attestations (e.g. built image + base image), same mild-style checks, and produces a VSA that captures the combined result so downstream doesn't re-verify each attestation. --- ## 🌶🌶 Medium: More Attestations & Producing a VSA
Image built with GitHub Actions, signed with Sigstore keyless.

Verify the built image and its base image, then produce a signed VSA at SLSA Build Level 2.
What's new
  • Combine & verify multiple attestations (built image + base image)
  • AMPEL produces a single VSA with verified level and dependency levels
  • Portable summary — downstream checks the VSA instead of re-verifying each attestation
Result: One VSA at L2 attached — one check for downstream.
??? Puerco leads. AMPEL policy at medium extends mild: same provenance checks, plus the engine produces a signed VSA (verifiedLevels, dependencyLevels for the base image) and attaches it. Demo: run AMPEL against the GitHub Actions–built image and base image, show the resulting VSA. --- ## 🌶🌶 Medium: AMPEL - Ensuring SLSA Level 2 ```hjson { id: slsa-source-level-2 meta: { description: "Checks for SLSA_SOURCE Level 2 or higher compliance in a VSA" } tenets: [ { predicates: { types: ["https://slsa.dev/verification_summary/v1"] } outputs: { pass: { code: "has(predicates[0].data.verificationResult) ? predicates[0].data.verificationResult == 'PASSED' : false" } levels: { code: "has(predicates[0].data.verifiedLevels) ? predicates[0].data.verifiedLevels : []" } } code: "outputs.pass && outputs.levels.exists(k, v, (v == 'SLSA_SOURCE_LEVEL_2' || v == 'SLSA_SOURCE_LEVEL_3' || v == 'SLSA_SOURCE_LEVEL_4'))" assessment: { message: "VSA attesting SLSA_SOURCE L2 compliance checks" } error: { message: "SLSA Source L2+ not recorded in verification summary" } } ] } ``` ??? This slide is the **source-level** check on a **VSA**: it reads `verification_summary/v1` and requires `SLSA_SOURCE_LEVEL_2` (or higher) in `verifiedLevels`. That mirrors how you gate on a dependency’s summary before trusting the built image’s story. --- ## 🌶🌶 Medium: AMPEL - Chaining Provenance to VSA ```hjson { id: verify-base-image source: { location: { uri: "git+https://github.com/carabiner-dev/policies#vsa/slsa-build-level2.json" } }, context: { // This is the base image reference baseImage: { default: "registry.access.redhat.com/ubi10/ubi-minimal", required: true, } }, chain: [ { // Same as above, we chain the build provenance to extract // the digest of the image. predicate: { type: "https://slsa.dev/provenance/v1", selector: "has(predicate.data.buildDefinition) ? (has(predicate.data.buildDefinition.resolvedDependencies) ? (predicate.data.buildDefinition.resolvedDependencies.map(dep, dep.uri.startsWith(context.baseImage), \"sha256:\" + dep.digest[\"sha256\"])[0]) : '') : ''" } } ], } ``` *Chaining predicates: find a VSA from the policy* ??? This is the **base-image chain** from the built image’s SLSA provenance: resolve the base digest, then load that image’s VSA and assert build level 2. Conforma’s `generate-vsa.sh` does the same story in two passes (base then built). --- ## 🌶🌶 Medium: Conforma — two-pass verification **Scenario**: Same — **built image + base**. Run ./2-medium/conforma/verify.sh (wraps scripts/generate-vsa.sh). ```shell ./2-medium/conforma/verify.sh # optional: BUILT_IMAGE=ghcr.io/arewm/mild-to-wild-samples:tag # Tekton: PUBLIC_KEY=provenance.pub BUILT_IMAGE=quay.io/... ./2-medium/conforma/verify.sh ``` **Outcome** (representative `mild-to-wild-samples` run):
Pass 1 · base ubi-minimal@sha256:734d6c22… → release signature OK, provenance OK
Pass 2 · built ghcr.io/arewm/mild-to-wild-samples@sha256:e9ac6c43…Result: WARNING (5× github_certificate.gh_workflow_extensions) · policy evaluation PASSED
Levels · built SLSA_BUILD_LEVEL_2 · base dependency SLSA_BUILD_LEVEL_2 (count 1)
Write · output/medium/conforma/image.vsa.json (+ base-report.json, built-report.json)
??? Andrew: "Conforma does that too." Pass 1 (base) then pass 2 (built, keyless GitHub Actions). Warnings are optional GitHub OIDC **certificate extensions** missing on the cert — not provenance failures; **violations stay 0** and the VSA file is still written. Next slide: what goes into that VSA. Tekton: `PUBLIC_KEY` + `BUILT_IMAGE`. --- ## 🌶🌶 Medium: Conforma — portable VSA (predicate) Downstream consumers care about the **verification summary** fields, not the full `ec` log. **`output/medium/conforma/image.vsa.json`** — downstream-facing predicate (trimmed): ```json { "verificationResult": "PASSED", "verifiedLevels": ["SLSA_BUILD_LEVEL_2"], "dependencyLevels": { "SLSA_BUILD_LEVEL_2": 1 }, "slsaVersion": "1.0" } ``` Same **in-toto** SLSA verification-summary shape AMPEL can emit — portable across policy engines. ??? Walk the JSON: **verifiedLevels** is the built image; **dependencyLevels** rolls up the base. Full files include `verifier`, `resourceUri`, `policy.uri`, `timeVerified`. Run `./2-medium/conforma/verify.sh` in `mild-to-wild-samples` to reproduce. --- ## 🌶🌶 Medium: "Conforma Does That Too" The policy doesn't care whether the image was built by GitHub Actions or Tekton: ```yaml # policy.yaml accepts both build systems (2-medium/conforma/policy.yaml) ruleData: allowed_builder_ids: - "https://github.com/arewm/mild-to-wild-samples/tekton-build" - "https://github.com/arewm/mild-to-wild-samples/.github/workflows/build-push.yaml@refs/heads/main" allowed_build_types: - "https://tekton.dev/chains/v2/slsa" - "https://actions.github.io/buildtypes/workflow/v1" ``` `./2-medium/conforma/verify.sh` uses keyless flags by default; set `PUBLIC_KEY` for Tekton Chains. Same VSA predicate shape either way. Both engines verify the same properties and can produce VSAs for downstream enforcement. The VSA format is standardized (in-toto), so the output is portable across policy engines. ??? Andrew's "me too." The key insight: the same Conforma policy accepts provenance from either build system because the SLSA format is standardized. The ruleData lists both builder IDs and build types. The repo helper switches key-based vs keyless via `PUBLIC_KEY` vs default certificate flags. The VSA format is standardized, so either engine can produce VSAs that any consumer can verify. About 45 seconds. --- ## "But Here's What Keeps Me Up at Night"
Raising the bar
But did the tasks recorded in the provenance actually produce this artifact?
Tekton Chains records tasks accurately — but pipelines are user-customizable. Any task could have injected a different artifact.
If we verify the tasks themselves were pinned and trusted, can we upgrade to L3?
??? Andrew raises the deeper trust question. This is the distinction between recording what ran and knowing that what ran *actually produced* the artifact. We're already producing VSAs at L2. The question for wild is: can we verify the tasks were trusted and upgrade to L3? Tekton Chains accurately records the tasks that ran, but because Tekton pipelines are user-customizable, the provenance can't on its own prove the artifact is the genuine output of those tasks. This motivates wild: use policy to inspect the Tekton provenance and verify that specific pinned trusted task bundles were used. --- class: center, middle, wild

🌶🌶🌶 Wild

Upgrade from L2 to L3 with trusted task verification</span> ??? Andrew introduces the wild level. Wild does the same thing as medium but for Tekton, where we have trusted tasks and isolation guarantees that let us upgrade to L3. Tekton Chains records task references in the provenance. Wild policy verifies every task is a known, pinned bundle or git reference. If all tasks are trusted, the build environment's isolation guarantees are established, and the VSA declares L3. If any are untrusted, warnings are produced and the VSA stays at L2. --- ## 🌶🌶🌶 Wild: Trusted Task Verification for L3 Tekton provenance records remote task references including bundle digests or git SHAs. ```json // TaskRun provenance (SLSA v1.0) { "buildDefinition": { "resolvedDependencies": [{ "name": "task", "uri": "git+https://github.com/arewm/mild-to-wild-samples", "digest": { "sha1": "e2c6ae7358fd68399787d322347a95ccd7bbb2f8" } }]}} ``` **Policy**: verify every task against a **trusted allowlist**. `warn` rule, not `deny` → untrusted → **L2**; all trusted → **L3**. ```rego # Conforma — warn on untrusted task refs warn contains result if { some att in lib.pipelinerun_attestations tasks := tekton.tasks(att) untrusted := tekton.untrusted_task_refs(tasks, manifests) # allowlist check count(untrusted) > 0 result := lib.result_helper(rego.metadata.chain(), [bundle_ref]) } ``` ??? Andrew explains the wild approach. Tekton Chains records task bundle references (for PipelineRun) or git resolver references (for TaskRun) in the provenance. Wild policy collects the bundle refs, fetches their OCI manifests (for version constraint checking), and verifies each task against a trusted task allowlist. Crucially, this is a `warn` rule, not `deny` — the policy always passes. Untrusted tasks produce warnings, which means the VSA stays at L2. If all tasks are trusted (no warnings), the VSA upgrades to L3. This is the "trusted task" model that Konflux uses: pinned tasks with known digests behave deterministically. --- ## 🌶🌶🌶 Wild: Trusted Task Data Format The allowlist specifies which task references are trusted: ```yaml # For PipelineRun: trusted_task_rules (OCI bundle patterns) # Loaded from quay.io/konflux-ci/tekton-catalog/data-acceptable-bundles # For TaskRun: trusted_task_refs (git URI + digest) trusted_task_refs: - uri: "git+https://github.com/arewm/mild-to-wild-samples" digest: sha1: "e2c6ae7358fd68399787d322347a95ccd7bbb2f8" ``` Policy checks the provenance task references against this data. Matching = trusted. Warnings = untrusted → L2. No warnings = all trusted → L3.
Tekton provenance → policy checks tasks → VSA at L2 or L3
??? Show the trusted task data format. For PipelineRun provenance, the trusted task rules come from an OCI bundle (Konflux's tekton-catalog). For TaskRun provenance using the git resolver, we maintain a list of trusted git URI prefixes and digests. The policy matches the task references in the provenance against this data. Any untrusted task produces a warning, which signals the VSA generator to stay at L2. All trusted means no warnings, so the VSA can declare L3. --- ## 🌶🌶🌶 Wild: Run Conforma ```shell ./3-wild/conforma/verify.sh # Default BUILT_IMAGE in script: quay.io/arewm/mild-to-wild-samples:build-20260319-164911 ``` **Outcome** (same idea as medium — compress the long `ec` transcript):
Pass 1 · base ubi-minimal@sha256:7ccae4b0… → OK
Pass 2 · built quay.io/arewm/mild-to-wild-samples@sha256:288eb652… · wild policy + trusted-tasks.yamlResult: SUCCESS, no task warnings
Levels · built SLSA_BUILD_LEVEL_3 · base dependency SLSA_BUILD_LEVEL_2 ×1
Write · output/wild/conforma/image.vsa.json
**VSA predicate** (L3 on the artifact under verification): ```json { "verificationResult": "PASSED", "verifiedLevels": ["SLSA_BUILD_LEVEL_3"], "dependencyLevels": { "SLSA_BUILD_LEVEL_2": 1 }, "slsaVersion": "1.0" } ``` ??? Representative run from `3-wild/conforma/verify.sh`: trusted tasks satisfied → pass 2 stays **SUCCESS** (contrast medium’s GitHub cert **warnings**) → VSA promotes the built image to **L3**. Full stdout is in the samples repo if you want a backup slide with the raw log. --- ## 🌶🌶🌶 Wild: "AMPEL Can Verify That Too" ```hjson { id: verify-trusted-tasks context: { // This is the context data from the file trusted_task_refs: { required: true } } tenets: [ { predicates: { types: ["https://slsa.dev/provenance/v1"] } code: ''' has(predicates[0].data.buildDefinition) && has(predicates[0].data.buildDefinition.resolvedDependencies) && has(context.trusted_task_refs) && predicates[0].data.buildDefinition.resolvedDependencies.filter(dep, has(dep.name) && dep.name == 'task') .all(dep, context.trusted_task_refs.exists(ref, ref.uri == dep.uri)) ''' assessment: { message: "All tasks are in the allow list of trusted tasks" } error: { message: "Untrusted task found" guidance: "At least one task was not found in the allowed tasklist" } } ] } ``` Same idea: trusted allowlist, substitutable engines. Untrusted → L2; all trusted → L3. ??? Puerco's final "me too." The payoff of the running gag: even for the most nuanced policy use case — trusted task verification with warn-level rules — both engines can do it. The attestation standard is the key, not the engine. Keep it brief — about 30 seconds. Then segue directly into takeaways. --- ## Which Heat Level Are You?
Level You check… Produces… Start here if…
🌶 Mild Provenance present, build type, builder identity, source materials, external params Pass/fail verification Just getting started
🌶🌶 Medium Same as mild VSA at SLSA Build Level 2 You want portable summaries for admission control
🌶🌶🌶 Wild Same as medium + trusted task verification (Tekton-specific) VSA at L2 (warnings) or L3 (all tasks trusted) You want end-to-end trust
Policy engines are interchangeable. Pick the one that fits your stack.
Attestation standards are open.
??? Both speakers together. Quick summary. The three key messages: 1. Start at mild with foundational provenance checks. Medium adds VSA output at L2 for portable verification. Wild upgrades to L3 by verifying trusted tasks. 2. Policy engines are interchangeable because the attestation standards are open. 3. Wild-level trust is Tekton-specific but follows the same pattern: verify properties in standardized attestations. --- class: center, middle, inverse

Thank You

Questions?
Andrew McNamara · arewm@redhat.com
Adolfo "puerco" García Veytia · puerco@carabiner.dev
.footnote[ slides.arewm.com/presentations/2026-03-23-from-mild-to-wild ] ??? Open for Q&A. Roughly 7 minutes. Both speakers take questions. --- ## Resources
??? Quick close. "Scan, follow along, try it yourself."