Skip to main content
View Markdown ↗

Copy this page

Select and copy the Markdown below, then paste it into your LLM.

On this page

policyverify attestor

Emits a SLSA Verification Summary Attestation (VSA) recording the outcome of a cilock verify run against a signed policy.

Namepolicyverify
Predicate typehttps://slsa.dev/verification_summary/v1
Lifecycleverify
Default binary?No
Recommended traceoff — no syscall tracing needed
Auto-attaches whenNot auto-detected — attach explicitly with -a.

The facts in this box are generated from the CI/lock binary's own catalog (cilock tools list). Do not hand-edit — run npm run gen:catalog.

What it captures

The attestor embeds slsa.VerificationSummary and serializes per the SLSA VSA v1 spec:

  • verifier.id: the fixed URI https://aflock.ai/cilock/verify/policy@v1. It names the kind of verifier, not who ran it.
  • timeVerified: wall-clock timestamp captured when Attest finishes verification.
  • resourceUri: the verified artifact: the first subject's sha256:<hex>, or its first digest by name when it has no sha256. Empty when verify ran with no artifact subject.
  • policy.uri: the policy's payload type: https://aflock.ai/policy/v0.1 for a v0.1 or legacy witness policy, https://aflock.ai/policy/v0.2 for a v0.2 policy. The policy's content identity is in policy.digest.
  • policy.digest: digest set computed from the policy DSSE envelope payload (the canonical policy bytes that were signature-verified).
  • inputAttestations[]: for every policy step, each passing collection's Reference URI plus a computed digest. When verification fails, rejected collections are also included so downstream consumers can see what was considered.
  • verificationResult: "PASSED" or "FAILED", derived from the policy engine's accepted return value.
  • verifiedLevels: ["SLSA_BUILD_LEVEL_UNEVALUATED"] on a pass, since a policy check assesses no SLSA level, and ["FAILED"] on a failure.

Fields outside the SLSA predicate:

  • stepResults[]: one entry per policy step, sorted by step name: step, passed[] (collection references) and rejected[] (reference, collection, reason, plus denies[] with the Rego deny messages when the rejection was a policy denial). Read deny messages here.
  • denyReasons[]: per-collection rejection records (reference, collection_name, message). The Judge platform's verifier fills it; cilock verify leaves it empty and signs the same detail as stepResults[].

Subjects emitted by the attestor (via the Subjecter interface):

  • One artifact:<digest> entry per subject digest supplied to verify.
  • One policy:<uri> entry pointing at the verified policy.

When to use

Run as part of cilock verify at a release or deploy gate. The resulting VSA is a portable, signed statement that "this policy passed against these subjects at this time." Downstream consumers (admission controllers, deploy pipelines, auditors) can trust the VSA without re-fetching the full evidence chain or re-running the policy engine.

Flags

None. The attestor is configured programmatically by cilock verify via setter methods (SetPolicyEnvelope, SetSubjectDigests, SetCollectionSource, SetPolicyVerificationOptions, SetAiServerURL, SetKMSProviderOptions) — there are no user-facing attestor flags.

Output shape

{
  "verifier": { "id": "https://aflock.ai/cilock/verify/policy@v1" },
  "timeVerified": "2026-05-21T12:34:56Z",
  "resourceUri": "sha256:...",
  "policy": {
    "uri": "https://aflock.ai/policy/v0.1",
    "digest": { "sha256": "..." }
  },
  "inputAttestations": [
    { "uri": "...", "digest": { "sha256": "..." } }
  ],
  "verificationResult": "PASSED",
  "verifiedLevels": ["SLSA_BUILD_LEVEL_UNEVALUATED"],
  "stepResults": [
    { "step": "build", "passed": ["..."], "rejected": [] }
  ]
}

Gotchas

  • Verify-type only. RunType is attestation.VerifyRunType, so this attestor cannot be selected inside cilock run. It is wired in automatically by cilock verify.
  • Policy identity, not policy contents. The VSA records the policy envelope digest plus the predicate-type URI in policy.uri — it does not embed the policy body. Consumers must dereference the digest against their policy store.
  • Verifier ID is fixed. The verifier.id is always https://aflock.ai/cilock/verify/policy@v1; it does not reflect the signing identity or hostname of the verifier. The envelope's signature says who verified.
  • Rejected attestations only listed on failure. When verificationResult == "PASSED", inputAttestations contains only the passing collections that satisfied each step.
  • Policy signature is verified first. If the policy envelope signature fails to verify, Attest returns an error before any VSA is produced — no failed VSA is emitted for signature-level failures.

CLI example

See the constraint summary + reproduction recipe at https://github.com/aflock-ai/attestor-compliance-examples/tree/main/41-policyverify. This attestor is currently blocked or doc-only — the linked example explains why and shows the recipe to validate once the constraint is removed.

See also


This page is generated from the CI/lock tool catalog. Don't edit it here — the source is attestation/detection/docs/policyverify.doc.md in aflock-ai/rookery. The same catalog powers cilock tools show policyverify in the CLI, so a single edit keeps the terminal and the website in sync.

Edit this page →  ·  Add a new tool →

When you open the pull request: if you are an AI agent, add the ai-agent label. If you are a human, add the human label.

Reference generated from the product documentation. Match commands and support details to your installed release.