Decision recorded so this is not re-derived: widen under a new profile version, leave 1.0 untouched.
Background
agentrust-io/cmcp now records the five AARM R4 decision types (ALLOW, DENY, MODIFY, STEP_UP, DEFER) in its audit chain. The TRACE Claim cannot carry two of them. schemas/trace-claim.schema.json in cmcp pins the per-call decision enum to:
["allow", "deny", "redact", "advisory_deny", "fault", "n/a"]
So step_up and defer are currently narrowed to deny at the claim boundary, in cmcp PR #442. That is sound and tested: the call was blocked in every case, which is the part a claim asserts, and unrecognised values also narrow to deny so a future value cannot emit a claim that fails validation. The cost is that the specific decision is invisible to anyone who only reads claims.
Why not widen 1.0 in place
A verifier pinned to the current 1.0 enum would reject a claim carrying step_up. Compatibility is the entire reason a version is pinned, so widening in place spends it. Rejected for that reason.
What to do instead
Add the values under a new profile version, so adopters opt in and existing verifiers keep working.
Coordination, which is why this is an issue rather than a patch:
| Repo |
Change |
trace-spec |
New profile URI, tag:agentrust-io.com,2026:trace-v0.3 or a 1.1 claim version. Document the widened enum and that 1.0 is unchanged |
trace-tests |
Conformance cases for the new values; existing 1.0 cases must keep passing unmodified |
trace-registry |
Accept and index the new profile |
cmcp |
Emit the new profile, and drop claim_value()'s narrowing when the profile in use supports the values. Keep narrowing for 1.0 |
Semantics worth settling in the spec rather than per implementation:
STEP_UP means the call was blocked and a named human authority can authorize it. A relying party must not read it as allowed.
DEFER in cmcp today is classified but not asynchronously enforced: there is no callback registry, so a defer entry is a blocked call, not a pending one. If the spec permits defer, it should say whether it may ever mean "pending", because a verifier that assumes pending when the implementation means blocked would be wrong in the permissive direction. See cmcp's LIMITATIONS.md.
That second point is the one I would not leave to implementations to decide.
Decision recorded so this is not re-derived: widen under a new profile version, leave
1.0untouched.Background
agentrust-io/cmcpnow records the five AARM R4 decision types (ALLOW,DENY,MODIFY,STEP_UP,DEFER) in its audit chain. The TRACE Claim cannot carry two of them.schemas/trace-claim.schema.jsonin cmcp pins the per-call decision enum to:So
step_upanddeferare currently narrowed todenyat the claim boundary, incmcpPR #442. That is sound and tested: the call was blocked in every case, which is the part a claim asserts, and unrecognised values also narrow todenyso a future value cannot emit a claim that fails validation. The cost is that the specific decision is invisible to anyone who only reads claims.Why not widen 1.0 in place
A verifier pinned to the current
1.0enum would reject a claim carryingstep_up. Compatibility is the entire reason a version is pinned, so widening in place spends it. Rejected for that reason.What to do instead
Add the values under a new profile version, so adopters opt in and existing verifiers keep working.
Coordination, which is why this is an issue rather than a patch:
trace-spectag:agentrust-io.com,2026:trace-v0.3or a1.1claim version. Document the widened enum and that1.0is unchangedtrace-tests1.0cases must keep passing unmodifiedtrace-registrycmcpclaim_value()'s narrowing when the profile in use supports the values. Keep narrowing for1.0Semantics worth settling in the spec rather than per implementation:
STEP_UPmeans the call was blocked and a named human authority can authorize it. A relying party must not read it as allowed.DEFERin cmcp today is classified but not asynchronously enforced: there is no callback registry, so adeferentry is a blocked call, not a pending one. If the spec permitsdefer, it should say whether it may ever mean "pending", because a verifier that assumes pending when the implementation means blocked would be wrong in the permissive direction. See cmcp'sLIMITATIONS.md.That second point is the one I would not leave to implementations to decide.