Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

### Changed

- Moved every `agentrust.io` identifier to `agentrust-io.com`: the JSON Schema `$id` values for `trace-claim`, `audit-entry`, and `catalog-entry`, the `@context` URL in test fixtures, and the maintainer email. `agentrust.io` is not ours and resolves to parked AWS addresses, so these identifiers pointed at a domain we do not control. They never resolved, so nothing that worked stops working. The `tag:agentrust.io,2026:trace-v0.1` EAT profile identifier is deliberately unchanged; it is a cross-repo identifier inside signed payloads and needs a transition decision, not a rename.
- **BREAKING: TRACE Claims now carry the v0.2 profile** `tag:agentrust-io.com,2026:trace-v0.2`, and `agentrust-trace` is pinned to `>=0.5`. The v0.1 URI named `agentrust.io`, a domain this project never controlled, which RFC 4151 does not permit for a tag URI (agentrust-io/trace-spec#107). A verifier on the v0.2 suite rejects a v0.1 claim, so producers and verifiers move together. Nothing else about the claim format changed.

### Changed

- Moved every `agentrust.io` identifier to `agentrust-io.com`: the JSON Schema `$id` values for `trace-claim`, `audit-entry`, and `catalog-entry`, the `@context` URL in test fixtures, and the maintainer email. `agentrust.io` is not ours and resolves to parked AWS addresses, so these identifiers pointed at a domain we do not control. They never resolved, so nothing that worked stops working. The `tag:agentrust-io.com,2026:trace-v0.2` EAT profile identifier is deliberately unchanged; it is a cross-repo identifier inside signed payloads and needs a transition decision, not a rename.

### Fixed

Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -194,7 +194,7 @@ A `GatewayClaim` is the unit of proof handed to an auditor, regulator, or downst

| Field | Description |
|---|---|
| `trace.eat_profile` | EAT profile URI: `tag:agentrust.io,2026:trace-v0.1` |
| `trace.eat_profile` | EAT profile URI: `tag:agentrust-io.com,2026:trace-v0.2` |
| `trace.runtime` | TEE platform and hardware measurement recorded at enclave boot |
| `trace.policy.bundle_hash` | SHA-256 of the Cedar bundle loaded at startup; changing any policy file changes this value |
| `trace.cnf.jwk` | Ed25519 public key bound to the TEE signing key |
Expand Down
4 changes: 2 additions & 2 deletions docs/SPEC.md
Original file line number Diff line number Diff line change
Expand Up @@ -130,14 +130,14 @@ Network position: sits between agent host and MCP servers. The gateway is the on
The unit of proof handed to an auditor, produced per session (or per call, configurable).
The normative schema is `schemas/trace-claim.schema.json`,
and a full worked example is in [the quickstart](quickstart.md). The envelope is a
`GatewayClaim`: canonical TRACE v0.1 fields live under `trace`, cMCP-specific addenda live
`GatewayClaim`: canonical TRACE v0.2 fields live under `trace`, cMCP-specific addenda live
under `gateway`, and `signature` is detached (computed over every other field).

```json
{
"cmcp_version": "1.0",
"trace": {
"eat_profile": "tag:agentrust.io,2026:trace-v0.1",
"eat_profile": "tag:agentrust-io.com,2026:trace-v0.2",
"iat": 1730000000,
"subject": "spiffe://cmcp.gateway/tee/<key-prefix>",
"runtime": {
Expand Down
2 changes: 1 addition & 1 deletion docs/concepts.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ The key difference:
| Can the operator forge it? | Yes | No: signing key never leaves the TEE |
| Who can verify it? | Anyone with read access | Anyone with the public key (no trust in operator) |

A TRACE Claim is a [TRACE Trust Record](https://trace.agentrust-io.com) with a `GatewayClaim` envelope. The envelope adds the session summary and audit chain. The inner trust record follows the TRACE v0.1 spec.
A TRACE Claim is a [TRACE Trust Record](https://trace.agentrust-io.com) with a `GatewayClaim` envelope. The envelope adds the session summary and audit chain. The inner trust record follows the TRACE v0.2 spec.

### What a TRACE Claim asserts

Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ classifiers = [
]
requires-python = ">=3.11"
dependencies = [
"agentrust-trace>=0.4",
"agentrust-trace>=0.5",
# 0.6.1 is the floor, not merely a compatible version: verify_manifest()
# is called on a peer-supplied manifest below, and before 0.6.1 a manifest
# declaring ML-DSA-65 or hybrid crashed the verifier with an uncaught
Expand Down
6 changes: 3 additions & 3 deletions schemas/trace-claim.schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://cmcp.agentrust-io.com/schemas/trace-claim.schema.json",
"title": "cMCP GatewayClaim",
"description": "TRACE profile envelope emitted by the cMCP Gateway TEE at session close. The 'trace' sub-object contains canonical TRACE v0.1 fields; 'gateway' contains cmcp-specific addenda.",
"description": "TRACE profile envelope emitted by the cMCP Gateway TEE at session close. The 'trace' sub-object contains canonical TRACE v0.2 fields; 'gateway' contains cmcp-specific addenda.",
"type": "object",
"additionalProperties": false,
"required": ["cmcp_version", "trace", "gateway", "signature"],
Expand All @@ -16,11 +16,11 @@
"type": "object",
"additionalProperties": false,
"required": ["eat_profile", "iat", "subject", "runtime", "policy", "data_class", "cnf"],
"description": "Canonical TRACE v0.1 fields for this gateway session.",
"description": "Canonical TRACE v0.2 fields for this gateway session.",
"properties": {
"eat_profile": {
"type": "string",
"const": "tag:agentrust.io,2026:trace-v0.1"
"const": "tag:agentrust-io.com,2026:trace-v0.2"
},
"iat": {
"type": "integer",
Expand Down
4 changes: 2 additions & 2 deletions src/cmcp_runtime/audit/trace_claim.py
Original file line number Diff line number Diff line change
Expand Up @@ -184,7 +184,7 @@ class GatewayTrace(BaseModel):

model_config = ConfigDict(extra="forbid")

eat_profile: Literal["tag:agentrust.io,2026:trace-v0.1"]
eat_profile: Literal["tag:agentrust-io.com,2026:trace-v0.2"]
iat: Annotated[int, Field(ge=1700000000)]
subject: Annotated[str, Field(pattern=r"^spiffe://")]
runtime: RuntimeInfo
Expand Down Expand Up @@ -376,7 +376,7 @@ def generate_trace_claim(
)

trace = GatewayTrace(
eat_profile="tag:agentrust.io,2026:trace-v0.1",
eat_profile="tag:agentrust-io.com,2026:trace-v0.2",
iat=int(datetime.now(tz=UTC).timestamp()),
subject=_build_subject(signing_key),
runtime=_build_runtime(attestation_report),
Expand Down