Split policy/compensation into companion spec, slim down base ECT

Move all policy evaluation (pol, pol_decision, pol_enforcer) and
compensation claims to I-D.nennemann-wimse-ect-policy-compensation.
Base spec now focuses on execution ordering, DAG structure, and
audit trail. All examples, diagrams, and prose updated accordingly.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-25 15:38:38 +01:00
parent a0a3369113
commit ddc1e3c6c0
4 changed files with 1299 additions and 2290 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -28,7 +28,6 @@ normative:
RFC7517: RFC7517:
RFC7519: RFC7519:
RFC7518: RFC7518:
RFC8126:
RFC9562: RFC9562:
RFC9110: RFC9110:
I-D.ietf-wimse-arch: I-D.ietf-wimse-arch:
@@ -39,6 +38,12 @@ informative:
RFC8693: RFC8693:
RFC9421: RFC9421:
I-D.ni-wimse-ai-agent-identity: I-D.ni-wimse-ai-agent-identity:
I-D.nennemann-wimse-ect-policy-compensation:
title: "Policy Evaluation and Compensation Extensions for Execution Context Tokens"
target: https://datatracker.ietf.org/doc/draft-nennemann-wimse-ect-policy-compensation/
date: false
author:
- fullname: Christian Nennemann
SPIFFE: SPIFFE:
title: "Secure Production Identity Framework for Everyone (SPIFFE)" title: "Secure Production Identity Framework for Everyone (SPIFFE)"
target: https://spiffe.io/docs/latest/spiffe-about/overview/ target: https://spiffe.io/docs/latest/spiffe-about/overview/
@@ -89,16 +94,16 @@ This document defines Execution Context Tokens (ECTs), an extension
to the Workload Identity in Multi System Environments (WIMSE) to the Workload Identity in Multi System Environments (WIMSE)
architecture for distributed agentic workflows in regulated architecture for distributed agentic workflows in regulated
environments. ECTs provide signed, structured records of task environments. ECTs provide signed, structured records of task
execution order, policy evaluation outcomes, and compliance state execution order and compliance state across agent-to-agent
across communication. By extending WIMSE Workload Identity
agent-to-agent communication. By extending WIMSE Workload Identity
Tokens with execution context claims in JSON Web Token (JWT) Tokens with execution context claims in JSON Web Token (JWT)
format, this specification enables regulated systems to maintain format, this specification enables regulated systems to maintain
structured audit trails that support compliance verification. structured audit trails that support compliance verification.
ECTs use a directed acyclic graph (DAG) structure to represent task ECTs use a directed acyclic graph (DAG) structure to represent task
dependencies, record policy evaluation outcomes at each decision dependencies and integrate with WIMSE Workload Identity Tokens (WIT)
point, and integrate with WIMSE Workload Identity Tokens (WIT) using the same signing model and cryptographic primitives.
using the same signing model and cryptographic primitives. A new Policy evaluation and compensation extensions are defined in
{{I-D.nennemann-wimse-ect-policy-compensation}}. A new
HTTP header field, HTTP header field,
Execution-Context, is defined for transporting ECTs alongside Execution-Context, is defined for transporting ECTs alongside
existing WIMSE headers. ECTs are a technical building block that existing WIMSE headers. ECTs are a technical building block that
@@ -121,8 +126,7 @@ Workload-Proof-Token HTTP headers.
However, workload identity alone does not address execution However, workload identity alone does not address execution
accountability. Knowing who performed an action does not record accountability. Knowing who performed an action does not record
what was done, what policy was applied, or whether compliance what was done or in what order.
requirements were evaluated at each decision point.
Regulated environments increasingly deploy autonomous agents that Regulated environments increasingly deploy autonomous agents that
coordinate across organizational boundaries. Multiple regulatory coordinate across organizational boundaries. Multiple regulatory
@@ -134,7 +138,7 @@ detailed mapping).
This document defines an extension to the WIMSE architecture that This document defines an extension to the WIMSE architecture that
addresses the gap between workload identity and execution addresses the gap between workload identity and execution
accountability. WIMSE authenticates agents; this extension records accountability. WIMSE authenticates agents; this extension records
what they did, in what order, and what policy was evaluated. what they did and in what order.
As identified in {{I-D.ni-wimse-ai-agent-identity}}, call context As identified in {{I-D.ni-wimse-ai-agent-identity}}, call context
in agentic workflows needs to be visible and preserved. ECTs in agentic workflows needs to be visible and preserved. ECTs
@@ -148,13 +152,13 @@ systems:
1. WIMSE authenticates agents but does not record what they 1. WIMSE authenticates agents but does not record what they
actually did. A WIT proves "Agent A is authorized" but not actually did. A WIT proves "Agent A is authorized" but not
"Agent A executed Task X, under Policy Y, producing Output Z." "Agent A executed Task X, producing Output Z."
2. No standard mechanism exists to record policy evaluation 2. No standard mechanism exists to cryptographically order and
outcomes at each decision point in a multi-agent workflow. link task execution across a multi-agent workflow.
3. No mechanism exists to cryptographically link compensation and 3. No mechanism exists to reconstruct the complete execution
rollback decisions to original actions. history of a distributed workflow for audit purposes.
Existing observability tools such as distributed tracing Existing observability tools such as distributed tracing
{{OPENTELEMETRY}} provide visibility for debugging and monitoring {{OPENTELEMETRY}} provide visibility for debugging and monitoring
@@ -168,11 +172,12 @@ This document defines:
- The Execution Context Token (ECT) format ({{ect-format}}) - The Execution Context Token (ECT) format ({{ect-format}})
- DAG structure for task dependency ordering ({{dag-validation}}) - DAG structure for task dependency ordering ({{dag-validation}})
- Policy checkpoint recording ({{policy-claims}})
- Integration with the WIMSE identity framework - Integration with the WIMSE identity framework
({{wimse-integration}}) ({{wimse-integration}})
- An HTTP header for ECT transport ({{http-header}}) - An HTTP header for ECT transport ({{http-header}})
- Audit ledger interface requirements ({{ledger-interface}}) - Audit ledger interface requirements ({{ledger-interface}})
- Policy evaluation and compensation extensions are defined
separately in {{I-D.nennemann-wimse-ect-policy-compensation}}
The following are out of scope and are handled by WIMSE: The following are out of scope and are handled by WIMSE:
@@ -194,11 +199,10 @@ beyond the scope of this specification. The regulatory references
in this document are intended to motivate the design requirements, in this document are intended to motivate the design requirements,
not to claim that implementing ECTs satisfies these regulations. not to claim that implementing ECTs satisfies these regulations.
ECTs provide evidence of claimed execution ordering and policy ECTs provide evidence of claimed execution ordering. They do not
evaluation. They do not independently verify that the claimed independently verify that the claimed execution actually occurred
execution actually occurred as described, that the policy as described or that the agent faithfully performed the stated
evaluation was correct, or that the agent faithfully performed the action. The trustworthiness of ECT claims depends on the
stated action. The trustworthiness of ECT claims depends on the
trustworthiness of the signing agent and the integrity of the trustworthiness of the signing agent and the integrity of the
broader deployment environment. broader deployment environment.
@@ -222,17 +226,13 @@ Directed Acyclic Graph (DAG):
Execution Context Token (ECT): Execution Context Token (ECT):
: A JSON Web Token {{RFC7519}} defined by this specification that : A JSON Web Token {{RFC7519}} defined by this specification that
records task execution details and policy evaluation outcomes. records task execution details.
Audit Ledger: Audit Ledger:
: An append-only, immutable log of all ECTs within a workflow or : An append-only, immutable log of all ECTs within a workflow or
set of workflows, used for regulatory audit and compliance set of workflows, used for regulatory audit and compliance
verification. verification.
Policy Checkpoint:
: A point in a workflow where a policy evaluation outcome is
recorded within an ECT.
Workload Identity Token (WIT): Workload Identity Token (WIT):
: A WIMSE credential proving a workload's identity within a trust : A WIMSE credential proving a workload's identity within a trust
domain. domain.
@@ -268,9 +268,8 @@ the WIMSE scope and are not addressed by workload identity alone:
- Recording what agents actually do with their authenticated - Recording what agents actually do with their authenticated
identity identity
- Recording policy evaluation outcomes at each hop
- Maintaining structured execution records - Maintaining structured execution records
- Linking compensation or rollback actions to original tasks - Linking actions to their predecessors with cryptographic assurance
## Extension Model ## Extension Model
@@ -288,7 +287,7 @@ between the identity layer and the application layer:
+--------------------------------------------------+ +--------------------------------------------------+
| ECT Layer (Execution Accountability) [This Spec]| | ECT Layer (Execution Accountability) [This Spec]|
| ECT: "Task executed, dependencies met, | | ECT: "Task executed, dependencies met, |
| policy evaluated, outcome recorded" | | inputs/outputs hashed" |
+--------------------------------------------------+ +--------------------------------------------------+
| |
v v
@@ -343,8 +342,8 @@ The receiving agent (Agent B) verifies in order:
trust domain. WPT verification, if present, per trust domain. WPT verification, if present, per
{{I-D.ietf-wimse-s2s-protocol}}. {{I-D.ietf-wimse-s2s-protocol}}.
2. ECT (this extension): Records what Agent A did, what policy was 2. ECT (this extension): Records what Agent A did and what
evaluated, and what precedent tasks exist. precedent tasks exist.
3. Ledger (if deployed): Appends the verified ECT to the audit 3. Ledger (if deployed): Appends the verified ECT to the audit
ledger. ledger.
@@ -484,59 +483,6 @@ par:
a root task with no dependencies. A workflow MAY contain a root task with no dependencies. A workflow MAY contain
multiple root tasks. multiple root tasks.
### Policy Evaluation {#policy-claims}
The following claims record policy evaluation outcomes:
pol:
: OPTIONAL. String. The identifier of the policy rule that was
evaluated for this task (e.g.,
"clinical_data_access_policy_v1"). MUST be present when
"pol_decision" is present.
pol_decision:
: OPTIONAL. String. The result of the policy evaluation. When
present, MUST be one of the values registered in the ECT Policy
Decision Values registry ({{pol-decision-registry}}). MUST be
present when "pol" is present. Initial values are:
* "approved": The policy evaluation succeeded and the task
was authorized to proceed.
* "rejected": The policy evaluation failed. A "rejected" ECT
MUST still be recorded for accountability. An ECT with
"pol_decision" of "rejected" MAY appear as a parent in the
"par" array of a subsequent ECT, but only for compensation,
rollback, or remediation tasks. Agents MUST NOT proceed
with normal workflow execution based on a parent ECT whose
"pol_decision" is "rejected".
* "pending_human_review": The policy evaluation requires human
judgment before proceeding. Agents MUST NOT proceed with
dependent tasks until a subsequent ECT from a human reviewer
records an "approved" decision referencing this task as a
parent.
When "pol" and "pol_decision" are absent, the ECT records task
execution without a policy checkpoint. Regulated deployments
SHOULD include policy claims on all ECTs to maintain complete
audit trails.
pol_enforcer:
: OPTIONAL. StringOrURI. The identity of the entity (system or
person) that evaluated the policy decision. When present,
SHOULD use SPIFFE ID format.
This specification intentionally defines only the recording of
policy evaluation outcomes. The mechanisms by which policies are
defined, distributed to agents, and evaluated are out of scope.
The "pol" claim is an opaque identifier referencing an external
policy; the semantics and enforcement of that policy are
determined by the deployment environment. Implementations may
use any policy engine or framework (e.g., OPA/Rego, Cedar, XACML,
or custom solutions) provided that the evaluation outcome is
faithfully recorded in the ECT claims defined above.
### Data Integrity {#data-integrity-claims} ### Data Integrity {#data-integrity-claims}
The following claims provide integrity verification for task The following claims provide integrity verification for task
@@ -560,12 +506,11 @@ out_hash:
### Compensation and Rollback {#compensation-claims} ### Compensation and Rollback {#compensation-claims}
Compensation and rollback actions are recorded using the "par" Compensation and rollback extensions are defined in
claim to reference the original task and the "exec_act" claim to {{I-D.nennemann-wimse-ect-policy-compensation}}. The referenced
describe the remediation action. The referenced parent ECTs may parent ECTs may have passed their own "exp" time; ECT expiration
have passed their own "exp" time; ECT expiration applies to the applies to the verification window of the ECT itself, not to its
verification window of the ECT itself, not to its validity as a validity as a parent reference in the ECT store.
parent reference in the ECT store.
### Extensions {#extension-claims} ### Extensions {#extension-claims}
@@ -598,14 +543,9 @@ they use short names without reverse domain prefixes:
attestation, witnesses should submit independent signed ECTs. attestation, witnesses should submit independent signed ECTs.
- "inp\_classification": String. Data sensitivity classification - "inp\_classification": String. Data sensitivity classification
(e.g., "public", "confidential", "restricted"). (e.g., "public", "confidential", "restricted").
- "pol\_timestamp": NumericDate. Time at which the policy
decision was made, if distinct from "iat". Additional extension keys for policy evaluation and compensation
- "compensation\_required": Boolean. Indicates whether this task are defined in {{I-D.nennemann-wimse-ect-policy-compensation}}.
is a compensation or rollback action.
- "compensation\_reason": String. Structured reason code for the
compensation action (e.g., "policy\_violation\_in\_parent\_trade").
SHOULD use structured identifiers rather than free-form text
to minimize information leakage (see {{data-minimization}}).
## Complete ECT Example ## Complete ECT Example
@@ -623,15 +563,10 @@ The following is a complete ECT payload example:
"exec_act": "recommend_treatment", "exec_act": "recommend_treatment",
"par": [], "par": [],
"pol": "clinical_reasoning_policy_v2",
"pol_decision": "approved",
"pol_enforcer": "spiffe://example.com/policy/clinical-engine",
"inp_hash": "sha-256:n4bQgYhMfWWaL-qgxVrQFaO_TxsrC4Is0V1sFbDwCgg", "inp_hash": "sha-256:n4bQgYhMfWWaL-qgxVrQFaO_TxsrC4Is0V1sFbDwCgg",
"out_hash": "sha-256:LCa0a2j_xo_5m0U8HTBBNBNCLXBkg7-g-YpeiGJm564", "out_hash": "sha-256:LCa0a2j_xo_5m0U8HTBBNBNCLXBkg7-g-YpeiGJm564",
"ext": { "ext": {
"pol_timestamp": 1772064145,
"exec_time_ms": 245, "exec_time_ms": 245,
"regulated_domain": "medtech", "regulated_domain": "medtech",
"model_version": "clinical-reasoning-v4.2" "model_version": "clinical-reasoning-v4.2"
@@ -720,16 +655,7 @@ the following DAG validation steps:
lead back to the current ECT's "jti". If a cycle is detected, lead back to the current ECT's "jti". If a cycle is detected,
the ECT MUST be rejected. the ECT MUST be rejected.
5. Parent Policy Decision: If any parent ECT contains a 5. Trust Domain Consistency: Parent tasks SHOULD belong to the
"pol_decision" of "rejected" or "pending_human_review", the
current ECT's "exec_act" MUST indicate a compensation,
rollback, remediation, or human review action.
Implementations MUST NOT accept an ECT representing normal
workflow continuation when a parent's "pol_decision" is not
"approved". This rule only applies when the parent ECT
contains policy claims.
6. Trust Domain Consistency: Parent tasks SHOULD belong to the
same trust domain or to a trust domain with which a federation same trust domain or to a trust domain with which a federation
relationship has been established. relationship has been established.
@@ -842,13 +768,9 @@ verification steps in order:
12. Verify all required claims ("jti", "exec_act", "par") are 12. Verify all required claims ("jti", "exec_act", "par") are
present and well-formed. present and well-formed.
13. If "pol" or "pol_decision" is present, verify that both are 13. Perform DAG validation per {{dag-validation}}.
present and that "pol_decision" is one of "approved",
"rejected", or "pending_human_review".
14. Perform DAG validation per {{dag-validation}}. 14. If all checks pass and an audit ledger is deployed, the ECT
15. If all checks pass and an audit ledger is deployed, the ECT
SHOULD be appended to the ledger. SHOULD be appended to the ledger.
If any verification step fails, the ECT MUST be rejected and the If any verification step fails, the ECT MUST be rejected and the
@@ -922,14 +844,6 @@ function verify_ect(ect_jws, verifier_id,
if claim not in payload: if claim not in payload:
return reject("Missing required claim: " + claim) return reject("Missing required claim: " + claim)
// Validate policy claims (optional, but must be paired)
if "pol" in payload or "pol_decision" in payload:
if "pol" not in payload or "pol_decision" not in payload:
return reject("pol and pol_decision must both be present")
if payload.pol_decision not in
["approved", "rejected", "pending_human_review"]:
return reject("Invalid pol_decision value")
// Validate DAG (against ECT store or inline parent ECTs) // Validate DAG (against ECT store or inline parent ECTs)
result = validate_dag(payload, ect_store, result = validate_dag(payload, ect_store,
clock_skew_tolerance) clock_skew_tolerance)
@@ -996,28 +910,22 @@ software used in medical devices.
Agent A (Spec Reviewer): Agent A (Spec Reviewer):
jti: task-001 par: [] jti: task-001 par: []
exec_act: review_requirements_spec exec_act: review_requirements_spec
pol: spec_review_policy_v2 pol_decision: approved
Agent B (Code Generator): Agent B (Code Generator):
jti: task-002 par: [task-001] jti: task-002 par: [task-001]
exec_act: implement_module exec_act: implement_module
pol: coding_standards_v3 pol_decision: approved
Agent C (Test Agent): Agent C (Test Agent):
jti: task-003 par: [task-002] jti: task-003 par: [task-002]
exec_act: execute_test_suite exec_act: execute_test_suite
pol: test_coverage_policy_v1 pol_decision: approved
Agent D (Build Agent): Agent D (Build Agent):
jti: task-004 par: [task-003] jti: task-004 par: [task-003]
exec_act: build_release_artifact exec_act: build_release_artifact
pol: build_validation_v2 pol_decision: approved
Human Release Manager: Human Release Manager:
jti: task-005 par: [task-004] jti: task-005 par: [task-004]
exec_act: approve_release exec_act: approve_release
pol: release_approval_policy pol_decision: approved
pol_enforcer: spiffe://meddev.example/human/release-mgr-42
ext: {witnessed_by: [...]} (extension metadata) ext: {witnessed_by: [...]} (extension metadata)
~~~ ~~~
{: #fig-medtech-sdlc title="Medical Device SDLC Workflow"} {: #fig-medtech-sdlc title="Medical Device SDLC Workflow"}
@@ -1056,7 +964,6 @@ task-005 (approve_release) [human, witnessed]
The reconstructed DAG provides cryptographic evidence that: The reconstructed DAG provides cryptographic evidence that:
- Each phase was executed by an identified and authenticated agent. - Each phase was executed by an identified and authenticated agent.
- Policy checkpoints were evaluated at every phase transition.
- The execution sequence was maintained (no step was bypassed). - The execution sequence was maintained (no step was bypassed).
- A human-in-the-loop approved the final release, with independent - A human-in-the-loop approved the final release, with independent
witness attestation. witness attestation.
@@ -1084,17 +991,14 @@ execution.
Agent A (Risk Assessment): Agent A (Risk Assessment):
jti: task-001 par: [] jti: task-001 par: []
exec_act: calculate_risk_exposure exec_act: calculate_risk_exposure
pol: risk_limits_policy_v2 pol_decision: approved
Agent B (Compliance): Agent B (Compliance):
jti: task-002 par: [task-001] jti: task-002 par: [task-001]
exec_act: verify_compliance exec_act: verify_compliance
pol: compliance_check_v1 pol_decision: approved
Agent C (Execution): Agent C (Execution):
jti: task-003 par: [task-002] jti: task-003 par: [task-002]
exec_act: execute_trade exec_act: execute_trade
pol: execution_policy_v3 pol_decision: approved
~~~ ~~~
{: #fig-finance title="Financial Trading Workflow"} {: #fig-finance title="Financial Trading Workflow"}
@@ -1108,34 +1012,10 @@ This can contribute to compliance with:
## Compensation and Rollback ## Compensation and Rollback
When a compliance violation is discovered after execution, ECTs Compensation and rollback use cases are described in
provide a mechanism to record authorized compensation actions with {{I-D.nennemann-wimse-ect-policy-compensation}}. The core
a cryptographic link to the original task: ECT mechanism supports compensation through the "par" claim,
which links a remediation ECT to the original task.
~~~json
{
"iss": "spiffe://bank.example/agent/operations",
"aud": "spiffe://bank.example/system/ledger",
"iat": 1772150550,
"exp": 1772151150,
"jti": "550e8400-e29b-41d4-a716-446655440099",
"wid": "d3e4f5a6-b7c8-9012-def0-123456789012",
"exec_act": "initiate_trade_rollback",
"par": ["550e8400-e29b-41d4-a716-446655440003"],
"pol": "compensation_policy_v1",
"pol_decision": "approved",
"pol_enforcer": "spiffe://bank.example/human/compliance-officer",
"ext": {
"compensation_required": true,
"compensation_reason": "policy_violation_in_parent_trade"
}
}
~~~
{: #fig-compensation title="Compensation ECT Example"}
The "par" claim links the compensation action to the original
trade, creating an auditable chain from execution through
violation discovery to remediation.
## Autonomous Logistics Coordination ## Autonomous Logistics Coordination
@@ -1147,27 +1027,22 @@ required checks were completed:
Agent A (Route Planning): Agent A (Route Planning):
jti: task-001 par: [] jti: task-001 par: []
exec_act: plan_route exec_act: plan_route
pol: route_policy_v1 pol_decision: approved
Agent B (Customs): Agent B (Customs):
jti: task-002 par: [task-001] jti: task-002 par: [task-001]
exec_act: validate_customs exec_act: validate_customs
pol: customs_policy_v2 pol_decision: approved
Agent C (Safety): Agent C (Safety):
jti: task-003 par: [task-001] jti: task-003 par: [task-001]
exec_act: verify_cargo_safety exec_act: verify_cargo_safety
pol: safety_policy_v1 pol_decision: approved
Agent D (Payment): Agent D (Payment):
jti: task-004 par: [task-002, task-003] jti: task-004 par: [task-002, task-003]
exec_act: authorize_payment exec_act: authorize_payment
pol: payment_policy_v3 pol_decision: approved
System (Commitment): System (Commitment):
jti: task-005 par: [task-004] jti: task-005 par: [task-004]
exec_act: commit_shipment exec_act: commit_shipment
pol: commitment_policy_v1 pol_decision: approved
~~~ ~~~
{: #fig-logistics title="Logistics Workflow with Parallel Tasks"} {: #fig-logistics title="Logistics Workflow with Parallel Tasks"}
@@ -1198,13 +1073,11 @@ The following threat actors are considered:
ECTs are self-asserted by the executing agent. The agent claims ECTs are self-asserted by the executing agent. The agent claims
what it did, and this claim is signed with its private key. A what it did, and this claim is signed with its private key. A
compromised or malicious agent could create ECTs with false claims compromised or malicious agent could create ECTs with false claims
(e.g., setting "pol_decision" to "approved" without actually (e.g., claiming an action was performed when it was not).
evaluating the policy).
ECTs do not independently verify that: ECTs do not independently verify that:
- The claimed execution actually occurred as described - The claimed execution actually occurred as described
- The policy evaluation was correctly performed
- The input/output hashes correspond to the actual data processed - The input/output hashes correspond to the actual data processed
- The agent faithfully performed the stated action - The agent faithfully performed the stated action
@@ -1235,8 +1108,6 @@ organizational controls are in place:
keys and how keys are protected. keys and how keys are protected.
- Ledger integrity governance: The ledger is maintained by an - Ledger integrity governance: The ledger is maintained by an
entity independent of the workflow agents. entity independent of the workflow agents.
- Policy lifecycle management: Policy identifiers in ECTs map to
actual, validated policy rules.
- Agent deployment governance: Agents are deployed and maintained - Agent deployment governance: Agents are deployed and maintained
in a manner that preserves their integrity. in a manner that preserves their integrity.
@@ -1286,8 +1157,7 @@ The defense-in-depth model provides:
- TLS/mTLS (transport layer): Prevents network-level tampering. - TLS/mTLS (transport layer): Prevents network-level tampering.
- WIT/WPT (WIMSE identity layer): Proves agent identity and - WIT/WPT (WIMSE identity layer): Proves agent identity and
request authorization. request authorization.
- ECT (execution accountability layer): Records what the agent did - ECT (execution accountability layer): Records what the agent did.
and under what policy.
## Key Compromise ## Key Compromise
@@ -1375,8 +1245,6 @@ ECTs necessarily reveal:
- Agent identities ("iss", "aud") for accountability purposes - Agent identities ("iss", "aud") for accountability purposes
- Action descriptions ("exec_act") for audit trail completeness - Action descriptions ("exec_act") for audit trail completeness
- Policy evaluation outcomes ("pol", "pol_decision") for
compliance verification
- Timestamps ("iat", "exp") for temporal ordering - Timestamps ("iat", "exp") for temporal ordering
ECTs are designed to NOT reveal: ECTs are designed to NOT reveal:
@@ -1392,12 +1260,8 @@ ECTs are designed to NOT reveal:
Implementations SHOULD minimize the information included in ECTs. Implementations SHOULD minimize the information included in ECTs.
The "exec_act" claim SHOULD use structured identifiers (e.g., The "exec_act" claim SHOULD use structured identifiers (e.g.,
"process_payment") rather than natural language descriptions. "process_payment") rather than natural language descriptions.
The "pol" claim SHOULD reference policy identifiers rather than Extension keys in "ext" ({{extension-claims}}) deserve particular
embedding policy content. attention: human-readable values risk exposing sensitive operational
The "compensation_reason" extension key in "ext"
({{compensation-claims}}) deserves particular attention: because
it is human-readable, it risks exposing sensitive operational
details. See {{extension-claims}} for guidance on using details. See {{extension-claims}} for guidance on using
structured identifiers. structured identifiers.
@@ -1417,8 +1281,7 @@ general access to the data values is not needed.
ECTs are designed for interpretation by qualified human auditors ECTs are designed for interpretation by qualified human auditors
and regulators. ECTs provide structural records of execution and regulators. ECTs provide structural records of execution
ordering and policy evaluation; they are not intended for public ordering; they are not intended for public disclosure.
disclosure.
# IANA Considerations # IANA Considerations
@@ -1502,28 +1365,14 @@ the "JSON Web Token Claims" registry maintained by IANA:
| wid | Workflow Identifier | IETF | {{exec-claims}} | | wid | Workflow Identifier | IETF | {{exec-claims}} |
| exec_act | Action/Task Type | IETF | {{exec-claims}} | | exec_act | Action/Task Type | IETF | {{exec-claims}} |
| par | Parent Task Identifiers | IETF | {{exec-claims}} | | par | Parent Task Identifiers | IETF | {{exec-claims}} |
| pol | Policy Rule Identifier | IETF | {{policy-claims}} |
| pol_decision | Policy Decision Result | IETF | {{policy-claims}} |
| pol_enforcer | Policy Enforcer Identity | IETF | {{policy-claims}} |
| inp_hash | Input Data Hash | IETF | {{data-integrity-claims}} | | inp_hash | Input Data Hash | IETF | {{data-integrity-claims}} |
| out_hash | Output Data Hash | IETF | {{data-integrity-claims}} | | out_hash | Output Data Hash | IETF | {{data-integrity-claims}} |
| ext | Extension Object | IETF | {{extension-claims}} | | ext | Extension Object | IETF | {{extension-claims}} |
{: #table-claims title="JWT Claims Registrations"} {: #table-claims title="JWT Claims Registrations"}
## ECT Policy Decision Values Registry {#pol-decision-registry} Policy evaluation claims and the ECT Policy Decision Values
registry are defined in
This document establishes the "ECT Policy Decision Values" {{I-D.nennemann-wimse-ect-policy-compensation}}.
registry under the "JSON Web Token (JWT)" group. Registration
policy is Specification Required per {{RFC8126}}.
The initial contents of the registry are:
| Value | Description | Change Controller | Reference |
|:---:|:---|:---:|:---:|
| approved | Policy evaluation succeeded | IETF | {{policy-claims}} |
| rejected | Policy evaluation failed | IETF | {{policy-claims}} |
| pending_human_review | Awaiting human judgment | IETF | {{policy-claims}} |
{: #table-pol-decision title="ECT Policy Decision Values"}
--- back --- back
@@ -1537,9 +1386,9 @@ The WIMSE architecture {{I-D.ietf-wimse-arch}} and service-to-
service protocol {{I-D.ietf-wimse-s2s-protocol}} provide the service protocol {{I-D.ietf-wimse-s2s-protocol}} provide the
identity foundation upon which ECTs are built. WIT/WPT answer identity foundation upon which ECTs are built. WIT/WPT answer
"who is this agent?" and "does it control the claimed key?" while "who is this agent?" and "does it control the claimed key?" while
ECTs record "what did this agent do?" and "what policy was ECTs record "what did this agent do?" Together they form an
evaluated?" Together they form an identity-plus-accountability identity-plus-accountability framework for regulated agentic
framework for regulated agentic systems. systems.
## OAuth 2.0 Token Exchange and the "act" Claim ## OAuth 2.0 Token Exchange and the "act" Claim
{:numbered="false"} {:numbered="false"}
@@ -1551,16 +1400,14 @@ delegation chain: "who is acting on behalf of whom." While
the nesting superficially resembles a chain, it is strictly the nesting superficially resembles a chain, it is strictly
linear (each "act" object contains at most one nested "act"), linear (each "act" object contains at most one nested "act"),
represents authorization delegation rather than task execution, represents authorization delegation rather than task execution,
and carries no task identifiers, policy decisions, or and carries no task identifiers or input/output integrity data. The "act" chain cannot represent
input/output integrity data. The "act" chain cannot represent
branching (fan-out) or convergence (fan-in) and therefore branching (fan-out) or convergence (fan-in) and therefore
cannot form a DAG. cannot form a DAG.
ECTs intentionally use the distinct claim name "exec_act" for the ECTs intentionally use the distinct claim name "exec_act" for the
action/task type to avoid collision with the "act" claim. The action/task type to avoid collision with the "act" claim. The
two concepts are orthogonal: "act" records "who authorized whom," two concepts are orthogonal: "act" records "who authorized whom,"
ECTs record "what was done, in what order, with what policy ECTs record "what was done, in what order."
outcomes."
## Transaction Tokens ## Transaction Tokens
{:numbered="false"} {:numbered="false"}
@@ -1581,7 +1428,7 @@ However, "req_wl" cannot form a DAG because:
token from the Transaction Token Service appear in "req_wl"; token from the Transaction Token Service appear in "req_wl";
workloads that forward the token unchanged are not recorded. workloads that forward the token unchanged are not recorded.
- It carries no task-level granularity, no parent references, - It carries no task-level granularity, no parent references,
no policy evaluation outcomes, and no execution content. and no execution content.
Extensions for agentic use cases Extensions for agentic use cases
({{I-D.oauth-transaction-tokens-for-agents}}) add agent ({{I-D.oauth-transaction-tokens-for-agents}}) add agent
@@ -1592,7 +1439,7 @@ ECTs and Transaction Tokens are complementary: a Txn-Token
propagates authorization context ("this request is authorized propagates authorization context ("this request is authorized
for scope X on behalf of user Y"), while an ECT records for scope X on behalf of user Y"), while an ECT records
execution accountability ("task T was performed, depending on execution accountability ("task T was performed, depending on
tasks P1 and P2, with policy Z evaluated and approved"). An tasks P1 and P2"). An
agent request could carry both a Txn-Token for authorization agent request could carry both a Txn-Token for authorization
and an ECT for execution recording. The WPT "tth" claim and an ECT for execution recording. The WPT "tth" claim
defined in {{I-D.ietf-wimse-s2s-protocol}} can hash-bind a defined in {{I-D.ietf-wimse-s2s-protocol}} can hash-bind a
@@ -1637,7 +1484,7 @@ identifier referenced in SCITT Signed Statements, linking a
complete ECT audit trail to a supply chain transparency record. complete ECT audit trail to a supply chain transparency record.
For example, in a regulated manufacturing workflow, each agent For example, in a regulated manufacturing workflow, each agent
step produces an ECT (recording what was done, by whom, under step produces an ECT (recording what was done, by whom, under
what policy), while the overall workflow identified by "wid" is under what constraints), while the overall workflow identified by "wid" is
registered as a SCITT Signed Statement on a Transparency Service. registered as a SCITT Signed Statement on a Transparency Service.
This enables auditors to verify both the individual execution This enables auditors to verify both the individual execution
steps (via ECT DAG validation) and the end-to-end supply chain steps (via ECT DAG validation) and the end-to-end supply chain
@@ -1651,7 +1498,7 @@ identifiers or Receipt references for tighter integration.
W3C Verifiable Credentials represent claims about subjects (e.g., W3C Verifiable Credentials represent claims about subjects (e.g.,
identity, qualifications). ECTs represent execution records of identity, qualifications). ECTs represent execution records of
actions (what happened, in what order, under what policy). While actions (what happened, in what order). While
both use JWT/JWS as a serialization format, their semantics and both use JWT/JWS as a serialization format, their semantics and
use cases are distinct. use cases are distinct.
@@ -1664,8 +1511,7 @@ use cases are distinct.
A minimal conforming implementation needs to: A minimal conforming implementation needs to:
1. Create JWTs with all required claims ("iss", "aud", "iat", 1. Create JWTs with all required claims ("iss", "aud", "iat",
"exp", "jti", "exec_act", "par") and policy claims ("pol", "exp", "jti", "exec_act", "par").
"pol_decision") when policy evaluation was performed.
2. Sign ECTs with the agent's private key using an algorithm 2. Sign ECTs with the agent's private key using an algorithm
matching the WIT (ES256 recommended). matching the WIT (ES256 recommended).
3. Verify ECT signatures against WIT public keys. 3. Verify ECT signatures against WIT public keys.
@@ -1754,8 +1600,6 @@ ECT Payload:
"wid": "b1c2d3e4-f5a6-7890-bcde-f01234567890", "wid": "b1c2d3e4-f5a6-7890-bcde-f01234567890",
"exec_act": "fetch_patient_data", "exec_act": "fetch_patient_data",
"par": [], "par": [],
"pol": "clinical_data_access_policy_v1",
"pol_decision": "approved",
"inp_hash": "sha-256:n4bQgYhMfWWaL-qgxVrQFaO_TxsrC4Is0V1sFbDwCgg", "inp_hash": "sha-256:n4bQgYhMfWWaL-qgxVrQFaO_TxsrC4Is0V1sFbDwCgg",
"out_hash": "sha-256:LCa0a2j_xo_5m0U8HTBBNBNCLXBkg7-g-YpeiGJm564" "out_hash": "sha-256:LCa0a2j_xo_5m0U8HTBBNBNCLXBkg7-g-YpeiGJm564"
} }
@@ -1773,9 +1617,7 @@ task, and creates its own ECT:
"jti": "550e8400-e29b-41d4-a716-446655440002", "jti": "550e8400-e29b-41d4-a716-446655440002",
"wid": "b1c2d3e4-f5a6-7890-bcde-f01234567890", "wid": "b1c2d3e4-f5a6-7890-bcde-f01234567890",
"exec_act": "validate_safety", "exec_act": "validate_safety",
"par": ["550e8400-e29b-41d4-a716-446655440001"], "par": ["550e8400-e29b-41d4-a716-446655440001"]
"pol": "safety_validation_policy_v2",
"pol_decision": "approved"
} }
~~~ ~~~
@@ -1806,8 +1648,6 @@ Task 1 (Spec Review Agent):
"wid": "c2d3e4f5-a6b7-8901-cdef-012345678901", "wid": "c2d3e4f5-a6b7-8901-cdef-012345678901",
"exec_act": "review_requirements_spec", "exec_act": "review_requirements_spec",
"par": [], "par": [],
"pol": "spec_review_policy_v2",
"pol_decision": "approved",
"inp_hash": "sha-256:n4bQgYhMfWWaL-qgxVrQFaO_TxsrC4Is0V1sFbDwCgg", "inp_hash": "sha-256:n4bQgYhMfWWaL-qgxVrQFaO_TxsrC4Is0V1sFbDwCgg",
"out_hash": "sha-256:LCa0a2j_xo_5m0U8HTBBNBNCLXBkg7-g-YpeiGJm564" "out_hash": "sha-256:LCa0a2j_xo_5m0U8HTBBNBNCLXBkg7-g-YpeiGJm564"
} }
@@ -1824,9 +1664,7 @@ Task 2 (Code Generation Agent):
"jti": "a1b2c3d4-0001-0000-0000-000000000002", "jti": "a1b2c3d4-0001-0000-0000-000000000002",
"wid": "c2d3e4f5-a6b7-8901-cdef-012345678901", "wid": "c2d3e4f5-a6b7-8901-cdef-012345678901",
"exec_act": "implement_module", "exec_act": "implement_module",
"par": ["a1b2c3d4-0001-0000-0000-000000000001"], "par": ["a1b2c3d4-0001-0000-0000-000000000001"]
"pol": "coding_standards_v3",
"pol_decision": "approved"
} }
~~~ ~~~
@@ -1841,9 +1679,7 @@ Task 3 (Autonomous Test Agent):
"jti": "a1b2c3d4-0001-0000-0000-000000000003", "jti": "a1b2c3d4-0001-0000-0000-000000000003",
"wid": "c2d3e4f5-a6b7-8901-cdef-012345678901", "wid": "c2d3e4f5-a6b7-8901-cdef-012345678901",
"exec_act": "execute_test_suite", "exec_act": "execute_test_suite",
"par": ["a1b2c3d4-0001-0000-0000-000000000002"], "par": ["a1b2c3d4-0001-0000-0000-000000000002"]
"pol": "test_coverage_policy_v1",
"pol_decision": "approved"
} }
~~~ ~~~
@@ -1859,8 +1695,6 @@ Task 4 (Build Agent):
"wid": "c2d3e4f5-a6b7-8901-cdef-012345678901", "wid": "c2d3e4f5-a6b7-8901-cdef-012345678901",
"exec_act": "build_release_artifact", "exec_act": "build_release_artifact",
"par": ["a1b2c3d4-0001-0000-0000-000000000003"], "par": ["a1b2c3d4-0001-0000-0000-000000000003"],
"pol": "build_validation_v2",
"pol_decision": "approved",
"out_hash": "sha-256:Ry1YfOoW2XpC5Mq8HkGzNx3dL9vBa4sUjE7iKt0wPZc" "out_hash": "sha-256:Ry1YfOoW2XpC5Mq8HkGzNx3dL9vBa4sUjE7iKt0wPZc"
} }
~~~ ~~~
@@ -1877,9 +1711,6 @@ Task 5 (Human Release Manager Approval):
"wid": "c2d3e4f5-a6b7-8901-cdef-012345678901", "wid": "c2d3e4f5-a6b7-8901-cdef-012345678901",
"exec_act": "approve_release", "exec_act": "approve_release",
"par": ["a1b2c3d4-0001-0000-0000-000000000004"], "par": ["a1b2c3d4-0001-0000-0000-000000000004"],
"pol": "release_approval_policy",
"pol_decision": "approved",
"pol_enforcer": "spiffe://meddev.example/human/release-mgr-42",
"ext": { "ext": {
"witnessed_by": [ "witnessed_by": [
"spiffe://meddev.example/audit/qa-observer-1" "spiffe://meddev.example/audit/qa-observer-1"
@@ -1948,9 +1779,7 @@ Task 004 ECT payload:
"par": [ "par": [
"f1e2d3c4-0002-0000-0000-000000000002", "f1e2d3c4-0002-0000-0000-000000000002",
"f1e2d3c4-0003-0000-0000-000000000003" "f1e2d3c4-0003-0000-0000-000000000003"
], ]
"pol": "trade_execution_policy_v3",
"pol_decision": "approved"
} }
~~~ ~~~

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff