# title
Provene Code-Change Receipt Predicate v0.1

# description
Predicate body for predicateType https://provene.dev/attestation/code-change/v0.1. Unknown properties are permitted by design: verifiers must ignore fields they do not recognize (RFC 0001 section 12).

# properties.attestation.allOf[].comment
T0 is unsigned and therefore has no attester or trust root beyond 'none'.

# properties.agent.properties.modelSource.description
How the model identifier was obtained. Required whenever `model` is present; absent when the emitter genuinely does not know the model, which is the case for a Claude Code hook payload. Inferred identifiers must not be recorded.

# properties.emitter.description
The software that produced this receipt. Required so that receipts written by a known-buggy emitter can be identified after the fact.

# properties.task.properties.ref.description
URI into a system the developer does not control. The primary evidence field.

# properties.task.properties.digest.description
Keyed HMAC over task text. Unkeyed digests are non-conformant.

# properties.task.properties.keySource.description
root-commit = salt derived from the lexicographically smallest root commit; PUBLIC, gives cross-tenant unlinkability but no confidentiality against repo readers. configured = secret supplied out of band.

# properties.binding.properties.changeDigest.description
Must equal the Statement subject digest.

# properties.binding.properties.parent.description
Advisory. A mismatch with an equal changeDigest indicates a rebase, not a failure.

# properties.binding.properties.excluded.description
Path patterns excluded from the change digest. Must include .provene/**.

# properties.changes.properties.granularity.description
'file' attributes per whole file via attributedTo. Emitters must fall back rather than guess.

# properties.changes.properties.files.items.properties.attributed.description
Content-anchored spans observed to be agent-produced. Unlisted regions are UNOBSERVED, never human-authored. Located by content, not position.

# properties.changes.properties.files.items.properties.verifiedBy.description
Identifiers of verification runs covering this path.

# properties.changes.properties.files.items.properties.attributedTo.description
Set only where the emitter OBSERVED this agent session modify the path (RFC 0001 6.4.1). Absent means UNOBSERVED and MUST NOT be read as human-authored. Never set from the path merely appearing in the changeset: changes.files is the whole changeset, including the developer's own edits.

# properties.changes.properties.files.items.allOf[].comment
Renames and copies both carry a pre-image path.

# properties.changes.allOf[].comment
File granularity asserts nothing about regions, so attributed ranges must be absent.

# properties.commands.items.properties.argv0.description
The command name, with any leading environment assignments skipped. Never empty: a line consisting only of assignments named no command and is not recorded at all.

# properties.commands.items.properties.shape.description
Present only when the full command matched an allowlist entry; the entry, not the observed text.

# properties.verification.properties.runs.items.properties.baseCommit.description
Commit the run executed against. Required where a policy may rely on the result; guards against replay of evidence onto a different base.

# properties.verification.properties.unverifiedPaths.description
Changed paths no run in this receipt covers. Source of the reviewer-facing PR annotations.

# properties.redaction.properties.pathsExcluded.description
True if configured exclusion suppressed paths, so an empty change set is distinguishable from a redacted one.

# properties.humanReview.description
Reserved. No v0.1 producer observes human review; a receipt must not claim it.