RFC: Register agent-decision/v0.1 predicate in in-toto/attestation
Status: Ready to file (copy this body into a GitHub issue on in-toto/attestation)
Author: Auxidus Technologies
Predicate URI (proposed): https://auxidus.dev/attestation/agent-decision/v0.1
Reference implementation: Auxidus/auxecurity (auxidus-evidence crate)
Summary
Request registration of a new in-toto attestation predicate type for AI agent authorization decisions: which tool was requested, which policies evaluated, allow/deny outcome, and optional trace correlation. Envelopes use standard DSSE with in-toto Statement v1, matching existing predicates such as human-review/v0.1.
Motivation
- Build provenance (SLSA, SBOM) already uses in-toto; runtime agent decisions have no registered predicate.
- Regulated deployers (EU AI Act Art. 12 logging) need portable, signed decision records, not vendor-specific JSON logs.
- Policy engines (e.g. Cedar) on MCP tool paths need a standard evidence shape for allow/deny.
Predicate type URI
https://auxidus.dev/attestation/agent-decision/v0.1
(URI may be aliased to https://in-toto.io/attestation/agent-decision/v0.1 upon WG consensus.)
Statement shape
_type: https://in-toto.io/Statement/v1
subject[]: in-toto subject descriptors (name, digest.sha256) — typically the tool or resource acted upon
predicateType: URI above
predicate: see schema below
Predicate schema (JSON Schema)
Canonical schema in upstream repo proposal:
- File:
predicates/agent-decision/v0.1/agent-decision-v0.1.json
- Source copy today:
crates/auxidus-evidence/schemas/agent-decision-v0.1.schema.json
- Human spec:
spec/agent-decision-v0.1.md
Required predicate fields
| Field |
Type |
Description |
agent_id |
string |
Stable agent instance identifier |
principal |
object |
{ "subject": string, "spiffe_id"?: string } |
policy_evaluations |
array |
{ policy, decision: allow|deny, reason, policy_ids? } |
tool_calls |
array |
{ name, args_hash } where args_hash is sha256:<hex> |
decided_at |
string |
RFC 3339 timestamp |
Optional predicate fields
| Field |
Type |
Description |
evaluation_results |
array |
{ name, passed } drop-gate results |
trace_parent |
string |
W3C Trace Context traceparent |
Example statement (payload before DSSE)
{
"_type": "https://in-toto.io/Statement/v1",
"subject": [
{
"name": "write_file",
"digest": {
"sha256": "0000000000000000000000000000000000000000000000000000000000000000"
}
}
],
"predicateType": "https://auxidus.dev/attestation/agent-decision/v0.1",
"predicate": {
"agent_id": "agent-demo-001",
"principal": { "subject": "demo-user" },
"policy_evaluations": [
{
"policy": "taint_aware",
"decision": "deny",
"reason": "untrusted write denied by policy",
"policy_ids": ["policy0"]
}
],
"tool_calls": [
{
"name": "write_file",
"args_hash": "sha256:8f6f16d89f7084b2edec5d0236ec45fbe0ea34cc8f27658cd6ccd2f73ff8e6db"
}
],
"evaluation_results": [{ "name": "cedar-ifc-gate", "passed": false }],
"trace_parent": "",
"decided_at": "2026-05-18T12:00:00Z"
}
}
Implementation notes
- Reference signer/verifier:
auxidus_evidence::dsse::{sign_agent_decision, verify_agent_decision} (Ed25519 DSSE).
- Modeled after
human-review/v0.1 for reviewer/decision semantics.
- v0.1 roadmap: SPIFFE-bound
principal, cosign-compatible verification, OpenTelemetry trace_parent population.
Proposed upstream layout
docs/predicates/agent-decision/v0.1/
README.md
agent-decision-v0.1.json # JSON Schema
Ask
- Feedback on predicate URI namespace (
auxidus.dev vs in-toto.io).
- WG review of schema fields (especially
args_hash vs embedding redacted args).
- Guidance on linking to SLSA / OIDC identities in a follow-on
v0.2.
Maintainer: file the issue
gh issue create \
--repo in-toto/attestation \
--title "RFC: agent-decision/v0.1 predicate for AI agent policy decisions" \
--body-file docs/rfc/in-toto-agent-decision-v0.1-rfc.md
After filing, update spec/agent-decision-v0.1.md status with the issue URL.
RFC: Register
agent-decision/v0.1predicate in in-toto/attestationStatus: Ready to file (copy this body into a GitHub issue on in-toto/attestation)
Author: Auxidus Technologies
Predicate URI (proposed):
https://auxidus.dev/attestation/agent-decision/v0.1Reference implementation: Auxidus/auxecurity (
auxidus-evidencecrate)Summary
Request registration of a new in-toto attestation predicate type for AI agent authorization decisions: which tool was requested, which policies evaluated, allow/deny outcome, and optional trace correlation. Envelopes use standard DSSE with in-toto Statement v1, matching existing predicates such as human-review/v0.1.
Motivation
Predicate type URI
(URI may be aliased to
https://in-toto.io/attestation/agent-decision/v0.1upon WG consensus.)Statement shape
_type:https://in-toto.io/Statement/v1subject[]: in-toto subject descriptors (name,digest.sha256) — typically the tool or resource acted uponpredicateType: URI abovepredicate: see schema belowPredicate schema (JSON Schema)
Canonical schema in upstream repo proposal:
predicates/agent-decision/v0.1/agent-decision-v0.1.jsoncrates/auxidus-evidence/schemas/agent-decision-v0.1.schema.jsonspec/agent-decision-v0.1.mdRequired predicate fields
agent_idprincipal{ "subject": string, "spiffe_id"?: string }policy_evaluations{ policy, decision: allow|deny, reason, policy_ids? }tool_calls{ name, args_hash }whereargs_hashissha256:<hex>decided_atOptional predicate fields
evaluation_results{ name, passed }drop-gate resultstrace_parenttraceparentExample statement (payload before DSSE)
{ "_type": "https://in-toto.io/Statement/v1", "subject": [ { "name": "write_file", "digest": { "sha256": "0000000000000000000000000000000000000000000000000000000000000000" } } ], "predicateType": "https://auxidus.dev/attestation/agent-decision/v0.1", "predicate": { "agent_id": "agent-demo-001", "principal": { "subject": "demo-user" }, "policy_evaluations": [ { "policy": "taint_aware", "decision": "deny", "reason": "untrusted write denied by policy", "policy_ids": ["policy0"] } ], "tool_calls": [ { "name": "write_file", "args_hash": "sha256:8f6f16d89f7084b2edec5d0236ec45fbe0ea34cc8f27658cd6ccd2f73ff8e6db" } ], "evaluation_results": [{ "name": "cedar-ifc-gate", "passed": false }], "trace_parent": "", "decided_at": "2026-05-18T12:00:00Z" } }Implementation notes
auxidus_evidence::dsse::{sign_agent_decision, verify_agent_decision}(Ed25519 DSSE).human-review/v0.1for reviewer/decision semantics.principal, cosign-compatible verification, OpenTelemetrytrace_parentpopulation.Proposed upstream layout
Ask
auxidus.devvsin-toto.io).args_hashvs embedding redacted args).v0.2.Maintainer: file the issue
gh issue create \ --repo in-toto/attestation \ --title "RFC: agent-decision/v0.1 predicate for AI agent policy decisions" \ --body-file docs/rfc/in-toto-agent-decision-v0.1-rfc.mdAfter filing, update
spec/agent-decision-v0.1.mdstatus with the issue URL.