verify-sign — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited verify-sign (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Add an Artifact Verification (SscaArtifactVerification) step to an existing Harness pipeline. The step verifies Cosign signatures on artifacts — typically immediately after SscaArtifactSigning.
This skill only works with existing pipelines — do not create standalone verification-only pipelines.
Prerequisites: Artifact must already be signed (typically via /sign-artifact / SscaArtifactSigning). Key-based verify requires the Cosign public key file secret matching the signing private key (/create-secret). If signing did not upload .sig to the registry, Harness pulls the signature from its database during verification.
Supported stages: CI, Security, and CD (Deployment in containerized step group before deploy).
Guide the user through a step-by-step interactive wizard (same UX as /sign-artifact):
references/interactive-wizard-flow.mdreferences/artifact-verification-step.mdreferences/cd-containerized-step-group.mdAskQuestion when available; otherwise numbered options with (Recommended).Pipeline · Placement · Source · Details · Verify · Submit
harness_get before placement/source questions.SscaArtifactSigning and connectors.SscaArtifactSigning step exists, reuse its source. Ifmultiple exist, ask which step to mirror.
harness_update only after user confirms.harness_update, provide a configuration summary andpoint 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).
/sign-artifact: harness_list withfilters.type, all scopes, size: 100, paginate; never hand-pick a subset. See wizard Phase 6.
harness_list per environment withfilters.environment_id; never show only the infra for one pre-selected environment.
artifact expression over a static tag from signing. Warn when static image ≠ service default tag.
harness_list(resource_type="delegate") orharness_execute(test_connection) on the K8s connector used in stepGroupInfra. Abort or warn if DELEGATE_NOT_AVAILABLE is likely (connector has delegateSelectors with no active delegate).
failureStrategies: StageRollback,rollbackSteps with K8sRollingRollback + spec: {}, and CI stages need MarkAsFailure when missing. See references/cd-containerized-step-group.md.
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 SscaArtifactSigning |
| 3 | Placement | AskQuestion: after signing, CD before deploy, etc. |
| 3b | Placement (CD) | Service, env, infra, step group if new Deploy stage |
| 4 | Source | Infer from signing or pick registry tile |
| 5 | Source | Registry provider (Third-Party only) |
| 6 | Details | Connector — list all via harness_list + filters.type (skip if obvious) |
| 7 | Details | Image / artifact fields (default from signing) |
| 8 | Verify | AskQuestion: verify signature method |
| 9 | Submit | AskQuestion: confirm pipeline update |
After Phase 9 confirm → insert step, harness_update, then provide summary (do not run the pipeline).
| Stage type | Step type | Placement notes |
|---|---|---|
CI | SscaArtifactVerification | After SscaArtifactSigning in the same stage |
Deployment | SscaArtifactVerification | Containerized step group; before deploy |
Security | SscaArtifactVerification | After signing 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 Artifact Verification before deploy.
Run Phase 3b (service, environment, infrastructure, stepGroupInfra) — see references/cd-containerized-step-group.md.
#### Preflight before CD stage write
stepGroupInfra — note delegateSelectors.selectors (e.g. ssca-prod2-at). Warn before harness_update if none match.
verify image, warn when it differs from the service default.
#### CD Deploy stage YAML (append to pipeline)
When adding a new Deploy stage, include all required blocks (API rejects incomplete YAML):
- stage:
name: Deploy
identifier: Deploy
type: Deployment
spec:
deploymentType: Kubernetes
service:
serviceRef: <service_id>
environment:
environmentRef: <env_id>
infrastructureDefinitions:
- identifier: <infra_id>
execution:
steps:
- stepGroup:
identifier: scs_before_deploy
name: Supply Chain Security
stepGroupInfra:
type: KubernetesDirect
spec:
connectorRef: <k8s_connector>
namespace: <namespace>
steps:
- step:
identifier: artifactverification_cd
name: Artifact Verification
type: SscaArtifactVerification
spec:
source:
type: docker
spec:
connector: <registry_connector>
image: <+artifact.image>
verifySign:
type: keyless
spec:
oidcProvider: harness
timeout: 15m
- step:
identifier: rolling_deployment
name: Rolling Deployment
type: K8sRollingDeploy
spec:
skipDryRun: false
timeout: 10m
rollbackSteps:
- step:
identifier: rollback
name: Rollback
type: K8sRollingRollback
spec: {}
timeout: 10m
failureStrategies:
- onFailure:
errors: [AllErrors]
action:
type: StageRollbackAlso ensure existing CI stages have failureStrategies: MarkAsFailure when missing.
#### Check prerequisites
SscaArtifactSigning (or user confirms signature exists).#### Extract context from pipeline YAML
From SscaArtifactSigning (if present), copy source and map signing → verification:
| Signing | Verification |
|---|---|
source.type: docker | same source.type: docker |
source.spec.image | same source.spec.image |
source.spec.connector | same source.spec.connector |
source.type: har | same source.type: har + registry + image |
signing.type: keyless | verifySign keyless (match OIDC provider) |
signing.type: cosign / keybased | verifySign with public key secret |
#### Generate Artifact Verification step YAML
CI — Docker Registry, key-based verify (Harness docs):
- step:
identifier: artifactverification
name: Artifact Verification
type: SscaArtifactVerification
spec:
source:
type: docker
spec:
connector: lavakush07
image: lavakush07/easy-buggy-app:v5
verifySign:
type: cosign
spec:
public_key: account.cosign_public_key
timeout: 15mKeyless verify (when signing used keyless Harness OIDC):
verifySign:
type: keyless
spec:
oidcProvider: harnessIf API validation rejects flat keyless, retry nested cosign wrapper — see references/artifact-verification-step.md.
HAR verify:
source:
type: har
spec:
registry: prod_har
image: my-service:v3CD Deploy — same step type inside containerized stepGroup; use <+artifact.image> for image when verifying service artifacts.
Full provider mapping: references/artifact-verification-step.md.
#### Insert step into pipeline YAML
Critical: Use the exact yamlPipeline from harness_get as the base. Insert or update only SscaArtifactVerification (and CD step group infra when applicable). Never add HarnessSAST, STO scanners, or other steps — signing/verification skills do not configure code scan.
artifactsigning when possible.artifactverification (use artifactverification_cd in CD when CI already has one).#### 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, check verifySign shape, image field, and public key secret refs.
#### Provide summary
Report the results to the user (same pattern as /configure-repo-scan — do not execute the pipeline):
## Artifact Verification Configured
**Pipeline:** <pipeline_name>
**Step:** Artifact Verification (SscaArtifactVerification)
**Location:** Stage "<stage_name>", <position>
**Source:** docker — <connector> — <image>
**Verify signature:** Keyless (Harness OIDC) — 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 Artifact Verification step in Pipeline Studio to adjust Advanced settings.
### Next Steps
1. Run the pipeline via `/run-pipeline` to verify artifact 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**, confirm verify method matches signing; check public key for keybased
5. Add signing with `/sign-artifact` if signature was missing — ensure `uploadSignature.upload: true`
6. Add SBOM/SLSA if not present (`/manage-supply-chain` or pipeline `SscaOrchestration` / `provenance`)
7. Automate with `/create-trigger`CD pipelines: note in the summary if runtime inputs (service artifact, environment, infrastructure, artifact tag/digest) will be required at run time — the user provides those via /run-pipeline or Harness UI Run. When running CI+CD, check runtime_input_template — service primaryArtifactRef: <+input> may need artifact tag/digest in inputs even when the template only shows build.
/verify-sign
Add artifact verification after artifactsigning — public key account.cosign_public_key/verify-sign
Verify signed artifact in deploy stage before K8s rolling deploy — keyless verify/verify-sign
Verify signature for HAR image payment-service:v2 — same registry as signing step/verify-sign
Verify with keyless Harness OIDC — same image as signing stepsource.type and image as SscaArtifactSigning.verify_attestation (SLSA) or signing.source.type: har; offer even if UI shows only two tiles./run-pipeline after configuration (same as /configure-repo-scan)./sign-artifact (sign) — verify method must match signing./sign-artifact first with signature upload or Harness DB signature storage.SscaArtifactSigning or identifier: artifactsigning.keyless vs keybased/cosign)..sig not in registry, signing step may not have set uploadSignature.upload: true (Harnessdefault is unchecked). Update signing step and re-run, or rely on Harness DB signature storage.
SscaArtifactSigning step to mirror for source, image, and verify method.secret-manager block.image as signing step source.spec.image.<+artifact.image> — static signing tag (e.g. :v5) may not match serviceartifact (e.g. :v24) and verification will fail or verify the wrong image.
DELEGATE_NOT_AVAILABLE)(e.g. Delegate(s) don't have selectors [ssca-prod2-at]).
/manage-delegates), or pick infra/K8s connectorbacked by an active delegate. Re-run after delegate is healthy.
failureStrategies: is missing — add StageRollback on the Deploy stage.rollbackSteps[0].step.spec: is missing — K8sRollingRollback requires spec: {}.references/cd-containerized-step-group.md.type must be SscaArtifactVerification.connector + image (not repo or image_path).verifySign: prefer flat type: keyless; keybased uses type: cosign + public_key.DUPLICATE_IDENTIFIER — rename artifactverification.stepGroup with stepGroupInfra — not top-level execution.steps.references/cd-containerized-step-group.md.harness_list + filters: { type: "DockerRegistry" } (not harness_search orparams.filterType). Query project, org, and account scopes. For infrastructure, list per environment with filters: { environment_id: "<env>" } — see wizard Phase 3b and Phase 6.
/run-pipeline to execute and /debug-pipeline to diagnose failures/run-pipeline or Harness UI RunCONNECTOR_NOT_FOUND — verify connector in Project Settings; re-run scoped harness_list.ACCESS_DENIED — PAT needs pipeline edit permission.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.