Both drafts now live in workspace/drafts/ as siblings:
drafts/
├── act/ (ACT -01, native to parent repo)
│ ├── draft-nennemann-act-01.md kramdown-rfc source
│ ├── draft-nennemann-act-01.{xml,txt,html,pdf}
│ ├── .refcache/ bibxml cache
│ └── build.sh
├── ietf-wimse-ect/ (ECT -02, submodule, PDF added)
│ └── ...
└── README-pdf.md PDF toolchain docs
ACT kramdown-rfc conversion:
- full YAML frontmatter (title, author, refs)
- section structure matches kramdown-rfc conventions
- {{REF}} citation syntax, auto-numbered sections
- references auto-built from normative/informative blocks
- removed manual TOC (kramdown-rfc generates)
- builds cleanly: 133K XML, 89K TXT, 208K HTML, 167K PDF
PDF toolchain:
- xml2rfc --pdf via weasyprint<60 + pydyf<0.10 injected into xml2rfc pipx venv
- both build.sh scripts now produce PDF as Step 4
- README-pdf.md documents the setup for new machines
Submodule: bump ietf-wimse-ect pointer for build.sh PDF step
3980 lines
203 KiB
HTML
3980 lines
203 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="en" class="Internet-Draft">
|
||
<head>
|
||
<meta charset="utf-8">
|
||
<meta content="Common,Latin" name="scripts">
|
||
<meta content="initial-scale=1.0" name="viewport">
|
||
<title>Agent Context Token (ACT)</title>
|
||
<meta content="Christian Nennemann" name="author">
|
||
<meta content="
|
||
This document defines the Agent Context Token (ACT), a self-contained
|
||
JWT-based format that captures the full invocation context of an
|
||
autonomous AI agent — its capabilities, constraints, delegation
|
||
provenance, oversight requirements, task metadata, and DAG position —
|
||
and unifies authorization and execution accountability in a single
|
||
token lifecycle. An ACT begins as a signed authorization mandate and
|
||
transitions into a tamper-evident execution record once the agent
|
||
completes its task, appending cryptographic hashes of inputs and
|
||
outputs and linking to predecessor tasks via a directed acyclic graph
|
||
(DAG). ACT requires no Authorization Server, no workload identity
|
||
infrastructure, and no transparency service for basic operation. Trust
|
||
is bootstrapped via pre-shared keys and is upgradeable to PKI or
|
||
Decentralized Identifiers (DIDs). ACT is designed for
|
||
cross-organizational agent federation in regulated and unregulated
|
||
environments alike. ACT is the general-purpose agent context
|
||
primitive; the WIMSE Execution Context Token (ECT)
|
||
is a sibling profile specialized for
|
||
workload-identity-bound execution recording in WIMSE deployments.
|
||
" name="description">
|
||
<meta content="xml2rfc 3.31.0" name="generator">
|
||
<meta content="agent authorization" name="keyword">
|
||
<meta content="execution accountability" name="keyword">
|
||
<meta content="JWT" name="keyword">
|
||
<meta content="DAG" name="keyword">
|
||
<meta content="delegation" name="keyword">
|
||
<meta content="draft-nennemann-act-01" name="ietf.draft">
|
||
<!-- Generator version information:
|
||
xml2rfc 3.31.0
|
||
Python 3.14.3
|
||
ConfigArgParse 1.7.1
|
||
google-i18n-address 3.1.1
|
||
intervaltree 3.2.1
|
||
Jinja2 3.1.6
|
||
lxml 6.0.2
|
||
platformdirs 4.9.2
|
||
pycountry 26.2.16
|
||
PyYAML 6.0.3
|
||
requests 2.32.5
|
||
wcwidth 0.6.0
|
||
weasyprint 59.0
|
||
-->
|
||
<link href="draft-nennemann-act-01.xml" rel="alternate" type="application/rfc+xml">
|
||
<link href="#copyright" rel="license">
|
||
<style type="text/css">/*
|
||
|
||
NOTE: Changes at the bottom of this file overrides some earlier settings.
|
||
|
||
Once the style has stabilized and has been adopted as an official RFC style,
|
||
this can be consolidated so that style settings occur only in one place, but
|
||
for now the contents of this file consists first of the initial CSS work as
|
||
provided to the RFC Formatter (xml2rfc) work, followed by itemized and
|
||
commented changes found necessary during the development of the v3
|
||
formatters.
|
||
|
||
*/
|
||
|
||
/* fonts */
|
||
@import url('https://static.ietf.org/fonts/noto-sans/import.css'); /* Sans-serif */
|
||
@import url('https://static.ietf.org/fonts/noto-serif/import.css'); /* Serif (print) */
|
||
@import url('https://static.ietf.org/fonts/roboto-mono/import.css'); /* Monospace */
|
||
|
||
:root {
|
||
--font-sans: 'Noto Sans', Arial, Helvetica, sans-serif;
|
||
--font-serif: 'Noto Serif', 'Times', 'Times New Roman', serif;
|
||
--font-mono: 'Roboto Mono', Courier, 'Courier New', monospace;
|
||
}
|
||
|
||
@viewport {
|
||
zoom: 1.0;
|
||
}
|
||
@-ms-viewport {
|
||
width: extend-to-zoom;
|
||
zoom: 1.0;
|
||
}
|
||
/* general and mobile first */
|
||
html {
|
||
}
|
||
body {
|
||
max-width: 90%;
|
||
margin: 1.5em auto;
|
||
color: #222;
|
||
background-color: #fff;
|
||
font-size: 14px;
|
||
font-family: var(--font-sans);
|
||
line-height: 1.6;
|
||
scroll-behavior: smooth;
|
||
overflow-wrap: break-word;
|
||
}
|
||
.ears {
|
||
display: none;
|
||
}
|
||
|
||
/* headings */
|
||
#title, h1, h2, h3, h4, h5, h6 {
|
||
margin: 1em 0 0.5em;
|
||
font-weight: bold;
|
||
line-height: 1.3;
|
||
}
|
||
#title {
|
||
clear: both;
|
||
border-bottom: 1px solid #ddd;
|
||
margin: 0 0 0.5em 0;
|
||
padding: 1em 0 0.5em;
|
||
}
|
||
.author {
|
||
padding-bottom: 4px;
|
||
}
|
||
h1 {
|
||
font-size: 26px;
|
||
margin: 1em 0;
|
||
}
|
||
h2 {
|
||
font-size: 22px;
|
||
margin-top: -20px; /* provide offset for in-page anchors */
|
||
padding-top: 33px;
|
||
}
|
||
h3 {
|
||
font-size: 18px;
|
||
margin-top: -36px; /* provide offset for in-page anchors */
|
||
padding-top: 42px;
|
||
}
|
||
h4 {
|
||
font-size: 16px;
|
||
margin-top: -36px; /* provide offset for in-page anchors */
|
||
padding-top: 42px;
|
||
}
|
||
h5, h6 {
|
||
font-size: 14px;
|
||
}
|
||
#n-copyright-notice {
|
||
border-bottom: 1px solid #ddd;
|
||
padding-bottom: 1em;
|
||
margin-bottom: 1em;
|
||
}
|
||
/* general structure */
|
||
p {
|
||
padding: 0;
|
||
margin: 0 0 1em 0;
|
||
text-align: left;
|
||
}
|
||
div, span {
|
||
position: relative;
|
||
}
|
||
div {
|
||
margin: 0;
|
||
}
|
||
.alignRight.art-text {
|
||
background-color: #f9f9f9;
|
||
border: 1px solid #eee;
|
||
border-radius: 3px;
|
||
padding: 1em 1em 0;
|
||
margin-bottom: 1.5em;
|
||
}
|
||
.alignRight.art-text pre {
|
||
padding: 0;
|
||
}
|
||
.alignRight {
|
||
margin: 1em 0;
|
||
}
|
||
.alignRight > *:first-child {
|
||
border: none;
|
||
margin: 0;
|
||
float: right;
|
||
clear: both;
|
||
}
|
||
.alignRight > *:nth-child(2) {
|
||
clear: both;
|
||
display: block;
|
||
border: none;
|
||
}
|
||
svg {
|
||
display: block;
|
||
}
|
||
@media print {
|
||
svg {
|
||
max-height: 850px;
|
||
max-width: 660px;
|
||
}
|
||
}
|
||
svg[font-family~="serif" i], svg [font-family~="serif" i] {
|
||
font-family: var(--font-serif);
|
||
}
|
||
svg[font-family~="sans-serif" i], svg [font-family~="sans-serif" i] {
|
||
font-family: var(--font-sans);
|
||
}
|
||
svg[font-family~="monospace" i], svg [font-family~="monospace" i] {
|
||
font-family: var(--font-mono);
|
||
}
|
||
.alignCenter.art-text {
|
||
background-color: #f9f9f9;
|
||
border: 1px solid #eee;
|
||
border-radius: 3px;
|
||
padding: 1em 1em 0;
|
||
margin-bottom: 1.5em;
|
||
}
|
||
.alignCenter.art-text pre {
|
||
padding: 0;
|
||
}
|
||
.alignCenter {
|
||
margin: 1em 0;
|
||
}
|
||
.alignCenter > *:first-child {
|
||
display: table;
|
||
border: none;
|
||
margin: 0 auto;
|
||
}
|
||
|
||
/* lists */
|
||
ol, ul {
|
||
padding: 0;
|
||
margin: 0 0 1em 2em;
|
||
}
|
||
ol ol, ul ul, ol ul, ul ol {
|
||
margin-left: 1em;
|
||
}
|
||
li {
|
||
margin: 0 0 0.25em 0;
|
||
}
|
||
.ulCompact li {
|
||
margin: 0;
|
||
}
|
||
ul.empty, .ulEmpty {
|
||
list-style-type: none;
|
||
}
|
||
ul.empty li, .ulEmpty li {
|
||
margin-top: 0.5em;
|
||
}
|
||
ul.ulBare, li.ulBare {
|
||
margin-left: 0em !important;
|
||
}
|
||
ul.compact, .ulCompact,
|
||
ol.compact, .olCompact {
|
||
line-height: 100%;
|
||
margin: 0 0 0 2em;
|
||
}
|
||
|
||
/* definition lists */
|
||
dl {
|
||
}
|
||
dl > dt {
|
||
float: left;
|
||
margin-right: 1em;
|
||
}
|
||
/*
|
||
dl.nohang > dt {
|
||
float: none;
|
||
}
|
||
*/
|
||
dl > dd {
|
||
margin-bottom: .8em;
|
||
min-height: 1.3em;
|
||
}
|
||
dl.compact > dd, .dlCompact > dd {
|
||
margin-bottom: 0em;
|
||
}
|
||
dl > dd > dl {
|
||
margin-top: 0.5em;
|
||
margin-bottom: 0em;
|
||
}
|
||
|
||
/* links */
|
||
a {
|
||
text-decoration: none;
|
||
}
|
||
a[href] {
|
||
color: #22e; /* Arlen: WCAG 2019 */
|
||
}
|
||
a[href]:hover {
|
||
background-color: #f2f2f2;
|
||
}
|
||
figcaption a[href],
|
||
a[href].selfRef {
|
||
color: #222;
|
||
}
|
||
/* XXX probably not this:
|
||
a.selfRef:hover {
|
||
background-color: transparent;
|
||
cursor: default;
|
||
} */
|
||
|
||
/* Figures */
|
||
tt, code, pre {
|
||
background-color: #f9f9f9;
|
||
font-family: var(--font-mono);
|
||
}
|
||
pre {
|
||
border: 1px solid #eee;
|
||
margin: 0;
|
||
padding: 1em;
|
||
}
|
||
img {
|
||
max-width: 100%;
|
||
}
|
||
figure {
|
||
margin: 0;
|
||
}
|
||
figure blockquote {
|
||
margin: 0.8em 0.4em 0.4em;
|
||
}
|
||
figcaption {
|
||
font-style: italic;
|
||
margin: 0 0 1em 0;
|
||
}
|
||
@media screen {
|
||
pre {
|
||
overflow-x: auto;
|
||
max-width: 100%;
|
||
max-width: calc(100% - 22px);
|
||
}
|
||
}
|
||
|
||
/* aside, blockquote */
|
||
aside, blockquote {
|
||
margin-left: 0;
|
||
padding: 1.2em 2em;
|
||
}
|
||
blockquote {
|
||
background-color: #f9f9f9;
|
||
color: #111; /* Arlen: WCAG 2019 */
|
||
border: 1px solid #ddd;
|
||
border-radius: 3px;
|
||
margin: 1em 0;
|
||
}
|
||
blockquote > *:last-child {
|
||
margin-bottom: 0;
|
||
}
|
||
cite {
|
||
display: block;
|
||
text-align: right;
|
||
font-style: italic;
|
||
}
|
||
.xref {
|
||
overflow-wrap: normal;
|
||
}
|
||
|
||
/* tables */
|
||
table {
|
||
width: 100%;
|
||
margin: 0 0 1em;
|
||
border-collapse: collapse;
|
||
border: 1px solid #eee;
|
||
}
|
||
th, td {
|
||
text-align: left;
|
||
vertical-align: top;
|
||
padding: 0.5em 0.75em;
|
||
}
|
||
th {
|
||
text-align: left;
|
||
background-color: #e9e9e9;
|
||
}
|
||
tr:nth-child(2n+1) > td {
|
||
background-color: #f5f5f5;
|
||
}
|
||
table caption {
|
||
font-style: italic;
|
||
margin: 0;
|
||
padding: 0;
|
||
text-align: left;
|
||
}
|
||
table p {
|
||
/* XXX to avoid bottom margin on table row signifiers. If paragraphs should
|
||
be allowed within tables more generally, it would be far better to select on a class. */
|
||
margin: 0;
|
||
}
|
||
|
||
/* pilcrow */
|
||
a.pilcrow {
|
||
color: #666; /* Arlen: AHDJ 2019 */
|
||
text-decoration: none;
|
||
visibility: hidden;
|
||
user-select: none;
|
||
-ms-user-select: none;
|
||
-o-user-select:none;
|
||
-moz-user-select: none;
|
||
-khtml-user-select: none;
|
||
-webkit-user-select: none;
|
||
-webkit-touch-callout: none;
|
||
}
|
||
@media screen {
|
||
aside:hover > a.pilcrow,
|
||
p:hover > a.pilcrow,
|
||
blockquote:hover > a.pilcrow,
|
||
div:hover > a.pilcrow,
|
||
li:hover > a.pilcrow,
|
||
pre:hover > a.pilcrow {
|
||
visibility: visible;
|
||
}
|
||
a.pilcrow:hover {
|
||
background-color: transparent;
|
||
}
|
||
}
|
||
|
||
/* misc */
|
||
hr {
|
||
border: 0;
|
||
border-top: 1px solid #eee;
|
||
}
|
||
.bcp14 {
|
||
font-variant: small-caps;
|
||
}
|
||
|
||
.role {
|
||
font-variant: all-small-caps;
|
||
}
|
||
|
||
/* info block */
|
||
#identifiers {
|
||
margin: 0;
|
||
font-size: 0.9em;
|
||
}
|
||
#identifiers dt {
|
||
width: 3em;
|
||
clear: left;
|
||
}
|
||
#identifiers dd {
|
||
float: left;
|
||
margin-bottom: 0;
|
||
}
|
||
/* Fix PDF info block run off issue */
|
||
@media print {
|
||
#identifiers dd {
|
||
max-width: 100%;
|
||
}
|
||
}
|
||
#identifiers .authors .author {
|
||
display: inline-block;
|
||
margin-right: 1.5em;
|
||
}
|
||
#identifiers .authors .org {
|
||
font-style: italic;
|
||
}
|
||
|
||
/* The prepared/rendered info at the very bottom of the page */
|
||
.docInfo {
|
||
color: #666; /* Arlen: WCAG 2019 */
|
||
font-size: 0.9em;
|
||
font-style: italic;
|
||
margin-top: 2em;
|
||
}
|
||
.docInfo .prepared {
|
||
float: left;
|
||
}
|
||
.docInfo .prepared {
|
||
float: right;
|
||
}
|
||
|
||
/* table of contents */
|
||
#toc {
|
||
padding: 0.75em 0 2em 0;
|
||
margin-bottom: 1em;
|
||
}
|
||
nav.toc ul {
|
||
margin: 0 0.5em 0 0;
|
||
padding: 0;
|
||
list-style: none;
|
||
}
|
||
nav.toc li {
|
||
line-height: 1.3em;
|
||
margin: 0.75em 0;
|
||
padding-left: 1.2em;
|
||
text-indent: -1.2em;
|
||
}
|
||
/* references */
|
||
.references dt {
|
||
text-align: right;
|
||
font-weight: bold;
|
||
min-width: 7em;
|
||
}
|
||
.references dd {
|
||
margin-left: 8em;
|
||
overflow: auto;
|
||
}
|
||
|
||
.refInstance {
|
||
margin-bottom: 1.25em;
|
||
}
|
||
|
||
.refSubseries {
|
||
margin-bottom: 1.25em;
|
||
}
|
||
|
||
.references .ascii {
|
||
margin-bottom: 0.25em;
|
||
}
|
||
|
||
/* index */
|
||
.index ul {
|
||
margin: 0 0 0 1em;
|
||
padding: 0;
|
||
list-style: none;
|
||
}
|
||
.index ul ul {
|
||
margin: 0;
|
||
}
|
||
.index li {
|
||
margin: 0;
|
||
text-indent: -2em;
|
||
padding-left: 2em;
|
||
padding-bottom: 5px;
|
||
}
|
||
.indexIndex {
|
||
margin: 0.5em 0 1em;
|
||
}
|
||
.index a {
|
||
font-weight: 700;
|
||
}
|
||
/* make the index two-column on all but the smallest screens */
|
||
@media (min-width: 600px) {
|
||
.index ul {
|
||
-moz-column-count: 2;
|
||
-moz-column-gap: 20px;
|
||
}
|
||
.index ul ul {
|
||
-moz-column-count: 1;
|
||
-moz-column-gap: 0;
|
||
}
|
||
}
|
||
|
||
/* authors */
|
||
address.vcard {
|
||
font-style: normal;
|
||
margin: 1em 0;
|
||
}
|
||
|
||
address.vcard .nameRole {
|
||
font-weight: 700;
|
||
margin-left: 0;
|
||
}
|
||
address.vcard .label {
|
||
font-family: var(--font-sans);
|
||
margin: 0.5em 0;
|
||
}
|
||
address.vcard .type {
|
||
display: none;
|
||
}
|
||
.alternative-contact {
|
||
margin: 1.5em 0 1em;
|
||
}
|
||
hr.addr {
|
||
border-top: 1px dashed;
|
||
margin: 0;
|
||
color: #ddd;
|
||
max-width: calc(100% - 16px);
|
||
}
|
||
|
||
/* temporary notes */
|
||
.rfcEditorRemove::before {
|
||
position: absolute;
|
||
top: 0.2em;
|
||
right: 0.2em;
|
||
padding: 0.2em;
|
||
content: "The RFC Editor will remove this note";
|
||
color: #9e2a00; /* Arlen: WCAG 2019 */
|
||
background-color: #ffd; /* Arlen: WCAG 2019 */
|
||
}
|
||
.rfcEditorRemove {
|
||
position: relative;
|
||
padding-top: 1.8em;
|
||
background-color: #ffd; /* Arlen: WCAG 2019 */
|
||
border-radius: 3px;
|
||
}
|
||
.cref {
|
||
background-color: #ffd; /* Arlen: WCAG 2019 */
|
||
padding: 2px 4px;
|
||
}
|
||
.crefSource {
|
||
font-style: italic;
|
||
}
|
||
/* alternative layout for smaller screens */
|
||
@media screen and (max-width: 1023px) {
|
||
body {
|
||
padding-top: 2em;
|
||
}
|
||
#title {
|
||
padding: 1em 0;
|
||
}
|
||
h1 {
|
||
font-size: 24px;
|
||
}
|
||
h2 {
|
||
font-size: 20px;
|
||
margin-top: -18px; /* provide offset for in-page anchors */
|
||
padding-top: 38px;
|
||
}
|
||
#identifiers dd {
|
||
max-width: 60%;
|
||
}
|
||
#toc {
|
||
position: fixed;
|
||
z-index: 2;
|
||
top: 0;
|
||
right: 0;
|
||
padding: 0;
|
||
margin: 0;
|
||
background-color: inherit;
|
||
border-bottom: 1px solid #ccc;
|
||
}
|
||
#toc h2 {
|
||
margin: -1px 0 0 0;
|
||
padding: 4px 0 4px 6px;
|
||
padding-right: 1em;
|
||
min-width: 190px;
|
||
font-size: 1.1em;
|
||
text-align: right;
|
||
background-color: #444;
|
||
color: white;
|
||
cursor: pointer;
|
||
}
|
||
#toc h2::before { /* css hamburger */
|
||
float: right;
|
||
position: relative;
|
||
width: 1em;
|
||
height: 1px;
|
||
left: -164px;
|
||
margin: 6px 0 0 0;
|
||
background: white none repeat scroll 0 0;
|
||
box-shadow: 0 4px 0 0 white, 0 8px 0 0 white;
|
||
content: "";
|
||
}
|
||
#toc nav {
|
||
display: none;
|
||
padding: 0.5em 1em 1em;
|
||
overflow: auto;
|
||
height: calc(100vh - 48px);
|
||
border-left: 1px solid #ddd;
|
||
}
|
||
}
|
||
|
||
/* alternative layout for wide screens */
|
||
@media screen and (min-width: 1024px) {
|
||
body {
|
||
max-width: 724px;
|
||
margin: 42px auto;
|
||
padding-left: 1.5em;
|
||
padding-right: 29em;
|
||
}
|
||
#toc {
|
||
position: fixed;
|
||
top: 42px;
|
||
right: 42px;
|
||
width: 25%;
|
||
margin: 0;
|
||
padding: 0 1em;
|
||
z-index: 1;
|
||
}
|
||
#toc h2 {
|
||
border-top: none;
|
||
border-bottom: 1px solid #ddd;
|
||
font-size: 1em;
|
||
font-weight: normal;
|
||
margin: 0;
|
||
padding: 0.25em 1em 1em 0;
|
||
}
|
||
#toc nav {
|
||
display: block;
|
||
height: calc(90vh - 84px);
|
||
bottom: 0;
|
||
padding: 0.5em 0 0;
|
||
overflow: auto;
|
||
}
|
||
img { /* future proofing */
|
||
max-width: 100%;
|
||
height: auto;
|
||
}
|
||
}
|
||
|
||
/* pagination */
|
||
@media print {
|
||
body {
|
||
width: 100%;
|
||
}
|
||
p {
|
||
orphans: 3;
|
||
widows: 3;
|
||
}
|
||
#n-copyright-notice {
|
||
border-bottom: none;
|
||
}
|
||
#toc, #n-introduction {
|
||
page-break-before: always;
|
||
}
|
||
#toc {
|
||
border-top: none;
|
||
padding-top: 0;
|
||
}
|
||
figure, pre {
|
||
page-break-inside: avoid;
|
||
}
|
||
figure {
|
||
overflow: scroll;
|
||
}
|
||
.breakable pre {
|
||
break-inside: auto;
|
||
}
|
||
h1, h2, h3, h4, h5, h6 {
|
||
page-break-after: avoid;
|
||
}
|
||
h2+*, h3+*, h4+*, h5+*, h6+* {
|
||
page-break-before: avoid;
|
||
}
|
||
pre {
|
||
white-space: pre-wrap;
|
||
word-wrap: break-word;
|
||
font-size: 10pt;
|
||
}
|
||
table {
|
||
border: 1px solid #ddd;
|
||
}
|
||
td {
|
||
border-top: 1px solid #ddd;
|
||
}
|
||
}
|
||
|
||
/* This is commented out here, as the string-set: doesn't
|
||
pass W3C validation currently */
|
||
/*
|
||
.ears thead .left {
|
||
string-set: ears-top-left content();
|
||
}
|
||
|
||
.ears thead .center {
|
||
string-set: ears-top-center content();
|
||
}
|
||
|
||
.ears thead .right {
|
||
string-set: ears-top-right content();
|
||
}
|
||
|
||
.ears tfoot .left {
|
||
string-set: ears-bottom-left content();
|
||
}
|
||
|
||
.ears tfoot .center {
|
||
string-set: ears-bottom-center content();
|
||
}
|
||
|
||
.ears tfoot .right {
|
||
string-set: ears-bottom-right content();
|
||
}
|
||
*/
|
||
|
||
@page :first {
|
||
padding-top: 0;
|
||
@top-left {
|
||
content: normal;
|
||
border: none;
|
||
}
|
||
@top-center {
|
||
content: normal;
|
||
border: none;
|
||
}
|
||
@top-right {
|
||
content: normal;
|
||
border: none;
|
||
}
|
||
}
|
||
|
||
@page {
|
||
size: A4;
|
||
margin-bottom: 45mm;
|
||
padding-top: 20px;
|
||
/* The following is commented out here, but set appropriately by in code, as
|
||
the content depends on the document */
|
||
/*
|
||
@top-left {
|
||
content: 'Internet-Draft';
|
||
vertical-align: bottom;
|
||
border-bottom: solid 1px #ccc;
|
||
}
|
||
@top-left {
|
||
content: string(ears-top-left);
|
||
vertical-align: bottom;
|
||
border-bottom: solid 1px #ccc;
|
||
}
|
||
@top-center {
|
||
content: string(ears-top-center);
|
||
vertical-align: bottom;
|
||
border-bottom: solid 1px #ccc;
|
||
}
|
||
@top-right {
|
||
content: string(ears-top-right);
|
||
vertical-align: bottom;
|
||
border-bottom: solid 1px #ccc;
|
||
}
|
||
@bottom-left {
|
||
content: string(ears-bottom-left);
|
||
vertical-align: top;
|
||
border-top: solid 1px #ccc;
|
||
}
|
||
@bottom-center {
|
||
content: string(ears-bottom-center);
|
||
vertical-align: top;
|
||
border-top: solid 1px #ccc;
|
||
}
|
||
@bottom-right {
|
||
content: '[Page ' counter(page) ']';
|
||
vertical-align: top;
|
||
border-top: solid 1px #ccc;
|
||
}
|
||
*/
|
||
|
||
}
|
||
|
||
/* Changes introduced to fix issues found during implementation */
|
||
/* Make sure links are clickable even if overlapped by following H* */
|
||
a {
|
||
z-index: 2;
|
||
}
|
||
/* Separate body from document info even without intervening H1 */
|
||
section {
|
||
clear: both;
|
||
}
|
||
|
||
|
||
/* Top align author divs, to avoid names without organization dropping level with org names */
|
||
.author {
|
||
vertical-align: top;
|
||
}
|
||
|
||
/* Leave room in document info to show Internet-Draft on one line */
|
||
#identifiers dt {
|
||
width: 8em;
|
||
}
|
||
|
||
/* Don't waste quite as much whitespace between label and value in doc info */
|
||
#identifiers dd {
|
||
margin-left: 1em;
|
||
}
|
||
|
||
/* Give floating toc a background color (needed when it's a div inside section */
|
||
#toc {
|
||
background-color: white;
|
||
}
|
||
|
||
/* Make the collapsed ToC header render white on gray also when it's a link */
|
||
@media screen and (max-width: 1023px) {
|
||
#toc h2 a,
|
||
#toc h2 a:link,
|
||
#toc h2 a:focus,
|
||
#toc h2 a:hover,
|
||
#toc a.toplink,
|
||
#toc a.toplink:hover {
|
||
color: white;
|
||
background-color: #444;
|
||
text-decoration: none;
|
||
}
|
||
}
|
||
|
||
/* Give the bottom of the ToC some whitespace */
|
||
@media screen and (min-width: 1024px) {
|
||
#toc {
|
||
padding: 0 0 1em 1em;
|
||
}
|
||
}
|
||
|
||
/* Style section numbers with more space between number and title */
|
||
.section-number {
|
||
padding-right: 0.5em;
|
||
}
|
||
|
||
/* prevent monospace from becoming overly large */
|
||
tt, code, pre {
|
||
font-size: 95%;
|
||
}
|
||
|
||
/* Fix the height/width aspect for ascii art*/
|
||
.sourcecode pre,
|
||
.art-text pre {
|
||
line-height: 1.12;
|
||
}
|
||
|
||
|
||
/* Add styling for a link in the ToC that points to the top of the document */
|
||
a.toplink {
|
||
float: right;
|
||
margin-right: 0.5em;
|
||
}
|
||
|
||
/* Fix the dl styling to match the RFC 7992 attributes */
|
||
dl > dt,
|
||
dl.dlParallel > dt {
|
||
float: left;
|
||
margin-right: 1em;
|
||
}
|
||
dl.dlNewline > dt {
|
||
float: none;
|
||
}
|
||
|
||
/* Provide styling for table cell text alignment */
|
||
table td.text-left,
|
||
table th.text-left {
|
||
text-align: left;
|
||
}
|
||
table td.text-center,
|
||
table th.text-center {
|
||
text-align: center;
|
||
}
|
||
table td.text-right,
|
||
table th.text-right {
|
||
text-align: right;
|
||
}
|
||
|
||
/* Make the alternative author contact information look less like just another
|
||
author, and group it closer with the primary author contact information */
|
||
.alternative-contact {
|
||
margin: 0.5em 0 0.25em 0;
|
||
}
|
||
address .non-ascii {
|
||
margin: 0 0 0 2em;
|
||
}
|
||
|
||
/* With it being possible to set tables with alignment
|
||
left, center, and right, { width: 100%; } does not make sense */
|
||
table {
|
||
width: auto;
|
||
}
|
||
|
||
/* Avoid reference text that sits in a block with very wide left margin,
|
||
because of a long floating dt label.*/
|
||
.references dd {
|
||
overflow: visible;
|
||
}
|
||
|
||
/* Control caption placement */
|
||
caption {
|
||
caption-side: bottom;
|
||
}
|
||
|
||
/* Limit the width of the author address vcard, so names in right-to-left
|
||
script don't end up on the other side of the page. */
|
||
|
||
address.vcard {
|
||
max-width: 30em;
|
||
margin-right: auto;
|
||
}
|
||
|
||
/* For address alignment dependent on LTR or RTL scripts */
|
||
address div.left {
|
||
text-align: left;
|
||
}
|
||
address div.right {
|
||
text-align: right;
|
||
}
|
||
|
||
/* Provide table alignment support. We can't use the alignX classes above
|
||
since they do unwanted things with caption and other styling. */
|
||
table.right {
|
||
margin-left: auto;
|
||
margin-right: 0;
|
||
}
|
||
table.center {
|
||
margin-left: auto;
|
||
margin-right: auto;
|
||
}
|
||
table.left {
|
||
margin-left: 0;
|
||
margin-right: auto;
|
||
}
|
||
|
||
/* Give the table caption label the same styling as the figcaption */
|
||
caption a[href] {
|
||
color: #222;
|
||
}
|
||
|
||
@media print {
|
||
.toplink {
|
||
display: none;
|
||
}
|
||
|
||
/* avoid overwriting the top border line with the ToC header */
|
||
#toc {
|
||
padding-top: 1px;
|
||
}
|
||
|
||
/* Avoid page breaks inside dl and author address entries */
|
||
.vcard {
|
||
page-break-inside: avoid;
|
||
}
|
||
|
||
}
|
||
/* Tweak the bcp14 keyword presentation */
|
||
.bcp14 {
|
||
font-variant: small-caps;
|
||
font-weight: bold;
|
||
font-size: 0.9em;
|
||
}
|
||
/* Tweak the invisible space above H* in order not to overlay links in text above */
|
||
h2 {
|
||
margin-top: -18px; /* provide offset for in-page anchors */
|
||
padding-top: 31px;
|
||
}
|
||
h3 {
|
||
margin-top: -18px; /* provide offset for in-page anchors */
|
||
padding-top: 24px;
|
||
}
|
||
h4 {
|
||
margin-top: -18px; /* provide offset for in-page anchors */
|
||
padding-top: 24px;
|
||
}
|
||
/* Float artwork pilcrow to the right */
|
||
@media screen {
|
||
.artwork a.pilcrow {
|
||
display: block;
|
||
line-height: 0.7;
|
||
margin-top: 0.15em;
|
||
}
|
||
}
|
||
/* Make pilcrows on dd visible */
|
||
@media screen {
|
||
dd:hover > a.pilcrow {
|
||
visibility: visible;
|
||
}
|
||
}
|
||
/* Make the placement of figcaption match that of a table's caption
|
||
by removing the figure's added bottom margin */
|
||
.alignLeft.art-text,
|
||
.alignCenter.art-text,
|
||
.alignRight.art-text {
|
||
margin-bottom: 0;
|
||
}
|
||
.alignLeft,
|
||
.alignCenter,
|
||
.alignRight {
|
||
margin: 1em 0 0 0;
|
||
}
|
||
/* In print, the pilcrow won't show on hover, so prevent it from taking up space,
|
||
possibly even requiring a new line */
|
||
@media print {
|
||
a.pilcrow {
|
||
display: none;
|
||
}
|
||
}
|
||
/* Styling for the external metadata */
|
||
div#external-metadata {
|
||
background-color: #eee;
|
||
padding: 0.5em;
|
||
margin-bottom: 0.5em;
|
||
display: none;
|
||
}
|
||
div#internal-metadata {
|
||
padding: 0.5em; /* to match the external-metadata padding */
|
||
}
|
||
/* Styling for title RFC Number */
|
||
h1#rfcnum {
|
||
clear: both;
|
||
margin: 0 0 -1em;
|
||
padding: 1em 0 0 0;
|
||
}
|
||
/* Make .olPercent look the same as <ol><li> */
|
||
dl.olPercent > dd {
|
||
margin-bottom: 0.25em;
|
||
min-height: initial;
|
||
}
|
||
/* Give aside some styling to set it apart */
|
||
aside {
|
||
border-left: 1px solid #ddd;
|
||
margin: 1em 0 1em 2em;
|
||
padding: 0.2em 2em;
|
||
}
|
||
aside > dl,
|
||
aside > ol,
|
||
aside > ul,
|
||
aside > table,
|
||
aside > p {
|
||
margin-bottom: 0.5em;
|
||
}
|
||
/* Additional page break settings */
|
||
@media print {
|
||
figcaption, table caption {
|
||
page-break-before: avoid;
|
||
}
|
||
}
|
||
/* Font size adjustments for print */
|
||
@media print {
|
||
body { font-size: 10pt; line-height: normal; max-width: 96%; }
|
||
h1 { font-size: 1.72em; padding-top: 1.5em; } /* 1*1.2*1.2*1.2 */
|
||
h2 { font-size: 1.44em; padding-top: 1.5em; } /* 1*1.2*1.2 */
|
||
h3 { font-size: 1.2em; padding-top: 1.5em; } /* 1*1.2 */
|
||
h4 { font-size: 1em; padding-top: 1.5em; }
|
||
h5, h6 { font-size: 1em; margin: initial; padding: 0.5em 0 0.3em; }
|
||
}
|
||
/* Sourcecode margin in print, when there's no pilcrow */
|
||
@media print {
|
||
.artwork,
|
||
.artwork > pre,
|
||
.sourcecode {
|
||
margin-bottom: 1em;
|
||
}
|
||
}
|
||
/* Avoid narrow tables forcing too narrow table captions, which may render badly */
|
||
table {
|
||
min-width: 20em;
|
||
}
|
||
/* ol type a */
|
||
ol.type-a { list-style-type: lower-alpha; }
|
||
ol.type-A { list-style-type: upper-alpha; }
|
||
ol.type-i { list-style-type: lower-roman; }
|
||
ol.type-I { list-style-type: upper-roman; }
|
||
/* Apply the print table and row borders in general, on request from the RPC,
|
||
and increase the contrast between border and odd row background slightly */
|
||
table {
|
||
border: 1px solid #ddd;
|
||
}
|
||
td {
|
||
border-top: 1px solid #ddd;
|
||
}
|
||
tr {
|
||
break-inside: avoid;
|
||
}
|
||
tr:nth-child(2n+1) > td {
|
||
background-color: #f8f8f8;
|
||
}
|
||
/* Use style rules to govern display of the TOC. */
|
||
@media screen and (max-width: 1023px) {
|
||
#toc nav { display: none; }
|
||
#toc.active nav { display: block; }
|
||
}
|
||
/* Add support for keepWithNext */
|
||
.keepWithNext {
|
||
break-after: avoid-page;
|
||
break-after: avoid-page;
|
||
}
|
||
/* Add support for keepWithPrevious */
|
||
.keepWithPrevious {
|
||
break-before: avoid-page;
|
||
}
|
||
/* Change the approach to avoiding breaks inside artwork etc. */
|
||
figure, pre, table, .artwork, .sourcecode {
|
||
break-before: auto;
|
||
break-after: auto;
|
||
}
|
||
/* Avoid breaks between <dt> and <dd> */
|
||
dl {
|
||
break-before: auto;
|
||
break-inside: auto;
|
||
}
|
||
dt {
|
||
break-before: auto;
|
||
break-after: avoid-page;
|
||
}
|
||
dd {
|
||
break-before: avoid-page;
|
||
break-after: auto;
|
||
orphans: 3;
|
||
widows: 3
|
||
}
|
||
span.break, dd.break {
|
||
margin-bottom: 0;
|
||
min-height: 0;
|
||
break-before: auto;
|
||
break-inside: auto;
|
||
break-after: auto;
|
||
}
|
||
/* Undo break-before ToC */
|
||
@media print {
|
||
#toc {
|
||
break-before: auto;
|
||
}
|
||
}
|
||
/* Text in compact lists should not get extra bottom margin space,
|
||
since that would makes the list not compact */
|
||
ul.compact p, .ulCompact p,
|
||
ol.compact p, .olCompact p {
|
||
margin: 0;
|
||
}
|
||
/* But the list as a whole needs the extra space at the end */
|
||
section ul.compact,
|
||
section .ulCompact,
|
||
section ol.compact,
|
||
section .olCompact {
|
||
margin-bottom: 1em; /* same as p not within ul.compact etc. */
|
||
}
|
||
/* The tt and code background above interferes with for instance table cell
|
||
backgrounds. Changed to something a bit more selective. */
|
||
tt, code {
|
||
background-color: transparent;
|
||
}
|
||
p tt, p code, li tt, li code, dt tt, dt code {
|
||
background-color: #f8f8f8;
|
||
}
|
||
/* Tweak the pre margin -- 0px doesn't come out well */
|
||
pre {
|
||
margin-top: 0.5px;
|
||
}
|
||
/* Tweak the compact list text */
|
||
ul.compact, .ulCompact,
|
||
ol.compact, .olCompact,
|
||
dl.compact, .dlCompact {
|
||
line-height: normal;
|
||
}
|
||
/* Don't add top margin for nested lists */
|
||
li > ul, li > ol, li > dl,
|
||
dd > ul, dd > ol, dd > dl,
|
||
dl > dd > dl {
|
||
margin-top: initial;
|
||
}
|
||
/* Elements that should not be rendered on the same line as a <dt> */
|
||
/* This should match the element list in writer.text.TextWriter.render_dl() */
|
||
dd > div.artwork:first-child,
|
||
dd > aside:first-child,
|
||
dd > blockquote:first-child,
|
||
dd > figure:first-child,
|
||
dd > ol:first-child,
|
||
dd > div.sourcecode:first-child,
|
||
dd > table:first-child,
|
||
dd > ul:first-child {
|
||
clear: left;
|
||
}
|
||
/* fix for weird browser behaviour when <dd/> is empty */
|
||
dt+dd:empty::before{
|
||
content: "\00a0";
|
||
}
|
||
/* Make paragraph spacing inside <li> smaller than in body text, to fit better within the list */
|
||
li > p {
|
||
margin-bottom: 0.5em
|
||
}
|
||
/* Don't let p margin spill out from inside list items */
|
||
li > p:last-of-type:only-child {
|
||
margin-bottom: 0;
|
||
}
|
||
</style>
|
||
<link href="rfc-local.css" rel="stylesheet" type="text/css">
|
||
<script type="application/javascript">async function addMetadata(){try{const e=document.styleSheets[0].cssRules;for(let t=0;t<e.length;t++)if(/#identifiers/.exec(e[t].selectorText)){const a=e[t].cssText.replace("#identifiers","#external-updates");document.styleSheets[0].insertRule(a,document.styleSheets[0].cssRules.length)}}catch(e){console.log(e)}const e=document.getElementById("external-metadata");if(e)try{var t,a="",o=function(e){const t=document.getElementsByTagName("meta");for(let a=0;a<t.length;a++)if(t[a].getAttribute("name")===e)return t[a].getAttribute("content");return""}("rfc.number");if(o){t="https://www.rfc-editor.org/rfc/rfc"+o+".json";try{const e=await fetch(t);a=await e.json()}catch(e){t=document.URL.indexOf("html")>=0?document.URL.replace(/html$/,"json"):document.URL+".json";const o=await fetch(t);a=await o.json()}}if(!a)return;e.style.display="block";const s="",d="https://datatracker.ietf.org/doc",n="https://datatracker.ietf.org/ipr/search",c="https://www.rfc-editor.org/info",l=a.doc_id.toLowerCase(),i=a.doc_id.slice(0,3).toLowerCase(),f=a.doc_id.slice(3).replace(/^0+/,""),u={status:"Status",obsoletes:"Obsoletes",obsoleted_by:"Obsoleted By",updates:"Updates",updated_by:"Updated By",see_also:"See Also",errata_url:"Errata"};let h="<dl style='overflow:hidden' id='external-updates'>";["status","obsoletes","obsoleted_by","updates","updated_by","see_also","errata_url"].forEach(e=>{if("status"==e){a[e]=a[e].toLowerCase();var t=a[e].split(" "),o=t.length,w="",p=1;for(let e=0;e<o;e++)p<o?w=w+r(t[e])+" ":w+=r(t[e]),p++;a[e]=w}else if("obsoletes"==e||"obsoleted_by"==e||"updates"==e||"updated_by"==e){var g,m="",b=1;g=a[e].length;for(let t=0;t<g;t++)a[e][t]&&(a[e][t]=String(a[e][t]).toLowerCase(),m=b<g?m+"<a href='"+s+"/rfc/".concat(a[e][t])+"'>"+a[e][t].slice(3)+"</a>, ":m+"<a href='"+s+"/rfc/".concat(a[e][t])+"'>"+a[e][t].slice(3)+"</a>",b++);a[e]=m}else if("see_also"==e){var y,L="",C=1;y=a[e].length;for(let t=0;t<y;t++)if(a[e][t]){a[e][t]=String(a[e][t]);var _=a[e][t].slice(0,3),v=a[e][t].slice(3).replace(/^0+/,"");L=C<y?"RFC"!=_?L+"<a href='"+s+"/info/"+_.toLowerCase().concat(v.toLowerCase())+"'>"+_+" "+v+"</a>, ":L+"<a href='"+s+"/info/"+_.toLowerCase().concat(v.toLowerCase())+"'>"+v+"</a>, ":"RFC"!=_?L+"<a href='"+s+"/info/"+_.toLowerCase().concat(v.toLowerCase())+"'>"+_+" "+v+"</a>":L+"<a href='"+s+"/info/"+_.toLowerCase().concat(v.toLowerCase())+"'>"+v+"</a>",C++}a[e]=L}else if("errata_url"==e){var R="";R=a[e]?R+"<a href='"+a[e]+"'>Errata exist</a> | <a href='"+d+"/"+l+"'>Datatracker</a>| <a href='"+n+"/?"+i+"="+f+"&submit="+i+"'>IPR</a> | <a href='"+c+"/"+l+"'>Info page</a>":"<a href='"+d+"/"+l+"'>Datatracker</a> | <a href='"+n+"/?"+i+"="+f+"&submit="+i+"'>IPR</a> | <a href='"+c+"/"+l+"'>Info page</a>",a[e]=R}""!=a[e]?"Errata"==u[e]?h+=`<dt>More info:</dt><dd>${a[e]}</dd>`:h+=`<dt>${u[e]}:</dt><dd>${a[e]}</dd>`:"Errata"==u[e]&&(h+=`<dt>More info:</dt><dd>${a[e]}</dd>`)}),h+="</dl>",e.innerHTML=h}catch(e){console.log(e)}else console.log("Could not locate metadata <div> element");function r(e){return e.charAt(0).toUpperCase()+e.slice(1)}}window.removeEventListener("load",addMetadata),window.addEventListener("load",addMetadata);</script>
|
||
</head>
|
||
<body class="xml2rfc">
|
||
<table class="ears">
|
||
<thead><tr>
|
||
<td class="left">Internet-Draft</td>
|
||
<td class="center">ACT</td>
|
||
<td class="right">April 2026</td>
|
||
</tr></thead>
|
||
<tfoot><tr>
|
||
<td class="left">Nennemann</td>
|
||
<td class="center">Expires 14 October 2026</td>
|
||
<td class="right">[Page]</td>
|
||
</tr></tfoot>
|
||
</table>
|
||
<div id="external-metadata" class="document-information"></div>
|
||
<div id="internal-metadata" class="document-information">
|
||
<dl id="identifiers">
|
||
<dt class="label-workgroup">Workgroup:</dt>
|
||
<dd class="workgroup">Network Working Group</dd>
|
||
<dt class="label-internet-draft">Internet-Draft:</dt>
|
||
<dd class="internet-draft">draft-nennemann-act-01</dd>
|
||
<dt class="label-published">Published:</dt>
|
||
<dd class="published">
|
||
<time datetime="2026-04-12" class="published">12 April 2026</time>
|
||
</dd>
|
||
<dt class="label-intended-status">Intended Status:</dt>
|
||
<dd class="intended-status">Standards Track</dd>
|
||
<dt class="label-expires">Expires:</dt>
|
||
<dd class="expires"><time datetime="2026-10-14">14 October 2026</time></dd>
|
||
<dt class="label-authors">Author:</dt>
|
||
<dd class="authors">
|
||
<div class="author">
|
||
<div class="author-name">C. Nennemann</div>
|
||
<div class="org">Independent Researcher</div>
|
||
</div>
|
||
</dd>
|
||
</dl>
|
||
</div>
|
||
<h1 id="title">Agent Context Token (ACT)</h1>
|
||
<section id="section-abstract">
|
||
<h2 id="abstract"><a href="#abstract" class="selfRef">Abstract</a></h2>
|
||
<p id="section-abstract-1">This document defines the Agent Context Token (ACT), a self-contained
|
||
JWT-based format that captures the full invocation context of an
|
||
autonomous AI agent — its capabilities, constraints, delegation
|
||
provenance, oversight requirements, task metadata, and DAG position —
|
||
and unifies authorization and execution accountability in a single
|
||
token lifecycle. An ACT begins as a signed authorization mandate and
|
||
transitions into a tamper-evident execution record once the agent
|
||
completes its task, appending cryptographic hashes of inputs and
|
||
outputs and linking to predecessor tasks via a directed acyclic graph
|
||
(DAG). ACT requires no Authorization Server, no workload identity
|
||
infrastructure, and no transparency service for basic operation. Trust
|
||
is bootstrapped via pre-shared keys and is upgradeable to PKI or
|
||
Decentralized Identifiers (DIDs). ACT is designed for
|
||
cross-organizational agent federation in regulated and unregulated
|
||
environments alike. ACT is the general-purpose agent context
|
||
primitive; the WIMSE Execution Context Token (ECT)
|
||
<span>[<a href="#I-D.nennemann-wimse-ect" class="cite xref">I-D.nennemann-wimse-ect</a>]</span> is a sibling profile specialized for
|
||
workload-identity-bound execution recording in WIMSE deployments.<a href="#section-abstract-1" class="pilcrow">¶</a></p>
|
||
</section>
|
||
<div id="status-of-memo">
|
||
<section id="section-boilerplate.1">
|
||
<h2 id="name-status-of-this-memo">
|
||
<a href="#name-status-of-this-memo" class="section-name selfRef">Status of This Memo</a>
|
||
</h2>
|
||
<p id="section-boilerplate.1-1">
|
||
This Internet-Draft is submitted in full conformance with the
|
||
provisions of BCP 78 and BCP 79.<a href="#section-boilerplate.1-1" class="pilcrow">¶</a></p>
|
||
<p id="section-boilerplate.1-2">
|
||
Internet-Drafts are working documents of the Internet Engineering Task
|
||
Force (IETF). Note that other groups may also distribute working
|
||
documents as Internet-Drafts. The list of current Internet-Drafts is
|
||
at <span><a href="https://datatracker.ietf.org/drafts/current/">https://datatracker.ietf.org/drafts/current/</a></span>.<a href="#section-boilerplate.1-2" class="pilcrow">¶</a></p>
|
||
<p id="section-boilerplate.1-3">
|
||
Internet-Drafts are draft documents valid for a maximum of six months
|
||
and may be updated, replaced, or obsoleted by other documents at any
|
||
time. It is inappropriate to use Internet-Drafts as reference
|
||
material or to cite them other than as "work in progress."<a href="#section-boilerplate.1-3" class="pilcrow">¶</a></p>
|
||
<p id="section-boilerplate.1-4">
|
||
This Internet-Draft will expire on 14 October 2026.<a href="#section-boilerplate.1-4" class="pilcrow">¶</a></p>
|
||
</section>
|
||
</div>
|
||
<div id="copyright">
|
||
<section id="section-boilerplate.2">
|
||
<h2 id="name-copyright-notice">
|
||
<a href="#name-copyright-notice" class="section-name selfRef">Copyright Notice</a>
|
||
</h2>
|
||
<p id="section-boilerplate.2-1">
|
||
Copyright (c) 2026 IETF Trust and the persons identified as the
|
||
document authors. All rights reserved.<a href="#section-boilerplate.2-1" class="pilcrow">¶</a></p>
|
||
<p id="section-boilerplate.2-2">
|
||
This document is subject to BCP 78 and the IETF Trust's Legal
|
||
Provisions Relating to IETF Documents
|
||
(<span><a href="https://trustee.ietf.org/license-info">https://trustee.ietf.org/license-info</a></span>) in effect on the date of
|
||
publication of this document. Please review these documents
|
||
carefully, as they describe your rights and restrictions with
|
||
respect to this document. Code Components extracted from this
|
||
document must include Revised BSD License text as described in
|
||
Section 4.e of the Trust Legal Provisions and are provided without
|
||
warranty as described in the Revised BSD License.<a href="#section-boilerplate.2-2" class="pilcrow">¶</a></p>
|
||
</section>
|
||
</div>
|
||
<div id="toc">
|
||
<section id="section-toc.1">
|
||
<a href="#" onclick="scroll(0,0)" class="toplink">▲</a><h2 id="name-table-of-contents">
|
||
<a href="#name-table-of-contents" class="section-name selfRef">Table of Contents</a>
|
||
</h2>
|
||
<nav class="toc"><ul class="compact toc ulBare ulEmpty">
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.1">
|
||
<p id="section-toc.1-1.1.1"><a href="#section-1" class="auto internal xref">1</a>. <a href="#name-introduction" class="internal xref">Introduction</a></p>
|
||
<ul class="compact toc ulBare ulEmpty">
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.1.2.1">
|
||
<p id="section-toc.1-1.1.2.1.1" class="keepWithNext"><a href="#section-1.1" class="auto internal xref">1.1</a>. <a href="#name-problem-statement" class="internal xref">Problem Statement</a></p>
|
||
</li>
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.1.2.2">
|
||
<p id="section-toc.1-1.1.2.2.1" class="keepWithNext"><a href="#section-1.2" class="auto internal xref">1.2</a>. <a href="#name-design-goals" class="internal xref">Design Goals</a></p>
|
||
</li>
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.1.2.3">
|
||
<p id="section-toc.1-1.1.2.3.1" class="keepWithNext"><a href="#section-1.3" class="auto internal xref">1.3</a>. <a href="#name-non-goals" class="internal xref">Non-Goals</a></p>
|
||
</li>
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.1.2.4">
|
||
<p id="section-toc.1-1.1.2.4.1"><a href="#section-1.4" class="auto internal xref">1.4</a>. <a href="#name-relationship-to-related-wor" class="internal xref">Relationship to Related Work</a></p>
|
||
<ul class="compact toc ulBare ulEmpty">
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.1.2.4.2.1">
|
||
<p id="section-toc.1-1.1.2.4.2.1.1"><a href="#section-1.4.1" class="auto internal xref">1.4.1</a>. <a href="#name-concurrent-agent-authorizat" class="internal xref">Concurrent Agent Authorization Proposals</a></p>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.1.2.5">
|
||
<p id="section-toc.1-1.1.2.5.1"><a href="#section-1.5" class="auto internal xref">1.5</a>. <a href="#name-applicability" class="internal xref">Applicability</a></p>
|
||
<ul class="compact toc ulBare ulEmpty">
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.1.2.5.2.1">
|
||
<p id="section-toc.1-1.1.2.5.2.1.1"><a href="#section-1.5.1" class="auto internal xref">1.5.1</a>. <a href="#name-model-context-protocol-mcp-" class="internal xref">Model Context Protocol (MCP) Tool-Use Flows</a></p>
|
||
</li>
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.1.2.5.2.2">
|
||
<p id="section-toc.1-1.1.2.5.2.2.1"><a href="#section-1.5.2" class="auto internal xref">1.5.2</a>. <a href="#name-openai-agents-sdk-and-funct" class="internal xref">OpenAI Agents SDK and Function Calling</a></p>
|
||
</li>
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.1.2.5.2.3">
|
||
<p id="section-toc.1-1.1.2.5.2.3.1"><a href="#section-1.5.3" class="auto internal xref">1.5.3</a>. <a href="#name-langgraph-and-langchain-age" class="internal xref">LangGraph and LangChain Agent Graphs</a></p>
|
||
</li>
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.1.2.5.2.4">
|
||
<p id="section-toc.1-1.1.2.5.2.4.1"><a href="#section-1.5.4" class="auto internal xref">1.5.4</a>. <a href="#name-google-agent2agent-a2a-prot" class="internal xref">Google Agent2Agent (A2A) Protocol</a></p>
|
||
</li>
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.1.2.5.2.5">
|
||
<p id="section-toc.1-1.1.2.5.2.5.1"><a href="#section-1.5.5" class="auto internal xref">1.5.5</a>. <a href="#name-enterprise-orchestration-wi" class="internal xref">Enterprise Orchestration Without WIMSE (CrewAI, AutoGen)</a></p>
|
||
</li>
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.1.2.5.2.6">
|
||
<p id="section-toc.1-1.1.2.5.2.6.1"><a href="#section-1.5.6" class="auto internal xref">1.5.6</a>. <a href="#name-relationship-to-wimse-ect" class="internal xref">Relationship to WIMSE ECT</a></p>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.2">
|
||
<p id="section-toc.1-1.2.1"><a href="#section-2" class="auto internal xref">2</a>. <a href="#name-conventions-and-definitions" class="internal xref">Conventions and Definitions</a></p>
|
||
</li>
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.3">
|
||
<p id="section-toc.1-1.3.1"><a href="#section-3" class="auto internal xref">3</a>. <a href="#name-act-lifecycle" class="internal xref">ACT Lifecycle</a></p>
|
||
<ul class="compact toc ulBare ulEmpty">
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.3.2.1">
|
||
<p id="section-toc.1-1.3.2.1.1"><a href="#section-3.1" class="auto internal xref">3.1</a>. <a href="#name-phase-1-authorization-manda" class="internal xref">Phase 1: Authorization Mandate</a></p>
|
||
</li>
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.3.2.2">
|
||
<p id="section-toc.1-1.3.2.2.1"><a href="#section-3.2" class="auto internal xref">3.2</a>. <a href="#name-phase-2-execution-record" class="internal xref">Phase 2: Execution Record</a></p>
|
||
</li>
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.3.2.3">
|
||
<p id="section-toc.1-1.3.2.3.1"><a href="#section-3.3" class="auto internal xref">3.3</a>. <a href="#name-lifecycle-state-machine" class="internal xref">Lifecycle State Machine</a></p>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.4">
|
||
<p id="section-toc.1-1.4.1"><a href="#section-4" class="auto internal xref">4</a>. <a href="#name-act-token-format" class="internal xref">ACT Token Format</a></p>
|
||
<ul class="compact toc ulBare ulEmpty">
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.4.2.1">
|
||
<p id="section-toc.1-1.4.2.1.1"><a href="#section-4.1" class="auto internal xref">4.1</a>. <a href="#name-jose-header" class="internal xref">JOSE Header</a></p>
|
||
</li>
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.4.2.2">
|
||
<p id="section-toc.1-1.4.2.2.1"><a href="#section-4.2" class="auto internal xref">4.2</a>. <a href="#name-jwt-claims-authorization-ph" class="internal xref">JWT Claims: Authorization Phase</a></p>
|
||
<ul class="compact toc ulBare ulEmpty">
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.4.2.2.2.1">
|
||
<p id="section-toc.1-1.4.2.2.2.1.1"><a href="#section-4.2.1" class="auto internal xref">4.2.1</a>. <a href="#name-standard-jwt-claims" class="internal xref">Standard JWT Claims</a></p>
|
||
</li>
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.4.2.2.2.2">
|
||
<p id="section-toc.1-1.4.2.2.2.2.1"><a href="#section-4.2.2" class="auto internal xref">4.2.2</a>. <a href="#name-act-authorization-claims" class="internal xref">ACT Authorization Claims</a></p>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.4.2.3">
|
||
<p id="section-toc.1-1.4.2.3.1"><a href="#section-4.3" class="auto internal xref">4.3</a>. <a href="#name-jwt-claims-execution-phase" class="internal xref">JWT Claims: Execution Phase</a></p>
|
||
</li>
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.4.2.4">
|
||
<p id="section-toc.1-1.4.2.4.1"><a href="#section-4.4" class="auto internal xref">4.4</a>. <a href="#name-complete-examples" class="internal xref">Complete Examples</a></p>
|
||
<ul class="compact toc ulBare ulEmpty">
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.4.2.4.2.1">
|
||
<p id="section-toc.1-1.4.2.4.2.1.1"><a href="#section-4.4.1" class="auto internal xref">4.4.1</a>. <a href="#name-example-phase-1-authorizati" class="internal xref">Example: Phase 1 — Authorization Mandate</a></p>
|
||
</li>
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.4.2.4.2.2">
|
||
<p id="section-toc.1-1.4.2.4.2.2.1"><a href="#section-4.4.2" class="auto internal xref">4.4.2</a>. <a href="#name-example-phase-2-execution-r" class="internal xref">Example: Phase 2 — Execution Record (same token, re-signed by target agent)</a></p>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.5">
|
||
<p id="section-toc.1-1.5.1"><a href="#section-5" class="auto internal xref">5</a>. <a href="#name-trust-model" class="internal xref">Trust Model</a></p>
|
||
<ul class="compact toc ulBare ulEmpty">
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.5.2.1">
|
||
<p id="section-toc.1-1.5.2.1.1"><a href="#section-5.1" class="auto internal xref">5.1</a>. <a href="#name-tier-0-bootstrap-tofu-trust" class="internal xref">Tier 0: Bootstrap (TOFU — Trust On First Use)</a></p>
|
||
</li>
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.5.2.2">
|
||
<p id="section-toc.1-1.5.2.2.1"><a href="#section-5.2" class="auto internal xref">5.2</a>. <a href="#name-tier-1-pre-shared-keys-mand" class="internal xref">Tier 1: Pre-Shared Keys (Mandatory-to-Implement)</a></p>
|
||
</li>
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.5.2.3">
|
||
<p id="section-toc.1-1.5.2.3.1"><a href="#section-5.3" class="auto internal xref">5.3</a>. <a href="#name-tier-2-pki-x509" class="internal xref">Tier 2: PKI / X.509</a></p>
|
||
</li>
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.5.2.4">
|
||
<p id="section-toc.1-1.5.2.4.1"><a href="#section-5.4" class="auto internal xref">5.4</a>. <a href="#name-tier-3-decentralized-identi" class="internal xref">Tier 3: Decentralized Identifiers (DID)</a></p>
|
||
</li>
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.5.2.5">
|
||
<p id="section-toc.1-1.5.2.5.1"><a href="#section-5.5" class="auto internal xref">5.5</a>. <a href="#name-cross-tier-interoperability" class="internal xref">Cross-Tier Interoperability</a></p>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.6">
|
||
<p id="section-toc.1-1.6.1"><a href="#section-6" class="auto internal xref">6</a>. <a href="#name-delegation-chain" class="internal xref">Delegation Chain</a></p>
|
||
<ul class="compact toc ulBare ulEmpty">
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.6.2.1">
|
||
<p id="section-toc.1-1.6.2.1.1"><a href="#section-6.1" class="auto internal xref">6.1</a>. <a href="#name-peer-to-peer-delegation" class="internal xref">Peer-to-Peer Delegation</a></p>
|
||
</li>
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.6.2.2">
|
||
<p id="section-toc.1-1.6.2.2.1"><a href="#section-6.2" class="auto internal xref">6.2</a>. <a href="#name-privilege-reduction-require" class="internal xref">Privilege Reduction Requirements</a></p>
|
||
</li>
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.6.2.3">
|
||
<p id="section-toc.1-1.6.2.3.1"><a href="#section-6.3" class="auto internal xref">6.3</a>. <a href="#name-delegation-verification" class="internal xref">Delegation Verification</a></p>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.7">
|
||
<p id="section-toc.1-1.7.1"><a href="#section-7" class="auto internal xref">7</a>. <a href="#name-dag-structure-and-causal-or" class="internal xref">DAG Structure and Causal Ordering</a></p>
|
||
<ul class="compact toc ulBare ulEmpty">
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.7.2.1">
|
||
<p id="section-toc.1-1.7.2.1.1"><a href="#section-7.1" class="auto internal xref">7.1</a>. <a href="#name-dag-validation" class="internal xref">DAG Validation</a></p>
|
||
</li>
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.7.2.2">
|
||
<p id="section-toc.1-1.7.2.2.1"><a href="#section-7.2" class="auto internal xref">7.2</a>. <a href="#name-root-tasks-and-fan-in" class="internal xref">Root Tasks and Fan-in</a></p>
|
||
</li>
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.7.2.3">
|
||
<p id="section-toc.1-1.7.2.3.1"><a href="#section-7.3" class="auto internal xref">7.3</a>. <a href="#name-dag-vs-linear-delegation-ch" class="internal xref">DAG vs Linear Delegation Chains</a></p>
|
||
<ul class="compact toc ulBare ulEmpty">
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.7.2.3.2.1">
|
||
<p id="section-toc.1-1.7.2.3.2.1.1"><a href="#section-7.3.1" class="auto internal xref">7.3.1</a>. <a href="#name-what-linear-chains-express-" class="internal xref">What Linear Chains Express Well</a></p>
|
||
</li>
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.7.2.3.2.2">
|
||
<p id="section-toc.1-1.7.2.3.2.2.1"><a href="#section-7.3.2" class="auto internal xref">7.3.2</a>. <a href="#name-limitations-of-linear-chain" class="internal xref">Limitations of Linear Chains</a></p>
|
||
</li>
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.7.2.3.2.3">
|
||
<p id="section-toc.1-1.7.2.3.2.3.1"><a href="#section-7.3.3" class="auto internal xref">7.3.3</a>. <a href="#name-acts-dag-approach" class="internal xref">ACT's DAG Approach</a></p>
|
||
</li>
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.7.2.3.2.4">
|
||
<p id="section-toc.1-1.7.2.3.2.4.1"><a href="#section-7.3.4" class="auto internal xref">7.3.4</a>. <a href="#name-verifiability-implications" class="internal xref">Verifiability Implications</a></p>
|
||
</li>
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.7.2.3.2.5">
|
||
<p id="section-toc.1-1.7.2.3.2.5.1"><a href="#section-7.3.5" class="auto internal xref">7.3.5</a>. <a href="#name-interoperability-with-linea" class="internal xref">Interoperability with Linear-Chain Designs</a></p>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.8">
|
||
<p id="section-toc.1-1.8.1"><a href="#section-8" class="auto internal xref">8</a>. <a href="#name-verification-procedure" class="internal xref">Verification Procedure</a></p>
|
||
<ul class="compact toc ulBare ulEmpty">
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.8.2.1">
|
||
<p id="section-toc.1-1.8.2.1.1"><a href="#section-8.1" class="auto internal xref">8.1</a>. <a href="#name-authorization-phase-verific" class="internal xref">Authorization Phase Verification</a></p>
|
||
</li>
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.8.2.2">
|
||
<p id="section-toc.1-1.8.2.2.1"><a href="#section-8.2" class="auto internal xref">8.2</a>. <a href="#name-execution-phase-verificatio" class="internal xref">Execution Phase Verification</a></p>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.9">
|
||
<p id="section-toc.1-1.9.1"><a href="#section-9" class="auto internal xref">9</a>. <a href="#name-transport" class="internal xref">Transport</a></p>
|
||
<ul class="compact toc ulBare ulEmpty">
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.9.2.1">
|
||
<p id="section-toc.1-1.9.2.1.1"><a href="#section-9.1" class="auto internal xref">9.1</a>. <a href="#name-http-header-transport" class="internal xref">HTTP Header Transport</a></p>
|
||
</li>
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.9.2.2">
|
||
<p id="section-toc.1-1.9.2.2.1"><a href="#section-9.2" class="auto internal xref">9.2</a>. <a href="#name-non-http-transports" class="internal xref">Non-HTTP Transports</a></p>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.10">
|
||
<p id="section-toc.1-1.10.1"><a href="#section-10" class="auto internal xref">10</a>. <a href="#name-audit-ledger-interface" class="internal xref">Audit Ledger Interface</a></p>
|
||
</li>
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.11">
|
||
<p id="section-toc.1-1.11.1"><a href="#section-11" class="auto internal xref">11</a>. <a href="#name-security-considerations" class="internal xref">Security Considerations</a></p>
|
||
<ul class="compact toc ulBare ulEmpty">
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.11.2.1">
|
||
<p id="section-toc.1-1.11.2.1.1"><a href="#section-11.1" class="auto internal xref">11.1</a>. <a href="#name-threat-model" class="internal xref">Threat Model</a></p>
|
||
</li>
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.11.2.2">
|
||
<p id="section-toc.1-1.11.2.2.1"><a href="#section-11.2" class="auto internal xref">11.2</a>. <a href="#name-self-assertion-limitation" class="internal xref">Self-Assertion Limitation</a></p>
|
||
</li>
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.11.2.3">
|
||
<p id="section-toc.1-1.11.2.3.1"><a href="#section-11.3" class="auto internal xref">11.3</a>. <a href="#name-key-compromise" class="internal xref">Key Compromise</a></p>
|
||
</li>
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.11.2.4">
|
||
<p id="section-toc.1-1.11.2.4.1"><a href="#section-11.4" class="auto internal xref">11.4</a>. <a href="#name-replay-attack-prevention" class="internal xref">Replay Attack Prevention</a></p>
|
||
</li>
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.11.2.5">
|
||
<p id="section-toc.1-1.11.2.5.1"><a href="#section-11.5" class="auto internal xref">11.5</a>. <a href="#name-equivocation" class="internal xref">Equivocation</a></p>
|
||
</li>
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.11.2.6">
|
||
<p id="section-toc.1-1.11.2.6.1"><a href="#section-11.6" class="auto internal xref">11.6</a>. <a href="#name-privilege-escalation" class="internal xref">Privilege Escalation</a></p>
|
||
</li>
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.11.2.7">
|
||
<p id="section-toc.1-1.11.2.7.1"><a href="#section-11.7" class="auto internal xref">11.7</a>. <a href="#name-denial-of-service" class="internal xref">Denial of Service</a></p>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.12">
|
||
<p id="section-toc.1-1.12.1"><a href="#section-12" class="auto internal xref">12</a>. <a href="#name-privacy-considerations" class="internal xref">Privacy Considerations</a></p>
|
||
</li>
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.13">
|
||
<p id="section-toc.1-1.13.1"><a href="#section-13" class="auto internal xref">13</a>. <a href="#name-iana-considerations" class="internal xref">IANA Considerations</a></p>
|
||
<ul class="compact toc ulBare ulEmpty">
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.13.2.1">
|
||
<p id="section-toc.1-1.13.2.1.1"><a href="#section-13.1" class="auto internal xref">13.1</a>. <a href="#name-media-type-registration" class="internal xref">Media Type Registration</a></p>
|
||
</li>
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.13.2.2">
|
||
<p id="section-toc.1-1.13.2.2.1"><a href="#section-13.2" class="auto internal xref">13.2</a>. <a href="#name-http-header-field-registrat" class="internal xref">HTTP Header Field Registration</a></p>
|
||
</li>
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.13.2.3">
|
||
<p id="section-toc.1-1.13.2.3.1"><a href="#section-13.3" class="auto internal xref">13.3</a>. <a href="#name-jwt-claims-registration" class="internal xref">JWT Claims Registration</a></p>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.14">
|
||
<p id="section-toc.1-1.14.1"><a href="#section-14" class="auto internal xref">14</a>. <a href="#name-references" class="internal xref">References</a></p>
|
||
<ul class="compact toc ulBare ulEmpty">
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.14.2.1">
|
||
<p id="section-toc.1-1.14.2.1.1"><a href="#section-14.1" class="auto internal xref">14.1</a>. <a href="#name-normative-references" class="internal xref">Normative References</a></p>
|
||
</li>
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.14.2.2">
|
||
<p id="section-toc.1-1.14.2.2.1"><a href="#section-14.2" class="auto internal xref">14.2</a>. <a href="#name-informative-references" class="internal xref">Informative References</a></p>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.15">
|
||
<p id="section-toc.1-1.15.1"><a href="#appendix-A" class="auto internal xref"></a><a href="#name-appendix-a-complete-json-sc" class="internal xref">Appendix A: Complete JSON Schema</a></p>
|
||
</li>
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.16">
|
||
<p id="section-toc.1-1.16.1"><a href="#appendix-B" class="auto internal xref"></a><a href="#name-appendix-b-test-vectors" class="internal xref">Appendix B: Test Vectors</a></p>
|
||
<ul class="compact toc ulBare ulEmpty">
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.16.2.1">
|
||
<p id="section-toc.1-1.16.2.1.1"><a href="#appendix-B.1" class="auto internal xref"></a><a href="#name-b1-valid-phase-1-act-root-m" class="internal xref">B.1. Valid Phase 1 ACT — Root Mandate (Tier 1, Pre-Shared Key)</a></p>
|
||
</li>
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.16.2.2">
|
||
<p id="section-toc.1-1.16.2.2.1"><a href="#appendix-B.2" class="auto internal xref"></a><a href="#name-b2-valid-phase-2-act-comple" class="internal xref">B.2. Valid Phase 2 ACT — Completed Execution</a></p>
|
||
</li>
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.16.2.3">
|
||
<p id="section-toc.1-1.16.2.3.1"><a href="#appendix-B.3" class="auto internal xref"></a><a href="#name-b3-valid-phase-2-act-fan-in" class="internal xref">B.3. Valid Phase 2 ACT — Fan-in (Multiple Parents)</a></p>
|
||
</li>
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.16.2.4">
|
||
<p id="section-toc.1-1.16.2.4.1"><a href="#appendix-B.4" class="auto internal xref"></a><a href="#name-b4-invalid-act-delegation-d" class="internal xref">B.4. Invalid ACT — Delegation Depth Exceeded</a></p>
|
||
</li>
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.16.2.5">
|
||
<p id="section-toc.1-1.16.2.5.1"><a href="#appendix-B.5" class="auto internal xref"></a><a href="#name-b5-invalid-act-capability-e" class="internal xref">B.5. Invalid ACT — Capability Escalation</a></p>
|
||
</li>
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.16.2.6">
|
||
<p id="section-toc.1-1.16.2.6.1"><a href="#appendix-B.6" class="auto internal xref"></a><a href="#name-b6-invalid-act-exec_act-mis" class="internal xref">B.6. Invalid ACT — exec_act Mismatch</a></p>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.17">
|
||
<p id="section-toc.1-1.17.1"><a href="#appendix-C" class="auto internal xref"></a><a href="#name-appendix-c-deployment-scena" class="internal xref">Appendix C: Deployment Scenarios</a></p>
|
||
<ul class="compact toc ulBare ulEmpty">
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.17.2.1">
|
||
<p id="section-toc.1-1.17.2.1.1"><a href="#appendix-C.1" class="auto internal xref"></a><a href="#name-c1-minimal-deployment-zero-" class="internal xref">C.1. Minimal Deployment (Zero Infrastructure)</a></p>
|
||
</li>
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.17.2.2">
|
||
<p id="section-toc.1-1.17.2.2.1"><a href="#appendix-C.2" class="auto internal xref"></a><a href="#name-c2-regulated-deployment-wit" class="internal xref">C.2. Regulated Deployment with Hash-Chained Ledger</a></p>
|
||
</li>
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.17.2.3">
|
||
<p id="section-toc.1-1.17.2.3.1"><a href="#appendix-C.3" class="auto internal xref"></a><a href="#name-c3-high-assurance-cross-org" class="internal xref">C.3. High-Assurance Cross-Organizational Deployment</a></p>
|
||
</li>
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.17.2.4">
|
||
<p id="section-toc.1-1.17.2.4.1"><a href="#appendix-C.4" class="auto internal xref"></a><a href="#name-c4-wimse-environment-integr" class="internal xref">C.4. WIMSE Environment Integration</a></p>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.18">
|
||
<p id="section-toc.1-1.18.1"><a href="#appendix-D" class="auto internal xref"></a><a href="#name-acknowledgments" class="internal xref">Acknowledgments</a></p>
|
||
</li>
|
||
<li class="compact toc ulBare ulEmpty" id="section-toc.1-1.19">
|
||
<p id="section-toc.1-1.19.1"><a href="#appendix-E" class="auto internal xref"></a><a href="#name-authors-address" class="internal xref">Author's Address</a></p>
|
||
</li>
|
||
</ul>
|
||
</nav>
|
||
</section>
|
||
</div>
|
||
<div id="introduction">
|
||
<section id="section-1">
|
||
<h2 id="name-introduction">
|
||
<a href="#section-1" class="section-number selfRef">1. </a><a href="#name-introduction" class="section-name selfRef">Introduction</a>
|
||
</h2>
|
||
<p id="section-1-1">Autonomous AI agents increasingly operate across organizational
|
||
boundaries, executing multi-step workflows where individual tasks are
|
||
delegated from one agent to another. These workflows create two
|
||
distinct, inseparable compliance requirements:<a href="#section-1-1" class="pilcrow">¶</a></p>
|
||
<ol start="1" type="1" class="normal type-1" id="section-1-2">
|
||
<li id="section-1-2.1">
|
||
<p id="section-1-2.1.1"><strong>Authorization</strong>: was the agent permitted to perform the action,
|
||
under what constraints, and by whose authority?<a href="#section-1-2.1.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li id="section-1-2.2">
|
||
<p id="section-1-2.2.1"><strong>Accountability</strong>: what did the agent actually do, with what
|
||
inputs, producing what outputs, in what causal relationship to
|
||
prior tasks?<a href="#section-1-2.2.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
</ol>
|
||
<p id="section-1-3">Existing specifications address these requirements in isolation.
|
||
The Agent Authorization Profile (AAP) <span>[<a href="#I-D.aap-oauth-profile" class="cite xref">I-D.aap-oauth-profile</a>]</span>
|
||
provides structured authorization via OAuth 2.0 but requires a
|
||
central Authorization Server. The WIMSE Execution Context Token
|
||
<span>[<a href="#I-D.nennemann-wimse-ect" class="cite xref">I-D.nennemann-wimse-ect</a>]</span> provides execution accountability but
|
||
requires WIMSE workload identity infrastructure (SPIFFE/SPIRE).<a href="#section-1-3" class="pilcrow">¶</a></p>
|
||
<p id="section-1-4">This document defines the Agent Context Token (ACT), which addresses
|
||
both requirements in a single, self-contained token that requires no
|
||
shared infrastructure beyond the ability to verify asymmetric
|
||
signatures. The word "Context" in the name reflects what the token
|
||
carries: the complete invocation context of an agent — DAG references,
|
||
task metadata, capabilities, delegation chain, and oversight claims
|
||
— bound together in one cryptographically verifiable envelope. ACT
|
||
is positioned as the general agent context primitive, with the
|
||
WIMSE Execution Context Token (ECT) <span>[<a href="#I-D.nennemann-wimse-ect" class="cite xref">I-D.nennemann-wimse-ect</a>]</span> as a
|
||
sibling profile specialized for workload-identity-bound execution
|
||
contexts in WIMSE deployments.<a href="#section-1-4" class="pilcrow">¶</a></p>
|
||
<div id="problem-statement">
|
||
<section id="section-1.1">
|
||
<h3 id="name-problem-statement">
|
||
<a href="#section-1.1" class="section-number selfRef">1.1. </a><a href="#name-problem-statement" class="section-name selfRef">Problem Statement</a>
|
||
</h3>
|
||
<p id="section-1.1-1">Cross-organizational agent federation today faces a bootstrapping
|
||
problem: deploying shared OAuth infrastructure or a common SPIFFE
|
||
trust domain requires organizational agreement before the first
|
||
message is exchanged. In practice this means either:<a href="#section-1.1-1" class="pilcrow">¶</a></p>
|
||
<p id="section-1.1-2">(a) agents operate without cryptographic authorization or audit
|
||
trails, relying on application-layer access control only; or<a href="#section-1.1-2" class="pilcrow">¶</a></p>
|
||
<p id="section-1.1-3">(b) organizations adopt one party's identity infrastructure, creating
|
||
a hub-and-spoke dependency that contradicts the decentralized
|
||
nature of agent networks.<a href="#section-1.1-3" class="pilcrow">¶</a></p>
|
||
<p id="section-1.1-4">ACT solves this by making pre-shared keys the mandatory-to-implement
|
||
trust baseline — two agents can begin a secure, auditable interaction
|
||
with nothing more than an out-of-band key exchange — while providing
|
||
a clean upgrade path to PKI or DID-based trust without changing the
|
||
token format.<a href="#section-1.1-4" class="pilcrow">¶</a></p>
|
||
</section>
|
||
</div>
|
||
<div id="design-goals">
|
||
<section id="section-1.2">
|
||
<h3 id="name-design-goals">
|
||
<a href="#section-1.2" class="section-number selfRef">1.2. </a><a href="#name-design-goals" class="section-name selfRef">Design Goals</a>
|
||
</h3>
|
||
<ul class="normal">
|
||
<li class="normal" id="section-1.2-1.1">
|
||
<p id="section-1.2-1.1.1"><strong>G1 — Zero infrastructure baseline</strong>: ACT <span class="bcp14">MUST</span> be deployable with
|
||
no shared servers, no common identity provider, and no transparency
|
||
service.<a href="#section-1.2-1.1.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li class="normal" id="section-1.2-1.2">
|
||
<p id="section-1.2-1.2.1"><strong>G2 — Single token lifecycle</strong>: Authorization and accountability
|
||
<span class="bcp14">MUST</span> be expressed in the same token format to prevent
|
||
authorization-accountability gaps.<a href="#section-1.2-1.2.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li class="normal" id="section-1.2-1.3">
|
||
<p id="section-1.2-1.3.1"><strong>G3 — Peer-to-peer delegation</strong>: Delegation chains <span class="bcp14">MUST</span> be
|
||
verifiable without contacting an Authorization Server, using
|
||
cryptographic chaining of agent signatures.<a href="#section-1.2-1.3.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li class="normal" id="section-1.2-1.4">
|
||
<p id="section-1.2-1.4.1"><strong>G4 — DAG-native causal ordering</strong>: Workflows with parallel
|
||
branches and fan-in dependencies <span class="bcp14">MUST</span> be expressible natively,
|
||
without flattening to a linear chain.<a href="#section-1.2-1.4.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li class="normal" id="section-1.2-1.5">
|
||
<p id="section-1.2-1.5.1"><strong>G5 — Cross-organizational interoperability</strong>: ACTs issued by
|
||
agents in different trust domains <span class="bcp14">MUST</span> be verifiable by any
|
||
participant holding the issuing agent's public key.<a href="#section-1.2-1.5.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li class="normal" id="section-1.2-1.6">
|
||
<p id="section-1.2-1.6.1"><strong>G6 — Regulatory applicability</strong>: ACT <span class="bcp14">MUST</span> provide sufficient
|
||
evidence for audit requirements in DORA <span>[<a href="#DORA" class="cite xref">DORA</a>]</span>, EU AI Act
|
||
Article 12 <span>[<a href="#EUAIA" class="cite xref">EUAIA</a>]</span>, and IEC 62304 <span>[<a href="#IEC62304" class="cite xref">IEC62304</a>]</span> without requiring
|
||
additional log formats.<a href="#section-1.2-1.6.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li class="normal" id="section-1.2-1.7">
|
||
<p id="section-1.2-1.7.1"><strong>G7 — Upgrade path</strong>: The trust model <span class="bcp14">MUST</span> support migration from
|
||
pre-shared keys to PKI or DID without breaking existing ACT chains.<a href="#section-1.2-1.7.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
</ul>
|
||
</section>
|
||
</div>
|
||
<div id="non-goals">
|
||
<section id="section-1.3">
|
||
<h3 id="name-non-goals">
|
||
<a href="#section-1.3" class="section-number selfRef">1.3. </a><a href="#name-non-goals" class="section-name selfRef">Non-Goals</a>
|
||
</h3>
|
||
<p id="section-1.3-1">The following are explicitly out of scope:<a href="#section-1.3-1" class="pilcrow">¶</a></p>
|
||
<ul class="normal">
|
||
<li class="normal" id="section-1.3-2.1">
|
||
<p id="section-1.3-2.1.1">Defining internal AI model behavior or decision logic.<a href="#section-1.3-2.1.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li class="normal" id="section-1.3-2.2">
|
||
<p id="section-1.3-2.2.1">Replacing organizational security policies or procedures.<a href="#section-1.3-2.2.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li class="normal" id="section-1.3-2.3">
|
||
<p id="section-1.3-2.3.1">Defining storage formats for audit ledgers.<a href="#section-1.3-2.3.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li class="normal" id="section-1.3-2.4">
|
||
<p id="section-1.3-2.4.1">Specifying token revocation infrastructure (deployments <span class="bcp14">MAY</span> use
|
||
existing mechanisms such as <span>[<a href="#RFC7009" class="cite xref">RFC7009</a>]</span> for this purpose).<a href="#section-1.3-2.4.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li class="normal" id="section-1.3-2.5">
|
||
<p id="section-1.3-2.5.1">Providing non-equivocation guarantees in standalone mode (see
|
||
<a href="#equivocation" class="auto internal xref">Section 11.5</a> for the equivocation discussion and optional
|
||
transparency anchoring).<a href="#section-1.3-2.5.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
</ul>
|
||
</section>
|
||
</div>
|
||
<div id="relationship-to-related-work">
|
||
<section id="section-1.4">
|
||
<h3 id="name-relationship-to-related-wor">
|
||
<a href="#section-1.4" class="section-number selfRef">1.4. </a><a href="#name-relationship-to-related-wor" class="section-name selfRef">Relationship to Related Work</a>
|
||
</h3>
|
||
<p id="section-1.4-1"><strong>AAP <span>[<a href="#I-D.aap-oauth-profile" class="cite xref">I-D.aap-oauth-profile</a>]</span></strong>: ACT addresses the same authorization
|
||
problem as AAP but does not require an Authorization Server. ACT
|
||
delegation is peer-to-peer via cryptographic signature chaining;
|
||
AAP delegation requires OAuth Token Exchange <span>[<a href="#RFC8693" class="cite xref">RFC8693</a>]</span> against a
|
||
central AS. ACT is not a profile of AAP; it is an
|
||
infrastructure-independent alternative for the same problem class.<a href="#section-1.4-1" class="pilcrow">¶</a></p>
|
||
<p id="section-1.4-2"><strong>WIMSE ECT <span>[<a href="#I-D.nennemann-wimse-ect" class="cite xref">I-D.nennemann-wimse-ect</a>]</span></strong>: ACT addresses the same
|
||
execution accountability problem as the WIMSE Execution Context Token
|
||
but does not require WIMSE workload identity infrastructure. ACT is
|
||
not a profile of WIMSE; it is deployable in environments without
|
||
SPIFFE/SPIRE. In environments where WIMSE is deployed, ACT <span class="bcp14">MAY</span> be
|
||
carried alongside WIMSE tokens to augment accountability with
|
||
authorization provenance.<a href="#section-1.4-2" class="pilcrow">¶</a></p>
|
||
<p id="section-1.4-3"><strong>SCITT <span>[<a href="#I-D.ietf-scitt-architecture" class="cite xref">I-D.ietf-scitt-architecture</a>]</span></strong>: For deployments requiring
|
||
non-equivocation guarantees (see <a href="#equivocation" class="auto internal xref">Section 11.5</a>), ACT execution
|
||
records <span class="bcp14">MAY</span> be anchored to a SCITT Transparency Service as a Layer 2
|
||
mechanism. This is <span class="bcp14">OPTIONAL</span> and not required for basic ACT operation.
|
||
Note: The SCITT architecture draft is currently in AUTH48 (RFC
|
||
Editor queue) at version -22 and is about to become an RFC; readers
|
||
should use the RFC number once assigned.<a href="#section-1.4-3" class="pilcrow">¶</a></p>
|
||
<div id="concurrent-agent-authorization-proposals">
|
||
<section id="section-1.4.1">
|
||
<h4 id="name-concurrent-agent-authorizat">
|
||
<a href="#section-1.4.1" class="section-number selfRef">1.4.1. </a><a href="#name-concurrent-agent-authorizat" class="section-name selfRef">Concurrent Agent Authorization Proposals</a>
|
||
</h4>
|
||
<p id="section-1.4.1-1">Several concurrent proposals in the IETF and academic communities
|
||
address overlapping portions of the agent authorization problem
|
||
space. This subsection situates ACT relative to those proposals.
|
||
Protocol-layer comparison of linear versus DAG delegation
|
||
structure is deferred to <a href="#dag-vs-linear" class="auto internal xref">Section 7.3</a>; the summaries below focus
|
||
on scope and deployability.<a href="#section-1.4.1-1" class="pilcrow">¶</a></p>
|
||
<p id="section-1.4.1-2"><strong>AIP / IBCTs <span>[<a href="#AIP-IBCT" class="cite xref">AIP-IBCT</a>]</span></strong>: The Agent Interaction Protocol proposes
|
||
Interaction-Bound Capability Tokens in two modes: compact signed
|
||
JWTs for single-hop invocation and Biscuit/Datalog tokens for
|
||
multi-hop delegation, motivated by a survey of approximately 2,000
|
||
Model Context Protocol servers that found no authorization
|
||
enforcement. ACT addresses the same problem class but relies
|
||
exclusively on JWT/JOSE throughout (no Biscuit or Datalog
|
||
dependency), defines an explicit two-phase lifecycle separating
|
||
authorization (Mandate) from proof-of-execution (Record), and
|
||
supports DAG delegation structure. IBCTs are modeled as append-only
|
||
chains at the protocol layer; ACT operates at the authorization
|
||
graph layer with revocable lifecycle states.<a href="#section-1.4.1-2" class="pilcrow">¶</a></p>
|
||
<p id="section-1.4.1-3"><strong>SentinelAgent <span>[<a href="#SentinelAgent" class="cite xref">SentinelAgent</a>]</span></strong>: SentinelAgent defines a formal
|
||
Delegation Chain Calculus with seven verifiable properties, a TLA+
|
||
mechanization, and reports 100% true-positive and 0% false-positive
|
||
rates against the DelegationBench v4 benchmark. It addresses the
|
||
same accountability question as ACT — namely, which principal
|
||
authorized a given chain of actions. The differentiator is
|
||
deployment substrate: SentinelAgent expresses its guarantees in a
|
||
domain-specific formal calculus, whereas ACT encodes the same
|
||
invariants in IETF-standard JWT infrastructure (RFC 7519, RFC 7515,
|
||
RFC 8032) already deployable in existing OAuth- and JOSE-aware
|
||
stacks.<a href="#section-1.4.1-3" class="pilcrow">¶</a></p>
|
||
<p id="section-1.4.1-4"><strong>Agentic JWT <span>[<a href="#AgenticJWT" class="cite xref">AgenticJWT</a>]</span></strong>: Agentic JWT derives a per-agent
|
||
identity as a one-way hash of the agent's prompt, registered tools,
|
||
and configuration, and chains delegation assertions across
|
||
invocations. It is the closest prior-art JWT-based construction
|
||
for agentic delegation. ACT differs in that it adds an explicit
|
||
two-phase lifecycle — separating the authorization mandate from
|
||
the proof-of-execution record — and expresses delegation as a DAG
|
||
via the array-valued <code>pred</code> claim rather than a strictly linear
|
||
chain.<a href="#section-1.4.1-4" class="pilcrow">¶</a></p>
|
||
<p id="section-1.4.1-5"><strong>OAuth Transaction Tokens for Agents
|
||
<span>[<a href="#I-D.oauth-transaction-tokens-for-agents" class="cite xref">I-D.oauth-transaction-tokens-for-agents</a>]</span></strong>: This draft
|
||
extends OAuth Transaction Tokens with an <code>actchain</code> claim (an
|
||
ordered delegation array), an <code>agentic_ctx</code> claim conveying intent
|
||
and constraints, and flow-type markers distinguishing interactive
|
||
from autonomous invocations. It is complementary to ACT at the
|
||
OAuth layer. The primary differentiators are topology and
|
||
infrastructure dependency: Transaction Tokens for Agents presume
|
||
an OAuth Authorization Server and use a linear <code>actchain</code>, whereas
|
||
ACT operates peer-to-peer without any AS and uses a DAG-valued
|
||
<code>pred</code>. A detailed differencing document is referenced in
|
||
<a href="#security-considerations" class="auto internal xref">Section 11</a>.<a href="#section-1.4.1-5" class="pilcrow">¶</a></p>
|
||
<p id="section-1.4.1-6"><strong>Helixar Delegation Protocol (HDP)
|
||
<span>[<a href="#I-D.helixar-hdp-agentic-delegation" class="cite xref">I-D.helixar-hdp-agentic-delegation</a>]</span></strong>: HDP specifies
|
||
Ed25519 signatures over RFC 8785-canonicalized JSON, an
|
||
append-only linear delegation chain with session binding, and
|
||
offline verification. ACT addresses the same problem but is
|
||
encoded in JWT/JOSE (aligning with the broader IETF token
|
||
ecosystem) rather than raw canonical JSON, and its <code>pred</code> claim
|
||
admits DAG topologies rather than strictly linear chains.<a href="#section-1.4.1-6" class="pilcrow">¶</a></p>
|
||
<p id="section-1.4.1-7"><strong>SCITT Profile for AI Agent Execution Records
|
||
<span>[<a href="#I-D.emirdag-scitt-ai-agent-execution" class="cite xref">I-D.emirdag-scitt-ai-agent-execution</a>]</span></strong>: This draft
|
||
defines a SCITT profile in which AgentInteractionRecord (AIR)
|
||
payloads are carried as COSE_Sign1 statements anchored to a
|
||
SCITT Transparency Service. It is highly complementary to ACT:
|
||
where ACT defines the two-phase lifecycle token issued and
|
||
consumed by agents at runtime, the SCITT AI Agent Execution
|
||
draft defines the payload format suitable for long-term anchoring.
|
||
Implementations that anchor Phase 2 ACTs to SCITT
|
||
(<a href="#security-considerations" class="auto internal xref">Section 11</a>) <span class="bcp14">SHOULD</span> consider the AIR payload
|
||
structure defined in that draft as the canonical encoding for
|
||
anchored records.<a href="#section-1.4.1-7" class="pilcrow">¶</a></p>
|
||
</section>
|
||
</div>
|
||
</section>
|
||
</div>
|
||
<div id="applicability">
|
||
<section id="section-1.5">
|
||
<h3 id="name-applicability">
|
||
<a href="#section-1.5" class="section-number selfRef">1.5. </a><a href="#name-applicability" class="section-name selfRef">Applicability</a>
|
||
</h3>
|
||
<p id="section-1.5-1">ACT is designed as a general-purpose primitive for AI agent
|
||
authorization and execution accountability. While a sibling
|
||
specification <span>[<a href="#I-D.nennemann-wimse-ect" class="cite xref">I-D.nennemann-wimse-ect</a>]</span> profiles execution context
|
||
tokens specifically for the WIMSE working group's workload identity
|
||
infrastructure, ACT operates without any shared identity plane. This
|
||
section identifies deployment contexts where ACT applies independently
|
||
of WIMSE, and clarifies how ACT complements — rather than competes
|
||
with — ecosystem-specific agent protocols.<a href="#section-1.5-1" class="pilcrow">¶</a></p>
|
||
<div id="model-context-protocol-mcp-tool-use-flows">
|
||
<section id="section-1.5.1">
|
||
<h4 id="name-model-context-protocol-mcp-">
|
||
<a href="#section-1.5.1" class="section-number selfRef">1.5.1. </a><a href="#name-model-context-protocol-mcp-" class="section-name selfRef">Model Context Protocol (MCP) Tool-Use Flows</a>
|
||
</h4>
|
||
<p id="section-1.5.1-1">The Model Context Protocol <span>[<a href="#MCP-SPEC" class="cite xref">MCP-SPEC</a>]</span> defines a client-server
|
||
interface by which LLM hosts invoke external tools via structured
|
||
JSON-RPC calls. MCP 2025-11-25 mandates OAuth 2.1 for transport-layer
|
||
authentication, but provides no mechanism for carrying per-invocation
|
||
authorization constraints or for producing a tamper-evident record
|
||
of what arguments were passed and what result was returned.<a href="#section-1.5.1-1" class="pilcrow">¶</a></p>
|
||
<p id="section-1.5.1-2">ACT addresses this gap as follows: when an MCP host is about to
|
||
dispatch a tool call on behalf of an agent, it <span class="bcp14">SHOULD</span> issue a Phase 1
|
||
ACT Mandate encoding the permitted tool name (e.g., as a capability
|
||
constraint), the declaring scope, and any parameter-level constraints
|
||
applicable to that invocation. The MCP server, upon receiving the
|
||
request, <span class="bcp14">MAY</span> validate the ACT Mandate and, upon completing the tool
|
||
execution, <span class="bcp14">SHOULD</span> transition the token to Phase 2 by appending
|
||
SHA-256 hashes of the serialized input arguments and the JSON
|
||
response, then re-sign. The resulting Phase 2 ACT constitutes an
|
||
unforgeable record that a specific tool was called with specific
|
||
arguments and returned a specific result, independently of MCP's
|
||
OAuth layer.<a href="#section-1.5.1-2" class="pilcrow">¶</a></p>
|
||
<p id="section-1.5.1-3">This integration requires no modification to MCP transport; the ACT
|
||
<span class="bcp14">SHOULD</span> be carried in the <code>ACT-Mandate</code> and <code>ACT-Record</code> HTTP headers
|
||
defined in <a href="#http-header-transport" class="auto internal xref">Section 9.1</a> of this document.<a href="#section-1.5.1-3" class="pilcrow">¶</a></p>
|
||
</section>
|
||
</div>
|
||
<div id="openai-agents-sdk-and-function-calling">
|
||
<section id="section-1.5.2">
|
||
<h4 id="name-openai-agents-sdk-and-funct">
|
||
<a href="#section-1.5.2" class="section-number selfRef">1.5.2. </a><a href="#name-openai-agents-sdk-and-funct" class="section-name selfRef">OpenAI Agents SDK and Function Calling</a>
|
||
</h4>
|
||
<p id="section-1.5.2-1">The OpenAI Agents SDK <span>[<a href="#OPENAI-AGENTS-SDK" class="cite xref">OPENAI-AGENTS-SDK</a>]</span> enables composition of
|
||
agents via handoffs — structured transfers of control from one agent
|
||
to another, each potentially invoking registered function tools. The
|
||
SDK provides no built-in mechanism for a receiving agent to verify
|
||
that the handoff was authorized by a named principal, nor for the
|
||
invoking agent to produce a verifiable record of what functions it
|
||
called.<a href="#section-1.5.2-1" class="pilcrow">¶</a></p>
|
||
<p id="section-1.5.2-2">ACT is applicable at the handoff boundary: the orchestrating agent
|
||
<span class="bcp14">SHOULD</span> issue a Phase 1 ACT Mandate to the receiving agent at the
|
||
moment of handoff, encoding the permitted function set as
|
||
capability constraints and the maximum privilege the receiving agent
|
||
<span class="bcp14">MAY</span> exercise. The receiving agent <span class="bcp14">SHOULD</span> attach its Phase 2 ACT
|
||
Record to any callback or downstream response, providing the
|
||
orchestrator with cryptographic evidence of the actions taken. In
|
||
multi-turn chains involving multiple handoffs, the DAG linkage
|
||
(<a href="#dag-structure" class="auto internal xref">Section 7</a>) allows each handoff to be expressed as a
|
||
parent-child edge, preserving the full causal ordering of the agent
|
||
invocation sequence.<a href="#section-1.5.2-2" class="pilcrow">¶</a></p>
|
||
<p id="section-1.5.2-3">Implementations that use the OpenAI function calling API directly,
|
||
without the Agents SDK, <span class="bcp14">MAY</span> apply ACT at the application layer: the
|
||
calling process issues a Phase 1 ACT before the function call
|
||
parameter block is finalized, and the receiving function handler
|
||
returns a Phase 2 ACT alongside its JSON result.<a href="#section-1.5.2-3" class="pilcrow">¶</a></p>
|
||
</section>
|
||
</div>
|
||
<div id="langgraph-and-langchain-agent-graphs">
|
||
<section id="section-1.5.3">
|
||
<h4 id="name-langgraph-and-langchain-age">
|
||
<a href="#section-1.5.3" class="section-number selfRef">1.5.3. </a><a href="#name-langgraph-and-langchain-age" class="section-name selfRef">LangGraph and LangChain Agent Graphs</a>
|
||
</h4>
|
||
<p id="section-1.5.3-1">LangGraph <span>[<a href="#LANGGRAPH" class="cite xref">LANGGRAPH</a>]</span> models agent workflows as typed StateGraphs in
|
||
which nodes represent agent invocations or tool calls and edges
|
||
represent conditional transitions. The DAG structure of ACT
|
||
(<a href="#dag-structure" class="auto internal xref">Section 7</a>) is a natural fit for this model: each LangGraph
|
||
node that performs an observable action corresponds to exactly one
|
||
ACT task identifier (<code>tid</code>), and directed edges in the LangGraph
|
||
correspond to <code>pred</code> (predecessor) references in successor ACTs.<a href="#section-1.5.3-1" class="pilcrow">¶</a></p>
|
||
<p id="section-1.5.3-2">ACT is applicable at the node boundary: when a LangGraph node
|
||
dispatches a sub-agent or invokes a tool with side effects, it <span class="bcp14">SHOULD</span>
|
||
issue a Phase 1 ACT Mandate encoding the node's permitted actions
|
||
before any external call is made. Upon transition out of the node,
|
||
a Phase 2 ACT Record <span class="bcp14">SHOULD</span> be produced and attached to the
|
||
LangGraph state object alongside the node's output. Downstream nodes
|
||
that fan-in from multiple predecessors <span class="bcp14">MAY</span> retrieve the set of parent
|
||
ACT identifiers from the shared state to populate their <code>pred</code> array,
|
||
thereby expressing LangGraph's fan-in semantics within the ACT DAG
|
||
without any additional infrastructure.<a href="#section-1.5.3-2" class="pilcrow">¶</a></p>
|
||
<p id="section-1.5.3-3">In contrast to LangGraph's built-in state audit trail, which is
|
||
mutable in-process memory, Phase 2 ACTs are cryptographically signed
|
||
and portable: they can be exported from a LangGraph run and
|
||
submitted to an external audit ledger, satisfying compliance
|
||
requirements that cannot be met by in-process logging alone.<a href="#section-1.5.3-3" class="pilcrow">¶</a></p>
|
||
</section>
|
||
</div>
|
||
<div id="google-agent2agent-a2a-protocol">
|
||
<section id="section-1.5.4">
|
||
<h4 id="name-google-agent2agent-a2a-prot">
|
||
<a href="#section-1.5.4" class="section-number selfRef">1.5.4. </a><a href="#name-google-agent2agent-a2a-prot" class="section-name selfRef">Google Agent2Agent (A2A) Protocol</a>
|
||
</h4>
|
||
<p id="section-1.5.4-1">The Agent2Agent protocol <span>[<a href="#A2A-SPEC" class="cite xref">A2A-SPEC</a>]</span> defines a task-oriented JSON-RPC
|
||
interface for inter-agent communication, with authentication
|
||
delegated to OAuth 2.0 or API key schemes declared in each agent's
|
||
Agent Card. A2A provides no mechanism for a receiving agent to
|
||
verify the authorization provenance of a task request beyond the
|
||
transport-layer credential, and produces no token that represents
|
||
the execution of the task in a verifiable, portable form.<a href="#section-1.5.4-1" class="pilcrow">¶</a></p>
|
||
<p id="section-1.5.4-2">ACT is applicable as a session-layer accountability complement to
|
||
A2A: a client agent <span class="bcp14">SHOULD</span> include a Phase 1 ACT Mandate in the
|
||
<code>metadata</code> field of the A2A Task object, encoding the task type as
|
||
a capability constraint and the delegating agent's identity as the
|
||
ACT issuer. The receiving agent <span class="bcp14">SHOULD</span> validate the Mandate before
|
||
beginning task execution and <span class="bcp14">SHOULD</span> return a Phase 2 ACT Record
|
||
as an artifact in the A2A TaskResult, enabling the client agent to
|
||
retain cryptographic proof of what was executed on its behalf.<a href="#section-1.5.4-2" class="pilcrow">¶</a></p>
|
||
<p id="section-1.5.4-3">This integration does not require modification to A2A's transport or
|
||
authentication scheme; ACT and A2A's OAuth credentials operate at
|
||
independent layers and are not redundant. A2A's credential answers
|
||
"is this client permitted to contact this server?"; the ACT Mandate
|
||
answers "is this agent permitted to request this specific task
|
||
under these constraints?".<a href="#section-1.5.4-3" class="pilcrow">¶</a></p>
|
||
</section>
|
||
</div>
|
||
<div id="enterprise-orchestration-without-wimse-crewai-autogen">
|
||
<section id="section-1.5.5">
|
||
<h4 id="name-enterprise-orchestration-wi">
|
||
<a href="#section-1.5.5" class="section-number selfRef">1.5.5. </a><a href="#name-enterprise-orchestration-wi" class="section-name selfRef">Enterprise Orchestration Without WIMSE (CrewAI, AutoGen)</a>
|
||
</h4>
|
||
<p id="section-1.5.5-1">Enterprise orchestration frameworks such as CrewAI <span>[<a href="#CREWAI" class="cite xref">CREWAI</a>]</span> and
|
||
AutoGen <span>[<a href="#AUTOGEN" class="cite xref">AUTOGEN</a>]</span> deploy multi-agent systems within a single
|
||
organizational boundary, typically without SPIFFE/SPIRE workload
|
||
identity infrastructure. In these environments, OAuth Authorization
|
||
Servers are often unavailable or impractical to deploy for
|
||
intra-process agent communication.<a href="#section-1.5.5-1" class="pilcrow">¶</a></p>
|
||
<p id="section-1.5.5-2">ACT is applicable in this context via its Tier 1 (pre-shared key)
|
||
trust model (<a href="#tier1" class="auto internal xref">Section 5.2</a>): each agent role in a CrewAI Crew or
|
||
AutoGen ConversableAgent graph is assigned an Ed25519 keypair at
|
||
instantiation time. The orchestrating agent issues Phase 1 Mandates
|
||
to worker agents before delegating tasks, constraining each worker
|
||
to only the tools and actions relevant to its role. Worker agents
|
||
produce Phase 2 Records on task completion. The resulting ACT chain
|
||
is exportable as a structured audit trail that satisfies the
|
||
per-action logging requirements of DORA <span>[<a href="#DORA" class="cite xref">DORA</a>]</span> and EU AI Act
|
||
Article 12 <span>[<a href="#EUAIA" class="cite xref">EUAIA</a>]</span> without requiring shared infrastructure beyond
|
||
the ability to exchange public keys at deployment time.<a href="#section-1.5.5-2" class="pilcrow">¶</a></p>
|
||
<p id="section-1.5.5-3">Implementations <span class="bcp14">SHOULD NOT</span> use ACT's self-assertion mode (where an
|
||
agent issues and records its own mandate without external sign-off)
|
||
in regulated workflows; at minimum, the orchestrating agent <span class="bcp14">MUST</span>
|
||
sign the initial Mandate so that accountability is anchored to a
|
||
principal outside the executing agent.<a href="#section-1.5.5-3" class="pilcrow">¶</a></p>
|
||
</section>
|
||
</div>
|
||
<div id="relationship-to-wimse-ect">
|
||
<section id="section-1.5.6">
|
||
<h4 id="name-relationship-to-wimse-ect">
|
||
<a href="#section-1.5.6" class="section-number selfRef">1.5.6. </a><a href="#name-relationship-to-wimse-ect" class="section-name selfRef">Relationship to WIMSE ECT</a>
|
||
</h4>
|
||
<p id="section-1.5.6-1">Where WIMSE infrastructure is deployed, ACT and the WIMSE Execution
|
||
Context Token <span>[<a href="#I-D.nennemann-wimse-ect" class="cite xref">I-D.nennemann-wimse-ect</a>]</span> serve complementary and
|
||
non-overlapping functions. The ECT records workload-level execution
|
||
in WIMSE terms — which SPIFFE workload executed, in which trust
|
||
domain, against which service. ACT records the authorization
|
||
provenance — which agent was permitted to request which action,
|
||
under what capability constraints, by whose authority — and
|
||
transitions that authorization record into an execution record upon
|
||
task completion.<a href="#section-1.5.6-1" class="pilcrow">¶</a></p>
|
||
<p id="section-1.5.6-2">In mixed environments, both tokens <span class="bcp14">SHOULD</span> be carried simultaneously:
|
||
the <code>Workload-Identity</code> header carries the WIMSE ECT; the
|
||
<code>ACT-Record</code> header carries the ACT. Verifiers <span class="bcp14">MAY</span> correlate the
|
||
two by matching the ACT <code>tid</code> claim against application-layer
|
||
identifiers present in the ECT's task context. Neither token is a
|
||
profile or extension of the other; they operate at different
|
||
abstraction layers and their co-presence is additive.<a href="#section-1.5.6-2" class="pilcrow">¶</a></p>
|
||
</section>
|
||
</div>
|
||
</section>
|
||
</div>
|
||
</section>
|
||
</div>
|
||
<div id="conventions-and-definitions">
|
||
<section id="section-2">
|
||
<h2 id="name-conventions-and-definitions">
|
||
<a href="#section-2" class="section-number selfRef">2. </a><a href="#name-conventions-and-definitions" class="section-name selfRef">Conventions and Definitions</a>
|
||
</h2>
|
||
<p id="section-2-1">The key words "<span class="bcp14">MUST</span>", "<span class="bcp14">MUST NOT</span>", "<span class="bcp14">REQUIRED</span>", "<span class="bcp14">SHALL</span>", "<span class="bcp14">SHALL NOT</span>", "<span class="bcp14">SHOULD</span>", "<span class="bcp14">SHOULD NOT</span>", "<span class="bcp14">RECOMMENDED</span>", "<span class="bcp14">NOT RECOMMENDED</span>",
|
||
"<span class="bcp14">MAY</span>", and "<span class="bcp14">OPTIONAL</span>" in this document are to be interpreted as
|
||
described in BCP 14 <span>[<a href="#RFC2119" class="cite xref">RFC2119</a>]</span> <span>[<a href="#RFC8174" class="cite xref">RFC8174</a>]</span> when, and only when, they
|
||
appear in all capitals, as shown here.<a href="#section-2-1" class="pilcrow">¶</a></p>
|
||
<p id="section-2-2"><strong>Agent</strong>: An autonomous software entity that executes tasks, issues
|
||
ACTs as mandates for sub-agents, and produces ACTs as execution
|
||
records of its own actions.<a href="#section-2-2" class="pilcrow">¶</a></p>
|
||
<p id="section-2-3"><strong>Authorization Mandate</strong>: An ACT in Phase 1, encoding what an agent
|
||
is permitted to do, under what constraints, and by whose authority.<a href="#section-2-3" class="pilcrow">¶</a></p>
|
||
<p id="section-2-4"><strong>Execution Record</strong>: An ACT in Phase 2, encoding what an agent
|
||
actually did, including cryptographic hashes of inputs and outputs
|
||
and causal links to predecessor tasks.<a href="#section-2-4" class="pilcrow">¶</a></p>
|
||
<p id="section-2-5"><strong>Directed Acyclic Graph (DAG)</strong>: A graph structure representing task
|
||
dependency ordering where edges are directed and no cycles exist. Used
|
||
by ACT to model causal relationships between tasks in a workflow.<a href="#section-2-5" class="pilcrow">¶</a></p>
|
||
<p id="section-2-6"><strong>Delegation Chain</strong>: A cryptographically verifiable sequence of ACT
|
||
issuances from a root authority through one or more agents, each
|
||
signing a new ACT that reduces privileges relative to the one it
|
||
received.<a href="#section-2-6" class="pilcrow">¶</a></p>
|
||
<p id="section-2-7"><strong>Trust Tier</strong>: A level of key management infrastructure used to
|
||
establish the public key of an ACT issuer. Tiers range from
|
||
pre-shared keys (Tier 1, mandatory) to PKI (Tier 2) and DIDs
|
||
(Tier 3).<a href="#section-2-7" class="pilcrow">¶</a></p>
|
||
<p id="section-2-8"><strong>Workflow</strong>: A set of related tasks, identified by a shared <code>wid</code>
|
||
claim, forming a single logical unit of work.<a href="#section-2-8" class="pilcrow">¶</a></p>
|
||
</section>
|
||
</div>
|
||
<div id="act-lifecycle">
|
||
<section id="section-3">
|
||
<h2 id="name-act-lifecycle">
|
||
<a href="#section-3" class="section-number selfRef">3. </a><a href="#name-act-lifecycle" class="section-name selfRef">ACT Lifecycle</a>
|
||
</h2>
|
||
<p id="section-3-1">An ACT has a two-phase lifecycle. The same token format is used in
|
||
both phases; the presence or absence of execution claims determines
|
||
which phase a token represents.<a href="#section-3-1" class="pilcrow">¶</a></p>
|
||
<p id="section-3-2">A token is a <strong>Phase 2 Execution Record</strong> if and only if the claim
|
||
<code>exec_act</code> is present. A token that does not contain <code>exec_act</code> is
|
||
a <strong>Phase 1 Authorization Mandate</strong>. Verifiers <span class="bcp14">MUST</span> determine the
|
||
phase before applying verification rules, and <span class="bcp14">MUST</span> reject a token
|
||
that is presented in the wrong phase for the operation being
|
||
performed.<a href="#section-3-2" class="pilcrow">¶</a></p>
|
||
<div id="phase-1-authorization-mandate">
|
||
<section id="section-3.1">
|
||
<h3 id="name-phase-1-authorization-manda">
|
||
<a href="#section-3.1" class="section-number selfRef">3.1. </a><a href="#name-phase-1-authorization-manda" class="section-name selfRef">Phase 1: Authorization Mandate</a>
|
||
</h3>
|
||
<p id="section-3.1-1">In Phase 1, an ACT is created by a delegating agent (or a human
|
||
operator) to authorize a target agent to perform a specific task. The
|
||
token carries:<a href="#section-3.1-1" class="pilcrow">¶</a></p>
|
||
<ul class="normal">
|
||
<li class="normal" id="section-3.1-2.1">
|
||
<p id="section-3.1-2.1.1">The identity of the issuing agent and the target agent.<a href="#section-3.1-2.1.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li class="normal" id="section-3.1-2.2">
|
||
<p id="section-3.1-2.2.1">The capabilities granted, with associated constraints.<a href="#section-3.1-2.2.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li class="normal" id="section-3.1-2.3">
|
||
<p id="section-3.1-2.3.1">Human oversight requirements for high-impact actions.<a href="#section-3.1-2.3.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li class="normal" id="section-3.1-2.4">
|
||
<p id="section-3.1-2.4.1">The delegation provenance (who authorized the issuer to delegate).<a href="#section-3.1-2.4.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li class="normal" id="section-3.1-2.5">
|
||
<p id="section-3.1-2.5.1">A task identifier and declared purpose.<a href="#section-3.1-2.5.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
</ul>
|
||
<p id="section-3.1-3">The Phase 1 ACT is signed by the issuing agent using its private key.
|
||
The target agent receives the ACT and uses it as a bearer mandate —
|
||
evidence that it is authorized to proceed.<a href="#section-3.1-3" class="pilcrow">¶</a></p>
|
||
<p id="section-3.1-4">Phase 1 ACTs are short-lived. Implementations <span class="bcp14">SHOULD</span> set expiration
|
||
(<code>exp</code>) to no more than 15 minutes after issuance (<code>iat</code>) for
|
||
automated agent-to-agent workflows. Longer lifetimes <span class="bcp14">MAY</span> be used for
|
||
human-initiated mandates where the agent may not act immediately.<a href="#section-3.1-4" class="pilcrow">¶</a></p>
|
||
</section>
|
||
</div>
|
||
<div id="phase-2-execution-record">
|
||
<section id="section-3.2">
|
||
<h3 id="name-phase-2-execution-record">
|
||
<a href="#section-3.2" class="section-number selfRef">3.2. </a><a href="#name-phase-2-execution-record" class="section-name selfRef">Phase 2: Execution Record</a>
|
||
</h3>
|
||
<p id="section-3.2-1">Upon completing the authorized task, the executing agent <span class="bcp14">MUST</span>
|
||
transition the ACT to Phase 2 by:<a href="#section-3.2-1" class="pilcrow">¶</a></p>
|
||
<ol start="1" type="1" class="normal type-1" id="section-3.2-2">
|
||
<li id="section-3.2-2.1">
|
||
<p id="section-3.2-2.1.1">Adding the <code>exec_act</code> claim describing the action performed.<a href="#section-3.2-2.1.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li id="section-3.2-2.2">
|
||
<p id="section-3.2-2.2.1">Optionally adding <code>inp_hash</code> and/or <code>out_hash</code> SHA-256 hashes
|
||
of task inputs and outputs (<span class="bcp14">RECOMMENDED</span> for regulated environments).<a href="#section-3.2-2.2.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li id="section-3.2-2.3">
|
||
<p id="section-3.2-2.3.1">Adding the <code>pred</code> array referencing predecessor task identifiers (DAG
|
||
dependencies).<a href="#section-3.2-2.3.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li id="section-3.2-2.4">
|
||
<p id="section-3.2-2.4.1">Adding <code>exec_ts</code> and <code>status</code> claims.<a href="#section-3.2-2.4.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li id="section-3.2-2.5">
|
||
<p id="section-3.2-2.5.1">Re-signing the complete token with its own private key.<a href="#section-3.2-2.5.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
</ol>
|
||
<p id="section-3.2-3">The re-signing is critical: it produces a new signature over the
|
||
combined authorization + execution claims, binding the executing
|
||
agent's cryptographic identity to both the mandate it received and
|
||
the execution it performed. This creates a single, non-repudiable
|
||
record that answers both "was this agent authorized?" and "what
|
||
did it do?"<a href="#section-3.2-3" class="pilcrow">¶</a></p>
|
||
<p id="section-3.2-4">Note on issuer signature preservation: re-signing replaces the
|
||
Phase 1 signature produced by the issuing agent (<code>iss</code>). The
|
||
integrity of the original mandate is preserved through the
|
||
<code>del.chain</code> mechanism: the chain entry's <code>sig</code> field is the <code>iss</code>
|
||
agent's signature over the Phase 1 ACT, and this signature remains
|
||
intact and verifiable in the Phase 2 token. For root mandates where
|
||
<code>del.chain</code> is empty, the issuer's signature is not independently
|
||
preserved in Phase 2. Deployments requiring independent
|
||
verifiability of the original mandate <span class="bcp14">SHOULD</span> retain the Phase 1
|
||
ACT separately alongside the Phase 2 record.<a href="#section-3.2-4" class="pilcrow">¶</a></p>
|
||
<p id="section-3.2-5">The resulting Phase 2 ACT <span class="bcp14">SHOULD</span> be submitted to an audit ledger
|
||
(<a href="#audit-ledger" class="auto internal xref">Section 10</a>) and <span class="bcp14">MAY</span> be sent to the next agent in the workflow
|
||
as evidence of completed prerequisites.<a href="#section-3.2-5" class="pilcrow">¶</a></p>
|
||
</section>
|
||
</div>
|
||
<div id="lifecycle-state-machine">
|
||
<section id="section-3.3">
|
||
<h3 id="name-lifecycle-state-machine">
|
||
<a href="#section-3.3" class="section-number selfRef">3.3. </a><a href="#name-lifecycle-state-machine" class="section-name selfRef">Lifecycle State Machine</a>
|
||
</h3>
|
||
<div class="alignLeft art-text artwork" id="section-3.3-1">
|
||
<pre>
|
||
[Issuer creates Phase 1 ACT]
|
||
|
|
||
| sign(issuer_key)
|
||
v
|
||
+------------------+
|
||
| MANDATE | Phase 1: Authorization Mandate
|
||
| (unsigned by | Carried as bearer token by target agent
|
||
| target agent) |
|
||
+------------------+
|
||
|
|
||
| Target agent executes task
|
||
| adds exec_act, inp_hash, out_hash, pred
|
||
| re-signs with target_agent_key
|
||
v
|
||
+------------------+
|
||
| RECORD | Phase 2: Execution Record
|
||
| (signed by | Submitted to ledger, passed to next agent
|
||
| target agent) |
|
||
+------------------+
|
||
|
|
||
| (optional) anchor to SCITT Transparency Service
|
||
v
|
||
+------------------+
|
||
| ANCHORED | Phase 2 + external non-equivocation
|
||
+------------------+
|
||
</pre><a href="#section-3.3-1" class="pilcrow">¶</a>
|
||
</div>
|
||
</section>
|
||
</div>
|
||
</section>
|
||
</div>
|
||
<div id="act-token-format">
|
||
<section id="section-4">
|
||
<h2 id="name-act-token-format">
|
||
<a href="#section-4" class="section-number selfRef">4. </a><a href="#name-act-token-format" class="section-name selfRef">ACT Token Format</a>
|
||
</h2>
|
||
<p id="section-4-1">An ACT is a JSON Web Token <span>[<a href="#RFC7519" class="cite xref">RFC7519</a>]</span> signed as a JSON Web Signature
|
||
<span>[<a href="#RFC7515" class="cite xref">RFC7515</a>]</span> using JWS Compact Serialization. All ACTs <span class="bcp14">MUST</span> use JWS
|
||
Compact Serialization to ensure they can be carried in a single HTTP
|
||
header value.<a href="#section-4-1" class="pilcrow">¶</a></p>
|
||
<div id="jose-header">
|
||
<section id="section-4.1">
|
||
<h3 id="name-jose-header">
|
||
<a href="#section-4.1" class="section-number selfRef">4.1. </a><a href="#name-jose-header" class="section-name selfRef">JOSE Header</a>
|
||
</h3>
|
||
<p id="section-4.1-1">The ACT JOSE header <span class="bcp14">MUST</span> contain:<a href="#section-4.1-1" class="pilcrow">¶</a></p>
|
||
<div class="lang-json sourcecode" id="section-4.1-2">
|
||
<pre>
|
||
{
|
||
"alg": "ES256",
|
||
"typ": "act+jwt",
|
||
"kid": "agent-a-key-2026-03"
|
||
}
|
||
</pre><a href="#section-4.1-2" class="pilcrow">¶</a>
|
||
</div>
|
||
<p id="section-4.1-3"><strong>alg</strong> (<span class="bcp14">REQUIRED</span>): The digital signature algorithm. Implementations
|
||
<span class="bcp14">MUST</span> support ES256 <span>[<a href="#RFC7518" class="cite xref">RFC7518</a>]</span>. EdDSA (Ed25519) <span>[<a href="#RFC8037" class="cite xref">RFC8037</a>]</span> is
|
||
<span class="bcp14">RECOMMENDED</span> for new deployments due to smaller signatures and
|
||
resistance to side-channel attacks. Symmetric algorithms (HS256,
|
||
HS384, HS512) <span class="bcp14">MUST NOT</span> be used. The "alg" value <span class="bcp14">MUST NOT</span> be "none".<a href="#section-4.1-3" class="pilcrow">¶</a></p>
|
||
<p id="section-4.1-4"><strong>typ</strong> (<span class="bcp14">REQUIRED</span>): <span class="bcp14">MUST</span> be "act+jwt" to distinguish ACTs from other
|
||
JWT types.<a href="#section-4.1-4" class="pilcrow">¶</a></p>
|
||
<p id="section-4.1-5"><strong>kid</strong> (<span class="bcp14">REQUIRED</span>): An identifier for the signing key. In Tier 1
|
||
deployments (pre-shared keys), this is an opaque string agreed
|
||
out-of-band. In Tier 2 deployments (PKI), this is the X.509
|
||
certificate thumbprint. In Tier 3 deployments (DID), this is the
|
||
DID key fragment (e.g., <code>did:key:z6Mk...#key-1</code>).<a href="#section-4.1-5" class="pilcrow">¶</a></p>
|
||
<p id="section-4.1-6"><strong>x5c</strong> (<span class="bcp14">OPTIONAL</span>): In Tier 2 deployments, the X.509 certificate
|
||
chain <span class="bcp14">MAY</span> be included to enable verification without out-of-band
|
||
key distribution.<a href="#section-4.1-6" class="pilcrow">¶</a></p>
|
||
<p id="section-4.1-7"><strong>did</strong> (<span class="bcp14">OPTIONAL</span>): In Tier 3 deployments, the full DID of the
|
||
issuing agent <span class="bcp14">MAY</span> be included for resolution.<a href="#section-4.1-7" class="pilcrow">¶</a></p>
|
||
</section>
|
||
</div>
|
||
<div id="jwt-claims-authorization-phase">
|
||
<section id="section-4.2">
|
||
<h3 id="name-jwt-claims-authorization-ph">
|
||
<a href="#section-4.2" class="section-number selfRef">4.2. </a><a href="#name-jwt-claims-authorization-ph" class="section-name selfRef">JWT Claims: Authorization Phase</a>
|
||
</h3>
|
||
<div id="standard-jwt-claims">
|
||
<section id="section-4.2.1">
|
||
<h4 id="name-standard-jwt-claims">
|
||
<a href="#section-4.2.1" class="section-number selfRef">4.2.1. </a><a href="#name-standard-jwt-claims" class="section-name selfRef">Standard JWT Claims</a>
|
||
</h4>
|
||
<p id="section-4.2.1-1"><strong>iss</strong> (<span class="bcp14">REQUIRED</span>): The identifier of the agent issuing the mandate.
|
||
Format depends on trust tier: an opaque string (Tier 1), an X.509
|
||
Subject DN (Tier 2), or a DID (Tier 3).<a href="#section-4.2.1-1" class="pilcrow">¶</a></p>
|
||
<p id="section-4.2.1-2"><strong>sub</strong> (<span class="bcp14">REQUIRED</span>): The identifier of the agent authorized to act.
|
||
<span class="bcp14">MUST</span> use the same format convention as <code>iss</code>.<a href="#section-4.2.1-2" class="pilcrow">¶</a></p>
|
||
<p id="section-4.2.1-3"><strong>aud</strong> (<span class="bcp14">REQUIRED</span>): The intended recipient(s). <span class="bcp14">MUST</span> include the
|
||
identifier of the target agent (<code>sub</code>). When an audit ledger is
|
||
deployed, <span class="bcp14">MUST</span> also include the ledger's identifier. When multiple
|
||
recipients are present, <span class="bcp14">MUST</span> be an array. Verifiers that are audit
|
||
ledgers <span class="bcp14">MUST</span> verify that their own identifier appears in <code>aud</code>.<a href="#section-4.2.1-3" class="pilcrow">¶</a></p>
|
||
<p id="section-4.2.1-4"><strong>iat</strong> (<span class="bcp14">REQUIRED</span>): Issuance time as a NumericDate <span>[<a href="#RFC7519" class="cite xref">RFC7519</a>]</span>.<a href="#section-4.2.1-4" class="pilcrow">¶</a></p>
|
||
<p id="section-4.2.1-5"><strong>exp</strong> (<span class="bcp14">REQUIRED</span>): Expiration time. Implementations <span class="bcp14">SHOULD</span> set to
|
||
no more than 15 minutes after <code>iat</code> for automated workflows.<a href="#section-4.2.1-5" class="pilcrow">¶</a></p>
|
||
<p id="section-4.2.1-6"><strong>jti</strong> (<span class="bcp14">REQUIRED</span>): A UUID <span>[<a href="#RFC9562" class="cite xref">RFC9562</a>]</span> uniquely identifying this ACT
|
||
and, in Phase 2, the task it records. Used as the task identifier
|
||
for DAG predecessor references in <code>pred</code>.<a href="#section-4.2.1-6" class="pilcrow">¶</a></p>
|
||
</section>
|
||
</div>
|
||
<div id="act-authorization-claims">
|
||
<section id="section-4.2.2">
|
||
<h4 id="name-act-authorization-claims">
|
||
<a href="#section-4.2.2" class="section-number selfRef">4.2.2. </a><a href="#name-act-authorization-claims" class="section-name selfRef">ACT Authorization Claims</a>
|
||
</h4>
|
||
<p id="section-4.2.2-1"><strong>wid</strong> (<span class="bcp14">OPTIONAL</span>): A UUID identifying the workflow to which this
|
||
task belongs. When present, groups related ACTs and scopes <code>jti</code>
|
||
uniqueness to the workflow.<a href="#section-4.2.2-1" class="pilcrow">¶</a></p>
|
||
<p id="section-4.2.2-2"><strong>task</strong> (<span class="bcp14">REQUIRED</span>): An object describing the authorized task:<a href="#section-4.2.2-2" class="pilcrow">¶</a></p>
|
||
<div class="lang-json sourcecode" id="section-4.2.2-3">
|
||
<pre>
|
||
{
|
||
"task": {
|
||
"purpose": "validate_patient_dosage",
|
||
"data_sensitivity": "restricted",
|
||
"created_by": "operator:clinical-admin-01",
|
||
"expires_at": 1772064750
|
||
}
|
||
}
|
||
</pre><a href="#section-4.2.2-3" class="pilcrow">¶</a>
|
||
</div>
|
||
<ul class="normal">
|
||
<li class="normal" id="section-4.2.2-4.1">
|
||
<p id="section-4.2.2-4.1.1"><code>purpose</code> (<span class="bcp14">REQUIRED</span>): A string describing the intended task.
|
||
Implementations <span class="bcp14">SHOULD</span> use a controlled vocabulary or reverse-
|
||
domain notation (e.g., "com.example.validate_dosage") to enable
|
||
semantic consistency checking by the receiving agent.<a href="#section-4.2.2-4.1.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li class="normal" id="section-4.2.2-4.2">
|
||
<p id="section-4.2.2-4.2.1"><code>data_sensitivity</code> (<span class="bcp14">OPTIONAL</span>): One of "public", "internal",
|
||
"confidential", "restricted". Receiving agents <span class="bcp14">MUST NOT</span> perform
|
||
actions that would expose data above this classification.<a href="#section-4.2.2-4.2.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li class="normal" id="section-4.2.2-4.3">
|
||
<p id="section-4.2.2-4.3.1"><code>created_by</code> (<span class="bcp14">OPTIONAL</span>): An identifier for the human or system
|
||
that initiated the workflow. <span class="bcp14">SHOULD</span> be pseudonymous (see
|
||
<a href="#privacy-considerations" class="auto internal xref">Section 12</a>).<a href="#section-4.2.2-4.3.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li class="normal" id="section-4.2.2-4.4">
|
||
<p id="section-4.2.2-4.4.1"><code>expires_at</code> (<span class="bcp14">OPTIONAL</span>): A NumericDate after which the task
|
||
mandate is no longer valid, independent of <code>exp</code>.<a href="#section-4.2.2-4.4.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
</ul>
|
||
<p id="section-4.2.2-5"><strong>cap</strong> (<span class="bcp14">REQUIRED</span>): An array of capability objects, each specifying
|
||
an action the agent is authorized to perform and the constraints
|
||
under which it may do so:<a href="#section-4.2.2-5" class="pilcrow">¶</a></p>
|
||
<div class="lang-json sourcecode" id="section-4.2.2-6">
|
||
<pre>
|
||
{
|
||
"cap": [
|
||
{
|
||
"action": "read.patient_record",
|
||
"constraints": {
|
||
"patient_id_scope": "current_task_only",
|
||
"max_records": 1,
|
||
"data_classification_max": "restricted"
|
||
}
|
||
},
|
||
{
|
||
"action": "write.dosage_recommendation",
|
||
"constraints": {
|
||
"status": "draft_only"
|
||
}
|
||
}
|
||
]
|
||
}
|
||
</pre><a href="#section-4.2.2-6" class="pilcrow">¶</a>
|
||
</div>
|
||
<p id="section-4.2.2-7">Action names <span class="bcp14">MUST</span> conform to the ABNF grammar:<a href="#section-4.2.2-7" class="pilcrow">¶</a></p>
|
||
<div class="alignLeft art-text artwork" id="section-4.2.2-8">
|
||
<pre>
|
||
action-name = component *( "." component )
|
||
component = ALPHA *( ALPHA / DIGIT / "-" / "_" )
|
||
</pre><a href="#section-4.2.2-8" class="pilcrow">¶</a>
|
||
</div>
|
||
<p id="section-4.2.2-9">Receiving agents <span class="bcp14">MUST</span> perform exact string matching on action names.
|
||
Wildcard matching is NOT part of this specification.<a href="#section-4.2.2-9" class="pilcrow">¶</a></p>
|
||
<p id="section-4.2.2-10">When multiple capabilities match the same action, OR semantics
|
||
apply: if ANY capability grants the action, the request is
|
||
authorized subject to that capability's constraints. When multiple
|
||
constraints exist within a single capability, AND semantics apply:
|
||
ALL constraints <span class="bcp14">MUST</span> be satisfied. When the same constraint key
|
||
appears in both a capability-level and a policy-level context, the
|
||
more restrictive value applies: lower numeric limits, narrower
|
||
allow-lists (intersection), broader block-lists (union), and
|
||
narrower time windows.<a href="#section-4.2.2-10" class="pilcrow">¶</a></p>
|
||
<p id="section-4.2.2-11"><strong>oversight</strong> (<span class="bcp14">OPTIONAL</span>): Human oversight requirements:<a href="#section-4.2.2-11" class="pilcrow">¶</a></p>
|
||
<div class="lang-json sourcecode" id="section-4.2.2-12">
|
||
<pre>
|
||
{
|
||
"oversight": {
|
||
"requires_approval_for": ["write.publish", "execute.payment"],
|
||
"approval_ref": "https://approval.example.com/workflow/w-123"
|
||
}
|
||
}
|
||
</pre><a href="#section-4.2.2-12" class="pilcrow">¶</a>
|
||
</div>
|
||
<p id="section-4.2.2-13">When <code>requires_approval_for</code> lists an action, the receiving agent
|
||
<span class="bcp14">MUST NOT</span> execute that action autonomously. The approval mechanism
|
||
is out of scope for this specification.<a href="#section-4.2.2-13" class="pilcrow">¶</a></p>
|
||
<p id="section-4.2.2-14"><strong>del</strong> (<span class="bcp14">OPTIONAL</span>): Delegation provenance, establishing the chain
|
||
of authority from the root mandate to this ACT. If <code>del</code> is absent,
|
||
the ACT <span class="bcp14">MUST</span> be treated as a root mandate with <code>depth</code> = 0 and
|
||
further delegation is not permitted (i.e., the receiving agent <span class="bcp14">MUST NOT</span> issue sub-mandates based on this ACT).<a href="#section-4.2.2-14" class="pilcrow">¶</a></p>
|
||
<div class="lang-json sourcecode" id="section-4.2.2-15">
|
||
<pre>
|
||
{
|
||
"del": {
|
||
"depth": 1,
|
||
"max_depth": 3,
|
||
"chain": [
|
||
{
|
||
"delegator": "did:key:z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK",
|
||
"jti": "550e8400-e29b-41d4-a716-446655440000",
|
||
"sig": "base64url-encoded-signature-of-parent-act-hash"
|
||
}
|
||
]
|
||
}
|
||
}
|
||
</pre><a href="#section-4.2.2-15" class="pilcrow">¶</a>
|
||
</div>
|
||
<ul class="normal">
|
||
<li class="normal" id="section-4.2.2-16.1">
|
||
<p id="section-4.2.2-16.1.1"><code>depth</code>: The current delegation depth. 0 means this is a root
|
||
mandate issued by a human or root authority.<a href="#section-4.2.2-16.1.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li class="normal" id="section-4.2.2-16.2">
|
||
<p id="section-4.2.2-16.2.1"><code>max_depth</code>: The maximum permitted delegation depth. Receiving
|
||
agents <span class="bcp14">MUST NOT</span> issue sub-mandates that would exceed this depth.<a href="#section-4.2.2-16.2.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li class="normal" id="section-4.2.2-16.3">
|
||
<p id="section-4.2.2-16.3.1"><code>chain</code>: An array of delegation provenance records ordered from
|
||
root to immediate parent (<code>chain[0]</code> is the root authority,
|
||
<code>chain[depth-1]</code> is the direct parent of this ACT). Each entry
|
||
contains:<a href="#section-4.2.2-16.3.1" class="pilcrow">¶</a></p>
|
||
<ul class="normal">
|
||
<li class="normal" id="section-4.2.2-16.3.2.1">
|
||
<p id="section-4.2.2-16.3.2.1.1"><code>delegator</code>: The identifier of the agent that authorized this
|
||
delegation step (i.e., the <code>iss</code> of the parent ACT at that
|
||
depth).<a href="#section-4.2.2-16.3.2.1.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li class="normal" id="section-4.2.2-16.3.2.2">
|
||
<p id="section-4.2.2-16.3.2.2.1"><code>jti</code>: The <code>jti</code> of the parent ACT that authorized this
|
||
delegation step.<a href="#section-4.2.2-16.3.2.2.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li class="normal" id="section-4.2.2-16.3.2.3">
|
||
<p id="section-4.2.2-16.3.2.3.1"><code>sig</code>: The delegating agent's signature over the SHA-256 hash
|
||
of that parent ACT, providing cryptographic linkage without
|
||
requiring the full parent ACT to be transmitted.<a href="#section-4.2.2-16.3.2.3.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
<p id="section-4.2.2-17">The <code>sig</code> field in each chain entry is the critical departure from
|
||
AAP's delegation model: rather than requiring a central AS to
|
||
validate the chain, any verifier holding the delegating agent's
|
||
public key can independently verify each step by recomputing the
|
||
hash and checking the signature.<a href="#section-4.2.2-17" class="pilcrow">¶</a></p>
|
||
</section>
|
||
</div>
|
||
</section>
|
||
</div>
|
||
<div id="jwt-claims-execution-phase">
|
||
<section id="section-4.3">
|
||
<h3 id="name-jwt-claims-execution-phase">
|
||
<a href="#section-4.3" class="section-number selfRef">4.3. </a><a href="#name-jwt-claims-execution-phase" class="section-name selfRef">JWT Claims: Execution Phase</a>
|
||
</h3>
|
||
<p id="section-4.3-1">The following claims are added by the executing agent when
|
||
transitioning to Phase 2. Their presence distinguishes an Execution
|
||
Record from an Authorization Mandate.<a href="#section-4.3-1" class="pilcrow">¶</a></p>
|
||
<p id="section-4.3-2"><strong>exec_act</strong> (<span class="bcp14">REQUIRED</span> in Phase 2): A string identifying the action
|
||
actually performed. <span class="bcp14">MUST</span> conform to the same ABNF grammar as
|
||
capability action names. <span class="bcp14">MUST</span> match one of the <code>action</code> values in
|
||
the <code>cap</code> array of the Phase 1 claims.<a href="#section-4.3-2" class="pilcrow">¶</a></p>
|
||
<p id="section-4.3-3"><strong>pred</strong> (<span class="bcp14">REQUIRED</span> in Phase 2): An array of <code>jti</code> values of predecessor
|
||
tasks in the DAG. An empty array indicates a root task. Each value
|
||
<span class="bcp14">MUST</span> be the <code>jti</code> of a previously verified ACT (Phase 2) within
|
||
the same workflow (same <code>wid</code>) or the global ACT store if <code>wid</code> is
|
||
absent.<a href="#section-4.3-3" class="pilcrow">¶</a></p>
|
||
<p id="section-4.3-4"><strong>inp_hash</strong> (<span class="bcp14">OPTIONAL</span>): The base64url encoding (without padding) of
|
||
the SHA-256 hash of the task's input data, computed over the raw
|
||
octets of the serialized input. Provides cryptographic evidence of
|
||
what data the agent processed.<a href="#section-4.3-4" class="pilcrow">¶</a></p>
|
||
<p id="section-4.3-5"><strong>out_hash</strong> (<span class="bcp14">OPTIONAL</span>): The base64url encoding (without padding) of
|
||
the SHA-256 hash of the task's output data, using the same format
|
||
as <code>inp_hash</code>. Provides cryptographic evidence of what data the
|
||
agent produced.<a href="#section-4.3-5" class="pilcrow">¶</a></p>
|
||
<p id="section-4.3-6"><strong>exec_ts</strong> (<span class="bcp14">REQUIRED</span> in Phase 2): A NumericDate recording the
|
||
actual time of task execution. <span class="bcp14">MAY</span> differ from <code>iat</code> when the agent
|
||
queued the mandate before execution. <span class="bcp14">MUST</span> be greater than or equal
|
||
to <code>iat</code>. <span class="bcp14">SHOULD</span> be less than or equal to <code>exp</code>; execution after
|
||
mandate expiry is possible when tasks are long-running and <span class="bcp14">MUST NOT</span>
|
||
cause automatic rejection, but implementors <span class="bcp14">SHOULD</span> log a warning.<a href="#section-4.3-6" class="pilcrow">¶</a></p>
|
||
<p id="section-4.3-7"><strong>status</strong> (<span class="bcp14">REQUIRED</span> in Phase 2): One of "completed", "failed",
|
||
"partial". Allows audit systems to distinguish successful execution
|
||
from partial or failed attempts, which is essential for regulated
|
||
environments where failed attempts must be recorded.<a href="#section-4.3-7" class="pilcrow">¶</a></p>
|
||
<p id="section-4.3-8"><strong>err</strong> (<span class="bcp14">OPTIONAL</span>, present when <code>status</code> is "failed" or "partial"):
|
||
An object providing error context:<a href="#section-4.3-8" class="pilcrow">¶</a></p>
|
||
<div class="lang-json sourcecode" id="section-4.3-9">
|
||
<pre>
|
||
{
|
||
"err": {
|
||
"code": "constraint_violation",
|
||
"detail": "data_classification_max exceeded"
|
||
}
|
||
}
|
||
</pre><a href="#section-4.3-9" class="pilcrow">¶</a>
|
||
</div>
|
||
<p id="section-4.3-10">Error detail <span class="bcp14">SHOULD NOT</span> reveal internal system state beyond what is
|
||
necessary for audit purposes.<a href="#section-4.3-10" class="pilcrow">¶</a></p>
|
||
</section>
|
||
</div>
|
||
<div id="complete-examples">
|
||
<section id="section-4.4">
|
||
<h3 id="name-complete-examples">
|
||
<a href="#section-4.4" class="section-number selfRef">4.4. </a><a href="#name-complete-examples" class="section-name selfRef">Complete Examples</a>
|
||
</h3>
|
||
<div id="example-phase-1-authorization-mandate">
|
||
<section id="section-4.4.1">
|
||
<h4 id="name-example-phase-1-authorizati">
|
||
<a href="#section-4.4.1" class="section-number selfRef">4.4.1. </a><a href="#name-example-phase-1-authorizati" class="section-name selfRef">Example: Phase 1 — Authorization Mandate</a>
|
||
</h4>
|
||
<div class="alignLeft art-text artwork" id="section-4.4.1-1">
|
||
<pre>
|
||
{
|
||
"alg": "ES256",
|
||
"typ": "act+jwt",
|
||
"kid": "agent-clinical-key-2026-03"
|
||
}
|
||
.
|
||
{
|
||
"iss": "did:key:z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK",
|
||
"sub": "did:key:z6MknGc3omCyas4b1GmEn4xySHgLuSHxrKrUBnrhJekxZHFz",
|
||
"aud": [
|
||
"did:key:z6MknGc3omCyas4b1GmEn4xySHgLuSHxrKrUBnrhJekxZHFz",
|
||
"https://ledger.hospital.example.com"
|
||
],
|
||
"iat": 1772064000,
|
||
"exp": 1772064900,
|
||
"jti": "550e8400-e29b-41d4-a716-446655440001",
|
||
|
||
"wid": "a0b1c2d3-e4f5-6789-abcd-ef0123456789",
|
||
|
||
"task": {
|
||
"purpose": "validate_treatment_recommendation",
|
||
"data_sensitivity": "restricted",
|
||
"created_by": "operator:clinical-admin-01"
|
||
},
|
||
|
||
"cap": [
|
||
{
|
||
"action": "read.patient_record",
|
||
"constraints": {
|
||
"patient_id_scope": "current_task_only",
|
||
"max_records": 1
|
||
}
|
||
},
|
||
{
|
||
"action": "write.safety_assessment",
|
||
"constraints": {
|
||
"status": "draft_only"
|
||
}
|
||
}
|
||
],
|
||
|
||
"oversight": {
|
||
"requires_approval_for": ["write.publish_assessment"]
|
||
},
|
||
|
||
"del": {
|
||
"depth": 0,
|
||
"max_depth": 2,
|
||
"chain": []
|
||
}
|
||
}
|
||
</pre><a href="#section-4.4.1-1" class="pilcrow">¶</a>
|
||
</div>
|
||
</section>
|
||
</div>
|
||
<div id="example-phase-2-execution-record-same-token-re-signed-by-target-agent">
|
||
<section id="section-4.4.2">
|
||
<h4 id="name-example-phase-2-execution-r">
|
||
<a href="#section-4.4.2" class="section-number selfRef">4.4.2. </a><a href="#name-example-phase-2-execution-r" class="section-name selfRef">Example: Phase 2 — Execution Record (same token, re-signed by target agent)</a>
|
||
</h4>
|
||
<div class="alignLeft art-text artwork" id="section-4.4.2-1">
|
||
<pre>
|
||
{
|
||
"alg": "EdDSA",
|
||
"typ": "act+jwt",
|
||
"kid": "agent-safety-key-2026-03"
|
||
}
|
||
.
|
||
{
|
||
"iss": "did:key:z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK",
|
||
"sub": "did:key:z6MknGc3omCyas4b1GmEn4xySHgLuSHxrKrUBnrhJekxZHFz",
|
||
"aud": [
|
||
"did:key:z6MknGc3omCyas4b1GmEn4xySHgLuSHxrKrUBnrhJekxZHFz",
|
||
"https://ledger.hospital.example.com"
|
||
],
|
||
"iat": 1772064000,
|
||
"exp": 1772064900,
|
||
"jti": "550e8400-e29b-41d4-a716-446655440001",
|
||
|
||
"wid": "a0b1c2d3-e4f5-6789-abcd-ef0123456789",
|
||
|
||
"task": {
|
||
"purpose": "validate_treatment_recommendation",
|
||
"data_sensitivity": "restricted",
|
||
"created_by": "operator:clinical-admin-01"
|
||
},
|
||
|
||
"cap": [
|
||
{
|
||
"action": "read.patient_record",
|
||
"constraints": {
|
||
"patient_id_scope": "current_task_only",
|
||
"max_records": 1
|
||
}
|
||
},
|
||
{
|
||
"action": "write.safety_assessment",
|
||
"constraints": {
|
||
"status": "draft_only"
|
||
}
|
||
}
|
||
],
|
||
|
||
"oversight": {
|
||
"requires_approval_for": ["write.publish_assessment"]
|
||
},
|
||
|
||
"del": {
|
||
"depth": 0,
|
||
"max_depth": 2,
|
||
"chain": []
|
||
},
|
||
|
||
"exec_act": "write.safety_assessment",
|
||
"pred": ["550e8400-e29b-41d4-a716-446655440000"],
|
||
"inp_hash": "n4bQgYhMfWWaL-qgxVrQFaO_TxsrC4Is0V1sFbDwCgg",
|
||
"out_hash": "LCa0a2j_xo_5m0U8HTBBNBNCLXBkg7-g-YpeiGJm564",
|
||
"exec_ts": 1772064300,
|
||
"status": "completed"
|
||
}
|
||
</pre><a href="#section-4.4.2-1" class="pilcrow">¶</a>
|
||
</div>
|
||
</section>
|
||
</div>
|
||
</section>
|
||
</div>
|
||
</section>
|
||
</div>
|
||
<div id="trust-model">
|
||
<section id="section-5">
|
||
<h2 id="name-trust-model">
|
||
<a href="#section-5" class="section-number selfRef">5. </a><a href="#name-trust-model" class="section-name selfRef">Trust Model</a>
|
||
</h2>
|
||
<p id="section-5-1">ACT defines four trust tiers. Tier 1 is mandatory-to-implement; all
|
||
others are optional upgrades. An ACT verifier <span class="bcp14">MUST</span> be able to process
|
||
ACTs from any tier it has configured. The trust tier in use is
|
||
determined by the <code>kid</code> format and the presence of <code>x5c</code> or <code>did</code>
|
||
header parameters.<a href="#section-5-1" class="pilcrow">¶</a></p>
|
||
<div id="tier-0-bootstrap-tofu-trust-on-first-use">
|
||
<section id="section-5.1">
|
||
<h3 id="name-tier-0-bootstrap-tofu-trust">
|
||
<a href="#section-5.1" class="section-number selfRef">5.1. </a><a href="#name-tier-0-bootstrap-tofu-trust" class="section-name selfRef">Tier 0: Bootstrap (TOFU — Trust On First Use)</a>
|
||
</h3>
|
||
<p id="section-5.1-1">Tier 0 is NOT part of the normative trust model and <span class="bcp14">MUST NOT</span> be used
|
||
in regulated environments. It is defined here for documentation
|
||
purposes only, to describe the common bootstrapping scenario.<a href="#section-5.1-1" class="pilcrow">¶</a></p>
|
||
<p id="section-5.1-2">In Tier 0, the first ACT received from an agent establishes its
|
||
public key. This is equivalent to SSH TOFU behavior: an attacker
|
||
who intercepts the first message can substitute their own key. Tier 0
|
||
deployments <span class="bcp14">MUST</span> transition to Tier 1 or higher before exchanging
|
||
ACTs that carry sensitive capabilities.<a href="#section-5.1-2" class="pilcrow">¶</a></p>
|
||
</section>
|
||
</div>
|
||
<div id="tier1">
|
||
<section id="section-5.2">
|
||
<h3 id="name-tier-1-pre-shared-keys-mand">
|
||
<a href="#section-5.2" class="section-number selfRef">5.2. </a><a href="#name-tier-1-pre-shared-keys-mand" class="section-name selfRef">Tier 1: Pre-Shared Keys (Mandatory-to-Implement)</a>
|
||
</h3>
|
||
<p id="section-5.2-1">In Tier 1, both parties exchange public keys out-of-band prior to
|
||
the first ACT exchange. The <code>kid</code> is an opaque string agreed during
|
||
the key exchange. Implementations <span class="bcp14">MUST</span> support Tier 1.<a href="#section-5.2-1" class="pilcrow">¶</a></p>
|
||
<p id="section-5.2-2">Key exchange <span class="bcp14">MAY</span> occur via any out-of-band mechanism: manual
|
||
configuration, a configuration management system, or a prior
|
||
authenticated channel. This specification does not mandate a
|
||
specific key exchange protocol.<a href="#section-5.2-2" class="pilcrow">¶</a></p>
|
||
<p id="section-5.2-3">Tier 1 public keys <span class="bcp14">MUST</span> be Ed25519 <span>[<a href="#RFC8037" class="cite xref">RFC8037</a>]</span> or P-256 (ES256)
|
||
<span>[<a href="#RFC7518" class="cite xref">RFC7518</a>]</span> keys. RSA keys <span class="bcp14">SHOULD NOT</span> be used in Tier 1 deployments due to
|
||
key size. Key rotation <span class="bcp14">MUST</span> be performed out-of-band using the same
|
||
mechanism as the initial exchange.<a href="#section-5.2-3" class="pilcrow">¶</a></p>
|
||
</section>
|
||
</div>
|
||
<div id="tier-2-pki-x509">
|
||
<section id="section-5.3">
|
||
<h3 id="name-tier-2-pki-x509">
|
||
<a href="#section-5.3" class="section-number selfRef">5.3. </a><a href="#name-tier-2-pki-x509" class="section-name selfRef">Tier 2: PKI / X.509</a>
|
||
</h3>
|
||
<p id="section-5.3-1">In Tier 2, agent identity is bound to an X.509 certificate issued
|
||
by a mutually trusted Certificate Authority (CA). The <code>kid</code> is the
|
||
certificate thumbprint (SHA-256 of the DER-encoded certificate).<a href="#section-5.3-1" class="pilcrow">¶</a></p>
|
||
<p id="section-5.3-2">Cross-organizational ACT exchange in Tier 2 requires either:<a href="#section-5.3-2" class="pilcrow">¶</a></p>
|
||
<p id="section-5.3-3">(a) a mutually trusted root CA, or
|
||
(b) cross-certification between the organizations' CAs, or
|
||
(c) explicit trust anchoring (one organization's CA is added to
|
||
the other's trust store).<a href="#section-5.3-3" class="pilcrow">¶</a></p>
|
||
<p id="section-5.3-4">The <code>x5c</code> JOSE header parameter <span>[<a href="#RFC7515" class="cite xref">RFC7515</a>]</span> <span class="bcp14">MAY</span> carry the full
|
||
certificate chain to enable verification without out-of-band trust
|
||
store configuration.<a href="#section-5.3-4" class="pilcrow">¶</a></p>
|
||
</section>
|
||
</div>
|
||
<div id="tier-3-decentralized-identifiers-did">
|
||
<section id="section-5.4">
|
||
<h3 id="name-tier-3-decentralized-identi">
|
||
<a href="#section-5.4" class="section-number selfRef">5.4. </a><a href="#name-tier-3-decentralized-identi" class="section-name selfRef">Tier 3: Decentralized Identifiers (DID)</a>
|
||
</h3>
|
||
<p id="section-5.4-1">In Tier 3, agent identity is expressed as a DID <span>[<a href="#W3C-DID" class="cite xref">W3C-DID</a>]</span>. The
|
||
<code>kid</code> is a DID key fragment. The <code>did</code> JOSE header parameter carries
|
||
the full DID for resolution.<a href="#section-5.4-1" class="pilcrow">¶</a></p>
|
||
<p id="section-5.4-2">Implementations <span class="bcp14">SHOULD</span> support at minimum <code>did:key</code> <span>[<a href="#DID-KEY" class="cite xref">DID-KEY</a>]</span> for
|
||
self-contained key distribution without external resolution, and
|
||
<code>did:web</code> <span>[<a href="#DID-WEB" class="cite xref">DID-WEB</a>]</span> for organizations that prefer DNS-anchored
|
||
identity.<a href="#section-5.4-2" class="pilcrow">¶</a></p>
|
||
<p id="section-5.4-3">DID resolution latency introduces a dependency on external
|
||
infrastructure. To preserve the zero-infrastructure baseline,
|
||
implementations using Tier 3 <span class="bcp14">MAY</span> cache DID Documents and <span class="bcp14">MUST</span>
|
||
specify a maximum cache TTL in their configuration.<a href="#section-5.4-3" class="pilcrow">¶</a></p>
|
||
</section>
|
||
</div>
|
||
<div id="cross-tier-interoperability">
|
||
<section id="section-5.5">
|
||
<h3 id="name-cross-tier-interoperability">
|
||
<a href="#section-5.5" class="section-number selfRef">5.5. </a><a href="#name-cross-tier-interoperability" class="section-name selfRef">Cross-Tier Interoperability</a>
|
||
</h3>
|
||
<p id="section-5.5-1">A delegation chain <span class="bcp14">MAY</span> include agents operating at different trust
|
||
tiers. Each step in the chain is verified using the trust tier of
|
||
the signing agent at that step. Verifiers <span class="bcp14">MUST NOT</span> reject a chain
|
||
solely because it mixes trust tiers, but <span class="bcp14">MAY</span> apply stricter
|
||
policy for chains that include Tier 0 or Tier 1 steps when
|
||
exchanging sensitive capabilities.<a href="#section-5.5-1" class="pilcrow">¶</a></p>
|
||
</section>
|
||
</div>
|
||
</section>
|
||
</div>
|
||
<div id="delegation-chain">
|
||
<section id="section-6">
|
||
<h2 id="name-delegation-chain">
|
||
<a href="#section-6" class="section-number selfRef">6. </a><a href="#name-delegation-chain" class="section-name selfRef">Delegation Chain</a>
|
||
</h2>
|
||
<p id="section-6-1">ACT delegation is peer-to-peer: no Authorization Server is involved.
|
||
Delegation is expressed as a cryptographically verifiable chain of
|
||
ACT issuances, where each step reduces privileges relative to the
|
||
previous step.<a href="#section-6-1" class="pilcrow">¶</a></p>
|
||
<div id="peer-to-peer-delegation">
|
||
<section id="section-6.1">
|
||
<h3 id="name-peer-to-peer-delegation">
|
||
<a href="#section-6.1" class="section-number selfRef">6.1. </a><a href="#name-peer-to-peer-delegation" class="section-name selfRef">Peer-to-Peer Delegation</a>
|
||
</h3>
|
||
<p id="section-6.1-1">When Agent A authorizes Agent B to perform a sub-task, Agent A:<a href="#section-6.1-1" class="pilcrow">¶</a></p>
|
||
<ol start="1" type="1" class="normal type-1" id="section-6.1-2">
|
||
<li id="section-6.1-2.1">
|
||
<p id="section-6.1-2.1.1">Creates a new ACT with <code>sub</code> set to Agent B's identifier.<a href="#section-6.1-2.1.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li id="section-6.1-2.2">
|
||
<p id="section-6.1-2.2.1">Sets <code>cap</code> to a subset of A's own authorized capabilities,
|
||
with constraints at least as restrictive as those in A's mandate.<a href="#section-6.1-2.2.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li id="section-6.1-2.3">
|
||
<p id="section-6.1-2.3.1">Sets <code>del.depth</code> to A's own <code>del.depth + 1</code>.<a href="#section-6.1-2.3.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li id="section-6.1-2.4">
|
||
<p id="section-6.1-2.4.1">Sets <code>del.max_depth</code> to no more than the <code>del.max_depth</code> value
|
||
in A's own mandate.<a href="#section-6.1-2.4.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li id="section-6.1-2.5">
|
||
<p id="section-6.1-2.5.1">Adds a chain entry containing A's identifier as <code>delegator</code>,
|
||
the <code>jti</code> of A's own mandate, and a <code>sig</code> value computed as:<a href="#section-6.1-2.5.1" class="pilcrow">¶</a></p>
|
||
<div class="alignLeft art-text artwork" id="section-6.1-2.5.2">
|
||
<pre>
|
||
sig = Sign(A.private_key, SHA-256(canonical_ACT_phase1_bytes))
|
||
</pre><a href="#section-6.1-2.5.2" class="pilcrow">¶</a>
|
||
</div>
|
||
<p id="section-6.1-2.5.3">
|
||
where <code>canonical_ACT_phase1_bytes</code> is the UTF-8 encoded bytes
|
||
of the JWS Compact Serialization of A's Phase 1 ACT.<a href="#section-6.1-2.5.3" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li id="section-6.1-2.6">
|
||
<p id="section-6.1-2.6.1">Signs the new ACT with A's private key.<a href="#section-6.1-2.6.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
</ol>
|
||
</section>
|
||
</div>
|
||
<div id="privilege-reduction-requirements">
|
||
<section id="section-6.2">
|
||
<h3 id="name-privilege-reduction-require">
|
||
<a href="#section-6.2" class="section-number selfRef">6.2. </a><a href="#name-privilege-reduction-require" class="section-name selfRef">Privilege Reduction Requirements</a>
|
||
</h3>
|
||
<p id="section-6.2-1">When issuing a delegated ACT, the issuing agent <span class="bcp14">MUST</span> reduce
|
||
privileges by one or more of:<a href="#section-6.2-1" class="pilcrow">¶</a></p>
|
||
<ul class="normal">
|
||
<li class="normal" id="section-6.2-2.1">
|
||
<p id="section-6.2-2.1.1">Removing capabilities (sub-set of parent capabilities only).<a href="#section-6.2-2.1.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li class="normal" id="section-6.2-2.2">
|
||
<p id="section-6.2-2.2.1">Adding stricter constraints (lower rate limits, narrower domains,
|
||
shorter time windows, lower data classification ceiling).<a href="#section-6.2-2.2.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li class="normal" id="section-6.2-2.3">
|
||
<p id="section-6.2-2.3.1">Reducing token lifetime (<code>exp</code> closer to <code>iat</code>).<a href="#section-6.2-2.3.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li class="normal" id="section-6.2-2.4">
|
||
<p id="section-6.2-2.4.1">Reducing <code>del.max_depth</code>.<a href="#section-6.2-2.4.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
</ul>
|
||
<p id="section-6.2-3">The issuing agent <span class="bcp14">MUST NOT</span> grant capabilities not present in its
|
||
own mandate. Capability escalation via delegation is prohibited and
|
||
<span class="bcp14">MUST</span> be detected and rejected by verifiers.<a href="#section-6.2-3" class="pilcrow">¶</a></p>
|
||
<p id="section-6.2-4">For well-known numeric constraints (e.g., <code>max_records</code>,
|
||
<code>max_requests_per_hour</code>), "more restrictive" means a numerically
|
||
lower or equal value. For well-known enumerated constraints
|
||
(e.g., <code>data_sensitivity</code>), "more restrictive" means a value that
|
||
is equal or higher in the defined ordering
|
||
("public" < "internal" < "confidential" < "restricted").
|
||
For unknown or domain-specific constraint keys, verifiers <span class="bcp14">MUST</span>
|
||
treat the constraint as non-comparable and <span class="bcp14">MUST</span> reject the
|
||
delegation unless the delegated constraint value is byte-for-byte
|
||
identical to the parent constraint value.<a href="#section-6.2-4" class="pilcrow">¶</a></p>
|
||
</section>
|
||
</div>
|
||
<div id="delegation-verification">
|
||
<section id="section-6.3">
|
||
<h3 id="name-delegation-verification">
|
||
<a href="#section-6.3" class="section-number selfRef">6.3. </a><a href="#name-delegation-verification" class="section-name selfRef">Delegation Verification</a>
|
||
</h3>
|
||
<p id="section-6.3-1">A verifier receiving a delegated ACT <span class="bcp14">MUST</span>:<a href="#section-6.3-1" class="pilcrow">¶</a></p>
|
||
<ol start="1" type="1" class="normal type-1" id="section-6.3-2">
|
||
<li id="section-6.3-2.1">
|
||
<p id="section-6.3-2.1.1">Verify the ACT's own signature (<a href="#auth-verification" class="auto internal xref">Section 8.1</a>).<a href="#section-6.3-2.1.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li id="section-6.3-2.2">
|
||
<p id="section-6.3-2.2.1">For each entry in <code>del.chain</code>, in order from index 0 to
|
||
<code>del.depth - 1</code>:
|
||
a. Retrieve the public key for <code>entry.delegator</code>.
|
||
b. Verify that <code>entry.sig</code> is a valid signature over the SHA-256
|
||
hash of the referenced parent ACT (identified by <code>entry.jti</code>).
|
||
c. Verify that the capabilities in the current ACT are a subset
|
||
of the capabilities in the parent ACT, per the constraint
|
||
comparison rules in <a href="#privilege-reduction-requirements" class="auto internal xref">Section 6.2</a>.<a href="#section-6.3-2.2.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li id="section-6.3-2.3">
|
||
<p id="section-6.3-2.3.1">Verify that <code>del.depth</code> does not exceed <code>del.max_depth</code>.<a href="#section-6.3-2.3.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li id="section-6.3-2.4">
|
||
<p id="section-6.3-2.4.1">Verify that <code>del.chain</code> length equals <code>del.depth</code>.<a href="#section-6.3-2.4.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
</ol>
|
||
<p id="section-6.3-3">If any step fails, the ACT <span class="bcp14">MUST</span> be rejected.<a href="#section-6.3-3" class="pilcrow">¶</a></p>
|
||
</section>
|
||
</div>
|
||
</section>
|
||
</div>
|
||
<div id="dag-structure">
|
||
<section id="section-7">
|
||
<h2 id="name-dag-structure-and-causal-or">
|
||
<a href="#section-7" class="section-number selfRef">7. </a><a href="#name-dag-structure-and-causal-or" class="section-name selfRef">DAG Structure and Causal Ordering</a>
|
||
</h2>
|
||
<p id="section-7-1">ACTs in Phase 2 form a DAG over the <code>pred</code> (predecessor) claim. The DAG
|
||
encodes causal dependencies: a task <span class="bcp14">MAY</span> NOT begin before all its
|
||
parent tasks are completed.<a href="#section-7-1" class="pilcrow">¶</a></p>
|
||
<div id="dag-validation">
|
||
<section id="section-7.1">
|
||
<h3 id="name-dag-validation">
|
||
<a href="#section-7.1" class="section-number selfRef">7.1. </a><a href="#name-dag-validation" class="section-name selfRef">DAG Validation</a>
|
||
</h3>
|
||
<p id="section-7.1-1">When processing a Phase 2 ACT, implementations <span class="bcp14">MUST</span>:<a href="#section-7.1-1" class="pilcrow">¶</a></p>
|
||
<ol start="1" type="1" class="normal type-1" id="section-7.1-2">
|
||
<li id="section-7.1-2.1">
|
||
<p id="section-7.1-2.1.1"><strong>Uniqueness</strong>: Verify the <code>jti</code> is unique within the workflow
|
||
(<code>wid</code>) or globally if <code>wid</code> is absent.<a href="#section-7.1-2.1.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li id="section-7.1-2.2">
|
||
<p id="section-7.1-2.2.1"><strong>Predecessor Existence</strong>: Verify every <code>jti</code> in <code>pred</code> corresponds to
|
||
a Phase 2 ACT available in the ACT store or audit ledger.<a href="#section-7.1-2.2.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li id="section-7.1-2.3">
|
||
<p id="section-7.1-2.3.1"><strong>Temporal Ordering</strong>: Verify that for each parent:
|
||
<code>parent.exec_ts < child.exec_ts + clock_skew_tolerance</code>
|
||
(<span class="bcp14">RECOMMENDED</span> tolerance: 30 seconds). Causal ordering is
|
||
primarily enforced by DAG structure, not timestamps.<a href="#section-7.1-2.3.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li id="section-7.1-2.4">
|
||
<p id="section-7.1-2.4.1"><strong>Acyclicity</strong>: Following parent references <span class="bcp14">MUST NOT</span> lead back
|
||
to the current ACT's <code>jti</code>. Implementations <span class="bcp14">MUST</span> enforce a
|
||
maximum ancestor traversal limit (<span class="bcp14">RECOMMENDED</span>: 10,000 nodes).<a href="#section-7.1-2.4.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li id="section-7.1-2.5">
|
||
<p id="section-7.1-2.5.1"><strong>Capability Consistency</strong>: Verify that <code>exec_act</code> matches one
|
||
of the <code>action</code> values in the <code>cap</code> array from Phase 1.<a href="#section-7.1-2.5.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
</ol>
|
||
</section>
|
||
</div>
|
||
<div id="root-tasks-and-fan-in">
|
||
<section id="section-7.2">
|
||
<h3 id="name-root-tasks-and-fan-in">
|
||
<a href="#section-7.2" class="section-number selfRef">7.2. </a><a href="#name-root-tasks-and-fan-in" class="section-name selfRef">Root Tasks and Fan-in</a>
|
||
</h3>
|
||
<p id="section-7.2-1">A root task has <code>pred = []</code>. A workflow <span class="bcp14">MAY</span> have multiple root tasks
|
||
representing parallel branches with no shared predecessor.<a href="#section-7.2-1" class="pilcrow">¶</a></p>
|
||
<p id="section-7.2-2">Fan-in — a task with multiple parents — is expressed naturally:<a href="#section-7.2-2" class="pilcrow">¶</a></p>
|
||
<div class="lang-json sourcecode" id="section-7.2-3">
|
||
<pre>
|
||
{
|
||
"pred": [
|
||
"550e8400-e29b-41d4-a716-446655440001",
|
||
"550e8400-e29b-41d4-a716-446655440002"
|
||
]
|
||
}
|
||
</pre><a href="#section-7.2-3" class="pilcrow">¶</a>
|
||
</div>
|
||
<p id="section-7.2-4">This indicates the current task depends on the completion of both
|
||
referenced parent tasks, which <span class="bcp14">MAY</span> have been executed in parallel
|
||
by different agents.<a href="#section-7.2-4" class="pilcrow">¶</a></p>
|
||
</section>
|
||
</div>
|
||
<div id="dag-vs-linear">
|
||
<section id="section-7.3">
|
||
<h3 id="name-dag-vs-linear-delegation-ch">
|
||
<a href="#section-7.3" class="section-number selfRef">7.3. </a><a href="#name-dag-vs-linear-delegation-ch" class="section-name selfRef">DAG vs Linear Delegation Chains</a>
|
||
</h3>
|
||
<p id="section-7.3-1">Several concurrent proposals for agent authorization model delegation
|
||
as an ordered, linear chain of tokens or principals. Examples include
|
||
the <code>actchain</code> claim of
|
||
<span>[<a href="#I-D.oauth-transaction-tokens-for-agents" class="cite xref">I-D.oauth-transaction-tokens-for-agents</a>]</span>, the Agentic JWT
|
||
construction of <span>[<a href="#AgenticJWT" class="cite xref">AgenticJWT</a>]</span>, the AIP / Interaction-Bound Context Token
|
||
(IBCT) model of <span>[<a href="#AIP-IBCT" class="cite xref">AIP-IBCT</a>]</span>, and the delegation record defined in
|
||
<span>[<a href="#I-D.helixar-hdp-agentic-delegation" class="cite xref">I-D.helixar-hdp-agentic-delegation</a>]</span>. In each of these
|
||
designs, the trail from the originator to the final executor is
|
||
represented as an ordered array recording one predecessor per hop.<a href="#section-7.3-1" class="pilcrow">¶</a></p>
|
||
<div id="what-linear-chains-express-well">
|
||
<section id="section-7.3.1">
|
||
<h4 id="name-what-linear-chains-express-">
|
||
<a href="#section-7.3.1" class="section-number selfRef">7.3.1. </a><a href="#name-what-linear-chains-express-" class="section-name selfRef">What Linear Chains Express Well</a>
|
||
</h4>
|
||
<p id="section-7.3.1-1">Linear chains are a natural fit for simple sequential delegation:
|
||
agent A delegates to agent B, which delegates to agent C. The chain
|
||
records the history of that single hand-off in order, and verifiers
|
||
can walk from the current holder back to the originator without
|
||
branching. For interactive user-to-agent-to-service flows, where each
|
||
step has exactly one predecessor, a linear chain is both sufficient
|
||
and compact.<a href="#section-7.3.1-1" class="pilcrow">¶</a></p>
|
||
</section>
|
||
</div>
|
||
<div id="limitations-of-linear-chains">
|
||
<section id="section-7.3.2">
|
||
<h4 id="name-limitations-of-linear-chain">
|
||
<a href="#section-7.3.2" class="section-number selfRef">7.3.2. </a><a href="#name-limitations-of-linear-chain" class="section-name selfRef">Limitations of Linear Chains</a>
|
||
</h4>
|
||
<p id="section-7.3.2-1">Agentic workflows in practice are rarely purely linear. Planner
|
||
agents dispatch parallel sub-tasks; synthesizer agents consume
|
||
results from multiple independent branches; tool calls execute
|
||
concurrently and their outputs are merged. A linear chain cannot
|
||
faithfully represent the following common topologies:<a href="#section-7.3.2-1" class="pilcrow">¶</a></p>
|
||
<ul class="normal">
|
||
<li class="normal" id="section-7.3.2-2.1">
|
||
<p id="section-7.3.2-2.1.1"><strong>Fork</strong>: A single task spawns multiple independent sub-tasks. A
|
||
linear chain cannot express that two concurrent sub-executions
|
||
share a common parent authorization but are otherwise
|
||
independent; each sub-task would either omit its siblings or
|
||
fabricate a false ordering between them.<a href="#section-7.3.2-2.1.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li class="normal" id="section-7.3.2-2.2">
|
||
<p id="section-7.3.2-2.2.1"><strong>Join (fan-in)</strong>: A task whose output depends on results from
|
||
several predecessors has no single prior hop. Linear chains
|
||
cannot express multiple-parent relationships without either
|
||
collapsing parallel branches into an arbitrary order or
|
||
duplicating records.<a href="#section-7.3.2-2.2.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li class="normal" id="section-7.3.2-2.3">
|
||
<p id="section-7.3.2-2.3.1"><strong>Diamond dependencies</strong>: A planner dispatches parallel work and
|
||
later synthesizes the results. The synthesis step depends on
|
||
every branch, and all branches depend on the same planner.
|
||
This diamond shape requires a DAG; a linear chain forces the
|
||
verifier to pick one branch and discard the others.<a href="#section-7.3.2-2.3.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li class="normal" id="section-7.3.2-2.4">
|
||
<p id="section-7.3.2-2.4.1"><strong>Cross-chain references</strong>: When two independently authorized
|
||
chains produce outputs that are later combined (e.g., a shared
|
||
cache lookup and a fresh retrieval), linear chains force a
|
||
single history and cannot record that the combined result has
|
||
two distinct provenances.<a href="#section-7.3.2-2.4.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
</ul>
|
||
</section>
|
||
</div>
|
||
<div id="acts-dag-approach">
|
||
<section id="section-7.3.3">
|
||
<h4 id="name-acts-dag-approach">
|
||
<a href="#section-7.3.3" class="section-number selfRef">7.3.3. </a><a href="#name-acts-dag-approach" class="section-name selfRef">ACT's DAG Approach</a>
|
||
</h4>
|
||
<p id="section-7.3.3-1">As specified in <a href="#jwt-claims-execution-phase" class="auto internal xref">Section 4.3</a>, the <code>pred</code> claim is
|
||
an array of parent <code>jti</code> values rather than a single scalar. This
|
||
allows an ACT to record:<a href="#section-7.3.3-1" class="pilcrow">¶</a></p>
|
||
<ul class="normal">
|
||
<li class="normal" id="section-7.3.3-2.1">
|
||
<p id="section-7.3.3-2.1.1">Zero parents (a root task, <code>pred = []</code>);<a href="#section-7.3.3-2.1.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li class="normal" id="section-7.3.3-2.2">
|
||
<p id="section-7.3.3-2.2.1">Exactly one parent (a linear chain, equivalent to the
|
||
single-predecessor designs referenced above);<a href="#section-7.3.3-2.2.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li class="normal" id="section-7.3.3-2.3">
|
||
<p id="section-7.3.3-2.3.1">Multiple parents (fan-in from parallel branches); and<a href="#section-7.3.3-2.3.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li class="normal" id="section-7.3.3-2.4">
|
||
<p id="section-7.3.3-2.4.1">Any acyclic shape that matches the actual execution structure.<a href="#section-7.3.3-2.4.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
</ul>
|
||
<p id="section-7.3.3-3">The following example illustrates a diamond workflow. A research
|
||
agent (A) dispatches a web-search agent (B) and a code-analysis
|
||
agent (C) in parallel; both complete, and their outputs are
|
||
combined by a writer agent (D):<a href="#section-7.3.3-3" class="pilcrow">¶</a></p>
|
||
<div class="alignLeft art-text artwork" id="section-7.3.3-4">
|
||
<pre>
|
||
+-----+
|
||
| A | pred = []
|
||
+-----+
|
||
/ \
|
||
v v
|
||
+---+ +---+
|
||
| B | | C | pred = [A.jti]
|
||
+---+ +---+
|
||
\ /
|
||
v v
|
||
+-----+
|
||
| D | pred = [B.jti, C.jti]
|
||
+-----+
|
||
</pre><a href="#section-7.3.3-4" class="pilcrow">¶</a>
|
||
</div>
|
||
<p id="section-7.3.3-5">A linear <code>actchain</code> representation cannot express that D depends on
|
||
both B and C. At best, it can record one of the two parents and lose
|
||
the other, or serialize B and C into a false sequential order.<a href="#section-7.3.3-5" class="pilcrow">¶</a></p>
|
||
</section>
|
||
</div>
|
||
<div id="verifiability-implications">
|
||
<section id="section-7.3.4">
|
||
<h4 id="name-verifiability-implications">
|
||
<a href="#section-7.3.4" class="section-number selfRef">7.3.4. </a><a href="#name-verifiability-implications" class="section-name selfRef">Verifiability Implications</a>
|
||
</h4>
|
||
<p id="section-7.3.4-1">With a DAG representation, an auditor holding the set of Phase 2
|
||
ACTs for a workflow can reconstruct the full execution graph, not
|
||
just one chain per final record. This matters for:<a href="#section-7.3.4-1" class="pilcrow">¶</a></p>
|
||
<ul class="normal">
|
||
<li class="normal" id="section-7.3.4-2.1">
|
||
<p id="section-7.3.4-2.1.1"><strong>Debugging</strong>: identifying which branch contributed an erroneous
|
||
input to a downstream synthesis.<a href="#section-7.3.4-2.1.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li class="normal" id="section-7.3.4-2.2">
|
||
<p id="section-7.3.4-2.2.1"><strong>Compliance</strong>: demonstrating that every input to a regulated
|
||
decision was itself authorized, not only the most recent hop.<a href="#section-7.3.4-2.2.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li class="normal" id="section-7.3.4-2.3">
|
||
<p id="section-7.3.4-2.3.1"><strong>Tamper-evidence</strong>: detecting that a branch has been omitted,
|
||
since the surviving siblings' <code>pred</code> arrays name the missing
|
||
predecessor by <code>jti</code>.<a href="#section-7.3.4-2.3.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
</ul>
|
||
</section>
|
||
</div>
|
||
<div id="interoperability-with-linear-chain-designs">
|
||
<section id="section-7.3.5">
|
||
<h4 id="name-interoperability-with-linea">
|
||
<a href="#section-7.3.5" class="section-number selfRef">7.3.5. </a><a href="#name-interoperability-with-linea" class="section-name selfRef">Interoperability with Linear-Chain Designs</a>
|
||
</h4>
|
||
<p id="section-7.3.5-1">ACT's DAG reduces to a linear chain in the degenerate case where
|
||
every <code>pred</code> array has length zero or one. An implementation that
|
||
requires linear-chain semantics <span class="bcp14">MAY</span> treat such ACTs as equivalent
|
||
to <code>actchain</code>-style records and ignore the fork/join capability.
|
||
The reverse reduction is not available: a linear-chain-only design
|
||
cannot represent ACT DAG topologies without loss of information.<a href="#section-7.3.5-1" class="pilcrow">¶</a></p>
|
||
<p id="section-7.3.5-2">ACT therefore takes the linear chain as a strict subset of its
|
||
model rather than as a competing approach. The DAG generalization
|
||
is deliberate and is motivated by the concurrent, branching nature
|
||
of real agentic executions rather than by any deficiency in the
|
||
linear-chain designs for the sequential cases they target.<a href="#section-7.3.5-2" class="pilcrow">¶</a></p>
|
||
</section>
|
||
</div>
|
||
</section>
|
||
</div>
|
||
</section>
|
||
</div>
|
||
<div id="verification-procedure">
|
||
<section id="section-8">
|
||
<h2 id="name-verification-procedure">
|
||
<a href="#section-8" class="section-number selfRef">8. </a><a href="#name-verification-procedure" class="section-name selfRef">Verification Procedure</a>
|
||
</h2>
|
||
<div id="auth-verification">
|
||
<section id="section-8.1">
|
||
<h3 id="name-authorization-phase-verific">
|
||
<a href="#section-8.1" class="section-number selfRef">8.1. </a><a href="#name-authorization-phase-verific" class="section-name selfRef">Authorization Phase Verification</a>
|
||
</h3>
|
||
<p id="section-8.1-1">A receiving agent <span class="bcp14">MUST</span> verify a Phase 1 ACT as follows:<a href="#section-8.1-1" class="pilcrow">¶</a></p>
|
||
<ol start="1" type="1" class="normal type-1" id="section-8.1-2">
|
||
<li id="section-8.1-2.1">
|
||
<p id="section-8.1-2.1.1">Parse JWS Compact Serialization per <span>[<a href="#RFC7515" class="cite xref">RFC7515</a>]</span>.<a href="#section-8.1-2.1.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li id="section-8.1-2.2">
|
||
<p id="section-8.1-2.2.1">Verify <code>typ</code> is "act+jwt".<a href="#section-8.1-2.2.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li id="section-8.1-2.3">
|
||
<p id="section-8.1-2.3.1">Verify <code>alg</code> is in the verifier's algorithm allowlist. The
|
||
allowlist <span class="bcp14">MUST NOT</span> include "none" or any symmetric algorithm.<a href="#section-8.1-2.3.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li id="section-8.1-2.4">
|
||
<p id="section-8.1-2.4.1">Retrieve the public key for <code>kid</code> per the applicable trust tier
|
||
(<a href="#trust-model" class="auto internal xref">Section 5</a>).<a href="#section-8.1-2.4.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li id="section-8.1-2.5">
|
||
<p id="section-8.1-2.5.1">Verify the JWS signature.<a href="#section-8.1-2.5.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li id="section-8.1-2.6">
|
||
<p id="section-8.1-2.6.1">Verify <code>exp</code> has not passed (with clock skew tolerance:
|
||
<span class="bcp14">RECOMMENDED</span> maximum 5 minutes).<a href="#section-8.1-2.6.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li id="section-8.1-2.7">
|
||
<p id="section-8.1-2.7.1">Verify <code>iat</code> is not unreasonably in the future (<span class="bcp14">RECOMMENDED</span>:
|
||
no more than 30 seconds ahead).<a href="#section-8.1-2.7.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li id="section-8.1-2.8">
|
||
<p id="section-8.1-2.8.1">Verify <code>aud</code> contains the verifier's own identifier.<a href="#section-8.1-2.8.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li id="section-8.1-2.9">
|
||
<p id="section-8.1-2.9.1">Verify <code>iss</code> is a trusted agent identity per local policy.<a href="#section-8.1-2.9.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li id="section-8.1-2.10">
|
||
<p id="section-8.1-2.10.1">Verify <code>sub</code> matches the verifier's own identifier (the agent
|
||
is the intended recipient of this mandate).<a href="#section-8.1-2.10.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li id="section-8.1-2.11">
|
||
<p id="section-8.1-2.11.1">Verify all required claims are present and well-formed.<a href="#section-8.1-2.11.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li id="section-8.1-2.12">
|
||
<p id="section-8.1-2.12.1">Verify delegation chain (<a href="#delegation-verification" class="auto internal xref">Section 6.3</a>) if
|
||
<code>del.chain</code> is non-empty.<a href="#section-8.1-2.12.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li id="section-8.1-2.13">
|
||
<p id="section-8.1-2.13.1">Verify capabilities are within policy limits.<a href="#section-8.1-2.13.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
</ol>
|
||
</section>
|
||
</div>
|
||
<div id="execution-phase-verification">
|
||
<section id="section-8.2">
|
||
<h3 id="name-execution-phase-verificatio">
|
||
<a href="#section-8.2" class="section-number selfRef">8.2. </a><a href="#name-execution-phase-verificatio" class="section-name selfRef">Execution Phase Verification</a>
|
||
</h3>
|
||
<p id="section-8.2-1">In addition to all Phase 1 verification steps, a verifier processing
|
||
a Phase 2 ACT <span class="bcp14">MUST</span>:<a href="#section-8.2-1" class="pilcrow">¶</a></p>
|
||
<ol start="1" type="1" class="normal type-1" id="section-8.2-2">
|
||
<li id="section-8.2-2.1">
|
||
<p id="section-8.2-2.1.1">Verify <code>exec_act</code> is present and matches an <code>action</code> in <code>cap</code>.<a href="#section-8.2-2.1.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li id="section-8.2-2.2">
|
||
<p id="section-8.2-2.2.1">Verify <code>pred</code> is present and perform DAG validation
|
||
(<a href="#dag-validation" class="auto internal xref">Section 7.1</a>).<a href="#section-8.2-2.2.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li id="section-8.2-2.3">
|
||
<p id="section-8.2-2.3.1">Verify <code>exec_ts</code> is present and is greater than or equal to
|
||
<code>iat</code>. If <code>exec_ts</code> is after <code>exp</code>, implementations <span class="bcp14">SHOULD</span> log
|
||
a warning but <span class="bcp14">MUST NOT</span> reject the record solely on this basis.<a href="#section-8.2-2.3.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li id="section-8.2-2.4">
|
||
<p id="section-8.2-2.4.1">Verify <code>status</code> is present and has a valid value.<a href="#section-8.2-2.4.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li id="section-8.2-2.5">
|
||
<p id="section-8.2-2.5.1">Verify the re-signature was produced by the <code>sub</code> agent (the
|
||
executing agent), not the <code>iss</code> agent (the mandating agent).
|
||
This is verified by checking that the <code>kid</code> in the Phase 2 JOSE
|
||
header corresponds to the <code>sub</code> agent's public key.<a href="#section-8.2-2.5.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li id="section-8.2-2.6">
|
||
<p id="section-8.2-2.6.1">If <code>inp_hash</code> or <code>out_hash</code> are present, verify them against
|
||
locally available input/output data when possible.<a href="#section-8.2-2.6.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
</ol>
|
||
</section>
|
||
</div>
|
||
</section>
|
||
</div>
|
||
<div id="transport">
|
||
<section id="section-9">
|
||
<h2 id="name-transport">
|
||
<a href="#section-9" class="section-number selfRef">9. </a><a href="#name-transport" class="section-name selfRef">Transport</a>
|
||
</h2>
|
||
<div id="http-header-transport">
|
||
<section id="section-9.1">
|
||
<h3 id="name-http-header-transport">
|
||
<a href="#section-9.1" class="section-number selfRef">9.1. </a><a href="#name-http-header-transport" class="section-name selfRef">HTTP Header Transport</a>
|
||
</h3>
|
||
<p id="section-9.1-1">This specification defines two HTTP header fields for ACT transport:<a href="#section-9.1-1" class="pilcrow">¶</a></p>
|
||
<p id="section-9.1-2"><strong>ACT-Mandate</strong>: Carries a Phase 1 ACT issued by an upstream agent
|
||
or operator. Value is the JWS Compact Serialization of the ACT.<a href="#section-9.1-2" class="pilcrow">¶</a></p>
|
||
<div class="alignLeft art-text artwork" id="section-9.1-3">
|
||
<pre>
|
||
GET /api/safety-check HTTP/1.1
|
||
Host: safety-agent.example.com
|
||
ACT-Mandate: eyJhbGci...Phase1ACT...
|
||
</pre><a href="#section-9.1-3" class="pilcrow">¶</a>
|
||
</div>
|
||
<p id="section-9.1-4"><strong>ACT-Record</strong>: Carries a Phase 2 ACT from a predecessor agent,
|
||
serving as evidence of completed prerequisites.<a href="#section-9.1-4" class="pilcrow">¶</a></p>
|
||
<div class="alignLeft art-text artwork" id="section-9.1-5">
|
||
<pre>
|
||
POST /api/downstream HTTP/1.1
|
||
Host: downstream-agent.example.com
|
||
ACT-Mandate: eyJhbGci...Phase1ACT...
|
||
ACT-Record: eyJhbGci...Phase2ACT...
|
||
</pre><a href="#section-9.1-5" class="pilcrow">¶</a>
|
||
</div>
|
||
<p id="section-9.1-6">Multiple <code>ACT-Record</code> header lines <span class="bcp14">MAY</span> be included when a task has
|
||
multiple completed predecessors (DAG fan-in). If any single ACT-Record
|
||
fails verification, the receiver <span class="bcp14">MUST</span> reject the entire request.<a href="#section-9.1-6" class="pilcrow">¶</a></p>
|
||
</section>
|
||
</div>
|
||
<div id="non-http-transports">
|
||
<section id="section-9.2">
|
||
<h3 id="name-non-http-transports">
|
||
<a href="#section-9.2" class="section-number selfRef">9.2. </a><a href="#name-non-http-transports" class="section-name selfRef">Non-HTTP Transports</a>
|
||
</h3>
|
||
<p id="section-9.2-1">For non-HTTP transports (MCP stdio, A2A message queues, AMQP, etc.),
|
||
ACTs <span class="bcp14">SHOULD</span> be carried as a dedicated field in the transport's
|
||
metadata envelope. The field name <span class="bcp14">SHOULD</span> be <code>act_mandate</code> for Phase 1
|
||
ACTs and <code>act_record</code> for Phase 2 ACTs. Implementations <span class="bcp14">MUST</span> use the
|
||
JWS Compact Serialization form in all transports.<a href="#section-9.2-1" class="pilcrow">¶</a></p>
|
||
</section>
|
||
</div>
|
||
</section>
|
||
</div>
|
||
<div id="audit-ledger">
|
||
<section id="section-10">
|
||
<h2 id="name-audit-ledger-interface">
|
||
<a href="#section-10" class="section-number selfRef">10. </a><a href="#name-audit-ledger-interface" class="section-name selfRef">Audit Ledger Interface</a>
|
||
</h2>
|
||
<p id="section-10-1">Phase 2 ACTs <span class="bcp14">SHOULD</span> be submitted to an immutable audit ledger.
|
||
A ledger is <span class="bcp14">RECOMMENDED</span> for regulated environments but is not
|
||
required for basic ACT operation. This specification does not
|
||
mandate a specific storage technology.<a href="#section-10-1" class="pilcrow">¶</a></p>
|
||
<p id="section-10-2">When an audit ledger is deployed, the implementation <span class="bcp14">MUST</span> provide:<a href="#section-10-2" class="pilcrow">¶</a></p>
|
||
<ol start="1" type="1" class="normal type-1" id="section-10-3">
|
||
<li id="section-10-3.1">
|
||
<p id="section-10-3.1.1"><strong>Append-only semantics</strong>: Once an ACT is recorded, it <span class="bcp14">MUST NOT</span>
|
||
be modified or deleted.<a href="#section-10-3.1.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li id="section-10-3.2">
|
||
<p id="section-10-3.2.1"><strong>Ordering</strong>: A monotonically increasing sequence number per
|
||
recorded ACT.<a href="#section-10-3.2.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li id="section-10-3.3">
|
||
<p id="section-10-3.3.1"><strong>Lookup</strong>: Efficient retrieval by <code>jti</code> value.<a href="#section-10-3.3.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li id="section-10-3.4">
|
||
<p id="section-10-3.4.1"><strong>Integrity</strong>: A cryptographic commitment scheme over recorded
|
||
ACTs (e.g., hash-chaining, Merkle tree anchoring, or SCITT
|
||
registration per <span>[<a href="#I-D.ietf-scitt-architecture" class="cite xref">I-D.ietf-scitt-architecture</a>]</span>).<a href="#section-10-3.4.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
</ol>
|
||
</section>
|
||
</div>
|
||
<div id="security-considerations">
|
||
<section id="section-11">
|
||
<h2 id="name-security-considerations">
|
||
<a href="#section-11" class="section-number selfRef">11. </a><a href="#name-security-considerations" class="section-name selfRef">Security Considerations</a>
|
||
</h2>
|
||
<div id="threat-model">
|
||
<section id="section-11.1">
|
||
<h3 id="name-threat-model">
|
||
<a href="#section-11.1" class="section-number selfRef">11.1. </a><a href="#name-threat-model" class="section-name selfRef">Threat Model</a>
|
||
</h3>
|
||
<p id="section-11.1-1">ACT assumes an adversarial environment where:<a href="#section-11.1-1" class="pilcrow">¶</a></p>
|
||
<ul class="normal">
|
||
<li class="normal" id="section-11.1-2.1">
|
||
<p id="section-11.1-2.1.1">Individual agents may be compromised.<a href="#section-11.1-2.1.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li class="normal" id="section-11.1-2.2">
|
||
<p id="section-11.1-2.2.1">Network paths may be intercepted (mitigated by transport security).<a href="#section-11.1-2.2.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li class="normal" id="section-11.1-2.3">
|
||
<p id="section-11.1-2.3.1">Attackers may attempt to replay valid ACTs from prior interactions.<a href="#section-11.1-2.3.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li class="normal" id="section-11.1-2.4">
|
||
<p id="section-11.1-2.4.1">Colluding agents may attempt to fabricate execution records.<a href="#section-11.1-2.4.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li class="normal" id="section-11.1-2.5">
|
||
<p id="section-11.1-2.5.1">Agents may attempt privilege escalation via manipulated delegation
|
||
chains.<a href="#section-11.1-2.5.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
</ul>
|
||
<p id="section-11.1-3">ACT does NOT assume:<a href="#section-11.1-3" class="pilcrow">¶</a></p>
|
||
<ul class="normal">
|
||
<li class="normal" id="section-11.1-4.1">
|
||
<p id="section-11.1-4.1.1">A trusted central authority (by design).<a href="#section-11.1-4.1.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li class="normal" id="section-11.1-4.2">
|
||
<p id="section-11.1-4.2.1">Synchronized clocks beyond the stated skew tolerance.<a href="#section-11.1-4.2.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li class="normal" id="section-11.1-4.3">
|
||
<p id="section-11.1-4.3.1">Availability of external network services during verification.<a href="#section-11.1-4.3.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
</ul>
|
||
</section>
|
||
</div>
|
||
<div id="self-assertion-limitation">
|
||
<section id="section-11.2">
|
||
<h3 id="name-self-assertion-limitation">
|
||
<a href="#section-11.2" class="section-number selfRef">11.2. </a><a href="#name-self-assertion-limitation" class="section-name selfRef">Self-Assertion Limitation</a>
|
||
</h3>
|
||
<p id="section-11.2-1">Phase 2 ACTs are self-asserted: an executing agent signs its own
|
||
execution record. A compromised agent with an intact private key can
|
||
produce Phase 2 ACTs claiming arbitrary inputs, outputs, and action
|
||
types, as long as the claimed <code>exec_act</code> matches an authorized
|
||
capability.<a href="#section-11.2-1" class="pilcrow">¶</a></p>
|
||
<p id="section-11.2-2">This is a fundamental limitation of self-sovereign attestation. It
|
||
is the same limitation affecting WIMSE ECT
|
||
<span>[<a href="#I-D.nennemann-wimse-ect" class="cite xref">I-D.nennemann-wimse-ect</a>]</span>.<a href="#section-11.2-2" class="pilcrow">¶</a></p>
|
||
<p id="section-11.2-3">Mitigations:<a href="#section-11.2-3" class="pilcrow">¶</a></p>
|
||
<ul class="normal">
|
||
<li class="normal" id="section-11.2-4.1">
|
||
<p id="section-11.2-4.1.1"><strong>Cross-agent corroboration</strong>: A receiving agent that processes
|
||
an ACT-Record as a prerequisite independently verifies that the
|
||
claimed <code>out_hash</code> matches the data it actually received.<a href="#section-11.2-4.1.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li class="normal" id="section-11.2-4.2">
|
||
<p id="section-11.2-4.2.1"><strong>Ledger sequencing</strong>: An append-only ledger with monotonic
|
||
sequence numbers prevents retroactive insertion of fabricated
|
||
records.<a href="#section-11.2-4.2.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li class="normal" id="section-11.2-4.3">
|
||
<p id="section-11.2-4.3.1"><strong>SCITT anchoring</strong>: For high-assurance deployments, Phase 2 ACTs
|
||
<span class="bcp14">SHOULD</span> be anchored to a SCITT Transparency Service, providing
|
||
external witness that the record was submitted at a claimed time.<a href="#section-11.2-4.3.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
</ul>
|
||
</section>
|
||
</div>
|
||
<div id="key-compromise">
|
||
<section id="section-11.3">
|
||
<h3 id="name-key-compromise">
|
||
<a href="#section-11.3" class="section-number selfRef">11.3. </a><a href="#name-key-compromise" class="section-name selfRef">Key Compromise</a>
|
||
</h3>
|
||
<p id="section-11.3-1">If an agent's private key is compromised, an attacker can issue
|
||
arbitrary Phase 1 mandates (impersonating the agent as an issuer)
|
||
and fabricate Phase 2 records (impersonating the agent as an
|
||
executor).<a href="#section-11.3-1" class="pilcrow">¶</a></p>
|
||
<p id="section-11.3-2">Key compromise response:<a href="#section-11.3-2" class="pilcrow">¶</a></p>
|
||
<ol start="1" type="1" class="normal type-1" id="section-11.3-3">
|
||
<li id="section-11.3-3.1">
|
||
<p id="section-11.3-3.1.1">The compromised agent's identifier <span class="bcp14">MUST</span> be added to all
|
||
verifiers' deny lists.<a href="#section-11.3-3.1.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li id="section-11.3-3.2">
|
||
<p id="section-11.3-3.2.1">In Tier 2 (PKI) deployments, the certificate <span class="bcp14">MUST</span> be revoked
|
||
via CRL or OCSP.<a href="#section-11.3-3.2.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li id="section-11.3-3.3">
|
||
<p id="section-11.3-3.3.1">In Tier 3 (DID) deployments, the DID Document <span class="bcp14">MUST</span> be updated
|
||
to revoke the compromised key.<a href="#section-11.3-3.3.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li id="section-11.3-3.4">
|
||
<p id="section-11.3-3.4.1">In Tier 1 (pre-shared key) deployments, both parties <span class="bcp14">MUST</span>
|
||
perform an out-of-band key rotation.<a href="#section-11.3-3.4.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
</ol>
|
||
<p id="section-11.3-4">ACT chains that include records signed by a compromised key <span class="bcp14">MUST</span>
|
||
be treated as potentially tainted from the point of compromise.
|
||
Audit systems <span class="bcp14">MUST</span> flag all ACTs signed after the estimated
|
||
compromise time.<a href="#section-11.3-4" class="pilcrow">¶</a></p>
|
||
</section>
|
||
</div>
|
||
<div id="replay-attack-prevention">
|
||
<section id="section-11.4">
|
||
<h3 id="name-replay-attack-prevention">
|
||
<a href="#section-11.4" class="section-number selfRef">11.4. </a><a href="#name-replay-attack-prevention" class="section-name selfRef">Replay Attack Prevention</a>
|
||
</h3>
|
||
<p id="section-11.4-1"><code>jti</code> uniqueness within the applicable scope (workflow or global)
|
||
provides replay detection. Verifiers <span class="bcp14">MUST</span> reject ACTs whose <code>jti</code>
|
||
has already been seen and processed.<a href="#section-11.4-1" class="pilcrow">¶</a></p>
|
||
<p id="section-11.4-2"><code>exp</code> provides a time-bounded replay window. Verifiers <span class="bcp14">MUST</span> reject
|
||
expired ACTs. The combination of <code>jti</code> and <code>exp</code> means that replay
|
||
detection state only needs to be maintained for the duration of token
|
||
lifetimes.<a href="#section-11.4-2" class="pilcrow">¶</a></p>
|
||
</section>
|
||
</div>
|
||
<div id="equivocation">
|
||
<section id="section-11.5">
|
||
<h3 id="name-equivocation">
|
||
<a href="#section-11.5" class="section-number selfRef">11.5. </a><a href="#name-equivocation" class="section-name selfRef">Equivocation</a>
|
||
</h3>
|
||
<p id="section-11.5-1">In standalone deployment (no audit ledger, no SCITT anchoring), ACT
|
||
does NOT provide non-equivocation guarantees. A compromised agent
|
||
can maintain two valid ACT chains — presenting Phase 2 records with
|
||
different <code>out_hash</code> values to different verifiers — and both will
|
||
pass independent verification.<a href="#section-11.5-1" class="pilcrow">¶</a></p>
|
||
<p id="section-11.5-2"><strong>Deployments claiming DORA <span>[<a href="#DORA" class="cite xref">DORA</a>]</span> Article 10/11 compliance or EU AI
|
||
Act <span>[<a href="#EUAIA" class="cite xref">EUAIA</a>]</span> Article 12 compliance <span class="bcp14">MUST</span> use one of:</strong><a href="#section-11.5-2" class="pilcrow">¶</a></p>
|
||
<p id="section-11.5-3">(a) A shared append-only audit ledger visible to all relevant parties,
|
||
with cryptographic integrity (hash chaining or Merkle trees).<a href="#section-11.5-3" class="pilcrow">¶</a></p>
|
||
<p id="section-11.5-4">(b) SCITT anchoring <span>[<a href="#I-D.ietf-scitt-architecture" class="cite xref">I-D.ietf-scitt-architecture</a>]</span> providing external
|
||
Transparency Service receipts.<a href="#section-11.5-4" class="pilcrow">¶</a></p>
|
||
<p id="section-11.5-5">Standalone ACT provides tamper detection (a verifier can detect
|
||
modification of a record it has seen) but not split-view prevention
|
||
(a verifier cannot detect a different record shown to another
|
||
verifier).<a href="#section-11.5-5" class="pilcrow">¶</a></p>
|
||
</section>
|
||
</div>
|
||
<div id="privilege-escalation">
|
||
<section id="section-11.6">
|
||
<h3 id="name-privilege-escalation">
|
||
<a href="#section-11.6" class="section-number selfRef">11.6. </a><a href="#name-privilege-escalation" class="section-name selfRef">Privilege Escalation</a>
|
||
</h3>
|
||
<p id="section-11.6-1">Verifiers <span class="bcp14">MUST</span> check that each step in <code>del.chain</code> reduces or
|
||
maintains (never increases) the capabilities relative to the
|
||
preceding step. Implementations <span class="bcp14">MUST</span> reject ACTs where:<a href="#section-11.6-1" class="pilcrow">¶</a></p>
|
||
<ul class="normal">
|
||
<li class="normal" id="section-11.6-2.1">
|
||
<p id="section-11.6-2.1.1"><code>del.depth</code> exceeds <code>del.max_depth</code>.<a href="#section-11.6-2.1.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li class="normal" id="section-11.6-2.2">
|
||
<p id="section-11.6-2.2.1"><code>cap</code> contains actions not present in any referenced parent ACT.<a href="#section-11.6-2.2.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li class="normal" id="section-11.6-2.3">
|
||
<p id="section-11.6-2.3.1">Constraints in <code>cap</code> are less restrictive than those in the parent.<a href="#section-11.6-2.3.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
</ul>
|
||
</section>
|
||
</div>
|
||
<div id="denial-of-service">
|
||
<section id="section-11.7">
|
||
<h3 id="name-denial-of-service">
|
||
<a href="#section-11.7" class="section-number selfRef">11.7. </a><a href="#name-denial-of-service" class="section-name selfRef">Denial of Service</a>
|
||
</h3>
|
||
<p id="section-11.7-1">ACT verification is more computationally expensive than standard JWT
|
||
validation due to delegation chain verification and DAG traversal.<a href="#section-11.7-1" class="pilcrow">¶</a></p>
|
||
<p id="section-11.7-2">Mitigations:<a href="#section-11.7-2" class="pilcrow">¶</a></p>
|
||
<ul class="normal">
|
||
<li class="normal" id="section-11.7-3.1">
|
||
<p id="section-11.7-3.1.1">Reject ACTs larger than 64KB before parsing.<a href="#section-11.7-3.1.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li class="normal" id="section-11.7-3.2">
|
||
<p id="section-11.7-3.2.1">Enforce maximum <code>del.chain</code> length (<span class="bcp14">RECOMMENDED</span>: 10 entries).<a href="#section-11.7-3.2.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li class="normal" id="section-11.7-3.3">
|
||
<p id="section-11.7-3.3.1">Enforce maximum DAG ancestor traversal depth (<span class="bcp14">RECOMMENDED</span>: 10,000
|
||
nodes, <a href="#dag-validation" class="auto internal xref">Section 7.1</a>).<a href="#section-11.7-3.3.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li class="normal" id="section-11.7-3.4">
|
||
<p id="section-11.7-3.4.1">Cache verification results for recently seen <code>jti</code> values within
|
||
the token lifetime window.<a href="#section-11.7-3.4.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
</ul>
|
||
</section>
|
||
</div>
|
||
</section>
|
||
</div>
|
||
<div id="privacy-considerations">
|
||
<section id="section-12">
|
||
<h2 id="name-privacy-considerations">
|
||
<a href="#section-12" class="section-number selfRef">12. </a><a href="#name-privacy-considerations" class="section-name selfRef">Privacy Considerations</a>
|
||
</h2>
|
||
<p id="section-12-1">ACT tokens and audit ledger records may contain information that
|
||
identifies agents, organizations, or individuals. Implementations
|
||
<span class="bcp14">SHOULD</span> apply data minimization principles:<a href="#section-12-1" class="pilcrow">¶</a></p>
|
||
<ul class="normal">
|
||
<li class="normal" id="section-12-2.1">
|
||
<p id="section-12-2.1.1"><code>task.created_by</code> <span class="bcp14">SHOULD</span> use a pseudonymous identifier rather
|
||
than a personal email address or real name.<a href="#section-12-2.1.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li class="normal" id="section-12-2.2">
|
||
<p id="section-12-2.2.1"><code>task.purpose</code> <span class="bcp14">SHOULD</span> use a controlled vocabulary code rather
|
||
than free-text descriptions that may contain personal data.<a href="#section-12-2.2.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li class="normal" id="section-12-2.3">
|
||
<p id="section-12-2.3.1"><code>del.chain</code> entries reveal organizational structure. Cross-
|
||
organizational delegation chains <span class="bcp14">SHOULD</span> use Tier 3 (DID)
|
||
identifiers that do not reveal organizational affiliation.<a href="#section-12-2.3.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li class="normal" id="section-12-2.4">
|
||
<p id="section-12-2.4.1"><code>inp_hash</code> and <code>out_hash</code> are hashes of data, not the data
|
||
itself, and do not constitute personal data under GDPR
|
||
Article 4(1) provided the underlying data is not trivially
|
||
reversible (e.g., hashes of very short strings).<a href="#section-12-2.4.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
</ul>
|
||
<p id="section-12-3">For GDPR Article 17 (right to erasure) compliance, audit ledgers
|
||
<span class="bcp14">SHOULD</span> store only ACT tokens (which contain hashes, not raw data)
|
||
and <span class="bcp14">SHOULD</span> implement crypto-shredding for any associated encrypted
|
||
payloads.<a href="#section-12-3" class="pilcrow">¶</a></p>
|
||
</section>
|
||
</div>
|
||
<div id="iana-considerations">
|
||
<section id="section-13">
|
||
<h2 id="name-iana-considerations">
|
||
<a href="#section-13" class="section-number selfRef">13. </a><a href="#name-iana-considerations" class="section-name selfRef">IANA Considerations</a>
|
||
</h2>
|
||
<div id="media-type-registration">
|
||
<section id="section-13.1">
|
||
<h3 id="name-media-type-registration">
|
||
<a href="#section-13.1" class="section-number selfRef">13.1. </a><a href="#name-media-type-registration" class="section-name selfRef">Media Type Registration</a>
|
||
</h3>
|
||
<p id="section-13.1-1">This document requests registration of the following media type:<a href="#section-13.1-1" class="pilcrow">¶</a></p>
|
||
<ul class="normal">
|
||
<li class="normal" id="section-13.1-2.1">
|
||
<p id="section-13.1-2.1.1">Type name: application<a href="#section-13.1-2.1.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li class="normal" id="section-13.1-2.2">
|
||
<p id="section-13.1-2.2.1">Subtype name: act+jwt<a href="#section-13.1-2.2.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li class="normal" id="section-13.1-2.3">
|
||
<p id="section-13.1-2.3.1">Required parameters: none<a href="#section-13.1-2.3.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li class="normal" id="section-13.1-2.4">
|
||
<p id="section-13.1-2.4.1">Encoding considerations: binary (base64url-encoded JWT)<a href="#section-13.1-2.4.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li class="normal" id="section-13.1-2.5">
|
||
<p id="section-13.1-2.5.1">Security considerations: See <a href="#security-considerations" class="auto internal xref">Section 11</a>.<a href="#section-13.1-2.5.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li class="normal" id="section-13.1-2.6">
|
||
<p id="section-13.1-2.6.1">Interoperability considerations: See <a href="#auth-verification" class="auto internal xref">Section 8.1</a>.<a href="#section-13.1-2.6.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li class="normal" id="section-13.1-2.7">
|
||
<p id="section-13.1-2.7.1">Specification: This document.<a href="#section-13.1-2.7.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
</ul>
|
||
</section>
|
||
</div>
|
||
<div id="http-header-field-registration">
|
||
<section id="section-13.2">
|
||
<h3 id="name-http-header-field-registrat">
|
||
<a href="#section-13.2" class="section-number selfRef">13.2. </a><a href="#name-http-header-field-registrat" class="section-name selfRef">HTTP Header Field Registration</a>
|
||
</h3>
|
||
<p id="section-13.2-1">This document requests registration of the following HTTP header
|
||
fields in the "Hypertext Transfer Protocol (HTTP) Field Name
|
||
Registry":<a href="#section-13.2-1" class="pilcrow">¶</a></p>
|
||
<ul class="normal">
|
||
<li class="normal" id="section-13.2-2.1">
|
||
<p id="section-13.2-2.1.1">Header field name: ACT-Mandate<a href="#section-13.2-2.1.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li class="normal" id="section-13.2-2.2">
|
||
<p id="section-13.2-2.2.1">Applicable protocol: HTTP<a href="#section-13.2-2.2.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li class="normal" id="section-13.2-2.3">
|
||
<p id="section-13.2-2.3.1">Status: permanent<a href="#section-13.2-2.3.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li class="normal" id="section-13.2-2.4">
|
||
<p id="section-13.2-2.4.1">Specification: This document, <a href="#http-header-transport" class="auto internal xref">Section 9.1</a>.<a href="#section-13.2-2.4.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li class="normal" id="section-13.2-2.5">
|
||
<p id="section-13.2-2.5.1">Header field name: ACT-Record<a href="#section-13.2-2.5.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li class="normal" id="section-13.2-2.6">
|
||
<p id="section-13.2-2.6.1">Applicable protocol: HTTP<a href="#section-13.2-2.6.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li class="normal" id="section-13.2-2.7">
|
||
<p id="section-13.2-2.7.1">Status: permanent<a href="#section-13.2-2.7.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
<li class="normal" id="section-13.2-2.8">
|
||
<p id="section-13.2-2.8.1">Specification: This document, <a href="#http-header-transport" class="auto internal xref">Section 9.1</a>.<a href="#section-13.2-2.8.1" class="pilcrow">¶</a></p>
|
||
</li>
|
||
</ul>
|
||
</section>
|
||
</div>
|
||
<div id="jwt-claims-registration">
|
||
<section id="section-13.3">
|
||
<h3 id="name-jwt-claims-registration">
|
||
<a href="#section-13.3" class="section-number selfRef">13.3. </a><a href="#name-jwt-claims-registration" class="section-name selfRef">JWT Claims Registration</a>
|
||
</h3>
|
||
<p id="section-13.3-1">This document requests registration of the following claims in the
|
||
IANA "JSON Web Token Claims" registry:<a href="#section-13.3-1" class="pilcrow">¶</a></p>
|
||
<table class="center" id="table-1">
|
||
<caption><a href="#table-1" class="selfRef">Table 1</a></caption>
|
||
<thead>
|
||
<tr>
|
||
<th class="text-left" rowspan="1" colspan="1">Claim Name</th>
|
||
<th class="text-left" rowspan="1" colspan="1">Description</th>
|
||
<th class="text-left" rowspan="1" colspan="1">Reference</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td class="text-left" rowspan="1" colspan="1">wid</td>
|
||
<td class="text-left" rowspan="1" colspan="1">Workflow identifier</td>
|
||
<td class="text-left" rowspan="1" colspan="1">This document</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="text-left" rowspan="1" colspan="1">task</td>
|
||
<td class="text-left" rowspan="1" colspan="1">Task authorization context</td>
|
||
<td class="text-left" rowspan="1" colspan="1">This document</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="text-left" rowspan="1" colspan="1">cap</td>
|
||
<td class="text-left" rowspan="1" colspan="1">Capabilities with constraints</td>
|
||
<td class="text-left" rowspan="1" colspan="1">This document</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="text-left" rowspan="1" colspan="1">oversight</td>
|
||
<td class="text-left" rowspan="1" colspan="1">Human oversight requirements</td>
|
||
<td class="text-left" rowspan="1" colspan="1">This document</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="text-left" rowspan="1" colspan="1">del</td>
|
||
<td class="text-left" rowspan="1" colspan="1">Delegation provenance chain</td>
|
||
<td class="text-left" rowspan="1" colspan="1">This document</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="text-left" rowspan="1" colspan="1">exec_act</td>
|
||
<td class="text-left" rowspan="1" colspan="1">Executed action identifier</td>
|
||
<td class="text-left" rowspan="1" colspan="1">This document</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="text-left" rowspan="1" colspan="1">pred</td>
|
||
<td class="text-left" rowspan="1" colspan="1">Predecessor task identifiers (DAG)</td>
|
||
<td class="text-left" rowspan="1" colspan="1">This document</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="text-left" rowspan="1" colspan="1">inp_hash</td>
|
||
<td class="text-left" rowspan="1" colspan="1">SHA-256 hash of task input</td>
|
||
<td class="text-left" rowspan="1" colspan="1">This document</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="text-left" rowspan="1" colspan="1">out_hash</td>
|
||
<td class="text-left" rowspan="1" colspan="1">SHA-256 hash of task output</td>
|
||
<td class="text-left" rowspan="1" colspan="1">This document</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="text-left" rowspan="1" colspan="1">exec_ts</td>
|
||
<td class="text-left" rowspan="1" colspan="1">Actual execution timestamp</td>
|
||
<td class="text-left" rowspan="1" colspan="1">This document</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="text-left" rowspan="1" colspan="1">status</td>
|
||
<td class="text-left" rowspan="1" colspan="1">Execution status</td>
|
||
<td class="text-left" rowspan="1" colspan="1">This document</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="text-left" rowspan="1" colspan="1">err</td>
|
||
<td class="text-left" rowspan="1" colspan="1">Execution error context</td>
|
||
<td class="text-left" rowspan="1" colspan="1">This document</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
</section>
|
||
</div>
|
||
</section>
|
||
</div>
|
||
<div id="sec-combined-references">
|
||
<section id="section-14">
|
||
<h2 id="name-references">
|
||
<a href="#section-14" class="section-number selfRef">14. </a><a href="#name-references" class="section-name selfRef">References</a>
|
||
</h2>
|
||
<div id="sec-normative-references">
|
||
<section id="section-14.1">
|
||
<h3 id="name-normative-references">
|
||
<a href="#section-14.1" class="section-number selfRef">14.1. </a><a href="#name-normative-references" class="section-name selfRef">Normative References</a>
|
||
</h3>
|
||
<dl class="references">
|
||
<dt id="RFC2119">[RFC2119]</dt>
|
||
<dd>
|
||
<span class="refAuthor">Bradner, S.</span>, <span class="refTitle">"Key words for use in RFCs to Indicate Requirement Levels"</span>, <span class="seriesInfo">BCP 14</span>, <span class="seriesInfo">RFC 2119</span>, <span class="seriesInfo">DOI 10.17487/RFC2119</span>, <time datetime="1997-03" class="refDate">March 1997</time>, <span><<a href="https://www.rfc-editor.org/rfc/rfc2119">https://www.rfc-editor.org/rfc/rfc2119</a>></span>. </dd>
|
||
<dd class="break"></dd>
|
||
<dt id="RFC7515">[RFC7515]</dt>
|
||
<dd>
|
||
<span class="refAuthor">Jones, M.</span>, <span class="refAuthor">Bradley, J.</span>, and <span class="refAuthor">N. Sakimura</span>, <span class="refTitle">"JSON Web Signature (JWS)"</span>, <span class="seriesInfo">RFC 7515</span>, <span class="seriesInfo">DOI 10.17487/RFC7515</span>, <time datetime="2015-05" class="refDate">May 2015</time>, <span><<a href="https://www.rfc-editor.org/rfc/rfc7515">https://www.rfc-editor.org/rfc/rfc7515</a>></span>. </dd>
|
||
<dd class="break"></dd>
|
||
<dt id="RFC7517">[RFC7517]</dt>
|
||
<dd>
|
||
<span class="refAuthor">Jones, M.</span>, <span class="refTitle">"JSON Web Key (JWK)"</span>, <span class="seriesInfo">RFC 7517</span>, <span class="seriesInfo">DOI 10.17487/RFC7517</span>, <time datetime="2015-05" class="refDate">May 2015</time>, <span><<a href="https://www.rfc-editor.org/rfc/rfc7517">https://www.rfc-editor.org/rfc/rfc7517</a>></span>. </dd>
|
||
<dd class="break"></dd>
|
||
<dt id="RFC7518">[RFC7518]</dt>
|
||
<dd>
|
||
<span class="refAuthor">Jones, M.</span>, <span class="refTitle">"JSON Web Algorithms (JWA)"</span>, <span class="seriesInfo">RFC 7518</span>, <span class="seriesInfo">DOI 10.17487/RFC7518</span>, <time datetime="2015-05" class="refDate">May 2015</time>, <span><<a href="https://www.rfc-editor.org/rfc/rfc7518">https://www.rfc-editor.org/rfc/rfc7518</a>></span>. </dd>
|
||
<dd class="break"></dd>
|
||
<dt id="RFC7519">[RFC7519]</dt>
|
||
<dd>
|
||
<span class="refAuthor">Jones, M.</span>, <span class="refAuthor">Bradley, J.</span>, and <span class="refAuthor">N. Sakimura</span>, <span class="refTitle">"JSON Web Token (JWT)"</span>, <span class="seriesInfo">RFC 7519</span>, <span class="seriesInfo">DOI 10.17487/RFC7519</span>, <time datetime="2015-05" class="refDate">May 2015</time>, <span><<a href="https://www.rfc-editor.org/rfc/rfc7519">https://www.rfc-editor.org/rfc/rfc7519</a>></span>. </dd>
|
||
<dd class="break"></dd>
|
||
<dt id="RFC8037">[RFC8037]</dt>
|
||
<dd>
|
||
<span class="refAuthor">Liusvaara, I.</span>, <span class="refTitle">"CFRG Elliptic Curve Diffie-Hellman (ECDH) and Signatures in JSON Object Signing and Encryption (JOSE)"</span>, <span class="seriesInfo">RFC 8037</span>, <span class="seriesInfo">DOI 10.17487/RFC8037</span>, <time datetime="2017-01" class="refDate">January 2017</time>, <span><<a href="https://www.rfc-editor.org/rfc/rfc8037">https://www.rfc-editor.org/rfc/rfc8037</a>></span>. </dd>
|
||
<dd class="break"></dd>
|
||
<dt id="RFC8174">[RFC8174]</dt>
|
||
<dd>
|
||
<span class="refAuthor">Leiba, B.</span>, <span class="refTitle">"Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words"</span>, <span class="seriesInfo">BCP 14</span>, <span class="seriesInfo">RFC 8174</span>, <span class="seriesInfo">DOI 10.17487/RFC8174</span>, <time datetime="2017-05" class="refDate">May 2017</time>, <span><<a href="https://www.rfc-editor.org/rfc/rfc8174">https://www.rfc-editor.org/rfc/rfc8174</a>></span>. </dd>
|
||
<dd class="break"></dd>
|
||
<dt id="RFC9110">[RFC9110]</dt>
|
||
<dd>
|
||
<span class="refAuthor">Fielding, R., Ed.</span>, <span class="refAuthor">Nottingham, M., Ed.</span>, and <span class="refAuthor">J. Reschke, Ed.</span>, <span class="refTitle">"HTTP Semantics"</span>, <span class="seriesInfo">STD 97</span>, <span class="seriesInfo">RFC 9110</span>, <span class="seriesInfo">DOI 10.17487/RFC9110</span>, <time datetime="2022-06" class="refDate">June 2022</time>, <span><<a href="https://www.rfc-editor.org/rfc/rfc9110">https://www.rfc-editor.org/rfc/rfc9110</a>></span>. </dd>
|
||
<dd class="break"></dd>
|
||
<dt id="RFC9562">[RFC9562]</dt>
|
||
<dd>
|
||
<span class="refAuthor">Davis, K.</span>, <span class="refAuthor">Peabody, B.</span>, and <span class="refAuthor">P. Leach</span>, <span class="refTitle">"Universally Unique IDentifiers (UUIDs)"</span>, <span class="seriesInfo">RFC 9562</span>, <span class="seriesInfo">DOI 10.17487/RFC9562</span>, <time datetime="2024-05" class="refDate">May 2024</time>, <span><<a href="https://www.rfc-editor.org/rfc/rfc9562">https://www.rfc-editor.org/rfc/rfc9562</a>></span>. </dd>
|
||
<dd class="break"></dd>
|
||
</dl>
|
||
</section>
|
||
</div>
|
||
<div id="sec-informative-references">
|
||
<section id="section-14.2">
|
||
<h3 id="name-informative-references">
|
||
<a href="#section-14.2" class="section-number selfRef">14.2. </a><a href="#name-informative-references" class="section-name selfRef">Informative References</a>
|
||
</h3>
|
||
<dl class="references">
|
||
<dt id="A2A-SPEC">[A2A-SPEC]</dt>
|
||
<dd>
|
||
<span class="refAuthor">Google</span>, <span class="refTitle">"Agent2Agent (A2A) Protocol"</span>, <span><<a href="https://github.com/a2aproject/A2A">https://github.com/a2aproject/A2A</a>></span>. </dd>
|
||
<dd class="break"></dd>
|
||
<dt id="AgenticJWT">[AgenticJWT]</dt>
|
||
<dd>
|
||
<span class="refTitle">"Agentic JWT: A JSON Web Token Profile for Delegated Agent Authorization"</span>, <time datetime="2025" class="refDate">2025</time>, <span><<a href="https://arxiv.org/abs/2509.13597">https://arxiv.org/abs/2509.13597</a>></span>. </dd>
|
||
<dd class="break"></dd>
|
||
<dt id="AIP-IBCT">[AIP-IBCT]</dt>
|
||
<dd>
|
||
<span class="refAuthor">S., P.</span>, <span class="refTitle">"AIP: Agent Interaction Protocol with Interaction-Bound Context Tokens"</span>, <time datetime="2026-03" class="refDate">March 2026</time>, <span><<a href="https://arxiv.org/abs/2603.24775">https://arxiv.org/abs/2603.24775</a>></span>. </dd>
|
||
<dd class="break"></dd>
|
||
<dt id="AUTOGEN">[AUTOGEN]</dt>
|
||
<dd>
|
||
<span class="refAuthor">Microsoft</span>, <span class="refTitle">"AutoGen Documentation"</span>, <span><<a href="https://microsoft.github.io/autogen/">https://microsoft.github.io/autogen/</a>></span>. </dd>
|
||
<dd class="break"></dd>
|
||
<dt id="CREWAI">[CREWAI]</dt>
|
||
<dd>
|
||
<span class="refAuthor">CrewAI</span>, <span class="refTitle">"CrewAI Documentation"</span>, <span><<a href="https://docs.crewai.com/">https://docs.crewai.com/</a>></span>. </dd>
|
||
<dd class="break"></dd>
|
||
<dt id="DID-KEY">[DID-KEY]</dt>
|
||
<dd>
|
||
<span class="refAuthor">D., L.</span>, <span class="refTitle">"The did:key Method v0.7"</span>, <time datetime="2021" class="refDate">2021</time>, <span><<a href="https://w3c-ccg.github.io/did-method-key/">https://w3c-ccg.github.io/did-method-key/</a>></span>. </dd>
|
||
<dd class="break"></dd>
|
||
<dt id="DID-WEB">[DID-WEB]</dt>
|
||
<dd>
|
||
<span class="refAuthor">O., S.</span>, <span class="refTitle">"did:web Method Specification"</span>, <time datetime="2022" class="refDate">2022</time>, <span><<a href="https://w3c-ccg.github.io/did-method-web/">https://w3c-ccg.github.io/did-method-web/</a>></span>. </dd>
|
||
<dd class="break"></dd>
|
||
<dt id="DORA">[DORA]</dt>
|
||
<dd>
|
||
<span class="refAuthor">European Parliament</span>, <span class="refTitle">"Digital Operational Resilience Act (DORA), Regulation (EU) 2022/2554"</span>, <time datetime="2022" class="refDate">2022</time>, <span><<a href="https://eur-lex.europa.eu/eli/reg/2022/2554/oj">https://eur-lex.europa.eu/eli/reg/2022/2554/oj</a>></span>. </dd>
|
||
<dd class="break"></dd>
|
||
<dt id="EUAIA">[EUAIA]</dt>
|
||
<dd>
|
||
<span class="refAuthor">European Parliament</span>, <span class="refTitle">"EU Artificial Intelligence Act, Regulation (EU) 2024/1689"</span>, <time datetime="2024" class="refDate">2024</time>, <span><<a href="https://eur-lex.europa.eu/eli/reg/2024/1689/oj">https://eur-lex.europa.eu/eli/reg/2024/1689/oj</a>></span>. </dd>
|
||
<dd class="break"></dd>
|
||
<dt id="I-D.aap-oauth-profile">[I-D.aap-oauth-profile]</dt>
|
||
<dd>
|
||
<span class="refAuthor">A., C.</span>, <span class="refTitle">"Agent Authorization Profile (AAP) for OAuth 2.0"</span>, <span class="refContent">Work in Progress</span>, <span class="seriesInfo">Internet-Draft, draft-aap-oauth-profile-01</span>, <time datetime="2026-02" class="refDate">February 2026</time>, <span><<a href="https://datatracker.ietf.org/doc/draft-aap-oauth-profile/">https://datatracker.ietf.org/doc/draft-aap-oauth-profile/</a>></span>. </dd>
|
||
<dd class="break"></dd>
|
||
<dt id="I-D.emirdag-scitt-ai-agent-execution">[I-D.emirdag-scitt-ai-agent-execution]</dt>
|
||
<dd>
|
||
<span class="refAuthor">Emirdag</span>, <span class="refTitle">"A SCITT Profile for AI Agent Execution Records"</span>, <span class="refContent">Work in Progress</span>, <span class="seriesInfo">Internet-Draft, draft-emirdag-scitt-ai-agent-execution-00</span>, <time datetime="2026-04" class="refDate">April 2026</time>, <span><<a href="https://datatracker.ietf.org/doc/draft-emirdag-scitt-ai-agent-execution/">https://datatracker.ietf.org/doc/draft-emirdag-scitt-ai-agent-execution/</a>></span>. </dd>
|
||
<dd class="break"></dd>
|
||
<dt id="I-D.helixar-hdp-agentic-delegation">[I-D.helixar-hdp-agentic-delegation]</dt>
|
||
<dd>
|
||
<span class="refAuthor">Helixar</span>, <span class="refTitle">"Helixar Delegation Protocol (HDP) for Agentic Delegation"</span>, <span class="refContent">Work in Progress</span>, <span class="seriesInfo">Internet-Draft, draft-helixar-hdp-agentic-delegation-00</span>, <time datetime="2026" class="refDate">2026</time>, <span><<a href="https://datatracker.ietf.org/doc/draft-helixar-hdp-agentic-delegation/">https://datatracker.ietf.org/doc/draft-helixar-hdp-agentic-delegation/</a>></span>. </dd>
|
||
<dd class="break"></dd>
|
||
<dt id="I-D.ietf-scitt-architecture">[I-D.ietf-scitt-architecture]</dt>
|
||
<dd>
|
||
<span class="refAuthor">Birkholz, H.</span>, <span class="refAuthor">Delignat-Lavaud, A.</span>, <span class="refAuthor">Fournet, C.</span>, <span class="refAuthor">Deshpande, Y.</span>, and <span class="refAuthor">S. Lasker</span>, <span class="refTitle">"An Architecture for Trustworthy and Transparent Digital Supply Chains"</span>, <span class="refContent">Work in Progress</span>, <span class="seriesInfo">Internet-Draft, draft-ietf-scitt-architecture-22</span>, <time datetime="2025-10-10" class="refDate">10 October 2025</time>, <span><<a href="https://datatracker.ietf.org/doc/html/draft-ietf-scitt-architecture-22">https://datatracker.ietf.org/doc/html/draft-ietf-scitt-architecture-22</a>></span>. </dd>
|
||
<dd class="break"></dd>
|
||
<dt id="I-D.nennemann-wimse-ect">[I-D.nennemann-wimse-ect]</dt>
|
||
<dd>
|
||
<span class="refAuthor">Nennemann, C.</span>, <span class="refTitle">"Execution Context Tokens for Distributed Agentic Workflows"</span>, <span class="refContent">Work in Progress</span>, <span class="seriesInfo">Internet-Draft, draft-nennemann-wimse-ect-02</span>, <time datetime="2026" class="refDate">2026</time>, <span><<a href="https://datatracker.ietf.org/doc/draft-nennemann-wimse-ect/">https://datatracker.ietf.org/doc/draft-nennemann-wimse-ect/</a>></span>. </dd>
|
||
<dd class="break"></dd>
|
||
<dt id="I-D.oauth-transaction-tokens-for-agents">[I-D.oauth-transaction-tokens-for-agents]</dt>
|
||
<dd>
|
||
<span class="refAuthor">G., F.</span>, <span class="refTitle">"Transaction Tokens for Agentic AI Systems"</span>, <span class="refContent">Work in Progress</span>, <span class="seriesInfo">Internet-Draft, draft-oauth-transaction-tokens-for-agents-06</span>, <time datetime="2026" class="refDate">2026</time>, <span><<a href="https://datatracker.ietf.org/doc/draft-oauth-transaction-tokens-for-agents/">https://datatracker.ietf.org/doc/draft-oauth-transaction-tokens-for-agents/</a>></span>. </dd>
|
||
<dd class="break"></dd>
|
||
<dt id="IEC62304">[IEC62304]</dt>
|
||
<dd>
|
||
<span class="refAuthor">IEC</span>, <span class="refTitle">"Medical device software — Software life cycle processes, IEC 62304:2006+AMD1:2015"</span>, <time datetime="2015" class="refDate">2015</time>, <span><<a href="https://www.iec.ch/">https://www.iec.ch/</a>></span>. </dd>
|
||
<dd class="break"></dd>
|
||
<dt id="LANGGRAPH">[LANGGRAPH]</dt>
|
||
<dd>
|
||
<span class="refAuthor">LangChain</span>, <span class="refTitle">"LangGraph Documentation"</span>, <span><<a href="https://langchain-ai.github.io/langgraph/">https://langchain-ai.github.io/langgraph/</a>></span>. </dd>
|
||
<dd class="break"></dd>
|
||
<dt id="MCP-SPEC">[MCP-SPEC]</dt>
|
||
<dd>
|
||
<span class="refTitle">"Model Context Protocol Specification"</span>, <time datetime="2025-11-25" class="refDate">25 November 2025</time>, <span><<a href="https://modelcontextprotocol.io/specification/2025-11-25">https://modelcontextprotocol.io/specification/2025-11-25</a>></span>. </dd>
|
||
<dd class="break"></dd>
|
||
<dt id="OPENAI-AGENTS-SDK">[OPENAI-AGENTS-SDK]</dt>
|
||
<dd>
|
||
<span class="refAuthor">OpenAI</span>, <span class="refTitle">"OpenAI Agents SDK"</span>, <span><<a href="https://openai.github.io/openai-agents-python/">https://openai.github.io/openai-agents-python/</a>></span>. </dd>
|
||
<dd class="break"></dd>
|
||
<dt id="RFC7009">[RFC7009]</dt>
|
||
<dd>
|
||
<span class="refAuthor">Lodderstedt, T., Ed.</span>, <span class="refAuthor">Dronia, S.</span>, and <span class="refAuthor">M. Scurtescu</span>, <span class="refTitle">"OAuth 2.0 Token Revocation"</span>, <span class="seriesInfo">RFC 7009</span>, <span class="seriesInfo">DOI 10.17487/RFC7009</span>, <time datetime="2013-08" class="refDate">August 2013</time>, <span><<a href="https://www.rfc-editor.org/rfc/rfc7009">https://www.rfc-editor.org/rfc/rfc7009</a>></span>. </dd>
|
||
<dd class="break"></dd>
|
||
<dt id="RFC8693">[RFC8693]</dt>
|
||
<dd>
|
||
<span class="refAuthor">Jones, M.</span>, <span class="refAuthor">Nadalin, A.</span>, <span class="refAuthor">Campbell, B., Ed.</span>, <span class="refAuthor">Bradley, J.</span>, and <span class="refAuthor">C. Mortimore</span>, <span class="refTitle">"OAuth 2.0 Token Exchange"</span>, <span class="seriesInfo">RFC 8693</span>, <span class="seriesInfo">DOI 10.17487/RFC8693</span>, <time datetime="2020-01" class="refDate">January 2020</time>, <span><<a href="https://www.rfc-editor.org/rfc/rfc8693">https://www.rfc-editor.org/rfc/rfc8693</a>></span>. </dd>
|
||
<dd class="break"></dd>
|
||
<dt id="SentinelAgent">[SentinelAgent]</dt>
|
||
<dd>
|
||
<span class="refAuthor">Patil</span>, <span class="refTitle">"SentinelAgent: A Formal Delegation Chain Calculus for Verifiable Agent Authorization"</span>, <time datetime="2026-04" class="refDate">April 2026</time>, <span><<a href="https://arxiv.org/abs/2604.02767">https://arxiv.org/abs/2604.02767</a>></span>. </dd>
|
||
<dd class="break"></dd>
|
||
<dt id="W3C-DID">[W3C-DID]</dt>
|
||
<dd>
|
||
<span class="refAuthor">M., S.</span>, <span class="refTitle">"Decentralized Identifiers (DIDs) v1.0"</span>, <time datetime="2022-07" class="refDate">July 2022</time>, <span><<a href="https://www.w3.org/TR/did-core/">https://www.w3.org/TR/did-core/</a>></span>. </dd>
|
||
<dd class="break"></dd>
|
||
</dl>
|
||
</section>
|
||
</div>
|
||
</section>
|
||
</div>
|
||
<div id="appendix-a-complete-json-schema">
|
||
<section id="appendix-A">
|
||
<h2 id="name-appendix-a-complete-json-sc">
|
||
<a href="#name-appendix-a-complete-json-sc" class="section-name selfRef">Appendix A: Complete JSON Schema</a>
|
||
</h2>
|
||
<p id="appendix-A-1">The normative JSON Schema for ACT Phase 1 and Phase 2 tokens is
|
||
available at [TODO: reference implementation repository].<a href="#appendix-A-1" class="pilcrow">¶</a></p>
|
||
</section>
|
||
</div>
|
||
<div id="appendix-b-test-vectors">
|
||
<section id="appendix-B">
|
||
<h2 id="name-appendix-b-test-vectors">
|
||
<a href="#name-appendix-b-test-vectors" class="section-name selfRef">Appendix B: Test Vectors</a>
|
||
</h2>
|
||
<div id="b1-valid-phase-1-act-root-mandate-tier-1-pre-shared-key">
|
||
<section id="appendix-B.1">
|
||
<h3 id="name-b1-valid-phase-1-act-root-m">
|
||
<a href="#name-b1-valid-phase-1-act-root-m" class="section-name selfRef">B.1. Valid Phase 1 ACT — Root Mandate (Tier 1, Pre-Shared Key)</a>
|
||
</h3>
|
||
<div class="alignLeft art-text artwork" id="appendix-B.1-1">
|
||
<pre>
|
||
[TODO: include encoded test vector with signing key, payload,
|
||
and expected JWS Compact Serialization]
|
||
</pre><a href="#appendix-B.1-1" class="pilcrow">¶</a>
|
||
</div>
|
||
</section>
|
||
</div>
|
||
<div id="b2-valid-phase-2-act-completed-execution">
|
||
<section id="appendix-B.2">
|
||
<h3 id="name-b2-valid-phase-2-act-comple">
|
||
<a href="#name-b2-valid-phase-2-act-comple" class="section-name selfRef">B.2. Valid Phase 2 ACT — Completed Execution</a>
|
||
</h3>
|
||
<div class="alignLeft art-text artwork" id="appendix-B.2-1">
|
||
<pre>
|
||
[TODO: include encoded test vector demonstrating Phase 1 -> Phase 2
|
||
transition with re-signature by target agent]
|
||
</pre><a href="#appendix-B.2-1" class="pilcrow">¶</a>
|
||
</div>
|
||
</section>
|
||
</div>
|
||
<div id="b3-valid-phase-2-act-fan-in-multiple-parents">
|
||
<section id="appendix-B.3">
|
||
<h3 id="name-b3-valid-phase-2-act-fan-in">
|
||
<a href="#name-b3-valid-phase-2-act-fan-in" class="section-name selfRef">B.3. Valid Phase 2 ACT — Fan-in (Multiple Parents)</a>
|
||
</h3>
|
||
<div class="alignLeft art-text artwork" id="appendix-B.3-1">
|
||
<pre>
|
||
[TODO: demonstrate pred with two predecessor jti values from parallel
|
||
workflow branches]
|
||
</pre><a href="#appendix-B.3-1" class="pilcrow">¶</a>
|
||
</div>
|
||
</section>
|
||
</div>
|
||
<div id="b4-invalid-act-delegation-depth-exceeded">
|
||
<section id="appendix-B.4">
|
||
<h3 id="name-b4-invalid-act-delegation-d">
|
||
<a href="#name-b4-invalid-act-delegation-d" class="section-name selfRef">B.4. Invalid ACT — Delegation Depth Exceeded</a>
|
||
</h3>
|
||
<div class="alignLeft art-text artwork" id="appendix-B.4-1">
|
||
<pre>
|
||
[TODO: demonstrate del.depth > del.max_depth rejection]
|
||
</pre><a href="#appendix-B.4-1" class="pilcrow">¶</a>
|
||
</div>
|
||
</section>
|
||
</div>
|
||
<div id="b5-invalid-act-capability-escalation">
|
||
<section id="appendix-B.5">
|
||
<h3 id="name-b5-invalid-act-capability-e">
|
||
<a href="#name-b5-invalid-act-capability-e" class="section-name selfRef">B.5. Invalid ACT — Capability Escalation</a>
|
||
</h3>
|
||
<div class="alignLeft art-text artwork" id="appendix-B.5-1">
|
||
<pre>
|
||
[TODO: demonstrate rejection when delegated cap contains action
|
||
not present in parent ACT]
|
||
</pre><a href="#appendix-B.5-1" class="pilcrow">¶</a>
|
||
</div>
|
||
</section>
|
||
</div>
|
||
<div id="b6-invalid-act-execact-mismatch">
|
||
<section id="appendix-B.6">
|
||
<h3 id="name-b6-invalid-act-exec_act-mis">
|
||
<a href="#name-b6-invalid-act-exec_act-mis" class="section-name selfRef">B.6. Invalid ACT — exec_act Mismatch</a>
|
||
</h3>
|
||
<div class="alignLeft art-text artwork" id="appendix-B.6-1">
|
||
<pre>
|
||
[TODO: demonstrate rejection when exec_act does not match any
|
||
cap.action in the Phase 1 claims]
|
||
</pre><a href="#appendix-B.6-1" class="pilcrow">¶</a>
|
||
</div>
|
||
</section>
|
||
</div>
|
||
</section>
|
||
</div>
|
||
<div id="appendix-c-deployment-scenarios">
|
||
<section id="appendix-C">
|
||
<h2 id="name-appendix-c-deployment-scena">
|
||
<a href="#name-appendix-c-deployment-scena" class="section-name selfRef">Appendix C: Deployment Scenarios</a>
|
||
</h2>
|
||
<div id="c1-minimal-deployment-zero-infrastructure">
|
||
<section id="appendix-C.1">
|
||
<h3 id="name-c1-minimal-deployment-zero-">
|
||
<a href="#name-c1-minimal-deployment-zero-" class="section-name selfRef">C.1. Minimal Deployment (Zero Infrastructure)</a>
|
||
</h3>
|
||
<p id="appendix-C.1-1">Two organizations exchange pre-shared public keys via secure email.
|
||
Each agent signs Phase 1 mandates and Phase 2 records with its
|
||
Ed25519 key. No ledger, no external services. Suitable for
|
||
development and low-risk workflows.<a href="#appendix-C.1-1" class="pilcrow">¶</a></p>
|
||
<p id="appendix-C.1-2">Limitation: No non-equivocation (<a href="#equivocation" class="auto internal xref">Section 11.5</a>).<a href="#appendix-C.1-2" class="pilcrow">¶</a></p>
|
||
</section>
|
||
</div>
|
||
<div id="c2-regulated-deployment-with-hash-chained-ledger">
|
||
<section id="appendix-C.2">
|
||
<h3 id="name-c2-regulated-deployment-wit">
|
||
<a href="#name-c2-regulated-deployment-wit" class="section-name selfRef">C.2. Regulated Deployment with Hash-Chained Ledger</a>
|
||
</h3>
|
||
<p id="appendix-C.2-1">Phase 2 ACTs are submitted to a shared append-only ledger with
|
||
hash-chaining. Each recorded ACT extends a cryptographic chain,
|
||
providing tamper evidence for each ACT and the chain as a whole.
|
||
The ledger is shared between all regulated parties participating
|
||
in the workflow. Suitable for DORA compliance.<a href="#appendix-C.2-1" class="pilcrow">¶</a></p>
|
||
</section>
|
||
</div>
|
||
<div id="c3-high-assurance-cross-organizational-deployment">
|
||
<section id="appendix-C.3">
|
||
<h3 id="name-c3-high-assurance-cross-org">
|
||
<a href="#name-c3-high-assurance-cross-org" class="section-name selfRef">C.3. High-Assurance Cross-Organizational Deployment</a>
|
||
</h3>
|
||
<p id="appendix-C.3-1">Phase 2 ACTs are anchored to a SCITT Transparency Service. SCITT
|
||
receipts are attached to the audit record as non-equivocation proofs.
|
||
DID-based agent identities (Tier 3) enable self-sovereign key
|
||
management without shared CA infrastructure.<a href="#appendix-C.3-1" class="pilcrow">¶</a></p>
|
||
</section>
|
||
</div>
|
||
<div id="c4-wimse-environment-integration">
|
||
<section id="appendix-C.4">
|
||
<h3 id="name-c4-wimse-environment-integr">
|
||
<a href="#name-c4-wimse-environment-integr" class="section-name selfRef">C.4. WIMSE Environment Integration</a>
|
||
</h3>
|
||
<p id="appendix-C.4-1">In environments where WIMSE is already deployed, ACT-Mandate and
|
||
ACT-Record headers are carried alongside the WIMSE Workload-Identity
|
||
header. The ECT and ACT serve different purposes: the ECT records
|
||
workload-level execution in WIMSE terms; the ACT records the
|
||
authorization provenance and capability constraints that governed
|
||
the action.<a href="#appendix-C.4-1" class="pilcrow">¶</a></p>
|
||
</section>
|
||
</div>
|
||
</section>
|
||
</div>
|
||
<div id="acknowledgments">
|
||
<section id="appendix-D">
|
||
<h2 id="name-acknowledgments">
|
||
<a href="#name-acknowledgments" class="section-name selfRef">Acknowledgments</a>
|
||
</h2>
|
||
<p id="appendix-D-1">The author thanks the IETF WIMSE, OAuth, and SCITT working groups
|
||
for foundational work on workload identity, delegated authorization,
|
||
and transparent supply chain records that informs this specification.<a href="#appendix-D-1" class="pilcrow">¶</a></p>
|
||
</section>
|
||
</div>
|
||
<div id="authors-addresses">
|
||
<section id="appendix-E">
|
||
<h2 id="name-authors-address">
|
||
<a href="#name-authors-address" class="section-name selfRef">Author's Address</a>
|
||
</h2>
|
||
<address class="vcard">
|
||
<div dir="auto" class="left"><span class="fn nameRole">Christian Nennemann</span></div>
|
||
<div dir="auto" class="left"><span class="org">Independent Researcher</span></div>
|
||
<div class="email">
|
||
<span>Email:</span>
|
||
<a href="mailto:ietf@nennemann.de" class="email">ietf@nennemann.de</a>
|
||
</div>
|
||
</address>
|
||
</section>
|
||
</div>
|
||
<script>const toc = document.getElementById("toc");
|
||
toc.querySelector("h2").addEventListener("click", e => {
|
||
toc.classList.toggle("active");
|
||
});
|
||
toc.querySelector("nav").addEventListener("click", e => {
|
||
toc.classList.remove("active");
|
||
});
|
||
</script>
|
||
</body>
|
||
</html>
|