Add an SLSA Verification (SlsaVerification) step to an existing Harness pipeline to verify SLSA provenance attestations and optionally enforce OPA policy sets on provenance data. Supports CI and CD (Deployment) including CI-only pipelines — append a Deploy stage via Phase 3b when verifying before deploy. Supports Docker, ECR, GCR, GAR, ACR, HAR, and Local artifacts. Only works with existing pipelines. Use when asked to verify SLSA, enforce SLSA policies, add SLSA verification step, validate SLSA attestation, or gate deploy on SLSA provenance. Trigger phrases: enforce SLSA, SLSA verification, verify SLSA, SLSA policy enforcement, SlsaVerification, verify SLSA attestation, add SLSA verify step.
76
95%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Passed
No findings from the security scan
Add an SLSA Verification (SlsaVerification) step to an existing Harness pipeline. The step
verifies SLSA provenance attestations (when enabled) and optionally evaluates OPA policy sets against
provenance data.
This skill only works with existing pipelines — do not create standalone verification-only pipelines.
Prerequisites: SLSA provenance must already exist for the artifact (typically from a provenance
step via /generate-slsa — UI label SLSA Generation). Optional policy sets for provenance
enforcement (/create-policy, harness_list policy_set).
Supported stages: CI, CD (Deployment), and Security. CD requires a containerized step group.
Unlike SBOM enforcement, CI and CD both use SlsaVerification (no separate CD step type).
Guide the user through a step-by-step interactive wizard (same UX as /generate-slsa):
references/interactive-wizard-flow.mdreferences/slsa-verification-step.mdskills/generate-slsa/references/cd-containerized-step-group.mdAskQuestion when available; otherwise numbered options with (Recommended).Pipeline · Placement · Source · Details · Verify · Policy · Submitharness_get before placement/source questions.provenance (SLSA Generation) and connectors.provenance step exists (or identifier: slsageneration), reuse its source (map repo → image_path, lowercase → PascalCase types).harness_update only after user confirms.harness_update, provide a configuration summary and
point the user to /run-pipeline to execute. Do not call harness_execute, poll
executions, or run harness_diagnose in this skill (same pattern as /configure-repo-scan).Full phase prompts: references/interactive-wizard-flow.md.
| Phase | Breadcrumb | Action |
|---|---|---|
| 0 | Pipeline | AskQuestion: pipeline URL ready? |
| 1 | Pipeline | Collect URL → harness_get |
| 2 | Pipeline | Display structure; note missing provenance (SLSA Generation) step |
| 3 | Placement | AskQuestion: after generation, CD before deploy, etc. |
| 3b | Placement (CD) | Service, env, infra, step group if new Deploy stage |
| 4 | Source | Infer from generation or pick registry tile |
| 5 | Source | Registry provider (Third-Party only) |
| 6 | Details | Connector (skip if obvious) |
| 7 | Details | Image / image_path (default from generation) |
| 8 | Verify | AskQuestion: verify attestation method |
| 9 | Policy | AskQuestion: policy set(s) or skip |
| 10 | Submit | AskQuestion: confirm pipeline update |
After Phase 10 confirm → insert step, harness_update, then provide summary (do not run the pipeline).
| Stage type | Step type | Placement notes |
|---|---|---|
CI | SlsaVerification | After provenance / slsageneration in the same stage |
Deployment | SlsaVerification | Containerized step group; before deploy |
Security | SlsaVerification | After generation when artifact is in registry |
If no Deployment stage and user chose CD verify:
No CD Deploy stage yet. We can add a Deployment stage with a containerized step group and place SLSA Verification before deploy.
Run Phase 3b (service, environment, infrastructure, stepGroupInfra) — mirror /generate-slsa Phase 3b.
Use skills/generate-slsa/references/cd-containerized-step-group.md with SlsaVerification.
type: provenance (SLSA Generation) or user confirms provenance exists.harness_list(resource_type="policy_set"). If user wants policy
enforcement and none exist, direct to /create-policy before continuing.From provenance step (if present — also match identifier: slsageneration), copy and transform:
| Generation | Verification |
|---|---|
source.type: docker | source.type: Docker |
source.spec.repo | source.spec.image_path |
source.spec.connector | source.spec.connector |
spec.attestation | matching verify_attestation (private → public key for keybased) |
CI / Security — Docker Registry, keyless verify:
- step:
identifier: slsaverification
name: SLSA Verification
type: SlsaVerification
spec:
source:
type: Docker
spec:
connector: lavakush07
image_path: lavakush07/easy-buggy-app:blog
verify_attestation:
type: keyless
spec:
oidcProvider: harness
timeout: 15mKey-based verify (generation used keybased + private key):
verify_attestation:
type: keybased
spec:
publicKey: account.cosign_public_keyIf API validation rejects flat keyless / keybased, retry with nested cosign wrapper — see
references/slsa-verification-step.md.
Policy enforcement (Advanced tab — step-level enforce):
enforce:
policySets:
- slsa_provenance_rulesNo attestation verify (policy-only): omit verify_attestation.
CD Deploy — same step type inside containerized stepGroup; use <+artifact.image> for
image_path when verifying service artifacts.
Full provider mapping: references/slsa-verification-step.md.
slsageneration when possible.slsaverification (use slsaverification_cd in CD when CI already has one).harness_update
resource_type: pipeline
resource_id: <pipeline_identifier>
org_id: <organization>
project_id: <project>
body: { yamlPipeline: "<updated pipeline YAML>" }On validation errors, check PascalCase source.type, image_path vs repo, and verify_attestation
shape (prefer flat keyless; fallback nested cosign).
Report the results to the user (same pattern as /configure-repo-scan — do not execute the pipeline):
## SLSA Verification Configured
**Pipeline:** <pipeline_name>
**Step:** SLSA Verification (SlsaVerification)
**Location:** Stage "<stage_name>", <position>
**Source:** Docker — <connector> — <image_path>
**Verify attestation:** Keyless (Harness OIDC) — or as configured
**Policy sets:** <list or none>
**Pipeline URL:** https://app.harness.io/ng/account/<account_id>/module/ci/orgs/<org_id>/projects/<project_id>/pipelines/<pipeline_id>/pipeline-studio/
**Note:** Review the SLSA Verification step in Pipeline Studio to adjust Advanced settings.
### Next Steps
1. Run the pipeline via `/run-pipeline` to verify SLSA verification executes successfully
2. If the run fails, diagnose with `/debug-pipeline`
3. View verification outcome on the execution **Supply Chain** tab
4. If **Failed** due to policy deny, tune policies via `/create-policy`
5. Add generation with `/generate-slsa` if provenance was missing
6. Automate with `/create-trigger`CD pipelines: note in the summary if runtime inputs (service artifact, environment, infrastructure)
will be required at run time — the user provides those via /run-pipeline or Harness UI Run.
/enforce-slsa
Add SLSA verification after slsa-generation — keyless verify, policy set slsa_prod_rules/enforce-slsa
Verify SLSA in deploy stage before K8s rolling deploy for easy-buggy-app:blog/enforce-slsa
Verify SLSA with public key account.cosign_public_key — same image as generation steptype: provenance or identifier: slsageneration; map repo → image_path, lowercase → PascalCase types.source.type is PascalCase (Docker) — generation uses lowercase (docker).verify_attestation is snake_case (not verifyAttestation). Prefer flat type: keyless + oidcProvider (same shape as generation attestation).enforce.policySets — not spec.policy like SBOM enforcement.policy_set via MCP — do not invent identifiers.skills/generate-slsa/references/cd-containerized-step-group.md./run-pipeline after configuration (same as /configure-repo-scan)./generate-slsa (generate) and /create-policy (OPA rules)./generate-slsa first with attestation enabled (type: provenance in YAML)..att in registry or provenance in SCS Artifacts.provenance steps — not SlsaGeneration (API uses provenance).keyless vs keybased).image_path as generation repo field.enforce.policySets.source.type must be PascalCase for verification (Docker, not docker).image_path, not repo.verify_attestation: use flat type: keyless + spec.oidcProvider: harness — not nested cosign unless API rejects flat shape.DUPLICATE_IDENTIFIER — rename slsaverification.stepGroup with stepGroupInfra — not top-level execution.steps.skills/generate-slsa/references/cd-containerized-step-group.md./run-pipeline to execute and /debug-pipeline to diagnose failures/run-pipeline or Harness UI RunCONNECTOR_NOT_FOUND — verify connector in Project Settings.ACCESS_DENIED — PAT needs pipeline edit and policy read permissions.23e9b8b
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.