Generate SLSA
Add a SLSA Generation step to an existing Harness pipeline to generate SLSA provenance and
optionally attest/sign the .att file in the container registry. Pipeline YAML uses
type: provenance (UI label: SLSA Generation; do not use SlsaGeneration — API rejects it).
This skill only works with existing pipelines — do not create standalone SLSA-only pipelines.
Prerequisites: Image must be built and pushed (or available in registry) before SLSA runs.
Key-based attestation requires Cosign key pair secrets (/create-secret). Harness Cloud builds
enable SLSA Level 3 provenance when using hosted infrastructure.
Guide the user through a step-by-step interactive wizard (same UX as /configure-repo-scan):
- Wizard:
references/interactive-wizard-flow.md - UI ↔ YAML:
references/slsa-generation-step.md - CD containerized step groups:
references/cd-containerized-step-group.md
Interaction model (mandatory)
- One question per turn — use
AskQuestionwhen available; otherwise numbered options with(Recommended). - Opening message — add SLSA Generation after image build/push; mention attestation options.
- Progress breadcrumb — after pipeline fetch:
Pipeline · Placement · Source · Details · Attestation · Submit - Record answers — running summary; do not re-ask unless the user changes direction.
- Fetch before configure —
harness_getbefore placement/source questions. - Show pipeline structure — highlight build/push steps and existing
provenance/SscaOrchestrationsteps (UI: SLSA Generation). - Infer connector from build/push — skip connector question when unambiguous from YAML.
- Never guess image tags — always ask for image/repo in Phase 7.
- Confirm before write — summary +
harness_updateonly after user confirms. - Stop after update — after successful
harness_update, provide a configuration summary and point the user to/run-pipelineto execute. Do not callharness_execute, poll executions, or runharness_diagnosein this skill (same pattern as/configure-repo-scan). - Phase 3 Placement is mandatory — always run Phase 2 then Phase 3, even with one CI stage or prior session context.
- Sequential with SBOM — if
SscaOrchestrationexists, place SLSA after it; never parallel (Cosign race). - CD path — Deploy stage steps go inside containerized
stepGrouponly — see CD reference.
Full phase prompts: references/interactive-wizard-flow.md.
Instructions
Wizard phases
| Phase | Breadcrumb | Action |
|---|---|---|
| 0 | Pipeline | AskQuestion: pipeline URL ready? |
| 1 | Pipeline | Collect URL → harness_get |
| 2 | Pipeline | Display structure; note build/push + SBOM steps |
| 3 | Placement | Mandatory AskQuestion: stage + position (after build/push recommended) |
| 3b | Placement (CD) | Service, env, infra, step group if new Deploy stage |
| 4 | Source | AskQuestion: Third-Party, HAR, or Local |
| 5 | Source | AskQuestion: registry provider (Third-Party only) |
| 6 | Details | Connector (skip if obvious) |
| 7 | Details | Image/repo; optional digest expression |
| 8 | Attestation | AskQuestion: keyless, keybased, vault, or none |
| 9 | Submit | AskQuestion: confirm pipeline update |
After Phase 9 confirm → generate YAML, insert step, harness_update, then provide summary (do not run the pipeline).
Supported stage types
| Stage type | Placement notes |
|---|---|
CI |
Recommended — immediately after BuildAndPush* or image push Run step |
Deployment |
Containerized step group only; before deploy — uncommon for generation |
Security |
End of stage when scanning pre-built registry images |
After the wizard — backend steps
Extract connectors from pipeline YAML
From BuildAndPushDockerRegistry, BuildAndPushECR, Run, Plugin, SscaOrchestration,
provenance (SLSA Generation), or SscaArtifactSigning steps — reuse connectorRef / connector.
Generate SLSA step YAML
Use only wizard answers. Default attestation: keyless Harness OIDC when user chose defaults.
Docker Registry — matches reference UI (key-based attestation):
- step:
identifier: slsageneration
name: slsa-generation
type: provenance
spec:
source:
type: docker
spec:
connector: lavakush07
repo: lavakush07/easy-buggy-app:blog
attestation:
type: keybased
spec:
privateKey: account.cosign_private_key
password: account.cosign_password
timeout: 15m
Keyless attestation (default for “use defaults”):
attestation:
type: keyless
spec:
oidcProvider: harness
With digest from Build and Push:
source:
type: docker
spec:
connector: <docker_registry_connector>
repo: <org>/<repo>:<tag>
digest: <+pipeline.stages.<stage>.spec.execution.steps.<build_step>.output.outputVariables.digest>
Amazon ECR:
source:
type: ecr
spec:
connector: <registry_connector>
image: <repo/name>
region: <aws_region>
account: <aws_account_id>
Google GCR / GAR / Azure ACR / HAR / Local: see references/slsa-generation-step.md.
No attestation: omit attestation block.
Insert step into pipeline YAML
- Insert at Phase 3 placement — after build/push (or after
generate_sbomwhen both exist). - Do not modify unrelated steps, variables, or failure strategies.
- Step identifier:
slsageneration(suffix_cdin CD when CI already has one). - CD: inside containerized
stepGroup.stepsonly.
Update pipeline via MCP
harness_update
resource_type: pipeline
resource_id: <pipeline_identifier>
org_id: <organization>
project_id: <project>
body: { yamlPipeline: "<updated pipeline YAML>" }
On validation errors, read the API message, fix fields (often repo vs image, attestation spec), retry.
Provide summary
Report the results to the user (same pattern as /configure-repo-scan — do not execute the pipeline):
## SLSA Generation Configured
**Pipeline:** <pipeline_name>
**Step:** SLSA Generation (`provenance`)
**Location:** Stage "<stage_name>", <position>
**Source:** docker — <connector> — <repo/image>
**Attestation:** Key-based (account.cosign_private_key) — or as configured
**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 Generation step in Pipeline Studio to adjust Advanced settings.
**Provenance:** After a successful run, view on the Supply Chain tab and in SCS Artifacts.
### Next Steps
1. Run the pipeline via `/run-pipeline` to verify the SLSA Generation step executes successfully
2. If the run fails, diagnose with `/debug-pipeline`
3. Add SLSA verification with `/enforce-slsa`
4. Pair with `SscaOrchestration` (Generate SBOM) — run SBOM then SLSA sequentially
5. 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.
Examples
After Docker build/push — key-based attestation (reference UI)
/generate-slsa
Add SLSA Generation to my CI pipeline after docker push — lavakush07/easy-buggy-app:blog, key-based attest with account cosign secrets
Keyless defaults on Harness Cloud
/generate-slsa
Use defaults — keyless Harness OIDC after Build_and_Push step
With digest expression
/generate-slsa
Generate SLSA for image from Build_and_Push digest output — keyless attest
Placement must be explicit
/generate-slsa
add slsa to the pipeline
Agent must still run Phase 2 + Phase 3 — do not assume stage or skip placement.
Performance Notes
- Only existing pipelines — do not create standalone SLSA pipelines (may append Deploy stage for CD).
- Wizard UX is mandatory — one question per turn; see
references/interactive-wizard-flow.md. - Placement after build/push — SLSA needs a published image (tag or digest).
- Sequential with SBOM — never parallel SBOM + SLSA attestation (Cosign registry race).
- YAML step
typeisprovenance— notSlsaGeneration(API enum rejectsSlsaGeneration). - Docker UI Image field → YAML
source.spec.repo(notimage; SBOMSscaOrchestrationusesimagefor docker). - Key-based attestation — private key + password must be Harness file secrets (
/create-secret). - CD generation is rare — prefer CI generation + CD
/enforce-slsa; see CD reference. - Do not execute pipelines in this skill — use
/run-pipelineafter configuration (same as/configure-repo-scan). - Do not use for dashboard-only SSCA config — use
/manage-supply-chaininstead.
Troubleshooting
Pipeline Not Found
- Verify org/project;
harness_list(resource_type:pipeline).
Connector Not Found
- Search build/push steps for
connectorRef;harness_searchfor Docker registry connectors.
Image Not Found / Invalid Reference
- Use single
repostring — e.g.lavakush07/easy-buggy-app:blog. - Symptom: provenance generation fails — confirm image exists at run time.
Attestation Failed (Key-based)
- Verify file secrets exist and Cosign key is
ecdsa-p256. - Password secret must match the key pair generation password.
- JFrog registries need extra connector permissions for
.attupload.
Attestation Failed (Keyless)
- Requires Harness CI execution context; configure Connector for Keyless Signing for non-harness OIDC.
SBOM + SLSA Race
- Symptom: only one
.attin registry — steps ran in parallel. - Fix: reorder — SBOM then SLSA sequentially in the same stage.
CD Validation Errors
provenance(SLSA Generation) in Deploy stages must be insidestepGroupwithstepGroupInfra.- See
references/cd-containerized-step-group.md.
YAML Rejects SlsaGeneration Step Type
- Symptom:
does not have a value in the enumerationforSlsaGeneration. - Fix: use
type: provenance— validate withharness_schema(resource_type="pipeline", path="steps").
Skipped Placement
- Re-run wizard from Phase 2; ask stage + position explicitly.
Pipeline Run Failed
- Use
/run-pipelineto execute and/debug-pipelineto diagnose failures - Verify image exists in registry and Cosign secrets are valid file secrets
- CD: provide service/env/infra inputs via
/run-pipelineor Harness UI Run — do not guess runtime inputs
MCP Errors
CONNECTOR_NOT_FOUND— verify connector identifier.ACCESS_DENIED— PAT needs pipeline edit permission.