Changelog¶
All notable changes to the TRACE specification will be documented here.
Format: Semantic Versioning. Spec versions follow MAJOR.MINOR.PATCH: - MAJOR: breaking changes to wire format or required Trust Record fields - MINOR: new optional fields, new platform profiles, new conformance levels - PATCH: editorial fixes, clarifications, non-normative additions
[Unreleased]¶
Added¶
verify_record(..., revocation=...)enforces key revocation at verification time (#76). §3.2.1 has always required that "Verifiers MUST consult current revocation status at verification time", butverify_record()checked only signature and freshness, so a record signed by a revoked or compromised key kept verifying. The newrevocationparameter accepts either a container of revoked key identifiers or a callable performing a live CRL, status-endpoint, or SCITT lookup. A listed key is rejected, and a store that cannot answer is also rejected: an unavailable revocation source is not evidence that a key is unrevoked.
Keys are identified by RFC 7638 JWK Thumbprint or kid. The check reads the trusted key rather than record["cnf"]["jwk"], which is attacker-controlled until the signature verifies.
Additive and backward compatible: revocation defaults to None, which leaves verification purely offline and unchanged. That mode cannot prove non-revocation, now stated in LIMITATIONS.md and docs/verification.md. No normative text, schema, or record field changed.
jwk_thumbprint(jwk): RFC 7638 JWK Thumbprint (RFC 8037 §2 for OKP), exported so callers can key a revocation list on the same identifier the verifier derives.
[0.5.1] — 2026-07-28¶
Fixed¶
transparencyis optional below Level 2. The model required a non-empty URI on every record, which was stricter than bothschema/trace-claim.json(required, nominLength) and the conformance suite, which runsTR-ANCat Level 2 only. A Level 0 or Level 1 record is not anchored, so it has no receipt to name, and that state was unrepresentable.Nonenow means unanchored; an empty string stays rejected, since""is not a URI and a field that looks populated but resolves to nothing is worse in a trust record than an absent one.
Changed¶
- BREAKING: TRACE v0.2 changes the EAT profile URI to
tag:agentrust-io.com,2026:trace-v0.2(wastag:agentrust.io,2026:trace-v0.1).agentrust.iowas never a domain this project controlled; it resolves to third-party parked addresses. RFC 4151 permits a tag URI only where the minting authority controlled the named domain on the stated date, so the v0.1 identifier was invalid rather than merely misspelled: it asserted authority over a name someone else could stand up a conflicting definition at.
Cutover, not coexistence. A v0.2 verifier requires the new URI and rejects the old one; it does not accept both. Dual acceptance would keep the invalid identifier live indefinitely, which is the thing being fixed. Records already issued under v0.1 stay verifiable against spec/trace-v0.1.md and the published agentrust-trace 0.4.x releases, which remain on PyPI. They are v0.1 records and are read as such.
Nothing else in the record format changed. No field was added, removed, or re-typed, so migration for a producer is the profile string and a dependency bump.
Moved together: spec/trace-v0.2.md (new, with a "Changes from v0.1" section), spec/trace-v0.1.md (retained, marked superseded), the root schema/trace-claim.json const, the packaged agentrust_trace/schema/trace-v0.2.json, the eat_profile Literal in models.py, the AGT adapter, validate.py's schema resource, the four platform example records, and the docs.
- Other
agentrust.ioURLs moved toagentrust-io.com: the registry and verifier hosts in the AGT adapter and the schema$id.
[0.4.0]¶
Added¶
-
azure-cvm-sev-snpplatform — Azure confidential VMs run AMD SEV-SNP behind a Hyper-V paravisor: the SNP report is read from the vTPM (the guest does not controlREPORT_DATA), so the runtime binding rides a vTPM AK-signed quote rather than the SNPreport_data. Given its ownruntime.platformvalue (distinct fromamd-sev-snp) so a consumer keying onruntime.platformknows the root of trust is vTPM-rooted, not direct-silicon. Added to theRuntimeInfomodel and the JSON schema enum. Hardware-validated on a live Azure SEV-SNP VM via cMCP. -
delegation(optional object): the A2A profile delegation-link block, carryingparent_record_hash(digest of the parent hop's Trust Record) andcredential_id(the delegation credential this hop acted under). A chain of records linked this way forms an offline-verifiable delegation DAG. Backward-compatible: existing records withoutdelegationremain valid. This is a MINOR (additive) change and the foundation of the forthcoming A2A profile; A2A is now stable at v1.x, clearing the prior blocker.
[0.3.0] — 2026-06-30¶
Security¶
verify_recordnow requires an explicit trusted key. Self-verification from the embeddedcnf.jwkis no longer the default; useallow_embedded_key=Trueto opt in.- Verification enforces freshness (
iat/max_age_seconds, default 24h) and an optionalexpected_nonce. JWKkty/crvare validated.
Breaking¶
- BREAKING: Canonicalization is now RFC 8785 (JCS). Trust records are NOT cross-verifiable with 0.2.0 (the prior
json.dumpscanonicalization was non-conformant).
[0.1.0] — 2026-06-23¶
Initial public draft. Announced at Confidential Computing Summit, San Francisco.
Specification¶
- Trust Record logical schema (§3.1):
subject,model,runtime,policy,data_class,tool_transcript,build_provenance,appraisal,transparency,cnf - Wire format (§3.2): EAT/JWT and CBOR-COSE envelopes; profile URI
tag:agentrust.io,2026:trace-v0.1 - Signing and key management (§3.2.1): ES256/ES384/EdDSA; four-layer key hierarchy; hash agility; revocation
- Verification protocol (§3.3): five-step offline verification, no issuer callback
- Standards composition (§4): RATS/EAT, SLSA, SPIFFE, SCITT, EAR, MCP, A2A, AIBOM, C2PA
- Hardware roots (§4.2): NVIDIA H100/Blackwell, Intel TDX, AMD SEV-SNP, Azure MAA, GCP Confidential Space, AWS Nitro
- Reference implementation (§5): cMCP Phase 1–3 roadmap
Schema¶
schema/trace-claim.json: JSON Schema (draft/2020-12) for Trust Record validation
Examples¶
examples/amd-sev-snp.json: AMD SEV-SNP Trust Recordexamples/intel-tdx.json: Intel TDX Trust Recordexamples/nvidia-h100.json: NVIDIA H100 Confidential Computing Trust Record
Open questions¶
Seven open questions requiring community input before v0.2 are documented in §7 of the spec.
[0.2.0] — TBD¶
Specification¶
- Extend
subjectfield to accept DID URIs (anydid:method) in addition to SPIFFE SVIDs. Previously^spiffe://only; now^(spiffe://|did:). Additive, backward-compatible. DID-native runtimes (e.g. AGTdid:mesh:identities) no longer require a parallel SPIFFE identity. Closes: microsoft/agent-governance-toolkit ADR-0032, agentrust-io/trace-spec#35.
Schema¶
schema/trace-claim.json:subjectpattern updated to^(spiffe://|did:), description updated.
Reference Implementation¶
TrustRecord.subjectpattern updated tor"^(spiffe://|did:)".
Upcoming¶
See ROADMAP.md for planned changes in v0.2 and v1.0.