Receipts
What a current WitnessOps receipt declares, what verification can establish, and which inputs remain outside receipt-only checks.
A receipt is a portable signed claim about one bounded workflow result. It carries declared context and evidence references; it is not the evidence package and it is not proof merely because its JSON has the expected shape.
App outputs differ: External Exposure snapshots are unsigned, reports are derived presentations, and Local Audit Proofpacks have a separate signed-package checking path. Start with Understand results and reports. This page focuses on receipt profiles, not every app result.
1. Legacy review receipt profile
The canonical legacy-named public_exposure_review receipt uses:
- envelope
witnessops.receipt.v0 - profile
witnessops.verification_context.v1 - workflow class
public_exposure_review
For this review profile, the documented sequence is:
- request
- scoped review
- evidence collection
- verification result
- signed receipt
- verification page
The receipt binds the final record to the declared subject, scope, method, timestamps, limitations, claim set, manifest digest, and signer identifier. Claim evidence references are real offsec_<24 lowercase hex> manifest artifact IDs produced from exported OffSec records.
2. What a receipt contains
At a high level, the public_exposure_review compatibility profile contains:
- workflow and proof-run identity
- subject and bounded scope
- the frozen review method and acceptance criteria
- observation, performance, issuance, and optional expiry times
- the fixed product limitations
- six required workflow claims with manifest artifact references
- a manifest SHA-256 declaration
- an Ed25519 signature declaration and key ID
The exact field contract is in Receipt Specification.
3. Declaration is not independent proof
A receipt can declare that evidence was collected, scope was authorized, or artifacts were hash-bound. Those statements become independently testable only when the verifier has the matching request, authority, workflow, manifest, artifact, signature, and trust inputs.
The public /verify surface currently receives receipt JSON only. For the public_exposure_review profile it checks the profile and declared relationships, but it does not receive the full package or an active production trust snapshot. A conforming receipt therefore remains indeterminate.
4. What stronger verification can establish
When a complete package is independently verified against authentic trust inputs, the checks can establish, within the declared scope:
- the signature matches the canonical receipt bytes
- the signer is authorized by the pinned production policy
- the manifest bytes match the receipt digest
- referenced artifact bytes match the manifest
- evidence references resolve and support the recorded claim status
- required limitations and unresolved states were preserved
Each conclusion must name the checks and inputs that produced it. A producer-generated verification_result.json is package output; it is not automatically an independent verification result.
5. What a receipt never proves on its own
A receipt does not by itself prove:
- that a finding is correct or exploitable
- that the reviewed system is secure
- that no vulnerability exists
- that the source tools or host were uncompromised
- that the target and approval records were truthful
- that the signer was authorized or unrevoked
- that referenced manifest and artifact bytes exist or match
- that the review is complete outside its declared scope
The legacy receipt profile also preserves the explicit non-claims that the associated review is not a penetration test, certification, attestation, compliance determination, proof of security, proof of completeness, proof of third-party acceptance, or proof of absence of vulnerabilities.
6. Compatibility receipt families
The web verifier retains bounded adapters for PV/QV/WV receipts and local-server-audit structural receipts. They are compatibility surfaces, not alternate definitions of the canonical public_exposure_review receipt.
Do not infer one universal ledger, timestamp, DSSE, or continuity layout across all accepted families. Read the adapter name, scope, artifact-revalidation field, named checks, and limitations in the actual result.
7. Next-page handoff
Read Receipt Specification for the field contract, then Verification for the public result semantics.