policyverify attestor
Emits a SLSA Verification Summary Attestation (VSA) recording the outcome of a cilock verify run against a signed policy.
| Name | policyverify |
|---|---|
| Predicate type | https://slsa.dev/verification_summary/v1 |
| Lifecycle | verify |
| Default binary? | No |
| Recommended trace | off — no syscall tracing needed |
| Auto-attaches when | Not 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 URIhttps://aflock.ai/cilock/verify/policy@v1. It names the kind of verifier, not who ran it.timeVerified: wall-clock timestamp captured whenAttestfinishes verification.resourceUri: the verified artifact: the first subject'ssha256:<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.1for a v0.1 or legacy witness policy,https://aflock.ai/policy/v0.2for a v0.2 policy. The policy's content identity is inpolicy.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'sReferenceURI 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'sacceptedreturn 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) andrejected[](reference,collection,reason, plusdenies[]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 verifyleaves it empty and signs the same detail asstepResults[].
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.
RunTypeisattestation.VerifyRunType, so this attestor cannot be selected insidecilock run. It is wired in automatically bycilock 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.idis alwayshttps://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",inputAttestationscontains only the passing collections that satisfied each step. - Policy signature is verified first. If the policy envelope signature fails to verify,
Attestreturns 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.