Spec section
Section 3.1 (Trust Record logical schema) and 3.3 (Verification); schema/trace-claim.json; TrustRecord in src/agentrust_trace/models.py.
Problem
The Trust Record subject is the gateway session SPIFFE URI (for example spiffe://cmcp.gateway/session/). It carries no agent identity, so verification proves that a session ran an approved policy and catalog, but not that the agent the operator reviewed (the signed Agent Manifest agent_id) is the agent that acted. cMCP issue agentrust-io/cmcp#302 (Option A, confirmed) binds the manifest to the session at the gateway. For that binding to be verifiable offline (the Option B defense-in-depth cross-check), the bound identity has to travel in the Trust Record.
Proposed change
Add an optional agent-identity block, distinct from subject (which stays the gateway session):
"agent": {
"agent_id": "spiffe://factory.example/agent/material-movement/dev",
"manifest_id": "0197739a-8c00-7000-8000-000000000001",
"binding": "svid-matched"
}
- All fields optional; records without the block remain valid (backward compatible). subject is unchanged.
- A verifier holding the offline manifest can then cross-check: agent.agent_id == manifest.agent_id, agent.manifest_id == manifest.manifest_id, and the manifest bound policy/catalog hashes == record.policy.* . That is the Option B self-checking layer.
- Spec: new subsection under 3.1 for the agent block, and under 3.3 for the cross-check. Schema: add the optional agent object. Model: add an optional agent field to TrustRecord.
Impact
- Backward compatible: yes (optional fields, existing records validate unchanged).
- Affects conformance level(s): Level 1+ (identity binding).
- Conformance tests that need updating: add present/absent agent-block cases; existing tests unaffected.
- Regulatory mapping impact: supports identity and accountability traceability (informational).
Alternatives considered
- Overload subject to carry the agent identity: rejected, subject is the gateway session and conflating them loses the very distinction the binding must prove.
- Keep agent identity only in the cMCP audit chain, not the Trust Record: rejected, the Trust Record is the portable evidence a third party verifies offline, so the binding must travel with it.
Spec section
Section 3.1 (Trust Record logical schema) and 3.3 (Verification); schema/trace-claim.json; TrustRecord in src/agentrust_trace/models.py.
Problem
The Trust Record subject is the gateway session SPIFFE URI (for example spiffe://cmcp.gateway/session/). It carries no agent identity, so verification proves that a session ran an approved policy and catalog, but not that the agent the operator reviewed (the signed Agent Manifest agent_id) is the agent that acted. cMCP issue agentrust-io/cmcp#302 (Option A, confirmed) binds the manifest to the session at the gateway. For that binding to be verifiable offline (the Option B defense-in-depth cross-check), the bound identity has to travel in the Trust Record.
Proposed change
Add an optional agent-identity block, distinct from subject (which stays the gateway session):
Impact
Alternatives considered