diff --git a/draft-nennemann-wimse-execution-context-00.html b/draft-nennemann-wimse-execution-context-00.html index b4834d7..6b066fc 100644 --- a/draft-nennemann-wimse-execution-context-00.html +++ b/draft-nennemann-wimse-execution-context-00.html @@ -1391,7 +1391,7 @@ regulatory frameworks.

4.2.2.  Execution Context

  • -

    4.2.3.  Policy Evaluation Extension Keys

    +

    4.2.3.  Policy Evaluation

  • 4.2.4.  Data Integrity

    @@ -1700,7 +1700,7 @@ regulatory audit scenarios.

    DAG structure for task dependency ordering (Section 6)

  • -

    Policy checkpoint recording via extension keys (Section 4.2.3)

    +

    Policy checkpoint recording (Section 4.2.3)

  • Integration with the WIMSE identity framework @@ -2173,73 +2173,70 @@ multiple root tasks.

    -

    -4.2.3. Policy Evaluation Extension Keys +

    +4.2.3. Policy Evaluation

    -

    Policy evaluation outcomes are recorded as extension keys within -the "ext" object (Section 4.2.6). This keeps the core -registered claims focused on DAG structure and execution context, -while allowing deployments to add policy recording as needed.

    -

    The following extension keys are defined for policy evaluation:

    -
    -
    "pol":
    -
    -

    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.

    +

    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":
    -
    -

    String. The result of the policy evaluation. When present, -MUST be one of the values registered in the ECT Policy Decision -Values registry (Section 12.4). MUST be present -when "pol" is present. Initial values are:

    +
    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 (Section 12.4). MUST be +present when "pol" is present. Initial values are:

      -
    • -

      "approved": The policy evaluation succeeded and the task -was authorized to proceed.

      +
    • +

      "approved": The policy evaluation succeeded and the task +was authorized to proceed.

    • -
    • -

      "rejected": The policy evaluation failed. A "rejected" ECT +

    • +

      "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".

      +"pol_decision" is "rejected".

    • -
    • -

      "pending_human_review": The policy evaluation requires human +

    • +

      "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.

      +parent.

    -

    When "pol" and "pol_decision" are absent from "ext", the ECT -records task execution without a policy checkpoint. Regulated -deployments SHOULD include policy keys on all ECTs to maintain -complete audit trails.

    +

    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":
    -
    -

    StringOrURI. The identity of the entity (system or person) -that evaluated the policy decision. When present, SHOULD use -SPIFFE ID format.

    +
    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 +

    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" key is an opaque identifier referencing an external +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 "ext" keys defined above.

    +faithfully recorded in the ECT claims defined above.

    @@ -2294,12 +2291,9 @@ parent reference in the ECT store.¶<
    ext:
    -

    OPTIONAL. Object. An extension object for claims beyond the -core registered claims. This specification defines several -extension keys for policy evaluation (Section 4.2.3) and -operational metadata; deployments MAY also include -domain-specific keys. Implementations MUST ignore extension -keys they do not recognize.

    +

    OPTIONAL. Object. An extension object for domain-specific +claims not defined by this specification. Implementations +that do not understand extension claims MUST ignore them.

    @@ -2314,57 +2308,41 @@ levels. Implementations SHOULD reject ECTs whose "ex exceeds these limits.

    The following extension keys are defined by this specification for common use cases. Because these keys are documented here, -they use short names without reverse domain prefixes.

    -

    Policy evaluation keys (see Section 4.2.3 for full -definitions and decision value semantics):

    +they use short names without reverse domain prefixes:

    -

    Operational metadata keys:

    - @@ -2392,13 +2370,14 @@ to minimize information leakage (see MUST be rejected.

  • -

    Parent Policy Decision: If any parent ECT's "ext" object -contains a "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's "ext" contains policy keys.

    +

    Parent Policy Decision: If any parent ECT contains a +"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.

  • Trust Domain Consistency: Parent tasks SHOULD belong to the @@ -2675,9 +2654,9 @@ verifier's current time, to account for clock skew).

  • -

    If "ext" is present and contains "pol" or "pol_decision", -verify that both are present and that "pol_decision" is one -of "approved", "rejected", or "pending_human_review".

    +

    If "pol" or "pol_decision" is present, verify that both are +present and that "pol_decision" is one of "approved", +"rejected", or "pending_human_review".

  • Perform DAG validation per Section 6.

    @@ -2764,12 +2743,11 @@ function verify_ect(ect_jws, verifier_id, if claim not in payload: return reject("Missing required claim: " + claim) - // Validate policy extension keys (optional, but must be paired) - ext = payload.ext or {} - if "pol" in ext or "pol_decision" in ext: - if "pol" not in ext or "pol_decision" not in ext: + // 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 ext.pol_decision not in + if payload.pol_decision not in ["approved", "rejected", "pending_human_review"]: return reject("Invalid pol_decision value") @@ -2860,34 +2838,29 @@ software used in medical devices. Agent A (Spec Reviewer): jti: task-001 par: [] exec_act: review_requirements_spec - ext.pol: spec_review_policy_v2 - ext.pol_decision: approved + pol: spec_review_policy_v2 pol_decision: approved Agent B (Code Generator): jti: task-002 par: [task-001] exec_act: implement_module - ext.pol: coding_standards_v3 - ext.pol_decision: approved + pol: coding_standards_v3 pol_decision: approved Agent C (Test Agent): jti: task-003 par: [task-002] exec_act: execute_test_suite - ext.pol: test_coverage_policy_v1 - ext.pol_decision: approved + pol: test_coverage_policy_v1 pol_decision: approved Agent D (Build Agent): jti: task-004 par: [task-003] exec_act: build_release_artifact - ext.pol: build_validation_v2 - ext.pol_decision: approved + pol: build_validation_v2 pol_decision: approved Human Release Manager: jti: task-005 par: [task-004] exec_act: approve_release - ext.pol: release_approval_policy - ext.pol_decision: approved - ext.pol_enforcer: spiffe://meddev.example/human/release-mgr-42 - ext.witnessed_by: [...] + pol: release_approval_policy pol_decision: approved + pol_enforcer: spiffe://meddev.example/human/release-mgr-42 + ext: {witnessed_by: [...]} (extension metadata)
    Figure 8: @@ -2990,20 +2963,17 @@ execution.

    Agent A (Risk Assessment): jti: task-001 par: [] exec_act: calculate_risk_exposure - ext.pol: risk_limits_policy_v2 - ext.pol_decision: approved + pol: risk_limits_policy_v2 pol_decision: approved Agent B (Compliance): jti: task-002 par: [task-001] exec_act: verify_compliance - ext.pol: compliance_check_v1 - ext.pol_decision: approved + pol: compliance_check_v1 pol_decision: approved Agent C (Execution): jti: task-003 par: [task-002] exec_act: execute_trade - ext.pol: execution_policy_v3 - ext.pol_decision: approved + pol: execution_policy_v3 pol_decision: approved
    Figure 10: @@ -3047,10 +3017,10 @@ a cryptographic link to the original task:
    Figure 12: @@ -3161,8 +3126,8 @@ to alter perceived execution ordering.ECTs are self-asserted by the executing agent. The agent claims what it did, and this claim is signed with its private key. A compromised or malicious agent could create ECTs with false claims -(e.g., setting "pol_decision" in "ext" to "approved" without -actually evaluating the policy).

    +(e.g., setting "pol_decision" to "approved" without actually +evaluating the policy).

    ECTs do not independently verify that:

    • @@ -3418,8 +3383,8 @@ serialized as JSON and SHOULD NOT exceed a nesting de

      Action descriptions ("exec_act") for audit trail completeness

    • -

      Policy evaluation outcomes (via "ext" keys "pol", -"pol_decision") when present, for compliance verification

      +

      Policy evaluation outcomes ("pol", "pol_decision") for +compliance verification

    • Timestamps ("iat", "exp") for temporal ordering

      @@ -3451,8 +3416,8 @@ hashes via "inp_hash" and "out_hash")Implementations SHOULD minimize the information included in ECTs. The "exec_act" claim SHOULD use structured identifiers (e.g., "process_payment") rather than natural language descriptions. -The "pol" extension key SHOULD reference policy identifiers -rather than embedding policy content.

      +The "pol" claim SHOULD reference policy identifiers rather than +embedding policy content.

      The "compensation_reason" extension key in "ext" (Section 4.2.5) deserves particular attention: because it is human-readable, it risks exposing sensitive operational @@ -3655,6 +3620,30 @@ the "JSON Web Token Claims" registry maintained by IANA:IETF Section 4.2.2 + + + + pol + Policy Rule Identifier + IETF + + Section 4.2.3 + + + + pol_decision + Policy Decision Result + IETF + + Section 4.2.3 + + + + pol_enforcer + Policy Enforcer Identity + IETF + + Section 4.2.3 @@ -3684,10 +3673,6 @@ the "JSON Web Token Claims" registry maintained by IANA:Note: Policy evaluation keys ("pol", "pol_decision", -"pol_enforcer") are carried within the "ext" object as -spec-defined extension keys (Section 4.2.3) and do not -require separate JWT Claims registration.

      @@ -4007,7 +3992,7 @@ registered as a SCITT Signed Statement on a Transparency Service. This enables auditors to verify both the individual execution steps (via ECT DAG validation) and the end-to-end supply chain integrity (via SCITT Receipts) using the "wid" as the shared -correlation point. The "ext" claim in ECTs (Section 4.2.6) +correlation point. The "ext" claim in ECTs (Section 4.2.2) can carry SCITT-specific metadata such as Transparency Service identifiers or Receipt references for tighter integration.

      @@ -4040,9 +4025,8 @@ use cases are distinct.

      1. Create JWTs with all required claims ("iss", "aud", "iat", -"exp", "jti", "exec_act", "par") and policy extension keys -("ext.pol", "ext.pol_decision") when policy evaluation was -performed.

        +"exp", "jti", "exec_act", "par") and policy claims ("pol", +"pol_decision") when policy evaluation was performed.

      2. Sign ECTs with the agent's private key using an algorithm @@ -4216,12 +4200,10 @@ Agent B:

        "wid": "b1c2d3e4-f5a6-7890-bcde-f01234567890", "exec_act": "fetch_patient_data", "par": [], + "pol": "clinical_data_access_policy_v1", + "pol_decision": "approved", "inp_hash": "sha-256:n4bQgYhMfWWaL-qgxVrQFaO_TxsrC4Is0V1sFbDwCgg", - "out_hash": "sha-256:LCa0a2j_xo_5m0U8HTBBNBNCLXBkg7-g-YpeiGJm564", - "ext": { - "pol": "clinical_data_access_policy_v1", - "pol_decision": "approved" - } + "out_hash": "sha-256:LCa0a2j_xo_5m0U8HTBBNBNCLXBkg7-g-YpeiGJm564" }
      @@ -4238,10 +4220,8 @@ task, and creates its own ECT: @@ -4275,12 +4255,10 @@ autonomous agents and human release approval: @@ -4296,10 +4274,8 @@ autonomous agents and human release approval: @@ -4315,10 +4291,8 @@ autonomous agents and human release approval: @@ -4334,11 +4308,9 @@ autonomous agents and human release approval: @@ -4354,10 +4326,10 @@ autonomous agents and human release approval: diff --git a/draft-nennemann-wimse-execution-context-00.md b/draft-nennemann-wimse-execution-context-00.md index 5aba041..ecf565a 100644 --- a/draft-nennemann-wimse-execution-context-00.md +++ b/draft-nennemann-wimse-execution-context-00.md @@ -168,7 +168,7 @@ This document defines: - The Execution Context Token (ECT) format ({{ect-format}}) - DAG structure for task dependency ordering ({{dag-validation}}) -- Policy checkpoint recording via extension keys ({{policy-claims}}) +- Policy checkpoint recording ({{policy-claims}}) - Integration with the WIMSE identity framework ({{wimse-integration}}) - An HTTP header for ECT transport ({{http-header}}) @@ -484,25 +484,21 @@ par: a root task with no dependencies. A workflow MAY contain multiple root tasks. -### Policy Evaluation Extension Keys {#policy-claims} +### Policy Evaluation {#policy-claims} -Policy evaluation outcomes are recorded as extension keys within -the "ext" object ({{extension-claims}}). This keeps the core -registered claims focused on DAG structure and execution context, -while allowing deployments to add policy recording as needed. +The following claims record policy evaluation outcomes: -The following extension keys are defined for policy evaluation: +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": -: 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": -: 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: +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. @@ -521,25 +517,25 @@ The following extension keys are defined for policy evaluation: records an "approved" decision referencing this task as a parent. - When "pol" and "pol_decision" are absent from "ext", the ECT - records task execution without a policy checkpoint. Regulated - deployments SHOULD include policy keys on all ECTs to maintain - complete audit trails. + 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": -: StringOrURI. The identity of the entity (system or person) - that evaluated the policy decision. When present, SHOULD use - SPIFFE ID format. +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" key is an opaque identifier referencing an external +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 "ext" keys defined above. +faithfully recorded in the ECT claims defined above. ### Data Integrity {#data-integrity-claims} @@ -574,12 +570,9 @@ parent reference in the ECT store. ### Extensions {#extension-claims} ext: -: OPTIONAL. Object. An extension object for claims beyond the - core registered claims. This specification defines several - extension keys for policy evaluation ({{policy-claims}}) and - operational metadata; deployments MAY also include - domain-specific keys. Implementations MUST ignore extension - keys they do not recognize. +: OPTIONAL. Object. An extension object for domain-specific + claims not defined by this specification. Implementations + that do not understand extension claims MUST ignore them. To avoid key collisions between different domains, extension key names SHOULD use reverse domain notation (e.g., @@ -593,20 +586,7 @@ exceeds these limits. The following extension keys are defined by this specification for common use cases. Because these keys are documented here, -they use short names without reverse domain prefixes. - -Policy evaluation keys (see {{policy-claims}} for full -definitions and decision value semantics): - -- "pol": String. Policy rule identifier. -- "pol\_decision": String. Policy evaluation outcome - ("approved", "rejected", or "pending\_human\_review"). -- "pol\_enforcer": StringOrURI. Identity of the policy - evaluator. -- "pol\_timestamp": NumericDate. Time at which the policy - decision was made, if distinct from "iat". - -Operational metadata keys: +they use short names without reverse domain prefixes: - "exec\_time\_ms": Integer. Execution duration in milliseconds. - "regulated\_domain": String. Regulatory domain (e.g., @@ -618,6 +598,8 @@ Operational metadata keys: attestation, witnesses should submit independent signed ECTs. - "inp\_classification": String. Data sensitivity classification (e.g., "public", "confidential", "restricted"). +- "pol\_timestamp": NumericDate. Time at which the policy + decision was made, if distinct from "iat". - "compensation\_required": Boolean. Indicates whether this task is a compensation or rollback action. - "compensation\_reason": String. Structured reason code for the @@ -641,13 +623,14 @@ The following is a complete ECT payload example: "exec_act": "recommend_treatment", "par": [], + "pol": "clinical_reasoning_policy_v2", + "pol_decision": "approved", + "pol_enforcer": "spiffe://example.com/policy/clinical-engine", + "inp_hash": "sha-256:n4bQgYhMfWWaL-qgxVrQFaO_TxsrC4Is0V1sFbDwCgg", "out_hash": "sha-256:LCa0a2j_xo_5m0U8HTBBNBNCLXBkg7-g-YpeiGJm564", "ext": { - "pol": "clinical_reasoning_policy_v2", - "pol_decision": "approved", - "pol_enforcer": "spiffe://example.com/policy/clinical-engine", "pol_timestamp": 1772064145, "exec_time_ms": 245, "regulated_domain": "medtech", @@ -737,14 +720,14 @@ the following DAG validation steps: lead back to the current ECT's "jti". If a cycle is detected, the ECT MUST be rejected. -5. Parent Policy Decision: If any parent ECT's "ext" object - contains a "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's "ext" contains policy keys. +5. Parent Policy Decision: If any parent ECT contains a + "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 @@ -859,9 +842,9 @@ verification steps in order: 12. Verify all required claims ("jti", "exec_act", "par") are present and well-formed. -13. If "ext" is present and contains "pol" or "pol_decision", - verify that both are present and that "pol_decision" is one - of "approved", "rejected", or "pending_human_review". +13. If "pol" or "pol_decision" is present, verify that both are + present and that "pol_decision" is one of "approved", + "rejected", or "pending_human_review". 14. Perform DAG validation per {{dag-validation}}. @@ -939,12 +922,11 @@ function verify_ect(ect_jws, verifier_id, if claim not in payload: return reject("Missing required claim: " + claim) - // Validate policy extension keys (optional, but must be paired) - ext = payload.ext or {} - if "pol" in ext or "pol_decision" in ext: - if "pol" not in ext or "pol_decision" not in ext: + // 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 ext.pol_decision not in + if payload.pol_decision not in ["approved", "rejected", "pending_human_review"]: return reject("Invalid pol_decision value") @@ -1014,34 +996,29 @@ software used in medical devices. Agent A (Spec Reviewer): jti: task-001 par: [] exec_act: review_requirements_spec - ext.pol: spec_review_policy_v2 - ext.pol_decision: approved + pol: spec_review_policy_v2 pol_decision: approved Agent B (Code Generator): jti: task-002 par: [task-001] exec_act: implement_module - ext.pol: coding_standards_v3 - ext.pol_decision: approved + pol: coding_standards_v3 pol_decision: approved Agent C (Test Agent): jti: task-003 par: [task-002] exec_act: execute_test_suite - ext.pol: test_coverage_policy_v1 - ext.pol_decision: approved + pol: test_coverage_policy_v1 pol_decision: approved Agent D (Build Agent): jti: task-004 par: [task-003] exec_act: build_release_artifact - ext.pol: build_validation_v2 - ext.pol_decision: approved + pol: build_validation_v2 pol_decision: approved Human Release Manager: jti: task-005 par: [task-004] exec_act: approve_release - ext.pol: release_approval_policy - ext.pol_decision: approved - ext.pol_enforcer: spiffe://meddev.example/human/release-mgr-42 - ext.witnessed_by: [...] + pol: release_approval_policy pol_decision: approved + pol_enforcer: spiffe://meddev.example/human/release-mgr-42 + ext: {witnessed_by: [...]} (extension metadata) ~~~ {: #fig-medtech-sdlc title="Medical Device SDLC Workflow"} @@ -1107,20 +1084,17 @@ execution. Agent A (Risk Assessment): jti: task-001 par: [] exec_act: calculate_risk_exposure - ext.pol: risk_limits_policy_v2 - ext.pol_decision: approved + pol: risk_limits_policy_v2 pol_decision: approved Agent B (Compliance): jti: task-002 par: [task-001] exec_act: verify_compliance - ext.pol: compliance_check_v1 - ext.pol_decision: approved + pol: compliance_check_v1 pol_decision: approved Agent C (Execution): jti: task-003 par: [task-002] exec_act: execute_trade - ext.pol: execution_policy_v3 - ext.pol_decision: approved + pol: execution_policy_v3 pol_decision: approved ~~~ {: #fig-finance title="Financial Trading Workflow"} @@ -1148,10 +1122,10 @@ a cryptographic link to the original task: "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": { - "pol": "compensation_policy_v1", - "pol_decision": "approved", - "pol_enforcer": "spiffe://bank.example/human/compliance-officer", "compensation_required": true, "compensation_reason": "policy_violation_in_parent_trade" } @@ -1173,32 +1147,27 @@ required checks were completed: Agent A (Route Planning): jti: task-001 par: [] exec_act: plan_route - ext.pol: route_policy_v1 - ext.pol_decision: approved + pol: route_policy_v1 pol_decision: approved Agent B (Customs): jti: task-002 par: [task-001] exec_act: validate_customs - ext.pol: customs_policy_v2 - ext.pol_decision: approved + pol: customs_policy_v2 pol_decision: approved Agent C (Safety): jti: task-003 par: [task-001] exec_act: verify_cargo_safety - ext.pol: safety_policy_v1 - ext.pol_decision: approved + pol: safety_policy_v1 pol_decision: approved Agent D (Payment): jti: task-004 par: [task-002, task-003] exec_act: authorize_payment - ext.pol: payment_policy_v3 - ext.pol_decision: approved + pol: payment_policy_v3 pol_decision: approved System (Commitment): jti: task-005 par: [task-004] exec_act: commit_shipment - ext.pol: commitment_policy_v1 - ext.pol_decision: approved + pol: commitment_policy_v1 pol_decision: approved ~~~ {: #fig-logistics title="Logistics Workflow with Parallel Tasks"} @@ -1229,8 +1198,8 @@ The following threat actors are considered: ECTs are self-asserted by the executing agent. The agent claims what it did, and this claim is signed with its private key. A compromised or malicious agent could create ECTs with false claims -(e.g., setting "pol_decision" in "ext" to "approved" without -actually evaluating the policy). +(e.g., setting "pol_decision" to "approved" without actually +evaluating the policy). ECTs do not independently verify that: @@ -1406,8 +1375,8 @@ ECTs necessarily reveal: - Agent identities ("iss", "aud") for accountability purposes - Action descriptions ("exec_act") for audit trail completeness -- Policy evaluation outcomes (via "ext" keys "pol", - "pol_decision") when present, for compliance verification +- Policy evaluation outcomes ("pol", "pol_decision") for + compliance verification - Timestamps ("iat", "exp") for temporal ordering ECTs are designed to NOT reveal: @@ -1423,8 +1392,8 @@ ECTs are designed to NOT reveal: Implementations SHOULD minimize the information included in ECTs. The "exec_act" claim SHOULD use structured identifiers (e.g., "process_payment") rather than natural language descriptions. -The "pol" extension key SHOULD reference policy identifiers -rather than embedding policy content. +The "pol" claim SHOULD reference policy identifiers rather than +embedding policy content. The "compensation_reason" extension key in "ext" ({{compensation-claims}}) deserves particular attention: because @@ -1533,16 +1502,14 @@ the "JSON Web Token Claims" registry maintained by IANA: | wid | Workflow Identifier | IETF | {{exec-claims}} | | exec_act | Action/Task Type | 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}} | | out_hash | Output Data Hash | IETF | {{data-integrity-claims}} | | ext | Extension Object | IETF | {{extension-claims}} | {: #table-claims title="JWT Claims Registrations"} -Note: Policy evaluation keys ("pol", "pol_decision", -"pol_enforcer") are carried within the "ext" object as -spec-defined extension keys ({{policy-claims}}) and do not -require separate JWT Claims registration. - ## ECT Policy Decision Values Registry {#pol-decision-registry} This document establishes the "ECT Policy Decision Values" @@ -1675,7 +1642,7 @@ registered as a SCITT Signed Statement on a Transparency Service. This enables auditors to verify both the individual execution steps (via ECT DAG validation) and the end-to-end supply chain integrity (via SCITT Receipts) using the "wid" as the shared -correlation point. The "ext" claim in ECTs ({{extension-claims}}) +correlation point. The "ext" claim in ECTs ({{exec-claims}}) can carry SCITT-specific metadata such as Transparency Service identifiers or Receipt references for tighter integration. @@ -1697,9 +1664,8 @@ use cases are distinct. A minimal conforming implementation needs to: 1. Create JWTs with all required claims ("iss", "aud", "iat", - "exp", "jti", "exec_act", "par") and policy extension keys - ("ext.pol", "ext.pol_decision") when policy evaluation was - performed. + "exp", "jti", "exec_act", "par") and policy claims ("pol", + "pol_decision") when policy evaluation was performed. 2. Sign ECTs with the agent's private key using an algorithm matching the WIT (ES256 recommended). 3. Verify ECT signatures against WIT public keys. @@ -1788,12 +1754,10 @@ ECT Payload: "wid": "b1c2d3e4-f5a6-7890-bcde-f01234567890", "exec_act": "fetch_patient_data", "par": [], + "pol": "clinical_data_access_policy_v1", + "pol_decision": "approved", "inp_hash": "sha-256:n4bQgYhMfWWaL-qgxVrQFaO_TxsrC4Is0V1sFbDwCgg", - "out_hash": "sha-256:LCa0a2j_xo_5m0U8HTBBNBNCLXBkg7-g-YpeiGJm564", - "ext": { - "pol": "clinical_data_access_policy_v1", - "pol_decision": "approved" - } + "out_hash": "sha-256:LCa0a2j_xo_5m0U8HTBBNBNCLXBkg7-g-YpeiGJm564" } ~~~ @@ -1810,10 +1774,8 @@ task, and creates its own ECT: "wid": "b1c2d3e4-f5a6-7890-bcde-f01234567890", "exec_act": "validate_safety", "par": ["550e8400-e29b-41d4-a716-446655440001"], - "ext": { - "pol": "safety_validation_policy_v2", - "pol_decision": "approved" - } + "pol": "safety_validation_policy_v2", + "pol_decision": "approved" } ~~~ @@ -1844,12 +1806,10 @@ Task 1 (Spec Review Agent): "wid": "c2d3e4f5-a6b7-8901-cdef-012345678901", "exec_act": "review_requirements_spec", "par": [], + "pol": "spec_review_policy_v2", + "pol_decision": "approved", "inp_hash": "sha-256:n4bQgYhMfWWaL-qgxVrQFaO_TxsrC4Is0V1sFbDwCgg", - "out_hash": "sha-256:LCa0a2j_xo_5m0U8HTBBNBNCLXBkg7-g-YpeiGJm564", - "ext": { - "pol": "spec_review_policy_v2", - "pol_decision": "approved" - } + "out_hash": "sha-256:LCa0a2j_xo_5m0U8HTBBNBNCLXBkg7-g-YpeiGJm564" } ~~~ @@ -1865,10 +1825,8 @@ Task 2 (Code Generation Agent): "wid": "c2d3e4f5-a6b7-8901-cdef-012345678901", "exec_act": "implement_module", "par": ["a1b2c3d4-0001-0000-0000-000000000001"], - "ext": { - "pol": "coding_standards_v3", - "pol_decision": "approved" - } + "pol": "coding_standards_v3", + "pol_decision": "approved" } ~~~ @@ -1884,10 +1842,8 @@ Task 3 (Autonomous Test Agent): "wid": "c2d3e4f5-a6b7-8901-cdef-012345678901", "exec_act": "execute_test_suite", "par": ["a1b2c3d4-0001-0000-0000-000000000002"], - "ext": { - "pol": "test_coverage_policy_v1", - "pol_decision": "approved" - } + "pol": "test_coverage_policy_v1", + "pol_decision": "approved" } ~~~ @@ -1903,11 +1859,9 @@ Task 4 (Build Agent): "wid": "c2d3e4f5-a6b7-8901-cdef-012345678901", "exec_act": "build_release_artifact", "par": ["a1b2c3d4-0001-0000-0000-000000000003"], - "out_hash": "sha-256:Ry1YfOoW2XpC5Mq8HkGzNx3dL9vBa4sUjE7iKt0wPZc", - "ext": { - "pol": "build_validation_v2", - "pol_decision": "approved" - } + "pol": "build_validation_v2", + "pol_decision": "approved", + "out_hash": "sha-256:Ry1YfOoW2XpC5Mq8HkGzNx3dL9vBa4sUjE7iKt0wPZc" } ~~~ @@ -1923,10 +1877,10 @@ Task 5 (Human Release Manager Approval): "wid": "c2d3e4f5-a6b7-8901-cdef-012345678901", "exec_act": "approve_release", "par": ["a1b2c3d4-0001-0000-0000-000000000004"], + "pol": "release_approval_policy", + "pol_decision": "approved", + "pol_enforcer": "spiffe://meddev.example/human/release-mgr-42", "ext": { - "pol": "release_approval_policy", - "pol_decision": "approved", - "pol_enforcer": "spiffe://meddev.example/human/release-mgr-42", "witnessed_by": [ "spiffe://meddev.example/audit/qa-observer-1" ] @@ -1995,10 +1949,8 @@ Task 004 ECT payload: "f1e2d3c4-0002-0000-0000-000000000002", "f1e2d3c4-0003-0000-0000-000000000003" ], - "ext": { - "pol": "trade_execution_policy_v3", - "pol_decision": "approved" - } + "pol": "trade_execution_policy_v3", + "pol_decision": "approved" } ~~~ diff --git a/draft-nennemann-wimse-execution-context-00.txt b/draft-nennemann-wimse-execution-context-00.txt index 9696647..c906d0c 100644 --- a/draft-nennemann-wimse-execution-context-00.txt +++ b/draft-nennemann-wimse-execution-context-00.txt @@ -89,11 +89,11 @@ Table of Contents 4.2. JWT Claims . . . . . . . . . . . . . . . . . . . . . . . 10 4.2.1. Standard JWT Claims . . . . . . . . . . . . . . . . . 10 4.2.2. Execution Context . . . . . . . . . . . . . . . . . . 11 - 4.2.3. Policy Evaluation Extension Keys . . . . . . . . . . 12 - 4.2.4. Data Integrity . . . . . . . . . . . . . . . . . . . 13 + 4.2.3. Policy Evaluation . . . . . . . . . . . . . . . . . . 11 + 4.2.4. Data Integrity . . . . . . . . . . . . . . . . . . . 12 4.2.5. Compensation and Rollback . . . . . . . . . . . . . . 13 4.2.6. Extensions . . . . . . . . . . . . . . . . . . . . . 13 - 4.3. Complete ECT Example . . . . . . . . . . . . . . . . . . 15 + 4.3. Complete ECT Example . . . . . . . . . . . . . . . . . . 14 5. HTTP Header Transport . . . . . . . . . . . . . . . . . . . . 15 5.1. Execution-Context Header Field . . . . . . . . . . . . . 15 6. DAG Validation . . . . . . . . . . . . . . . . . . . . . . . 16 @@ -116,7 +116,7 @@ Internet-Draft WIMSE Execution Context February 2026 9.1.1. FDA Audit with DAG Reconstruction . . . . . . . . . . 24 9.2. Financial Trading Workflow . . . . . . . . . . . . . . . 25 - 9.3. Compensation and Rollback . . . . . . . . . . . . . . . . 26 + 9.3. Compensation and Rollback . . . . . . . . . . . . . . . . 25 9.4. Autonomous Logistics Coordination . . . . . . . . . . . . 26 10. Security Considerations . . . . . . . . . . . . . . . . . . . 27 10.1. Threat Model . . . . . . . . . . . . . . . . . . . . . . 27 @@ -124,16 +124,16 @@ Internet-Draft WIMSE Execution Context February 2026 10.3. Organizational Prerequisites . . . . . . . . . . . . . . 28 10.4. Signature Verification . . . . . . . . . . . . . . . . . 29 10.5. Replay Attack Prevention . . . . . . . . . . . . . . . . 29 - 10.6. Man-in-the-Middle Protection . . . . . . . . . . . . . . 30 + 10.6. Man-in-the-Middle Protection . . . . . . . . . . . . . . 29 10.7. Key Compromise . . . . . . . . . . . . . . . . . . . . . 30 10.8. Collusion and False Claims . . . . . . . . . . . . . . . 30 10.9. Denial of Service . . . . . . . . . . . . . . . . . . . 31 10.10. Timestamp Accuracy . . . . . . . . . . . . . . . . . . . 31 - 10.11. ECT Size Constraints . . . . . . . . . . . . . . . . . . 32 - 11. Privacy Considerations . . . . . . . . . . . . . . . . . . . 32 - 11.1. Data Exposure in ECTs . . . . . . . . . . . . . . . . . 32 + 10.11. ECT Size Constraints . . . . . . . . . . . . . . . . . . 31 + 11. Privacy Considerations . . . . . . . . . . . . . . . . . . . 31 + 11.1. Data Exposure in ECTs . . . . . . . . . . . . . . . . . 31 11.2. Data Minimization . . . . . . . . . . . . . . . . . . . 32 - 11.3. Storage and Access Control . . . . . . . . . . . . . . . 33 + 11.3. Storage and Access Control . . . . . . . . . . . . . . . 32 11.4. Regulatory Access . . . . . . . . . . . . . . . . . . . 33 12. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 33 12.1. Media Type Registration . . . . . . . . . . . . . . . . 33 @@ -240,7 +240,7 @@ Internet-Draft WIMSE Execution Context February 2026 * DAG structure for task dependency ordering (Section 6) - * Policy checkpoint recording via extension keys (Section 4.2.3) + * Policy checkpoint recording (Section 4.2.3) * Integration with the WIMSE identity framework (Section 3) @@ -605,11 +605,11 @@ Internet-Draft WIMSE Execution Context February 2026 root task with no dependencies. A workflow MAY contain multiple root tasks. +4.2.3. Policy Evaluation + The following claims record policy evaluation outcomes: - - - + pol: OPTIONAL. String. The identifier of the policy rule that was @@ -618,23 +618,13 @@ Nennemann Expires 29 August 2026 [Page 11] Internet-Draft WIMSE Execution Context February 2026 -4.2.3. Policy Evaluation Extension Keys + evaluated for this task (e.g., "clinical_data_access_policy_v1"). + MUST be present when "pol_decision" is present. - Policy evaluation outcomes are recorded as extension keys within the - "ext" object (Section 4.2.6). This keeps the core registered claims - focused on DAG structure and execution context, while allowing - deployments to add policy recording as needed. - - The following extension keys are defined for policy evaluation: - - "pol": 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": String. The result of the policy evaluation. When - present, MUST be one of the values registered in the ECT Policy - Decision Values registry (Section 12.4). MUST be present when - "pol" is present. Initial values are: + 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 (Section 12.4). MUST be + present when "pol" is present. Initial values are: * "approved": The policy evaluation succeeded and the task was authorized to proceed. @@ -653,19 +643,29 @@ Internet-Draft WIMSE Execution Context February 2026 records an "approved" decision referencing this task as a parent. - When "pol" and "pol_decision" are absent from "ext", the ECT - records task execution without a policy checkpoint. Regulated - deployments SHOULD include policy keys on all ECTs to maintain - complete audit trails. + 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": StringOrURI. The identity of the entity (system or - person) that evaluated the policy decision. When present, SHOULD - use SPIFFE ID format. + 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" key - is an opaque identifier referencing an external policy; the semantics + 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. + +4.2.4. Data Integrity + + The following claims provide integrity verification for task inputs + and outputs without revealing the data itself: @@ -674,17 +674,6 @@ Nennemann Expires 29 August 2026 [Page 12] Internet-Draft WIMSE Execution Context February 2026 - 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 "ext" keys defined - above. - -4.2.4. Data Integrity - - The following claims provide integrity verification for task inputs - and outputs without revealing the data itself: - inp_hash: OPTIONAL. String. A cryptographic hash of the input data, formatted as "hash-algorithm:base64url-encoded-hash" (e.g., "sha-256:n4bQgYhMfWWaL-qgxVrQFaO_TxsrC4Is0V1sFbDwCgg"). The hash @@ -711,25 +700,14 @@ Internet-Draft WIMSE Execution Context February 2026 4.2.6. Extensions - ext: OPTIONAL. Object. An extension object for claims beyond the - core registered claims. This specification defines several - extension keys for policy evaluation (Section 4.2.3) and - operational metadata; deployments MAY also include domain-specific - keys. Implementations MUST ignore extension keys they do not - recognize. + ext: OPTIONAL. Object. An extension object for domain-specific + claims not defined by this specification. Implementations that do + not understand extension claims MUST ignore them. To avoid key collisions between different domains, extension key names SHOULD use reverse domain notation (e.g., "com.example.custom_field") to avoid collisions between independently developed extensions. To prevent abuse and excessive token size, the - - - -Nennemann Expires 29 August 2026 [Page 13] - -Internet-Draft WIMSE Execution Context February 2026 - - serialized JSON representation of the "ext" object SHOULD NOT exceed 4096 bytes, and the JSON nesting depth within the "ext" object SHOULD NOT exceed 5 levels. Implementations SHOULD reject ECTs whose "ext" @@ -737,28 +715,21 @@ Internet-Draft WIMSE Execution Context February 2026 The following extension keys are defined by this specification for common use cases. Because these keys are documented here, they use - short names without reverse domain prefixes. - - Policy evaluation keys (see Section 4.2.3 for full definitions and - decision value semantics): - - * "pol": String. Policy rule identifier. - - * "pol_decision": String. Policy evaluation outcome ("approved", - "rejected", or "pending_human_review"). - - * "pol_enforcer": StringOrURI. Identity of the policy evaluator. - - * "pol_timestamp": NumericDate. Time at which the policy decision - was made, if distinct from "iat". - - Operational metadata keys: + short names without reverse domain prefixes: * "exec_time_ms": Integer. Execution duration in milliseconds. * "regulated_domain": String. Regulatory domain (e.g., "medtech", "finance", "military"). + + + +Nennemann Expires 29 August 2026 [Page 13] + +Internet-Draft WIMSE Execution Context February 2026 + + * "model_version": String. AI/ML model version. * "witnessed_by": Array of StringOrURI. Identifiers of third-party @@ -769,6 +740,9 @@ Internet-Draft WIMSE Execution Context February 2026 * "inp_classification": String. Data sensitivity classification (e.g., "public", "confidential", "restricted"). + * "pol_timestamp": NumericDate. Time at which the policy decision + was made, if distinct from "iat". + * "compensation_required": Boolean. Indicates whether this task is a compensation or rollback action. @@ -776,6 +750,32 @@ Internet-Draft WIMSE Execution Context February 2026 compensation action (e.g., "policy_violation_in_parent_trade"). SHOULD use structured identifiers rather than free-form text to minimize information leakage (see Section 11.2). + +4.3. Complete ECT Example + + The following is a complete ECT payload example: + + + + + + + + + + + + + + + + + + + + + + @@ -786,10 +786,6 @@ Nennemann Expires 29 August 2026 [Page 14] Internet-Draft WIMSE Execution Context February 2026 -4.3. Complete ECT Example - - The following is a complete ECT payload example: - { "iss": "spiffe://example.com/agent/clinical", "aud": "spiffe://example.com/agent/safety", @@ -801,13 +797,14 @@ Internet-Draft WIMSE Execution Context February 2026 "exec_act": "recommend_treatment", "par": [], + "pol": "clinical_reasoning_policy_v2", + "pol_decision": "approved", + "pol_enforcer": "spiffe://example.com/policy/clinical-engine", + "inp_hash": "sha-256:n4bQgYhMfWWaL-qgxVrQFaO_TxsrC4Is0V1sFbDwCgg", "out_hash": "sha-256:LCa0a2j_xo_5m0U8HTBBNBNCLXBkg7-g-YpeiGJm564", "ext": { - "pol": "clinical_reasoning_policy_v2", - "pol_decision": "approved", - "pol_enforcer": "spiffe://example.com/policy/clinical-engine", "pol_timestamp": 1772064145, "exec_time_ms": 245, "regulated_domain": "medtech", @@ -831,9 +828,12 @@ Internet-Draft WIMSE Execution Context February 2026 An agent sending a request to another agent includes the Execution- Context header alongside the WIMSE Workload-Identity header: + GET /api/safety-check HTTP/1.1 + Host: safety-agent.example.com + Workload-Identity: eyJhbGci...WIT... + Execution-Context: eyJhbGci...ECT... - - + Figure 5: HTTP Request with ECT Header @@ -842,13 +842,6 @@ Nennemann Expires 29 August 2026 [Page 15] Internet-Draft WIMSE Execution Context February 2026 - GET /api/safety-check HTTP/1.1 - Host: safety-agent.example.com - Workload-Identity: eyJhbGci...WIT... - Execution-Context: eyJhbGci...ECT... - - Figure 5: HTTP Request with ECT Header - When multiple parent tasks contribute context to a single request, multiple Execution-Context header field lines MAY be included, each carrying a separate ECT in JWS Compact Serialization format. @@ -893,6 +886,13 @@ Internet-Draft WIMSE Execution Context February 2026 + + + + + + + Nennemann Expires 29 August 2026 [Page 16] Internet-Draft WIMSE Execution Context February 2026 @@ -913,13 +913,13 @@ Internet-Draft WIMSE Execution Context February 2026 lead back to the current ECT's "jti". If a cycle is detected, the ECT MUST be rejected. - 5. Parent Policy Decision: If any parent ECT's "ext" object contains - a "pol_decision" of "rejected" or "pending_human_review", the + 5. Parent Policy Decision: If any parent ECT contains a + "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's "ext" contains policy keys. + 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 @@ -1075,9 +1075,9 @@ Internet-Draft WIMSE Execution Context February 2026 12. Verify all required claims ("jti", "exec_act", "par") are present and well-formed. - 13. If "ext" is present and contains "pol" or "pol_decision", verify - that both are present and that "pol_decision" is one of - "approved", "rejected", or "pending_human_review". + 13. If "pol" or "pol_decision" is present, verify that both are + present and that "pol_decision" is one of "approved", + "rejected", or "pending_human_review". 14. Perform DAG validation per Section 6. @@ -1161,15 +1161,15 @@ Internet-Draft WIMSE Execution Context February 2026 if claim not in payload: return reject("Missing required claim: " + claim) - // Validate policy extension keys (optional, but must be paired) - ext = payload.ext or {} - if "pol" in ext or "pol_decision" in ext: - if "pol" not in ext or "pol_decision" not in ext: + // 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 ext.pol_decision not in + 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) @@ -1178,7 +1178,6 @@ Nennemann Expires 29 August 2026 [Page 21] Internet-Draft WIMSE Execution Context February 2026 - // Validate DAG (against ECT store or inline parent ECTs) result = validate_dag(payload, ect_store, clock_skew_tolerance) if result is error: @@ -1229,6 +1228,7 @@ Internet-Draft WIMSE Execution Context February 2026 + Nennemann Expires 29 August 2026 [Page 22] Internet-Draft WIMSE Execution Context February 2026 @@ -1249,37 +1249,37 @@ Internet-Draft WIMSE Execution Context February 2026 Agent A (Spec Reviewer): jti: task-001 par: [] exec_act: review_requirements_spec - ext.pol: spec_review_policy_v2 - ext.pol_decision: approved + pol: spec_review_policy_v2 pol_decision: approved Agent B (Code Generator): jti: task-002 par: [task-001] exec_act: implement_module - ext.pol: coding_standards_v3 - ext.pol_decision: approved + pol: coding_standards_v3 pol_decision: approved Agent C (Test Agent): jti: task-003 par: [task-002] exec_act: execute_test_suite - ext.pol: test_coverage_policy_v1 - ext.pol_decision: approved + pol: test_coverage_policy_v1 pol_decision: approved Agent D (Build Agent): jti: task-004 par: [task-003] exec_act: build_release_artifact - ext.pol: build_validation_v2 - ext.pol_decision: approved + pol: build_validation_v2 pol_decision: approved Human Release Manager: jti: task-005 par: [task-004] exec_act: approve_release - ext.pol: release_approval_policy - ext.pol_decision: approved - ext.pol_enforcer: spiffe://meddev.example/human/release-mgr-42 - ext.witnessed_by: [...] + pol: release_approval_policy pol_decision: approved + pol_enforcer: spiffe://meddev.example/human/release-mgr-42 + ext: {witnessed_by: [...]} (extension metadata) Figure 8: Medical Device SDLC Workflow + ECTs record that requirements were reviewed before implementation + began, that tests were executed against the implemented code, that + the build artifact was validated, and that a human release manager + explicitly approved the release. The DAG structure ensures no phase + was skipped or reordered. @@ -1290,12 +1290,6 @@ Nennemann Expires 29 August 2026 [Page 23] Internet-Draft WIMSE Execution Context February 2026 - ECTs record that requirements were reviewed before implementation - began, that tests were executed against the implemented code, that - the build artifact was validated, and that a human release manager - explicitly approved the release. The DAG structure ensures no phase - was skipped or reordered. - 9.1.1. FDA Audit with DAG Reconstruction During a regulatory audit, an FDA reviewer requests evidence of the @@ -1337,6 +1331,12 @@ Internet-Draft WIMSE Execution Context February 2026 * [FDA-21CFR11] Section 11.10(e): Computer-generated audit trails that record the date, time, and identity of the operator. + * [EU-MDR] Annex II: Technical documentation traceability for the + software development lifecycle. + + * [EU-AI-ACT] Article 12: Automatic logging capabilities for high- + risk AI systems involved in the development process. + @@ -1346,12 +1346,6 @@ Nennemann Expires 29 August 2026 [Page 24] Internet-Draft WIMSE Execution Context February 2026 - * [EU-MDR] Annex II: Technical documentation traceability for the - software development lifecycle. - - * [EU-AI-ACT] Article 12: Automatic logging capabilities for high- - risk AI systems involved in the development process. - * [EU-AI-ACT] Article 14: ECTs can record evidence that human oversight events occurred during the release process. @@ -1364,20 +1358,17 @@ Internet-Draft WIMSE Execution Context February 2026 Agent A (Risk Assessment): jti: task-001 par: [] exec_act: calculate_risk_exposure - ext.pol: risk_limits_policy_v2 - ext.pol_decision: approved + pol: risk_limits_policy_v2 pol_decision: approved Agent B (Compliance): jti: task-002 par: [task-001] exec_act: verify_compliance - ext.pol: compliance_check_v1 - ext.pol_decision: approved + pol: compliance_check_v1 pol_decision: approved Agent C (Execution): jti: task-003 par: [task-002] exec_act: execute_trade - ext.pol: execution_policy_v3 - ext.pol_decision: approved + pol: execution_policy_v3 pol_decision: approved Figure 10: Financial Trading Workflow @@ -1391,6 +1382,15 @@ Internet-Draft WIMSE Execution Context February 2026 * [EU-AI-ACT] Article 12: Logging of decisions made by AI-driven systems. +9.3. Compensation and Rollback + + When a compliance violation is discovered after execution, ECTs + provide a mechanism to record authorized compensation actions with a + cryptographic link to the original task: + + + + @@ -1402,12 +1402,6 @@ Nennemann Expires 29 August 2026 [Page 25] Internet-Draft WIMSE Execution Context February 2026 -9.3. Compensation and Rollback - - When a compliance violation is discovered after execution, ECTs - provide a mechanism to record authorized compensation actions with a - cryptographic link to the original task: - { "iss": "spiffe://bank.example/agent/operations", "aud": "spiffe://bank.example/system/ledger", @@ -1417,10 +1411,10 @@ Internet-Draft WIMSE Execution Context February 2026 "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": { - "pol": "compensation_policy_v1", - "pol_decision": "approved", - "pol_enforcer": "spiffe://bank.example/human/compliance-officer", "compensation_required": true, "compensation_reason": "policy_violation_in_parent_trade" } @@ -1451,6 +1445,12 @@ Internet-Draft WIMSE Execution Context February 2026 + + + + + + Nennemann Expires 29 August 2026 [Page 26] @@ -1461,32 +1461,27 @@ Internet-Draft WIMSE Execution Context February 2026 Agent A (Route Planning): jti: task-001 par: [] exec_act: plan_route - ext.pol: route_policy_v1 - ext.pol_decision: approved + pol: route_policy_v1 pol_decision: approved Agent B (Customs): jti: task-002 par: [task-001] exec_act: validate_customs - ext.pol: customs_policy_v2 - ext.pol_decision: approved + pol: customs_policy_v2 pol_decision: approved Agent C (Safety): jti: task-003 par: [task-001] exec_act: verify_cargo_safety - ext.pol: safety_policy_v1 - ext.pol_decision: approved + pol: safety_policy_v1 pol_decision: approved Agent D (Payment): jti: task-004 par: [task-002, task-003] exec_act: authorize_payment - ext.pol: payment_policy_v3 - ext.pol_decision: approved + pol: payment_policy_v3 pol_decision: approved System (Commitment): jti: task-005 par: [task-004] exec_act: commit_shipment - ext.pol: commitment_policy_v1 - ext.pol_decision: approved + pol: commitment_policy_v1 pol_decision: approved Figure 12: Logistics Workflow with Parallel Tasks @@ -1506,6 +1501,11 @@ Internet-Draft WIMSE Execution Context February 2026 * Malicious agent (insider threat): An agent within the trust domain that intentionally creates false ECT claims. + * Compromised agent (external attacker): An agent whose private key + has been obtained by an external attacker. + + * Ledger tamperer: An entity attempting to modify or delete ledger + entries after they have been recorded. @@ -1514,12 +1514,6 @@ Nennemann Expires 29 August 2026 [Page 27] Internet-Draft WIMSE Execution Context February 2026 - * Compromised agent (external attacker): An agent whose private key - has been obtained by an external attacker. - - * Ledger tamperer: An entity attempting to modify or delete ledger - entries after they have been recorded. - * Time manipulator: An entity attempting to manipulate timestamps to alter perceived execution ordering. @@ -1528,8 +1522,7 @@ Internet-Draft WIMSE Execution Context February 2026 ECTs are self-asserted by the executing agent. The agent claims what it did, and this claim is signed with its private key. A compromised or malicious agent could create ECTs with false claims (e.g., setting - "pol_decision" in "ext" to "approved" without actually evaluating the - policy). + "pol_decision" to "approved" without actually evaluating the policy). ECTs do not independently verify that: @@ -1563,6 +1556,13 @@ Internet-Draft WIMSE Execution Context February 2026 provided by ECTs are only meaningful when the following organizational controls are in place: + * Key management governance: Controls over who provisions agent keys + and how keys are protected. + + * Ledger integrity governance: The ledger is maintained by an entity + independent of the workflow agents. + + Nennemann Expires 29 August 2026 [Page 28] @@ -1570,12 +1570,6 @@ Nennemann Expires 29 August 2026 [Page 28] Internet-Draft WIMSE Execution Context February 2026 - * Key management governance: Controls over who provisions agent keys - and how keys are protected. - - * Ledger integrity governance: The ledger is maintained by an entity - independent of the workflow agents. - * Policy lifecycle management: Policy identifiers in ECTs map to actual, validated policy rules. @@ -1614,18 +1608,6 @@ Internet-Draft WIMSE Execution Context February 2026 to detect replayed ECTs within the expiration window. An ECT with a duplicate "jti" value MUST be rejected. - - - - - - - -Nennemann Expires 29 August 2026 [Page 29] - -Internet-Draft WIMSE Execution Context February 2026 - - 10.6. Man-in-the-Middle Protection ECTs do not replace transport-layer security. ECTs MUST be @@ -1636,6 +1618,14 @@ Internet-Draft WIMSE Execution Context February 2026 The defense-in-depth model provides: + + + +Nennemann Expires 29 August 2026 [Page 29] + +Internet-Draft WIMSE Execution Context February 2026 + + * TLS/mTLS (transport layer): Prevents network-level tampering. * WIT/WPT (WIMSE identity layer): Proves agent identity and request @@ -1674,14 +1664,6 @@ Internet-Draft WIMSE Execution Context February 2026 Mitigations include: - - - -Nennemann Expires 29 August 2026 [Page 30] - -Internet-Draft WIMSE Execution Context February 2026 - - * Independent ledger maintenance: The ledger SHOULD be maintained by an entity independent of the workflow agents. @@ -1691,6 +1673,15 @@ Internet-Draft WIMSE Execution Context February 2026 * Cross-verification: Multiple independent ledger replicas can be compared for consistency. + + + + +Nennemann Expires 29 August 2026 [Page 30] + +Internet-Draft WIMSE Execution Context February 2026 + + * Out-of-band audit: External auditors periodically verify ledger contents against expected workflow patterns. @@ -1724,20 +1715,6 @@ Internet-Draft WIMSE Execution Context February 2026 The temporal ordering check in DAG validation incorporates the clock skew tolerance to account for minor clock differences between agents. - - - - - - - - - -Nennemann Expires 29 August 2026 [Page 31] - -Internet-Draft WIMSE Execution Context February 2026 - - 10.11. ECT Size Constraints ECTs with many parent tasks or large extension objects can increase @@ -1753,12 +1730,20 @@ Internet-Draft WIMSE Execution Context February 2026 ECTs necessarily reveal: + + + +Nennemann Expires 29 August 2026 [Page 31] + +Internet-Draft WIMSE Execution Context February 2026 + + * Agent identities ("iss", "aud") for accountability purposes * Action descriptions ("exec_act") for audit trail completeness - * Policy evaluation outcomes (via "ext" keys "pol", "pol_decision") - when present, for compliance verification + * Policy evaluation outcomes ("pol", "pol_decision") for compliance + verification * Timestamps ("iat", "exp") for temporal ordering @@ -1778,22 +1763,14 @@ Internet-Draft WIMSE Execution Context February 2026 Implementations SHOULD minimize the information included in ECTs. The "exec_act" claim SHOULD use structured identifiers (e.g., "process_payment") rather than natural language descriptions. The - "pol" extension key SHOULD reference policy identifiers rather than - embedding policy content. + "pol" claim SHOULD reference policy identifiers rather than embedding + policy content. The "compensation_reason" extension key in "ext" (Section 4.2.5) deserves particular attention: because it is human-readable, it risks exposing sensitive operational details. See Section 4.2.6 for guidance on using structured identifiers. - - - -Nennemann Expires 29 August 2026 [Page 32] - -Internet-Draft WIMSE Execution Context February 2026 - - 11.3. Storage and Access Control ECTs stored in audit ledgers SHOULD be access-controlled so that only @@ -1806,6 +1783,17 @@ Internet-Draft WIMSE Execution Context February 2026 controls, since auditors may need to verify hash correctness but general access to the data values is not needed. + + + + + + +Nennemann Expires 29 August 2026 [Page 32] + +Internet-Draft WIMSE Execution Context February 2026 + + 11.4. Regulatory Access ECTs are designed for interpretation by qualified human auditors and @@ -1842,14 +1830,6 @@ Internet-Draft WIMSE Execution Context February 2026 regulated agentic workflows requiring execution context tracing and audit trails. - - - -Nennemann Expires 29 August 2026 [Page 33] - -Internet-Draft WIMSE Execution Context February 2026 - - Additional information: Magic number(s): none File extension(s): none Macintosh file type code(s): none @@ -1862,6 +1842,14 @@ Internet-Draft WIMSE Execution Context February 2026 Author: Christian Nennemann + + + +Nennemann Expires 29 August 2026 [Page 33] + +Internet-Draft WIMSE Execution Context February 2026 + + Change controller: IETF 12.2. HTTP Header Field Registration @@ -1892,6 +1880,18 @@ Internet-Draft WIMSE Execution Context February 2026 + + + + + + + + + + + + @@ -1906,34 +1906,39 @@ Nennemann Expires 29 August 2026 [Page 34] Internet-Draft WIMSE Execution Context February 2026 - +============+=====================+===================+===========+ - | Claim Name | Claim Description | Change Controller | Reference | - +============+=====================+===================+===========+ - | wid | Workflow Identifier | IETF | Section | - | | | | 4.2.2 | - +------------+---------------------+-------------------+-----------+ - | exec_act | Action/Task Type | IETF | Section | - | | | | 4.2.2 | - +------------+---------------------+-------------------+-----------+ - | par | Parent Task | IETF | Section | - | | Identifiers | | 4.2.2 | - +------------+---------------------+-------------------+-----------+ - | inp_hash | Input Data Hash | IETF | Section | - | | | | 4.2.4 | - +------------+---------------------+-------------------+-----------+ - | out_hash | Output Data Hash | IETF | Section | - | | | | 4.2.4 | - +------------+---------------------+-------------------+-----------+ - | ext | Extension Object | IETF | Section | - | | | | 4.2.6 | - +------------+---------------------+-------------------+-----------+ + +==============+===================+===================+===========+ + | Claim Name | Claim Description | Change Controller | Reference | + +==============+===================+===================+===========+ + | wid | Workflow | IETF | Section | + | | Identifier | | 4.2.2 | + +--------------+-------------------+-------------------+-----------+ + | exec_act | Action/Task Type | IETF | Section | + | | | | 4.2.2 | + +--------------+-------------------+-------------------+-----------+ + | par | Parent Task | IETF | Section | + | | Identifiers | | 4.2.2 | + +--------------+-------------------+-------------------+-----------+ + | pol | Policy Rule | IETF | Section | + | | Identifier | | 4.2.3 | + +--------------+-------------------+-------------------+-----------+ + | pol_decision | Policy Decision | IETF | Section | + | | Result | | 4.2.3 | + +--------------+-------------------+-------------------+-----------+ + | pol_enforcer | Policy Enforcer | IETF | Section | + | | Identity | | 4.2.3 | + +--------------+-------------------+-------------------+-----------+ + | inp_hash | Input Data Hash | IETF | Section | + | | | | 4.2.4 | + +--------------+-------------------+-------------------+-----------+ + | out_hash | Output Data Hash | IETF | Section | + | | | | 4.2.4 | + +--------------+-------------------+-------------------+-----------+ + | ext | Extension Object | IETF | Section | + | | | | 4.2.6 | + +--------------+-------------------+-------------------+-----------+ Table 1: JWT Claims Registrations - Note: Policy evaluation keys ("pol", "pol_decision", "pol_enforcer") - are carried within the "ext" object as spec-defined extension keys - (Section 4.2.3) and do not require separate JWT Claims registration. - 12.4. ECT Policy Decision Values Registry This document establishes the "ECT Policy Decision Values" registry @@ -1952,11 +1957,6 @@ Internet-Draft WIMSE Execution Context February 2026 - - - - - Nennemann Expires 29 August 2026 [Page 35] Internet-Draft WIMSE Execution Context February 2026 @@ -2270,7 +2270,7 @@ SCITT (Supply Chain Integrity, Transparency, and Trust) both the individual execution steps (via ECT DAG validation) and the end-to-end supply chain integrity (via SCITT Receipts) using the "wid" as the shared correlation point. The "ext" claim in ECTs - (Section 4.2.6) can carry SCITT-specific metadata such as + (Section 4.2.2) can carry SCITT-specific metadata such as Transparency Service identifiers or Receipt references for tighter integration. @@ -2299,8 +2299,8 @@ Internet-Draft WIMSE Execution Context February 2026 1. Create JWTs with all required claims ("iss", "aud", "iat", "exp", - "jti", "exec_act", "par") and policy extension keys ("ext.pol", - "ext.pol_decision") when policy evaluation was performed. + "jti", "exec_act", "par") and policy claims ("pol", + "pol_decision") when policy evaluation was performed. 2. Sign ECTs with the agent's private key using an algorithm matching the WIT (ES256 recommended). @@ -2427,12 +2427,10 @@ Internet-Draft WIMSE Execution Context February 2026 "wid": "b1c2d3e4-f5a6-7890-bcde-f01234567890", "exec_act": "fetch_patient_data", "par": [], + "pol": "clinical_data_access_policy_v1", + "pol_decision": "approved", "inp_hash": "sha-256:n4bQgYhMfWWaL-qgxVrQFaO_TxsrC4Is0V1sFbDwCgg", - "out_hash": "sha-256:LCa0a2j_xo_5m0U8HTBBNBNCLXBkg7-g-YpeiGJm564", - "ext": { - "pol": "clinical_data_access_policy_v1", - "pol_decision": "approved" - } + "out_hash": "sha-256:LCa0a2j_xo_5m0U8HTBBNBNCLXBkg7-g-YpeiGJm564" } Agent B receives the ECT, verifies it, executes a validation task, @@ -2447,14 +2445,16 @@ Internet-Draft WIMSE Execution Context February 2026 "wid": "b1c2d3e4-f5a6-7890-bcde-f01234567890", "exec_act": "validate_safety", "par": ["550e8400-e29b-41d4-a716-446655440001"], - "ext": { - "pol": "safety_validation_policy_v2", - "pol_decision": "approved" - } + "pol": "safety_validation_policy_v2", + "pol_decision": "approved" } The resulting DAG: + task-...-0001 (fetch_patient_data) + | + v + task-...-0002 (validate_safety) @@ -2466,11 +2466,6 @@ Nennemann Expires 29 August 2026 [Page 44] Internet-Draft WIMSE Execution Context February 2026 - task-...-0001 (fetch_patient_data) - | - v - task-...-0002 (validate_safety) - Example 2: Medical Device SDLC with Release Approval A multi-step medical device software lifecycle workflow with @@ -2487,12 +2482,10 @@ Example 2: Medical Device SDLC with Release Approval "wid": "c2d3e4f5-a6b7-8901-cdef-012345678901", "exec_act": "review_requirements_spec", "par": [], + "pol": "spec_review_policy_v2", + "pol_decision": "approved", "inp_hash": "sha-256:n4bQgYhMfWWaL-qgxVrQFaO_TxsrC4Is0V1sFbDwCgg", - "out_hash": "sha-256:LCa0a2j_xo_5m0U8HTBBNBNCLXBkg7-g-YpeiGJm564", - "ext": { - "pol": "spec_review_policy_v2", - "pol_decision": "approved" - } + "out_hash": "sha-256:LCa0a2j_xo_5m0U8HTBBNBNCLXBkg7-g-YpeiGJm564" } Task 2 (Code Generation Agent): @@ -2506,10 +2499,8 @@ Example 2: Medical Device SDLC with Release Approval "wid": "c2d3e4f5-a6b7-8901-cdef-012345678901", "exec_act": "implement_module", "par": ["a1b2c3d4-0001-0000-0000-000000000001"], - "ext": { - "pol": "coding_standards_v3", - "pol_decision": "approved" - } + "pol": "coding_standards_v3", + "pol_decision": "approved" } Task 3 (Autonomous Test Agent): @@ -2517,6 +2508,15 @@ Example 2: Medical Device SDLC with Release Approval + + + + + + + + + Nennemann Expires 29 August 2026 [Page 45] Internet-Draft WIMSE Execution Context February 2026 @@ -2531,10 +2531,8 @@ Internet-Draft WIMSE Execution Context February 2026 "wid": "c2d3e4f5-a6b7-8901-cdef-012345678901", "exec_act": "execute_test_suite", "par": ["a1b2c3d4-0001-0000-0000-000000000002"], - "ext": { - "pol": "test_coverage_policy_v1", - "pol_decision": "approved" - } + "pol": "test_coverage_policy_v1", + "pol_decision": "approved" } Task 4 (Build Agent): @@ -2548,11 +2546,9 @@ Internet-Draft WIMSE Execution Context February 2026 "wid": "c2d3e4f5-a6b7-8901-cdef-012345678901", "exec_act": "build_release_artifact", "par": ["a1b2c3d4-0001-0000-0000-000000000003"], - "out_hash": "sha-256:Ry1YfOoW2XpC5Mq8HkGzNx3dL9vBa4sUjE7iKt0wPZc", - "ext": { - "pol": "build_validation_v2", - "pol_decision": "approved" - } + "pol": "build_validation_v2", + "pol_decision": "approved", + "out_hash": "sha-256:Ry1YfOoW2XpC5Mq8HkGzNx3dL9vBa4sUjE7iKt0wPZc" } Task 5 (Human Release Manager Approval): @@ -2572,6 +2568,10 @@ Internet-Draft WIMSE Execution Context February 2026 + + + + Nennemann Expires 29 August 2026 [Page 46] @@ -2587,10 +2587,10 @@ Internet-Draft WIMSE Execution Context February 2026 "wid": "c2d3e4f5-a6b7-8901-cdef-012345678901", "exec_act": "approve_release", "par": ["a1b2c3d4-0001-0000-0000-000000000004"], + "pol": "release_approval_policy", + "pol_decision": "approved", + "pol_enforcer": "spiffe://meddev.example/human/release-mgr-42", "ext": { - "pol": "release_approval_policy", - "pol_decision": "approved", - "pol_enforcer": "spiffe://meddev.example/human/release-mgr-42", "witnessed_by": [ "spiffe://meddev.example/audit/qa-observer-1" ] @@ -2663,10 +2663,8 @@ Example 3: Parallel Execution with Join "f1e2d3c4-0002-0000-0000-000000000002", "f1e2d3c4-0003-0000-0000-000000000003" ], - "ext": { - "pol": "trade_execution_policy_v3", - "pol_decision": "approved" - } + "pol": "trade_execution_policy_v3", + "pol_decision": "approved" } The "par" array with two entries records that both compliance @@ -2682,6 +2680,8 @@ Acknowledgments Author's Address + Christian Nennemann + Independent Researcher @@ -2690,8 +2690,6 @@ Nennemann Expires 29 August 2026 [Page 48] Internet-Draft WIMSE Execution Context February 2026 - Christian Nennemann - Independent Researcher Email: ietf@nennemann.de @@ -2738,6 +2736,8 @@ Internet-Draft WIMSE Execution Context February 2026 + + diff --git a/draft-nennemann-wimse-execution-context-00.xml b/draft-nennemann-wimse-execution-context-00.xml index 39818bd..c4695da 100644 --- a/draft-nennemann-wimse-execution-context-00.xml +++ b/draft-nennemann-wimse-execution-context-00.xml @@ -131,7 +131,7 @@ regulatory audit scenarios. The Execution Context Token (ECT) format () DAG structure for task dependency ordering () - Policy checkpoint recording via extension keys () + Policy checkpoint recording () Integration with the WIMSE identity framework () An HTTP header for ECT transport () @@ -504,28 +504,24 @@ multiple root tasks. -
      Policy Evaluation Extension Keys +
      Policy Evaluation -Policy evaluation outcomes are recorded as extension keys within -the "ext" object (). This keeps the core -registered claims focused on DAG structure and execution context, -while allowing deployments to add policy recording as needed. - -The following extension keys are defined for policy evaluation: +The following claims record policy evaluation outcomes:
      -
      "pol":
      +
      pol:
      - 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. + 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":
      +
      pol_decision:
      - String. The result of the policy evaluation. When present, -MUST be one of the values registered in the ECT Policy Decision -Values registry (). MUST be present -when "pol" is present. Initial values are: + OPTIONAL. String. The result of the policy evaluation. When +present, MUST be one of the values registered in the ECT Policy +Decision Values registry (). MUST be +present when "pol" is present. Initial values are: @@ -545,28 +541,28 @@ records an "approved" decision referencing this task as a parent. - When "pol" and "pol_decision" are absent from "ext", the ECT -records task execution without a policy checkpoint. Regulated -deployments SHOULD include policy keys on all ECTs to maintain -complete audit trails. + 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":
      +
      pol_enforcer:
      - StringOrURI. The identity of the entity (system or person) -that evaluated the policy decision. When present, SHOULD use -SPIFFE ID format. + 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" key is an opaque identifier referencing an external +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 "ext" keys defined above. +faithfully recorded in the ECT claims defined above.
      Data Integrity @@ -611,12 +607,9 @@ parent reference in the ECT store.
      ext:
      - OPTIONAL. Object. An extension object for claims beyond the -core registered claims. This specification defines several -extension keys for policy evaluation () and -operational metadata; deployments MAY also include -domain-specific keys. Implementations MUST ignore extension -keys they do not recognize. + OPTIONAL. Object. An extension object for domain-specific +claims not defined by this specification. Implementations +that do not understand extension claims MUST ignore them.
      @@ -632,22 +625,7 @@ exceeds these limits. The following extension keys are defined by this specification for common use cases. Because these keys are documented here, -they use short names without reverse domain prefixes. - -Policy evaluation keys (see for full -definitions and decision value semantics): - - - "pol": String. Policy rule identifier. - "pol_decision": String. Policy evaluation outcome -("approved", "rejected", or "pending_human_review"). - "pol_enforcer": StringOrURI. Identity of the policy -evaluator. - "pol_timestamp": NumericDate. Time at which the policy -decision was made, if distinct from "iat". - - -Operational metadata keys: +they use short names without reverse domain prefixes: "exec_time_ms": Integer. Execution duration in milliseconds. @@ -660,6 +638,8 @@ task. Note: this is self-asserted; for verifiable witness attestation, witnesses should submit independent signed ECTs. "inp_classification": String. Data sensitivity classification (e.g., "public", "confidential", "restricted"). + "pol_timestamp": NumericDate. Time at which the policy +decision was made, if distinct from "iat". "compensation_required": Boolean. Indicates whether this task is a compensation or rollback action. "compensation_reason": String. Structured reason code for the @@ -686,13 +666,14 @@ to minimize information leakage (see ). "exec_act": "recommend_treatment", "par": [], + "pol": "clinical_reasoning_policy_v2", + "pol_decision": "approved", + "pol_enforcer": "spiffe://example.com/policy/clinical-engine", + "inp_hash": "sha-256:n4bQgYhMfWWaL-qgxVrQFaO_TxsrC4Is0V1sFbDwCgg", "out_hash": "sha-256:LCa0a2j_xo_5m0U8HTBBNBNCLXBkg7-g-YpeiGJm564", "ext": { - "pol": "clinical_reasoning_policy_v2", - "pol_decision": "approved", - "pol_enforcer": "spiffe://example.com/policy/clinical-engine", "pol_timestamp": 1772064145, "exec_time_ms": 245, "regulated_domain": "medtech", @@ -782,14 +763,14 @@ ECT MUST be rejected. Acyclicity: Following the chain of parent references MUST NOT lead back to the current ECT's "jti". If a cycle is detected, the ECT MUST be rejected. - Parent Policy Decision: If any parent ECT's "ext" object -contains a "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's "ext" contains policy keys. + Parent Policy Decision: If any parent ECT contains a +"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. Trust Domain Consistency: Parent tasks SHOULD belong to the same trust domain or to a trust domain with which a federation relationship has been established. @@ -895,9 +876,9 @@ identity MUST appear in "aud". verifier's current time, to account for clock skew). Verify all required claims ("jti", "exec_act", "par") are present and well-formed. - If "ext" is present and contains "pol" or "pol_decision", -verify that both are present and that "pol_decision" is one -of "approved", "rejected", or "pending_human_review". + If "pol" or "pol_decision" is present, verify that both are +present and that "pol_decision" is one of "approved", +"rejected", or "pending_human_review". Perform DAG validation per . If all checks pass and an audit ledger is deployed, the ECT SHOULD be appended to the ledger. @@ -975,12 +956,11 @@ function verify_ect(ect_jws, verifier_id, if claim not in payload: return reject("Missing required claim: " + claim) - // Validate policy extension keys (optional, but must be paired) - ext = payload.ext or {} - if "pol" in ext or "pol_decision" in ext: - if "pol" not in ext or "pol_decision" not in ext: + // 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 ext.pol_decision not in + if payload.pol_decision not in ["approved", "rejected", "pending_human_review"]: return reject("Invalid pol_decision value") @@ -1051,34 +1031,29 @@ software used in medical devices. Agent A (Spec Reviewer): jti: task-001 par: [] exec_act: review_requirements_spec - ext.pol: spec_review_policy_v2 - ext.pol_decision: approved + pol: spec_review_policy_v2 pol_decision: approved Agent B (Code Generator): jti: task-002 par: [task-001] exec_act: implement_module - ext.pol: coding_standards_v3 - ext.pol_decision: approved + pol: coding_standards_v3 pol_decision: approved Agent C (Test Agent): jti: task-003 par: [task-002] exec_act: execute_test_suite - ext.pol: test_coverage_policy_v1 - ext.pol_decision: approved + pol: test_coverage_policy_v1 pol_decision: approved Agent D (Build Agent): jti: task-004 par: [task-003] exec_act: build_release_artifact - ext.pol: build_validation_v2 - ext.pol_decision: approved + pol: build_validation_v2 pol_decision: approved Human Release Manager: jti: task-005 par: [task-004] exec_act: approve_release - ext.pol: release_approval_policy - ext.pol_decision: approved - ext.pol_enforcer: spiffe://meddev.example/human/release-mgr-42 - ext.witnessed_by: [...] + pol: release_approval_policy pol_decision: approved + pol_enforcer: spiffe://meddev.example/human/release-mgr-42 + ext: {witnessed_by: [...]} (extension metadata) ]]> ECTs record that requirements were reviewed before implementation @@ -1148,20 +1123,17 @@ execution. Agent A (Risk Assessment): jti: task-001 par: [] exec_act: calculate_risk_exposure - ext.pol: risk_limits_policy_v2 - ext.pol_decision: approved + pol: risk_limits_policy_v2 pol_decision: approved Agent B (Compliance): jti: task-002 par: [task-001] exec_act: verify_compliance - ext.pol: compliance_check_v1 - ext.pol_decision: approved + pol: compliance_check_v1 pol_decision: approved Agent C (Execution): jti: task-003 par: [task-002] exec_act: execute_trade - ext.pol: execution_policy_v3 - ext.pol_decision: approved + pol: execution_policy_v3 pol_decision: approved ]]> This can contribute to compliance with: @@ -1191,10 +1163,10 @@ a cryptographic link to the original task: "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": { - "pol": "compensation_policy_v1", - "pol_decision": "approved", - "pol_enforcer": "spiffe://bank.example/human/compliance-officer", "compensation_required": true, "compensation_reason": "policy_violation_in_parent_trade" } @@ -1216,32 +1188,27 @@ required checks were completed: Agent A (Route Planning): jti: task-001 par: [] exec_act: plan_route - ext.pol: route_policy_v1 - ext.pol_decision: approved + pol: route_policy_v1 pol_decision: approved Agent B (Customs): jti: task-002 par: [task-001] exec_act: validate_customs - ext.pol: customs_policy_v2 - ext.pol_decision: approved + pol: customs_policy_v2 pol_decision: approved Agent C (Safety): jti: task-003 par: [task-001] exec_act: verify_cargo_safety - ext.pol: safety_policy_v1 - ext.pol_decision: approved + pol: safety_policy_v1 pol_decision: approved Agent D (Payment): jti: task-004 par: [task-002, task-003] exec_act: authorize_payment - ext.pol: payment_policy_v3 - ext.pol_decision: approved + pol: payment_policy_v3 pol_decision: approved System (Commitment): jti: task-005 par: [task-004] exec_act: commit_shipment - ext.pol: commitment_policy_v1 - ext.pol_decision: approved + pol: commitment_policy_v1 pol_decision: approved ]]> Note that tasks 002 and 003 both depend only on task-001 and can @@ -1276,8 +1243,8 @@ to alter perceived execution ordering. ECTs are self-asserted by the executing agent. The agent claims what it did, and this claim is signed with its private key. A compromised or malicious agent could create ECTs with false claims -(e.g., setting "pol_decision" in "ext" to "approved" without -actually evaluating the policy). +(e.g., setting "pol_decision" to "approved" without actually +evaluating the policy). ECTs do not independently verify that: @@ -1475,8 +1442,8 @@ serialized as JSON and SHOULD NOT exceed a nesting depth of Agent identities ("iss", "aud") for accountability purposes Action descriptions ("exec_act") for audit trail completeness - Policy evaluation outcomes (via "ext" keys "pol", -"pol_decision") when present, for compliance verification + Policy evaluation outcomes ("pol", "pol_decision") for +compliance verification Timestamps ("iat", "exp") for temporal ordering @@ -1496,8 +1463,8 @@ hashes via "inp_hash" and "out_hash") Implementations SHOULD minimize the information included in ECTs. The "exec_act" claim SHOULD use structured identifiers (e.g., "process_payment") rather than natural language descriptions. -The "pol" extension key SHOULD reference policy identifiers -rather than embedding policy content. +The "pol" claim SHOULD reference policy identifiers rather than +embedding policy content. The "compensation_reason" extension key in "ext" () deserves particular attention: because @@ -1648,6 +1615,18 @@ the "JSON Web Token Claims" registry maintained by IANA: Parent Task Identifiers IETF + pol + Policy Rule Identifier + IETF + + pol_decision + Policy Decision Result + IETF + + pol_enforcer + Policy Enforcer Identity + IETF + inp_hash Input Data Hash IETF @@ -1662,11 +1641,6 @@ the "JSON Web Token Claims" registry maintained by IANA: -Note: Policy evaluation keys ("pol", "pol_decision", -"pol_enforcer") are carried within the "ext" object as -spec-defined extension keys () and do not -require separate JWT Claims registration. -
      ECT Policy Decision Values Registry @@ -2154,7 +2128,7 @@ been incorporated into this document. This document obsoletes RFC - +
      Related Work @@ -2271,7 +2245,7 @@ registered as a SCITT Signed Statement on a Transparency Service. This enables auditors to verify both the individual execution steps (via ECT DAG validation) and the end-to-end supply chain integrity (via SCITT Receipts) using the "wid" as the shared -correlation point. The "ext" claim in ECTs () +correlation point. The "ext" claim in ECTs () can carry SCITT-specific metadata such as Transparency Service identifiers or Receipt references for tighter integration. @@ -2294,9 +2268,8 @@ use cases are distinct. Create JWTs with all required claims ("iss", "aud", "iat", -"exp", "jti", "exec_act", "par") and policy extension keys -("ext.pol", "ext.pol_decision") when policy evaluation was -performed. +"exp", "jti", "exec_act", "par") and policy claims ("pol", +"pol_decision") when policy evaluation was performed. Sign ECTs with the agent's private key using an algorithm matching the WIT (ES256 recommended). Verify ECT signatures against WIT public keys. @@ -2404,12 +2377,10 @@ Agent B: "wid": "b1c2d3e4-f5a6-7890-bcde-f01234567890", "exec_act": "fetch_patient_data", "par": [], + "pol": "clinical_data_access_policy_v1", + "pol_decision": "approved", "inp_hash": "sha-256:n4bQgYhMfWWaL-qgxVrQFaO_TxsrC4Is0V1sFbDwCgg", - "out_hash": "sha-256:LCa0a2j_xo_5m0U8HTBBNBNCLXBkg7-g-YpeiGJm564", - "ext": { - "pol": "clinical_data_access_policy_v1", - "pol_decision": "approved" - } + "out_hash": "sha-256:LCa0a2j_xo_5m0U8HTBBNBNCLXBkg7-g-YpeiGJm564" } ]]> @@ -2426,10 +2397,8 @@ task, and creates its own ECT: "wid": "b1c2d3e4-f5a6-7890-bcde-f01234567890", "exec_act": "validate_safety", "par": ["550e8400-e29b-41d4-a716-446655440001"], - "ext": { - "pol": "safety_validation_policy_v2", - "pol_decision": "approved" - } + "pol": "safety_validation_policy_v2", + "pol_decision": "approved" } ]]> @@ -2460,12 +2429,10 @@ autonomous agents and human release approval: "wid": "c2d3e4f5-a6b7-8901-cdef-012345678901", "exec_act": "review_requirements_spec", "par": [], + "pol": "spec_review_policy_v2", + "pol_decision": "approved", "inp_hash": "sha-256:n4bQgYhMfWWaL-qgxVrQFaO_TxsrC4Is0V1sFbDwCgg", - "out_hash": "sha-256:LCa0a2j_xo_5m0U8HTBBNBNCLXBkg7-g-YpeiGJm564", - "ext": { - "pol": "spec_review_policy_v2", - "pol_decision": "approved" - } + "out_hash": "sha-256:LCa0a2j_xo_5m0U8HTBBNBNCLXBkg7-g-YpeiGJm564" } ]]> @@ -2481,10 +2448,8 @@ autonomous agents and human release approval: "wid": "c2d3e4f5-a6b7-8901-cdef-012345678901", "exec_act": "implement_module", "par": ["a1b2c3d4-0001-0000-0000-000000000001"], - "ext": { - "pol": "coding_standards_v3", - "pol_decision": "approved" - } + "pol": "coding_standards_v3", + "pol_decision": "approved" } ]]> @@ -2500,10 +2465,8 @@ autonomous agents and human release approval: "wid": "c2d3e4f5-a6b7-8901-cdef-012345678901", "exec_act": "execute_test_suite", "par": ["a1b2c3d4-0001-0000-0000-000000000002"], - "ext": { - "pol": "test_coverage_policy_v1", - "pol_decision": "approved" - } + "pol": "test_coverage_policy_v1", + "pol_decision": "approved" } ]]> @@ -2519,11 +2482,9 @@ autonomous agents and human release approval: "wid": "c2d3e4f5-a6b7-8901-cdef-012345678901", "exec_act": "build_release_artifact", "par": ["a1b2c3d4-0001-0000-0000-000000000003"], - "out_hash": "sha-256:Ry1YfOoW2XpC5Mq8HkGzNx3dL9vBa4sUjE7iKt0wPZc", - "ext": { - "pol": "build_validation_v2", - "pol_decision": "approved" - } + "pol": "build_validation_v2", + "pol_decision": "approved", + "out_hash": "sha-256:Ry1YfOoW2XpC5Mq8HkGzNx3dL9vBa4sUjE7iKt0wPZc" } ]]> @@ -2539,10 +2500,10 @@ autonomous agents and human release approval: "wid": "c2d3e4f5-a6b7-8901-cdef-012345678901", "exec_act": "approve_release", "par": ["a1b2c3d4-0001-0000-0000-000000000004"], + "pol": "release_approval_policy", + "pol_decision": "approved", + "pol_enforcer": "spiffe://meddev.example/human/release-mgr-42", "ext": { - "pol": "release_approval_policy", - "pol_decision": "approved", - "pol_enforcer": "spiffe://meddev.example/human/release-mgr-42", "witnessed_by": [ "spiffe://meddev.example/audit/qa-observer-1" ] @@ -2611,10 +2572,8 @@ task-...-0004 (execute_trade) "f1e2d3c4-0002-0000-0000-000000000002", "f1e2d3c4-0003-0000-0000-000000000003" ], - "ext": { - "pol": "trade_execution_policy_v3", - "pol_decision": "approved" - } + "pol": "trade_execution_policy_v3", + "pol_decision": "approved" } ]]> @@ -2638,529 +2597,523 @@ tracing is built.