<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<?rfc rfcedstyle="yes"?>
<?rfc tocindent="yes"?>
<?rfc strict="yes"?>
<?rfc comments="yes"?>
<?rfc inline="yes"?>
<?rfc docmapping="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-somoza-atn-agent-trust-negotiation-01" category="exp" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <front>
    <title abbrev="agent-trust-negotiation">Agent Trust Negotiation: Capability, Delegation, and Provenance Binding for AI Agents</title>
    <seriesInfo name="Internet-Draft" value="draft-somoza-atn-agent-trust-negotiation-01"/>
    <author initials="E." surname="Somoza" fullname="Enrique Somoza">
      <organization>Independent</organization>
      <address>
        <postal>
          <country>US</country>
        </postal>
        <email>enrique@somoza.co</email>
      </address>
    </author>
    <date year="2026" month="May" day="28"/>
    <keyword>AI agents</keyword>
    <keyword>trust</keyword>
    <keyword>capability</keyword>
    <keyword>delegation</keyword>
    <keyword>provenance</keyword>
    <keyword>handshake</keyword>
    <keyword>DNS</keyword>
    <keyword>DNSSEC</keyword>
    <keyword>SCITT</keyword>
    <keyword>RATS</keyword>
    <abstract>
<t>This document defines the Agent Trust Negotiation (ATN) protocol. ATN sits above whatever mechanism is used to discover an agent identity and answers questions that discovery alone cannot: what is the agent permitted to do, under whose authority, with what provenance, and how do two agents reach a verifiable working agreement.</t>
      <t>ATN binds four artifacts to a discovered agent identity:</t>
      <ol spacing="normal" type="1"><li>
          <t>A Capability Manifest expressing what the agent is willing to do, under what conditions, and with what constraints.</t>
        </li>
        <li>
          <t>A Delegation Chain proving authorized principal scope and revocation paths.</t>
        </li>
        <li>
          <t>A Provenance Attestation proving build-time and runtime integrity.</t>
        </li>
        <li>
          <t>A Session Receipt produced at handshake completion, recording the negotiated scope.</t>
        </li>
      </ol>
      <t>ATN defines the handshake state machine that consumes these artifacts to produce a mutually verified, scope-bounded agent session, and a session receipt suitable for transparency log inclusion.</t>
      <t>ATN is discovery-agnostic. The default binding identifies agents as HTTP resources and uses a per-origin well-known URI to bootstrap discovery. A DNS-based binding is also specified for the cross-organizational case. Other bindings can plug into the same abstract interface. ATN composes with existing discovery proposals including AID, DNS-AID, and ANS v2.</t>
    </abstract>
  </front>
  <middle>
<section anchor="introduction">
      <name>Introduction</name>
      <t>Agent-to-agent discovery work in progress at the IETF and adjacent venues, including AID <xref target="AID"/>, DNS-AID <xref target="DNS-AID"/>, and ANS v2 <xref target="ANSv2"/>, addresses how to locate an agent's endpoint and verify its cryptographic identity. These efforts answer two questions: <em>where is the agent</em> and <em>who is the agent</em>.</t>
      <t>They do not answer the questions that arise immediately after:</t>
      <ul spacing="normal">
        <li>
          <t>What is the agent permitted to do, and under what constraints?</t>
        </li>
        <li>
          <t>Under whose authority is the agent operating?</t>
        </li>
        <li>
          <t>What is the provenance of the agent's software, model, and configuration?</t>
        </li>
        <li>
          <t>How do two agents reach a mutually verifiable working agreement before any task begins?</t>
        </li>
        <li>
          <t>What evidence remains after the session ends, and how is it audited?</t>
        </li>
      </ul>
      <t>This document defines the Agent Trust Negotiation (ATN) protocol to address these gaps. ATN is the layer above discovery. It assumes the discovery layer has located an endpoint and authenticated an identity through one of the existing mechanisms. ATN then negotiates the trust relationship.</t>
      <t>The design has four parts:</t>
      <ol spacing="normal" type="1"><li>
          <t>Four structured artifacts (Capability Manifest, Delegation Chain, Provenance Attestation, Session Receipt) that bind to an agent identity regardless of how that identity was discovered.</t>
        </li>
        <li>
          <t>A handshake protocol over HTTPS that exchanges and verifies the artifacts between two agents.</t>
        </li>
        <li>
          <t>A capability intersection algorithm that yields the negotiated session scope.</t>
        </li>
        <li>
          <t>A receipt format suitable for SCITT-style transparency log inclusion.</t>
        </li>
      </ol>
      <t>ATN deliberately does not introduce a new discovery mechanism. It builds on existing work and adds the negotiation layer that the agent ecosystem lacks.</t>
      <section anchor="scope">
        <name>Scope</name>
        <t>In scope:</t>
        <ul spacing="normal">
          <li>
            <t>Format and semantics of the four ATN artifacts.</t>
          </li>
          <li>
            <t>The Agent Trust Handshake (ATH) state machine.</t>
          </li>
          <li>
            <t>Capability intersection algebra.</t>
          </li>
          <li>
            <t>An abstract discovery binding interface and two concrete bindings (HTTP-Resource and DNS).</t>
          </li>
          <li>
            <t>IANA registrations for ATN-specific identifiers.</t>
          </li>
        </ul>
        <t>Out of scope:</t>
        <ul spacing="normal">
          <li>
            <t>Discovery of the agent itself (use <xref target="AID"/>, <xref target="DNS-AID"/>, <xref target="ANSv2"/>, or equivalent).</t>
          </li>
          <li>
            <t>Endpoint authentication (delegated to the discovery layer).</t>
          </li>
          <li>
            <t>Application protocol (delegated to MCP, A2A, OpenAPI, or equivalent).</t>
          </li>
          <li>
            <t>In-organization service-to-service identity (see <xref target="SPIFFE"/>).</t>
          </li>
          <li>
            <t>Reputation distribution.</t>
          </li>
          <li>
            <t>Behavioral attestation.</t>
          </li>
        </ul>
      </section>
      <section anchor="non-goals">
        <name>Non-Goals</name>
        <ul spacing="normal">
          <li>
            <t>ATN does NOT define a new DNS record type.</t>
          </li>
          <li>
            <t>ATN does NOT replace any existing discovery proposal.</t>
          </li>
          <li>
            <t>ATN does NOT introduce a centralized trust authority.</t>
          </li>
          <li>
            <t>ATN does NOT enforce policy. It produces verifiable evidence of declared and negotiated policy that downstream systems can audit.</t>
          </li>
        </ul>
      </section>
      <section anchor="choice-of-venue">
        <name>Choice of Venue</name>
        <t>ATN's choice of IETF as the venue follows from its dependencies. The discovery substrate options include DNS <xref target="RFC4033"/> and SVCB <xref target="RFC9460"/>, both IETF standards, as well as HTTP <xref target="RFC9110"/>. The attestation architecture is RATS <xref target="RFC9334"/>. The transparency log is SCITT. The signature format is JWS <xref target="RFC7515"/>. The mutual authentication transport is TLS <xref target="RFC8446"/>. The authorization frameworks ATN composes with are OAuth <xref target="RFC6749"/> and GNAP <xref target="RFC9635"/>.</t>
        <t>ATN is the composition of IETF primitives into a peer-to-peer agent trust handshake. Standardizing the composition in any other venue would fork the primitive stack and create alignment problems. The natural home for the composition is the same venue that standardized the primitives.</t>
      </section>
      <section anchor="changes-from-00">
        <name>Changes from draft-somoza-atn-agent-trust-negotiation-00</name>
        <t>This revision incorporates feedback received on the dmsc and dnsop working group lists. The substantive changes are:</t>
        <ol spacing="normal" type="1"><li>
            <t>The four artifacts are repositioned as the normative core of ATN, independent of any specific discovery substrate. The -00 framing of ATN as sitting above DNS-based discovery is replaced with a discovery-agnostic framing.</t>
          </li>
          <li>
            <t>A new HTTP-Resource Binding is specified as the default, using a per-origin well-known URI <xref target="RFC8615"/> to bootstrap discovery to a signed Index Document. See <xref target="http-resource-binding"/>.</t>
          </li>
          <li>
            <t>The DNS Binding is reduced to a thin TXT record that announces ATN support at an origin. It no longer carries per-agent records and no longer carries integrity hints. See <xref target="dns-binding"/>.</t>
          </li>
          <li>
            <t>The SVCB ParamKey registrations <tt>atn</tt> and <tt>atn-digest</tt> proposed in -00 are withdrawn. SVCB ParamKeys are not the appropriate mechanism for pointing at a separate document at another URL. See <xref target="withdrawal-of-svcb-paramkeys"/>.</t>
          </li>
          <li>
            <t>The JWS signature requirement on the Index Document is now MUST regardless of DNSSEC posture. The Index Document needs offline-verifiable provenance for cached, mirrored, and SCITT-published copies. See <xref target="index-document-jws"/>.</t>
          </li>
          <li>
            <t>The Introduction's claim that "Recent IETF work has converged on DNS-based discovery for AI agents" is removed. The discovery landscape includes multiple proposals at multiple venues; no convergence has occurred.</t>
          </li>
        </ol>
      </section>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
<section anchor="terminology">
        <name>Terminology</name>
        <dl>
          <dt>Agent</dt>
          <dd>
            <t>An automated software entity that initiates network interactions on behalf of, or with delegated authority from, a principal, without per-interaction human authorization.</t>
          </dd>
          <dt>Initiator</dt>
          <dd>
            <t>The agent that opens the trust handshake.</t>
          </dd>
          <dt>Responder</dt>
          <dd>
            <t>The agent that answers the trust handshake.</t>
          </dd>
          <dt>Origin</dt>
          <dd>
            <t>As defined in <xref target="RFC9110"/>. The scheme/host/port tuple that anchors one or more agents in the HTTP-Resource Binding.</t>
          </dd>
          <dt>Capability Manifest</dt>
          <dd>
            <t>A signed JSON <xref target="RFC8259"/> document declaring what an agent is willing to do, under what conditions, and with what constraints.</t>
          </dd>
          <dt>Delegation Chain</dt>
          <dd>
            <t>A signed sequence of authorization statements binding the agent to a principal, with explicit scope, time bounds, and revocation pointers.</t>
          </dd>
          <dt>Provenance Attestation</dt>
          <dd>
            <t>A signed document proving build-time and runtime characteristics of the agent.</t>
          </dd>
          <dt>Session Receipt</dt>
          <dd>
            <t>A signed record produced at handshake completion, summarizing the negotiated scope and identities, suitable for transparency log inclusion.</t>
          </dd>
          <dt>Negotiated Scope</dt>
          <dd>
            <t>The intersection of two agents' capability sets, time windows, authorization scopes, and operational constraints, as determined by the handshake.</t>
          </dd>
          <dt>Index Document</dt>
          <dd>
            <t>The JWS-signed JSON document fetched during HTTP-Resource Binding discovery, listing agents at an origin and origin-level capabilities.</t>
          </dd>
        </dl>
      </section>
    </section>
    <section anchor="architecture-overview">
      <name>Architecture Overview</name>
      <t>ATN defines four roles:</t>
      <ol spacing="normal" type="1"><li>
          <t>Agent Operator: publishes the discovery records and the ATN artifacts.</t>
        </li>
        <li>
          <t>Agent: the runtime entity, in either Initiator or Responder mode at any moment.</t>
        </li>
        <li>
          <t>Principal: the human, organization, or other agent that authorized the agent through the Delegation Chain.</t>
        </li>
        <li>
          <t>Witness: an optional third party that can pre-verify ATN artifacts and publish endorsements (e.g., via SCITT <xref target="SCITT"/>).</t>
        </li>
      </ol>
      <t>ATN layers above discovery:</t>
      <artwork><![CDATA[
+----------------------------------------------+
|  Application Layer (MCP, A2A, OpenAPI, ...)  |
+----------------------------------------------+
|  Agent Trust Negotiation (this document)     |
+----------------------------------------------+
|  Discovery and Identity                      |
|  (HTTP-Resource, AID, DNS-AID, ANS v2, ...)  |
+----------------------------------------------+
|  HTTP, DNS, DNSSEC, TLS                      |
+----------------------------------------------+
]]></artwork>
      <t>The handshake order is:</t>
      <ol spacing="normal" type="1"><li>
          <t>Discovery: Initiator resolves the Responder's identity via the active discovery binding (HTTP-Resource, DNS, or other).</t>
        </li>
        <li>
          <t>Artifact fetch: Initiator retrieves the four ATN artifacts referenced by the Index Document.</t>
        </li>
        <li>
          <t>Handshake: Initiator opens the ATN handshake. Both parties exchange artifacts and verify signatures.</t>
        </li>
        <li>
          <t>Negotiation: Both parties compute the capability intersection.</t>
        </li>
        <li>
          <t>Receipt: Both parties produce a signed Session Receipt covering the negotiated scope.</t>
        </li>
        <li>
          <t>Session: Application traffic proceeds within the negotiated scope.</t>
        </li>
      </ol>
      <t>The ATN core protocol operates on the four artifacts. How the Initiator obtained the Responder's identity and how that identity binds to the four artifacts are specified by a binding (see <xref target="discovery-binding-framework"/>). The handshake makes no assumptions about the binding beyond the abstract interface.</t>
    </section>
    <section anchor="discovery-binding-framework">
      <name>Discovery Binding Framework</name>
      <t>ATN is discovery-agnostic. The four artifacts and the handshake are the normative core; the binding to a discovery substrate is a separable concern. This document specifies two concrete bindings: HTTP-Resource Binding (the default, in <xref target="http-resource-binding"/>) and DNS Binding (optional, in <xref target="dns-binding"/>). Other bindings can be specified by future documents using the abstract interface below.</t>
      <section anchor="abstract-binding-interface">
        <name>Abstract Binding Interface</name>
        <t>A binding provides two operations:</t>
        <ol spacing="normal" type="1"><li>
            <t><tt>Resolve(identifier) -&gt; IndexDocumentURL</tt>: given an agent or origin identifier in the binding's namespace, return the URL at which the Index Document can be fetched.</t>
          </li>
          <li>
            <t><tt>Integrity(identifier) -&gt; IntegrityProof</tt>: return any integrity proof the binding provides for the resolution (e.g., DNSSEC signatures for a DNS binding). Bindings <bcp14>MAY</bcp14> return a null proof if no binding-level integrity is provided; the JWS signature on the Index Document remains mandatory in that case (see <xref target="index-document-jws"/>).</t>
          </li>
        </ol>
        <t>A binding is conformant if it provides these two operations and if the resolved Index Document, when fetched and JWS-verified, contains the claimed identifier.</t>
      </section>
      <section anchor="http-resource-binding">
        <name>HTTP-Resource Binding (Default)</name>
        <t>This is the default binding for HTTP-native agents. It identifies agents as HTTP resources and uses a per-origin well-known URI <xref target="RFC8615"/> to bootstrap discovery.</t>
        <section anchor="origin-discovery">
          <name>Origin Discovery</name>
          <t>For an origin <tt>https://example.com</tt>, the Index Document is fetched from:</t>
          <artwork><![CDATA[
https://example.com/.well-known/atn
]]></artwork>
          <t>This URI is registered in <xref target="iana-considerations"/> per <xref target="RFC8615"/>.</t>
        </section>
        <section anchor="agent-identification">
          <name>Agent Identification</name>
          <t>An agent is identified by an HTTPS URL of the form:</t>
          <artwork><![CDATA[
https://{origin}/{path}
]]></artwork>
          <t>The agent URL is the canonical identifier in the HTTP-Resource Binding. Agents at the same origin share one Index Document.</t>
        </section>
        <section anchor="per-agent-resources">
          <name>Per-Agent Resources</name>
          <t>A GET on the agent URL returns a JSON object containing the agent's Capability Manifest, Delegation Chain, and Provenance Attestation, or URLs from which each can be fetched. The agent URL <bcp14>MAY</bcp14> also serve as the handshake endpoint for the Initiator.</t>
        </section>
        <section anchor="operational-properties">
          <name>Operational Properties</name>
          <t>The HTTP-Resource Binding has the following properties relevant to operational deployments:</t>
          <ul spacing="normal">
            <li>
              <t>Many agents share one origin and one set of DNS records.</t>
            </li>
            <li>
              <t>Creating, modifying, or removing an agent requires no DNS changes.</t>
            </li>
            <li>
              <t>Web infrastructure (caching, load balancing, CDN) handles scale.</t>
            </li>
            <li>
              <t>Agent lookups do not generate per-agent DNS queries.</t>
            </li>
          </ul>
        </section>
        <section anchor="index-document-structure">
          <name>Index Document Structure</name>
          <t>The Index Document at <tt>/.well-known/atn</tt> is a JSON object with the following structure:</t>
          <sourcecode type="json"><![CDATA[
{
  "v": "atn1",
  "origin": "https://example.com",
  "issued_at": "2026-05-15T10:00:00Z",
  "not_after": "2026-08-15T10:00:00Z",
  "origin_capabilities": { "...": "see Capability Manifest" },
  "agents": [
    {
      "id": "https://example.com/agents/alice",
      "manifest_url": "https://example.com/alice/cap.jws",
      "delegation_url": "https://example.com/alice/del.jws",
      "provenance_url": "https://example.com/alice/prov.jws",
      "handshake_endpoint": "https://example.com/alice/hs",
      "key": { "...": "JWK per RFC 7517" }
    }
  ],
  "witness_pointers": [
    "https://scitt.example.org/entries/a1b2c3..."
  ]
}
]]></sourcecode>
          <t>Implementations <bcp14>MAY</bcp14> embed any of the artifact URLs above as inline objects instead.</t>
        </section>
        <section anchor="index-document-jws">
          <name>Index Document JWS Signature Requirements</name>
          <t>The Index Document <bcp14>MUST</bcp14> be signed as a JWS <xref target="RFC7515"/> using JSON Flattened Serialization. The signature is computed over the canonicalized JSON object. The signing key <bcp14>MUST</bcp14> be discoverable by the verifier through a trust anchor recognized by the verifier.</t>
          <t>The JWS signature requirement is <bcp14>MUST</bcp14> regardless of whether DNSSEC covers the origin's DNS records and regardless of whether the Index Document was fetched over TLS. The Index Document is an artifact that needs to be verifiable offline by parties that did not perform the original fetch, including SCITT transparency services and audit consumers reconstructing sessions long after the original TLS connection has closed.</t>
        </section>
      </section>
      <section anchor="dns-binding">
        <name>DNS Binding (Optional)</name>
        <t>This is an optional binding for cross-organizational discovery, where the verifier knows only a domain and needs to locate the ATN-supporting origin.</t>
        <section anchor="txt-record">
          <name>TXT Record</name>
          <t>A TXT record at <tt>_atn.{domain}</tt> announces ATN support:</t>
          <artwork><![CDATA[
_atn.example.com.  3600  IN  TXT  "v=atn1; origin=https://example.com"
]]></artwork>
          <t>The TXT record <bcp14>MUST</bcp14> contain <tt>v=atn1</tt> and <bcp14>SHOULD</bcp14> contain an <tt>origin</tt> key. If <tt>origin</tt> is absent, the origin is <tt>https://{domain}</tt>.</t>
          <t>The TXT record carries no integrity hints, no per-agent records, and no Index Document content. Its sole purpose is to announce that the origin supports ATN and, optionally, which origin to use.</t>
        </section>
        <section anchor="dnssec">
          <name>DNSSEC</name>
          <t>DNSSEC validation of the TXT record <xref target="RFC4033"/> is <bcp14>RECOMMENDED</bcp14>. JWS signing of the resolved Index Document remains <bcp14>MUST</bcp14> regardless of DNSSEC posture (see <xref target="index-document-jws"/>).</t>
        </section>
        <section anchor="withdrawal-of-svcb-paramkeys">
          <name>Withdrawal of -00 SVCB ParamKey Registrations</name>
          <t>The SVCB ParamKey registrations <tt>atn</tt> and <tt>atn-digest</tt> proposed in draft-somoza-atn-agent-trust-negotiation-00 are withdrawn. SVCB ParamKeys <xref target="RFC9460"/> are designed to convey service-connection hints (such as <tt>alpn</tt>, <tt>port</tt>, and <tt>ech</tt>), not to point at a separate document at another URL. Pointing at the Index Document from DNS is handled instead by the thin TXT record in <xref target="txt-record"/>.</t>
        </section>
      </section>
      <section anchor="other-bindings">
        <name>Other Bindings</name>
        <t>Other bindings (URI-based out-of-band, registry-based, embodied-agent-specific) can be specified by future documents using the abstract binding interface in <xref target="abstract-binding-interface"/>. Such bindings are out of scope for this document.</t>
      </section>
    </section>
    <section anchor="capability-manifest">
      <name>Capability Manifest</name>
      <t>The Capability Manifest declares what the agent is willing to do under what conditions. It is a JSON object signed as a JWS.</t>
      <section anchor="capability-object-structure">
        <name>Capability Object Structure</name>
        <t>Each capability is a structured object with explicit dimensions covering identification, semantics, scope, and operational bounds. The design borrows from the action-resource-condition pattern of established authorization frameworks, the schema-binding pattern of W3C Verifiable Credentials, and the attenuation principle of capability-based security research.</t>
        <table>
          <thead>
            <tr>
              <th align="left">Field</th>
              <th align="left">Required</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">
                <tt>id</tt></td>
              <td align="left">Yes</td>
              <td align="left">Capability identifier from the IANA registry, or a vendor-specific identifier.</td>
            </tr>
            <tr>
              <td align="left">
                <tt>schema</tt></td>
              <td align="left">Yes</td>
              <td align="left">URI plus SHA-256 digest of the formal capability definition.</td>
            </tr>
            <tr>
              <td align="left">
                <tt>actions</tt></td>
              <td align="left">Yes</td>
              <td align="left">List of action verbs scoped to the capability's schema vocabulary.</td>
            </tr>
            <tr>
              <td align="left">
                <tt>resources</tt></td>
              <td align="left">Yes</td>
              <td align="left">List of resource patterns the capability applies to.</td>
            </tr>
            <tr>
              <td align="left">
                <tt>conditions</tt></td>
              <td align="left">No</td>
              <td align="left">Runtime constraints: rate limits, data residency, time windows, size limits.</td>
            </tr>
            <tr>
              <td align="left">
                <tt>effects</tt></td>
              <td align="left">Yes</td>
              <td align="left">One of: <tt>none</tt>, <tt>read_only</tt>, <tt>idempotent</tt>, <tt>mutating</tt>.</td>
            </tr>
            <tr>
              <td align="left">
                <tt>external_calls</tt></td>
              <td align="left">Yes</td>
              <td align="left">One of: <tt>forbidden</tt>, <tt>listed_only</tt>, <tt>free</tt>. Whether the capability may call out.</td>
            </tr>
            <tr>
              <td align="left">
                <tt>sub_invocations</tt></td>
              <td align="left">Yes</td>
              <td align="left">One of: <tt>forbidden</tt>, <tt>same_scope</tt>, <tt>fresh_handshake_required</tt>. Sub-agent rules.</td>
            </tr>
            <tr>
              <td align="left">
                <tt>persistence</tt></td>
              <td align="left">Yes</td>
              <td align="left">One of: <tt>none</tt>, <tt>session_only</tt>, <tt>durable</tt>. Whether state survives the session.</td>
            </tr>
            <tr>
              <td align="left">
                <tt>resource_bounds</tt></td>
              <td align="left">Yes</td>
              <td align="left">Hard ceilings: <tt>max_tokens</tt>, <tt>max_duration_seconds</tt>, <tt>max_cost_usd</tt>.</td>
            </tr>
            <tr>
              <td align="left">
                <tt>preconditions</tt></td>
              <td align="left">No</td>
              <td align="left">Counterparty requirements that must hold before the capability is exercised.</td>
            </tr>
          </tbody>
        </table>
        <t>Every dimension uses a controlled vocabulary registered with IANA (see <xref target="iana-considerations"/>). Vendor-specific identifiers under the <tt>x-</tt> prefix are permitted for non-standard capabilities and <bcp14>MUST</bcp14> carry a schema reference.</t>
      </section>
      <section anchor="schema-binding">
        <name>Schema Binding</name>
        <t>The <tt>schema</tt> field binds the capability identifier to a formal definition. Two implementations resolving the same <tt>id</tt> to different <tt>schema.digest</tt> values <bcp14>MUST</bcp14> treat the capabilities as semantically distinct, even if the identifier matches. This eliminates the silent-divergence problem that opaque scope strings created in OAuth deployments.</t>
        <t>The schema document <bcp14>SHOULD</bcp14> define:</t>
        <ol spacing="normal" type="1"><li>
            <t>The semantic meaning of the capability identifier.</t>
          </li>
          <li>
            <t>The permitted values in <tt>actions</tt>.</t>
          </li>
          <li>
            <t>The format and semantics of <tt>resources</tt> patterns.</t>
          </li>
          <li>
            <t>Any capability-specific extensions to <tt>conditions</tt>.</t>
          </li>
        </ol>
        <t>Schema documents are versioned. A capability <bcp14>MAY</bcp14> pin a specific schema version via the digest.</t>
      </section>
      <section anchor="capability-manifest-structure">
        <name>Structure</name>
        <sourcecode type="json"><![CDATA[
{
  "v": "atn-capability-1",
  "agent_id": "<stable-identifier>",
  "issued_at": "2026-05-15T10:00:00Z",
  "valid_until": "2026-08-15T10:00:00Z",
  "capabilities": [
    {
      "id": "data-read",
      "schema": {
        "url": "https://example.com/atn/data-read-v1.json",
        "digest": "sha256:b4c5d6..."
      },
      "actions": ["read", "list"],
      "resources": [
        "dataset:public/*",
        "dataset:internal/research/*"
      ],
      "conditions": {
        "rate_limit": "1000/min",
        "data_residency": ["us", "eu"],
        "time_window": "09:00-17:00 UTC",
        "max_response_size_bytes": 10485760
      },
      "effects": "read_only",
      "external_calls": "forbidden",
      "sub_invocations": "forbidden",
      "persistence": "none",
      "resource_bounds": {
        "max_tokens": 100000,
        "max_duration_seconds": 1800,
        "max_cost_usd": 0.50
      },
      "preconditions": {
        "counterparty_provenance": "required",
        "counterparty_delegation": "required",
        "transport": "tls1.3"
      }
    },
    {
      "id": "task-execute",
      "schema": {
        "url": "https://example.com/atn/task-execute-v1.json",
        "digest": "sha256:c5d6e7..."
      },
      "actions": ["execute"],
      "resources": [
        "task:summarize",
        "task:translate",
        "task:classify"
      ],
      "conditions": {
        "max_session_minutes": 30
      },
      "effects": "idempotent",
      "external_calls": "listed_only",
      "sub_invocations": "same_scope",
      "persistence": "session_only",
      "resource_bounds": {
        "max_tokens": 500000,
        "max_duration_seconds": 1800,
        "max_cost_usd": 2.00
      },
      "preconditions": {
        "human_approval": "required",
        "approval_token_issuer": "https://approvals.example.com"
      }
    }
  ],
  "refusals": [
    {
      "category": "financial_transactions",
      "scope": "all"
    },
    {
      "category": "data_write",
      "scope": "external_systems"
    }
  ]
}
]]></sourcecode>
      </section>
      <section anchor="dimension-semantics">
        <name>Dimension Semantics</name>
        <t><tt>effects</tt> declares the consequence of exercising the capability:</t>
        <ul spacing="normal">
          <li>
            <t><tt>none</tt>: no observable consequence (introspection only).</t>
          </li>
          <li>
            <t><tt>read_only</tt>: data is read; no state changes.</t>
          </li>
          <li>
            <t><tt>idempotent</tt>: state may change but repeated execution is equivalent to single execution.</t>
          </li>
          <li>
            <t><tt>mutating</tt>: state changes, and the change is not idempotent.</t>
          </li>
        </ul>
        <t><tt>external_calls</tt> declares whether the capability may initiate calls outside the agent's own scope:</t>
        <ul spacing="normal">
          <li>
            <t><tt>forbidden</tt>: no external calls.</t>
          </li>
          <li>
            <t><tt>listed_only</tt>: external calls are permitted only to destinations listed in the schema or conditions.</t>
          </li>
          <li>
            <t><tt>free</tt>: any external call is permitted, bounded only by <tt>resource_bounds</tt>.</t>
          </li>
        </ul>
        <t><tt>sub_invocations</tt> declares the rules for invoking other agents:</t>
        <ul spacing="normal">
          <li>
            <t><tt>forbidden</tt>: this capability does not invoke other agents.</t>
          </li>
          <li>
            <t><tt>same_scope</tt>: sub-invocations inherit the present session's negotiated scope.</t>
          </li>
          <li>
            <t><tt>fresh_handshake_required</tt>: every sub-invocation requires a separate ATN handshake with the sub-agent.</t>
          </li>
        </ul>
        <t><tt>persistence</tt> declares state survivability:</t>
        <ul spacing="normal">
          <li>
            <t><tt>none</tt>: no state persists beyond a single request.</t>
          </li>
          <li>
            <t><tt>session_only</tt>: state persists for the session lifetime, then is discarded.</t>
          </li>
          <li>
            <t><tt>durable</tt>: state persists beyond the session; the agent <bcp14>MUST</bcp14> disclose retention policy in its schema.</t>
          </li>
        </ul>
        <t><tt>resource_bounds</tt> declares hard ceilings on the negotiated scope. Conforming implementations <bcp14>MUST</bcp14> terminate the session when any bound is exceeded. The protocol specifies the contract; runtime enforcement is the implementation's responsibility, consistent with the enforcement posture described in the Security Considerations.</t>
      </section>
      <section anchor="key-properties">
        <name>Key Properties</name>
        <ul spacing="normal">
          <li>
            <t>The manifest is a declaration of willingness, not an enforcement primitive. Violations are auditable through the Session Receipt and transparency log.</t>
          </li>
          <li>
            <t>The <tt>valid_until</tt> field forces rotation. Manifests without expiry <bcp14>MUST</bcp14> be rejected.</t>
          </li>
          <li>
            <t><tt>refusals</tt> are first-class. Explicit "will not" claims provide auditable accountability if violated.</t>
          </li>
          <li>
            <t>Capability <tt>id</tt> values from the IANA registry have stable semantics; vendor-specific identifiers under <tt>x-</tt> <bcp14>MUST</bcp14> carry a schema reference.</t>
          </li>
          <li>
            <t>Capabilities are deny-by-default. The negotiated session scope contains only what both parties explicitly offered.</t>
          </li>
        </ul>
      </section>
      <section anchor="refusal-semantics">
        <name>Refusal Semantics</name>
        <t>Refusals are a deliberate inversion of conventional capability advertisement. Most existing proposals describe what an agent CAN do. ATN requires agents to also describe what they explicitly WILL NOT do. This produces auditable behavioral contracts: a recorded refusal that is subsequently violated is direct evidence of misbehavior.</t>
      </section>
    </section>
    <section anchor="delegation-chain">
      <name>Delegation Chain</name>
      <t>The Delegation Chain proves the agent operates under authorized principal scope, with explicit time bounds and revocation paths.</t>
      <section anchor="delegation-chain-structure">
        <name>Structure</name>
        <sourcecode type="json"><![CDATA[
{
  "v": "atn-delegation-1",
  "agent_id": "<stable-identifier>",
  "chain": [
    {
      "issuer": "did:example:organization-root",
      "subject": "did:example:department-ops",
      "scope": ["agent.deploy", "agent.delegate"],
      "issued_at": "2026-01-01T00:00:00Z",
      "valid_until": "2027-01-01T00:00:00Z",
      "revocation": "https://example.com/atn/rev/dept-ops",
      "signature": "<JWS>"
    },
    {
      "issuer": "did:example:department-ops",
      "subject": "agent:<stable-identifier>",
      "scope": [
        "data-read",
        "task-execute:summarize",
        "task-execute:translate"
      ],
      "issued_at": "2026-05-01T00:00:00Z",
      "valid_until": "2026-08-01T00:00:00Z",
      "revocation": "https://example.com/atn/rev/agent",
      "signature": "<JWS>"
    }
  ]
}
]]></sourcecode>
      </section>
      <section anchor="verification">
        <name>Verification</name>
        <t>A relying party <bcp14>MUST</bcp14>:</t>
        <ol spacing="normal" type="1"><li>
            <t>Verify each link's signature against the issuer's published key.</t>
          </li>
          <li>
            <t>Verify each link's <tt>scope</tt> is a subset of the parent link's <tt>scope</tt>.</t>
          </li>
          <li>
            <t>Verify all links are within their <tt>valid_until</tt> window.</t>
          </li>
          <li>
            <t>Optionally poll revocation endpoints with rate-limited caching.</t>
          </li>
          <li>
            <t>Verify the leaf <tt>subject</tt> matches the agent's stable identifier from discovery.</t>
          </li>
        </ol>
        <t>If any check fails, the agent <bcp14>MUST NOT</bcp14> be trusted for any capability beyond the verifiable subset.</t>
      </section>
    </section>
    <section anchor="provenance-attestation">
      <name>Provenance Attestation</name>
      <t>The Provenance Attestation proves build-time and runtime characteristics of the agent.</t>
      <section anchor="provenance-attestation-structure">
        <name>Structure</name>
        <sourcecode type="json"><![CDATA[
{
  "v": "atn-provenance-1",
  "agent_id": "<stable-identifier>",
  "build": {
    "predicateType": "https://slsa.dev/provenance/v1",
    "predicate": { "...": "in-toto SLSA provenance" }
  },
  "model": {
    "model_id": "example-vendor/llm-v1.2.3",
    "model_version_sha256": "9f8e7d6c5b4a...",
    "system_prompt_sha256": "1a2b3c4d5e6f..."
  },
  "runtime": {
    "evidence_type": "RATS",
    "evidence": { "...": "RFC 9334 evidence" },
    "verifier": "https://verifier.example.com/rats"
  },
  "issued_at": "2026-05-15T08:00:00Z",
  "valid_until": "2026-05-15T20:00:00Z"
}
]]></sourcecode>
      </section>
      <section anchor="properties">
        <name>Properties</name>
        <ul spacing="normal">
          <li>
            <t>The Provenance Attestation links three independent supply chains: software build (SLSA, in-toto <xref target="IN-TOTO"/>), model identity (cryptographic hash of weights or version anchor), and runtime environment (RATS evidence <xref target="RFC9334"/>).</t>
          </li>
          <li>
            <t>All three are optional. An agent that publishes only build provenance is more trustworthy than one that publishes none and less trustworthy than one that publishes all three.</t>
          </li>
          <li>
            <t>Short <tt>valid_until</tt> windows are encouraged. The Provenance Attestation is the most time-sensitive artifact.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="the-agent-trust-handshake-ath">
      <name>The Agent Trust Handshake (ATH)</name>
      <section anchor="state-machine">
        <name>State Machine</name>
        <artwork><![CDATA[
   Initiator                                      Responder
       |                                              |
       |---- ATH_HELLO ------------------------------>|
       |     (initiator artifacts + requested scope)  |
       |                                              |
       |<--- ATH_OFFER -------------------------------|
       |     (responder artifacts + offered scope)    |
       |                                              |
       |---- ATH_ACCEPT ---------------------------- >|
       |     (intersection scope + receipt request)   |
       |                                              |
       |<--- ATH_RECEIPT -----------------------------|
       |     (signed session receipt)                 |
       |                                              |
       === negotiated session begins ===
]]></artwork>
        <t>All four messages are JSON, signed as JWS, exchanged over HTTPS at the Responder's <tt>handshake_endpoint</tt>.</t>
      </section>
      <section anchor="athhello">
        <name>ATH_HELLO</name>
        <sourcecode type="json"><![CDATA[
{
  "v": "ath1",
  "type": "hello",
  "supported_versions": ["ath1"],
  "initiator": {
    "agent_id": "<initiator-id>",
    "artifacts": {
      "capability": { "url": "...", "digest": "..." },
      "delegation": { "url": "...", "digest": "..." },
      "provenance": { "url": "...", "digest": "..." }
    }
  },
  "requested_scope": {
    "capability_ids": ["data-read"],
    "duration_seconds": 1800,
    "purpose": "summarize_research_corpus"
  },
  "nonce": "<random>",
  "timestamp": "..."
}
]]></sourcecode>
        <t>The <tt>requested_scope.capability_ids</tt> field carries only the identifiers of the capabilities the Initiator wishes to negotiate. The Responder consults its own Capability Manifest for the structured definitions and computes the intersection (see <xref target="capability-intersection-algebra"/>).</t>
      </section>
      <section anchor="athoffer">
        <name>ATH_OFFER</name>
        <t>The Responder verifies the Initiator's artifacts, computes the capability intersection, and returns:</t>
        <sourcecode type="json"><![CDATA[
{
  "v": "ath1",
  "type": "offer",
  "selected_version": "ath1",
  "supported_versions_echo": ["ath1"],
  "responder": {
    "agent_id": "<responder-id>",
    "artifacts": {
      "capability": { "url": "...", "digest": "..." },
      "delegation": { "url": "...", "digest": "..." },
      "provenance": { "url": "...", "digest": "..." }
    }
  },
  "offered_scope": {
    "capabilities": [
      {
        "id": "data-read",
        "schema": {
          "url": "https://example.com/atn/data-read-v1.json",
          "digest": "sha256:b4c5d6..."
        },
        "actions": ["read", "list"],
        "resources": ["dataset:public/*"],
        "conditions": {
          "rate_limit": "500/min",
          "data_residency": ["us"]
        },
        "effects": "read_only",
        "external_calls": "forbidden",
        "sub_invocations": "forbidden",
        "persistence": "none",
        "resource_bounds": {
          "max_tokens": 50000,
          "max_duration_seconds": 1800,
          "max_cost_usd": 0.50
        }
      }
    ],
    "duration_seconds": 1800,
    "purpose": "summarize_research_corpus"
  },
  "nonce": "<random>",
  "in_reply_to_nonce": "<initiator-nonce>",
  "timestamp": "..."
}
]]></sourcecode>
        <t>The <tt>offered_scope.capabilities</tt> field carries the full structured Capability objects after intersection. Each is the per-dimension intersection of the Initiator's requested capability (resolved from its Capability Manifest) and the Responder's offered version.</t>
      </section>
      <section anchor="athaccept">
        <name>ATH_ACCEPT</name>
        <t>If the Initiator agrees with the offered scope:</t>
        <sourcecode type="json"><![CDATA[
{
  "v": "ath1",
  "type": "accept",
  "agreed_scope": { "...": "matches ATH_OFFER offered_scope" },
  "nonce": "<random>",
  "in_reply_to_nonce": "<responder-nonce>",
  "timestamp": "..."
}
]]></sourcecode>
        <t>If the Initiator disagrees, it <bcp14>MAY</bcp14> send <tt>ATH_COUNTER</tt> with a revised request, up to a limit (see <xref target="handshake-limits"/>).</t>
      </section>
      <section anchor="athreceipt">
        <name>ATH_RECEIPT</name>
        <t>The Responder produces the Session Receipt:</t>
        <sourcecode type="json"><![CDATA[
{
  "v": "ath1",
  "type": "receipt",
  "session_id": "<uuid>",
  "initiator_id": "<initiator-id>",
  "responder_id": "<responder-id>",
  "agreed_scope": { "...": "the intersection result" },
  "artifact_digests": {
    "initiator_capability": "sha256:...",
    "initiator_delegation": "sha256:...",
    "initiator_provenance": "sha256:...",
    "responder_capability": "sha256:...",
    "responder_delegation": "sha256:...",
    "responder_provenance": "sha256:..."
  },
  "scitt_log_pointer": "https://scitt.example.org/entries/...",
  "issued_at": "...",
  "expires_at": "...",
  "signature": "<JWS by responder>"
}
]]></sourcecode>
        <t>Both parties countersign the receipt and <bcp14>MAY</bcp14> publish it to a SCITT log <xref target="SCITT"/>.</t>
      </section>
      <section anchor="handshake-limits">
        <name>Handshake Limits</name>
        <ul spacing="normal">
          <li>
            <t>Total handshake round trips <bcp14>MUST NOT</bcp14> exceed 4.</t>
          </li>
          <li>
            <t>ATH_COUNTER messages <bcp14>MUST NOT</bcp14> exceed 2 per session.</t>
          </li>
          <li>
            <t>The handshake <bcp14>MUST</bcp14> complete within 30 seconds.</t>
          </li>
          <li>
            <t>Sessions exceeding <tt>agreed_scope.duration_seconds</tt> require a new handshake.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="capability-intersection-algebra">
      <name>Capability Intersection Algebra</name>
      <t>When two agents present capability sets, the negotiated scope is computed by intersection. The algorithm is specified for interoperability so that conforming implementations produce identical results from identical inputs.</t>
      <section anchor="identity-rule">
        <name>Identity Rule</name>
        <t>A capability <tt>c</tt> is in the intersection only if all of the following hold:</t>
        <ol spacing="normal" type="1"><li>
            <t>Both Initiator's requested set and Responder's offered set include a capability with the same <tt>id</tt>.</t>
          </li>
          <li>
            <t>Both capabilities reference the same <tt>schema.url</tt> and <tt>schema.digest</tt>. Identifiers with diverging schemas <bcp14>MUST</bcp14> be treated as distinct capabilities and excluded from the intersection.</t>
          </li>
          <li>
            <t>Neither party has a matching entry in <tt>refusals</tt> covering <tt>c</tt>.</t>
          </li>
        </ol>
      </section>
      <section anchor="per-dimension-rules">
        <name>Per-Dimension Rules</name>
        <t>For each capability <tt>c</tt> that satisfies the identity rule, the intersected capability is computed dimension by dimension as follows.</t>
        <dl>
          <dt><tt>actions</tt></dt>
          <dd>List intersection. If empty, <tt>c</tt> is dropped.</dd>

          <dt><tt>resources</tt></dt>
          <dd>Pattern intersection using longest-prefix match. If empty, <tt>c</tt> is dropped.</dd>

          <dt><tt>conditions</tt> numeric fields (<tt>rate_limit</tt>, <tt>max_response_size_bytes</tt>, <tt>max_session_minutes</tt>)</dt>
          <dd>Minimum value of the two. Tighter bound wins.</dd>

          <dt><tt>conditions</tt> list fields (<tt>data_residency</tt>, <tt>tasks</tt>)</dt>
          <dd>List intersection. If empty, <tt>c</tt> is dropped.</dd>

          <dt><tt>conditions.time_window</tt></dt>
          <dd>Time-window intersection. If empty, <tt>c</tt> is dropped.</dd>

          <dt><tt>effects</tt></dt>
          <dd>Most restrictive of the two, where the order from least to most restrictive is <tt>mutating</tt>, <tt>idempotent</tt>, <tt>read_only</tt>, <tt>none</tt>. Take the lower-impact value.</dd>

          <dt><tt>external_calls</tt></dt>
          <dd>Most restrictive of the two, where the order from least to most restrictive is <tt>free</tt>, <tt>listed_only</tt>, <tt>forbidden</tt>. Take the more restrictive value.</dd>

          <dt><tt>sub_invocations</tt></dt>
          <dd>Most restrictive of the two, where the order from least to most restrictive is <tt>same_scope</tt>, <tt>fresh_handshake_required</tt>, <tt>forbidden</tt>. Take the more restrictive value.</dd>

          <dt><tt>persistence</tt></dt>
          <dd>Most restrictive of the two, where the order from least to most persistent is <tt>none</tt>, <tt>session_only</tt>, <tt>durable</tt>. Take the lower value.</dd>

          <dt><tt>resource_bounds.max_tokens</tt>, <tt>resource_bounds.max_duration_seconds</tt>, <tt>resource_bounds.max_cost_usd</tt></dt>
          <dd>Minimum value of the two.</dd>

          <dt><tt>preconditions</tt></dt>
          <dd>Union. Both parties' preconditions apply to the negotiated capability.</dd>
        </dl>
      </section>
      <section anchor="refusal-override">
        <name>Refusal Override</name>
        <t>If either party's <tt>refusals</tt> list contains an entry matching capability <tt>c</tt> by <tt>category</tt> or by direct <tt>id</tt>, <tt>c</tt> is dropped from the intersection regardless of any other dimension. Refusals are absolute.</t>
      </section>
      <section anchor="worked-example">
        <name>Worked Example</name>
        <t>Initiator requests <tt>data-read</tt>:</t>
        <ul spacing="normal">
          <li>
            <t><tt>actions</tt>: <tt>[read, list, search]</tt></t>
          </li>
          <li>
            <t><tt>resources</tt>: <tt>[dataset:public/*, dataset:internal/*]</tt></t>
          </li>
          <li>
            <t><tt>conditions.rate_limit</tt>: 1000/min</t>
          </li>
          <li>
            <t><tt>conditions.data_residency</tt>: <tt>["us", "eu", "apac"]</tt></t>
          </li>
          <li>
            <t><tt>effects</tt>: <tt>read_only</tt></t>
          </li>
          <li>
            <t><tt>external_calls</tt>: <tt>listed_only</tt></t>
          </li>
          <li>
            <t><tt>resource_bounds.max_cost_usd</tt>: 1.00</t>
          </li>
        </ul>
        <t>Responder offers <tt>data-read</tt>:</t>
        <ul spacing="normal">
          <li>
            <t><tt>actions</tt>: <tt>[read, list]</tt></t>
          </li>
          <li>
            <t><tt>resources</tt>: <tt>[dataset:public/*]</tt></t>
          </li>
          <li>
            <t><tt>conditions.rate_limit</tt>: 500/min</t>
          </li>
          <li>
            <t><tt>conditions.data_residency</tt>: <tt>["us", "eu"]</tt></t>
          </li>
          <li>
            <t><tt>effects</tt>: <tt>read_only</tt></t>
          </li>
          <li>
            <t><tt>external_calls</tt>: <tt>forbidden</tt></t>
          </li>
          <li>
            <t><tt>resource_bounds.max_cost_usd</tt>: 0.50</t>
          </li>
        </ul>
        <t>Negotiated intersection (assuming matching schemas):</t>
        <ul spacing="normal">
          <li>
            <t><tt>actions</tt>: <tt>[read, list]</tt></t>
          </li>
          <li>
            <t><tt>resources</tt>: <tt>[dataset:public/*]</tt></t>
          </li>
          <li>
            <t><tt>conditions.rate_limit</tt>: 500/min</t>
          </li>
          <li>
            <t><tt>conditions.data_residency</tt>: <tt>["us", "eu"]</tt></t>
          </li>
          <li>
            <t><tt>effects</tt>: <tt>read_only</tt></t>
          </li>
          <li>
            <t><tt>external_calls</tt>: <tt>forbidden</tt></t>
          </li>
          <li>
            <t><tt>resource_bounds.max_cost_usd</tt>: 0.50</t>
          </li>
        </ul>
        <t>If the schemas had diverged, <tt>data-read</tt> would be dropped entirely with no intersection. If Initiator's refusals included <tt>data-read</tt>, the capability would be dropped regardless of offer compatibility.</t>
      </section>
    </section>
    <section anchor="mutual-trust-mode">
      <name>Mutual Trust Mode</name>
      <t>When both agents are sensitive (for example, two agents acting on behalf of different organizations), the handshake operates in mutual mode:</t>
      <ul spacing="normal">
        <li>
          <t>Both parties <bcp14>MUST</bcp14> present all four artifacts in ATH_HELLO and ATH_OFFER.</t>
        </li>
        <li>
          <t>Both parties <bcp14>MUST</bcp14> verify the counterparty's full chain before proceeding.</t>
        </li>
        <li>
          <t>The Session Receipt <bcp14>MUST</bcp14> be countersigned by both parties.</t>
        </li>
      </ul>
      <t>In single-sided mode (for example, when one party is a public service), only the trusted side must present full artifacts. The other side's identity is still verified at the discovery layer, but the trust posture is asymmetric.</t>
    </section>
    <section anchor="version-negotiation-and-algorithm-agility">
      <name>Version Negotiation and Algorithm Agility</name>
      <t>ATN is designed for long-term evolution. Two mechanisms ensure forward compatibility: explicit version negotiation in the handshake and pluggable cryptographic algorithms in artifacts and messages.</t>
      <section anchor="version-negotiation">
        <name>Version Negotiation</name>
        <t>The Initiator's ATH_HELLO message advertises every ATN version it supports in a <tt>supported_versions</tt> field. The Responder's ATH_OFFER selects the highest mutually supported version and echoes it in a <tt>selected_version</tt> field. All subsequent messages in the session use the selected version.</t>
        <sourcecode type="json"><![CDATA[
{
  "v": "ath1",
  "type": "hello",
  "supported_versions": ["ath1", "ath2"],
  "initiator": { "...": "..." },
  "requested_scope": { "...": "..." },
  "nonce": "...",
  "timestamp": "..."
}
]]></sourcecode>
        <t>The Responder <bcp14>MUST</bcp14> include the Initiator's <tt>supported_versions</tt> list in the signed envelope of its ATH_OFFER. This prevents downgrade attacks: an on-path adversary that strips advertised versions from ATH_HELLO would cause the Responder's signature to cover the stripped list, which the Initiator can detect.</t>
        <t>If the Initiator and Responder share no common version, the Responder <bcp14>MUST</bcp14> reply with ATH_REJECT carrying error code <tt>version_mismatch</tt>. The handshake terminates.</t>
      </section>
      <section anchor="algorithm-agility">
        <name>Algorithm Agility</name>
        <t>ATN does not pin cryptographic algorithms beyond a minimum set required for v1 interoperability. Implementations <bcp14>MAY</bcp14> use any algorithm registered for JWS <xref target="RFC7515"/> or COSE.</t>
        <t>Required for ATN v1 conformance:</t>
        <ol spacing="normal" type="1"><li>
            <t>Ed25519 signatures over JWS-encoded artifacts and handshake messages.</t>
          </li>
          <li>
            <t>SHA-256 for digests bound in artifact references.</t>
          </li>
        </ol>
        <t>Recommended additional algorithms:</t>
        <ol spacing="normal" type="1"><li>
            <t>ECDSA P-256 with SHA-256 for environments with ECDSA-only hardware tokens.</t>
          </li>
          <li>
            <t>ML-DSA (post-quantum signature) for deployments preparing for post-quantum transition.</t>
          </li>
        </ol>
        <t>The Capability Manifest, Delegation Chain, Provenance Attestation, and Session Receipt <bcp14>MAY</bcp14> each be signed with a different algorithm. The JWS header identifies the algorithm. Relying parties <bcp14>MUST</bcp14> reject artifacts signed with algorithms they do not support.</t>
        <t>Algorithm identifiers are negotiated implicitly via the JWS <tt>alg</tt> header on each artifact. Explicit negotiation in ATH_HELLO is NOT <bcp14>REQUIRED</bcp14> for v1 but <bcp14>MAY</bcp14> be added in future versions.</t>
      </section>
      <section anchor="post-quantum-transition">
        <name>Post-Quantum Transition</name>
        <t>The cryptographic operations in ATN are well-bounded: signature verification of artifacts and handshake messages. There is no key agreement step inside ATN itself; TLS handles channel security. Migration to post-quantum signatures requires only adopting a PQ-capable signature algorithm in JWS, which the IETF JOSE working group is standardizing.</t>
        <t>When PQ algorithms are widely deployed, operators <bcp14>SHOULD</bcp14> rotate to a hybrid scheme (classical + PQ) during the transition window, then to PQ-only. ATN's version negotiation supports introducing a new minor version that prefers PQ signatures without breaking v1 deployments.</t>
      </section>
    </section>
    <section anchor="compatibility-with-existing-discovery-protocols">
      <name>Compatibility with Existing Discovery Protocols</name>
      <t>ATN is designed to coexist with existing discovery proposals without modification. Each proposal can be paired with ATN through either the HTTP-Resource Binding or the DNS Binding, depending on what the proposal provides.</t>
      <section anchor="with-aid-aid">
        <name>With AID <xref target="AID"/></name>
        <t>AID's TXT record continues to authenticate the agent endpoint via PKA. The TXT record can be paired with ATN's <tt>_atn.{domain}</tt> announcement, with the actual artifact references retrieved from the resolved Index Document at <tt>/.well-known/atn</tt>. ATN consumes the AID-authenticated identity as the input to the handshake.</t>
      </section>
      <section anchor="with-dns-aid-dns-aid">
        <name>With DNS-AID <xref target="DNS-AID"/></name>
        <t>DNS-AID's SVCB records resolve an agent endpoint. ATN composes with DNS-AID by publishing a <tt>_atn.{domain}</tt> TXT record alongside the DNS-AID record set, with the artifact references retrieved from the resolved Index Document.</t>
      </section>
      <section anchor="with-ans-v2-ansv2">
        <name>With ANS v2 <xref target="ANSv2"/></name>
        <t>ANS v2's Trust Card concept maps directly to a subset of ATN's Capability Manifest. An ANS v2 deployment can publish an ATN Index Document where the Capability Manifest cross-references the ANS Trust Card.</t>
      </section>
      <section anchor="multi-discovery-tolerance">
        <name>Multi-Discovery Tolerance</name>
        <t>A single agent zone <bcp14>MAY</bcp14> publish records compatible with multiple discovery proposals simultaneously. ATN binding is independent of which discovery format is used.</t>
      </section>
    </section>
    <section anchor="relationship-to-existing-identity-authorization-and-attestation-frameworks">
      <name>Relationship to Existing Identity, Authorization, and Attestation Frameworks</name>
      <t>A reasonable first question for any new trust protocol is whether existing frameworks suffice. ATN composes several mature primitives and does not reinvent any of them. The contribution is the composition: a peer-to-peer agent handshake with deterministic scope negotiation and an auditable session receipt. This section addresses each adjacent framework and identifies where ATN composes with it.</t>
      <t>The analogy that clarifies the relationship: TLS uses asymmetric crypto, symmetric crypto, key exchange, and X.509. TLS is not accused of reinventing those primitives. TLS is the handshake that composes them into a deployable channel-security protocol. ATN occupies the same compositional role for inter-agent trust.</t>
      <section anchor="oauth-20-and-gnap">
        <name>OAuth 2.0 and GNAP</name>
        <t>OAuth 2.0 <xref target="RFC6749"/> and GNAP <xref target="RFC9635"/> authenticate and authorize a Client to access a Resource Server. ATN negotiates a mutual agreement between two autonomous peers.</t>
        <t>Structural differences:</t>
        <ol spacing="normal" type="1"><li>
            <t>Asymmetric vs symmetric. OAuth and GNAP define Client and Resource Server roles. ATN defines two peers, each presenting four artifacts. There is no "resource server" in agent-to-agent collaboration.</t>
          </li>
          <li>
            <t>Secret tokens vs publishable artifacts. OAuth bearer tokens are secrets and <bcp14>MUST NOT</bcp14> be logged. ATN artifacts are designed for publication to transparency logs. Opposite security models for the core artifacts.</t>
          </li>
          <li>
            <t>No formal scope intersection. OAuth scopes are evaluated by membership at the Resource Server. ATN specifies a deterministic intersection algorithm.</t>
          </li>
          <li>
            <t>No refusal semantics. OAuth represents grants. ATN represents grants and explicit refusals as first-class signed claims.</t>
          </li>
        </ol>
        <t>Where OAuth and GNAP remain the right tools:</t>
        <ul spacing="normal">
          <li>
            <t>Inside a trust domain with a central authorization server, OAuth and GNAP issue access tokens to passive resources. ATN is unnecessary.</t>
          </li>
          <li>
            <t>Where one party is a passive resource, OAuth-style bearer access fits.</t>
          </li>
          <li>
            <t>Human-to-agent delegation, where a human grants an agent access on the human's behalf, fits GNAP.</t>
          </li>
        </ul>
        <t>ATN composes with OAuth and GNAP. An agent in an ATN session <bcp14>MAY</bcp14> hold OAuth tokens for downstream resource access. ATN governs the inter-agent relationship; OAuth governs subsequent resource calls.</t>
      </section>
      <section anchor="spiffe-workload-identity">
        <name>SPIFFE Workload Identity</name>
        <t>SPIFFE <xref target="SPIFFE"/> issues SVIDs (SPIFFE Verifiable Identity Documents) to workloads within a trust domain. SPIFFE Federation supports cross-domain identity through bilaterally exchanged trust bundles.</t>
        <t>Structural relationship:</t>
        <ol spacing="normal" type="1"><li>
            <t>SPIFFE provides identity, not authorization, willingness, capability, or provenance.</t>
          </li>
          <li>
            <t>SPIFFE is optimized for intra-organizational deployment. Cross-organizational use requires pre-arranged federation. ATN targets cross-organizational interactions where peers may meet for the first time without prior trust setup.</t>
          </li>
          <li>
            <t>ATN can carry a SPIFFE ID as the stable identifier in its artifacts. The SPIFFE SVID becomes the authentication input; the ATN handshake adds capability, delegation, provenance, and receipt on top.</t>
          </li>
        </ol>
        <t>SPIFFE and ATN compose cleanly. SPIFFE within the trust domain, ATN at the boundary.</t>
      </section>
      <section anchor="mutual-tls">
        <name>Mutual TLS</name>
        <t>Mutual TLS <xref target="RFC8446"/> authenticates both endpoints at the transport layer. It establishes that the connection is between two specific certificates.</t>
        <t>mTLS provides:</t>
        <ul spacing="normal">
          <li>
            <t>Endpoint authentication.</t>
          </li>
          <li>
            <t>Channel confidentiality and integrity.</t>
          </li>
        </ul>
        <t>mTLS does not provide:</t>
        <ul spacing="normal">
          <li>
            <t>Capability declaration.</t>
          </li>
          <li>
            <t>Delegation expression.</t>
          </li>
          <li>
            <t>Provenance evidence.</t>
          </li>
          <li>
            <t>Negotiation of scope.</t>
          </li>
          <li>
            <t>Auditable agreement record.</t>
          </li>
        </ul>
        <t>ATN runs on top of an mTLS-secured channel where appropriate. mTLS is necessary infrastructure for many ATN deployments. It is not a substitute for the negotiation.</t>
      </section>
      <section anchor="rats-remote-attestation">
        <name>RATS Remote Attestation</name>
        <t>RATS <xref target="RFC9334"/> defines roles (Attester, Verifier, Relying Party, Endorser) and the structure of attestation evidence and results.</t>
        <t>RATS provides:</t>
        <ul spacing="normal">
          <li>
            <t>The architecture for producing and verifying attestation evidence.</t>
          </li>
        </ul>
        <t>RATS does not provide:</t>
        <ul spacing="normal">
          <li>
            <t>A protocol for combining attestation evidence with authorization or capability negotiation.</t>
          </li>
          <li>
            <t>A specification for what to do with verification results in a peer interaction.</t>
          </li>
        </ul>
        <t>ATN consumes RATS evidence as one axis of its Provenance Attestation. The other two axes (build provenance and model identity) come from supply-chain attestation frameworks. RATS is the input; ATN is one specified consumer.</t>
      </section>
      <section anchor="scitt-transparency">
        <name>SCITT Transparency</name>
        <t>SCITT <xref target="SCITT"/> defines an append-only transparency log for signed statements with inclusion proofs.</t>
        <t>SCITT provides:</t>
        <ul spacing="normal">
          <li>
            <t>The transparency log infrastructure.</t>
          </li>
          <li>
            <t>The signed-statement envelope format.</t>
          </li>
        </ul>
        <t>SCITT does not provide:</t>
        <ul spacing="normal">
          <li>
            <t>The semantics of what to log for a given application.</t>
          </li>
          <li>
            <t>The receipt format that captures an inter-agent agreement.</t>
          </li>
        </ul>
        <t>ATN provides the Session Receipt format that becomes the SCITT statement for an agent interaction. SCITT without ATN is a log waiting for a record format. ATN without SCITT is a receipt waiting for a transparency layer.</t>
      </section>
      <section anchor="composition-summary">
        <name>Composition Summary</name>
        <t>ATN composes the following primitives per layer:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Concern</th>
              <th align="left">Primitive</th>
              <th align="left">ATN's Role</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">Endpoint authentication</td>
              <td align="left">mTLS <xref target="RFC8446"/></td>
              <td align="left">Runs above</td>
            </tr>
            <tr>
              <td align="left">Workload identity (intra-org)</td>
              <td align="left">SPIFFE <xref target="SPIFFE"/></td>
              <td align="left">Consumes SVIDs as stable identifiers</td>
            </tr>
            <tr>
              <td align="left">Cross-org identity</td>
              <td align="left">HTTP origins <xref target="RFC9110"/>, DNS <xref target="RFC4033"/>, <xref target="AID"/>, <xref target="DNS-AID"/>, <xref target="ANSv2"/></td>
              <td align="left">Discovery substrate for ATN artifacts</td>
            </tr>
            <tr>
              <td align="left">Delegated authorization to passive resources</td>
              <td align="left">OAuth <xref target="RFC6749"/>, GNAP <xref target="RFC9635"/></td>
              <td align="left">Composes with, does not replace</td>
            </tr>
            <tr>
              <td align="left">Attestation evidence</td>
              <td align="left">RATS <xref target="RFC9334"/></td>
              <td align="left">Consumes evidence in Provenance Attestation</td>
            </tr>
            <tr>
              <td align="left">Public auditability</td>
              <td align="left">SCITT <xref target="SCITT"/></td>
              <td align="left">Provides the receipt format for log entries</td>
            </tr>
            <tr>
              <td align="left">Peer-to-peer trust handshake</td>
              <td align="left">(none exists)</td>
              <td align="left">This document</td>
            </tr>
          </tbody>
        </table>
        <t>The contribution of ATN is the bottom row. The five rows above are existing work that ATN composes.</t>
      </section>
      <section anchor="when-to-use-what">
        <name>When to Use What</name>
        <ol spacing="normal" type="1"><li>
            <t>Two workloads inside one trust domain coordinating on a task: SPIFFE.</t>
          </li>
          <li>
            <t>A client accessing a resource server with delegated user authorization: OAuth or GNAP.</t>
          </li>
          <li>
            <t>Establishing that you are talking to a specific endpoint: mTLS.</t>
          </li>
          <li>
            <t>Producing tamper-evident proof that some software was built and deployed as claimed: RATS plus supply-chain attestation.</t>
          </li>
          <li>
            <t>Publishing an auditable record of a claim: SCITT.</t>
          </li>
          <li>
            <t>Two autonomous agents from different organizations agreeing to work together with mutually verified capability, authority, provenance, and a signed record of the agreement: ATN.</t>
          </li>
        </ol>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <section anchor="threat-model">
        <name>Threat Model</name>
        <t>ATN assumes:</t>
        <ul spacing="normal">
          <li>
            <t>Adversaries may publish well-formed but malicious ATN artifacts.</t>
          </li>
          <li>
            <t>Adversaries may compromise an agent and continue to present valid pre-compromise artifacts.</t>
          </li>
          <li>
            <t>Adversaries may attempt to negotiate scope expansions outside the published Capability Manifest.</t>
          </li>
          <li>
            <t>Adversaries may collude across organizational boundaries to construct false Delegation Chains.</t>
          </li>
        </ul>
      </section>
      <section anchor="artifact-authenticity">
        <name>Artifact Authenticity</name>
        <t>Every ATN artifact is signed. Signatures <bcp14>MUST</bcp14> be verified against keys bound to the agent's stable identifier through the active binding. Artifacts whose signatures do not verify, whose <tt>valid_until</tt> has passed, or whose digests do not match the values in the Index Document <bcp14>MUST</bcp14> be rejected.</t>
      </section>
      <section anchor="cross-binding-consistency">
        <name>Cross-Binding Consistency</name>
        <t>When an agent is reachable through multiple bindings (for example, both HTTP-Resource and DNS), the artifacts served through each binding <bcp14>MUST</bcp14> be identical. Inconsistency across bindings <bcp14>MUST</bcp14> cause the handshake to fail with <tt>binding_mismatch</tt>.</t>
      </section>
      <section anchor="enforcement-posture-evidence-not-prevention">
        <name>Enforcement Posture: Evidence, Not Prevention</name>
        <t>A predictable objection to ATN is that auditability is not enforcement. The objection is correct on its terms and misses the layer at which ATN operates. ATN is technical evidence infrastructure. It is not a behavioral enforcement primitive. No protocol layered on top of an autonomous software agent can be one.</t>
        <t>An agent that signs a Capability Manifest declaring it will not perform financial transactions, then performs a financial transaction, has cryptographically committed to a refusal it then violated. ATN cannot prevent the violation. ATN produces a Session Receipt and a published transparency log entry that, combined with the application-layer evidence of the violation, constitute direct cryptographic evidence usable for revocation, contract enforcement, regulatory complaint, and civil action.</t>
        <t>The complete trust stack for autonomous agents has four layers:</t>
        <ol spacing="normal" type="1"><li>
            <t>Technical evidence layer (ATN, SCITT, RATS). Provides cryptographic proof of what was claimed and what was agreed.</t>
          </li>
          <li>
            <t>Policy layer (contracts, organizational policy, regulations). Specifies what is permitted.</t>
          </li>
          <li>
            <t>Consequence layer (revocation, financial penalty, legal action, reputational impact). Imposes cost on violation.</t>
          </li>
          <li>
            <t>Operational enforcement layer (sandboxing, capability-based execution, hardware-enforced runtime such as TEEs, gating proxies). Prevents violation at runtime.</t>
          </li>
        </ol>
        <t>ATN is the first layer. It enables the other three. It does not substitute for them.</t>
        <t>For high-stakes domains (financial transactions, clinical decision support, control of physical systems), ATN <bcp14>MUST</bcp14> be deployed with operational enforcement (layer 4). Recommended patterns:</t>
        <ol spacing="normal" type="1"><li>
            <t>Run sensitive capabilities inside a TEE that enforces declared bounds at hardware level.</t>
          </li>
          <li>
            <t>Use a gating proxy that enforces the negotiated scope on every outbound call from the agent.</t>
          </li>
          <li>
            <t>Use short session lifetimes with frequent re-attestation.</t>
          </li>
          <li>
            <t>Combine ATN with object-capability execution where the agent runtime denies unauthorized actions by construction, not by policy.</t>
          </li>
        </ol>
        <t>ATN's contribution is to make violations <em>expensive and discoverable</em>, not impossible. The analogy is to TCP checksums: they do not prevent transmission errors, they detect them so the next layer can respond. Trust at Internet scale has always operated this way. SPF does not prevent spoofed email. Certificate transparency does not prevent mis-issuance. They make undetected misbehavior infeasible. ATN does the same for inter-agent agreements.</t>
      </section>
      <section anchor="delegation-forgery">
        <name>Delegation Forgery</name>
        <t>Delegation Chains depend on the cryptographic strength of each issuer's signing key. ATN does not specify the identity verification process that issuers use to vouch for subjects. Operators <bcp14>SHOULD</bcp14> use verifiable credentials <xref target="W3C-DID"/> or organizational identity infrastructure with established assurance levels.</t>
      </section>
      <section anchor="session-receipt-tampering">
        <name>Session Receipt Tampering</name>
        <t>Session Receipts are countersigned and publishable to a SCITT log <xref target="SCITT"/>. Tampering after publication is detectable through log inclusion proofs. Operators handling high-value sessions <bcp14>SHOULD</bcp14> publish receipts.</t>
      </section>
      <section anchor="replay">
        <name>Replay</name>
        <t>Every handshake message includes a nonce and a timestamp. Implementations <bcp14>MUST</bcp14> reject messages with nonces seen within the session and with timestamps outside a configurable skew window (<bcp14>RECOMMENDED</bcp14> 60 seconds).</t>
      </section>
      <section anchor="provenance-attestation-limits">
        <name>Provenance Attestation Limits</name>
        <t>Provenance attestations prove what was built and deployed at attestation time. They do not prove the agent is still executing the attested code. Operators <bcp14>SHOULD</bcp14> use short <tt>valid_until</tt> windows for provenance attestations and refresh through RATS verification <xref target="RFC9334"/>.</t>
      </section>
    </section>
    <section anchor="privacy-considerations">
      <name>Privacy Considerations</name>
      <section anchor="per-agent-lookups">
        <name>Per-Agent Lookups</name>
        <t>The HTTP-Resource Binding does not generate per-agent DNS queries. Agent lookups occur within a single TLS connection to the origin, limiting on-path observers' visibility into which agents are being discovered.</t>
      </section>
      <section anchor="dns-binding-leakage">
        <name>DNS Binding Leakage</name>
        <t>The DNS Binding's <tt>_atn.{domain}</tt> TXT lookup leaks the fact that an origin supports ATN to on-path DNS observers. This is a property of the binding, not of the core protocol. Deployments where this leakage is unacceptable <bcp14>SHOULD</bcp14> use the HTTP-Resource Binding directly.</t>
      </section>
      <section anchor="negotiation-observability">
        <name>Negotiation Observability</name>
        <t>The handshake exchanges artifacts that may reveal the purpose of the session (<tt>purpose</tt> field) and the identity of the principal (<tt>Delegation Chain</tt>). Operators <bcp14>SHOULD</bcp14> treat handshake metadata as sensitive.</t>
      </section>
      <section anchor="witness-aggregation">
        <name>Witness Aggregation</name>
        <t>Witnesses and SCITT log operators see the volume and pattern of agent interactions. Operators <bcp14>SHOULD</bcp14> use multiple witnesses to reduce centralized observability.</t>
      </section>
      <section anchor="minimum-disclosure">
        <name>Minimum Disclosure</name>
        <t>ATN supports minimum-disclosure mode where the Initiator presents only the artifacts required for the requested scope. The Responder <bcp14>MAY</bcp14> request additional artifacts during the handshake, which the Initiator <bcp14>MAY</bcp14> decline (causing the handshake to fail).</t>
      </section>
      <section anchor="scitt-publication">
        <name>SCITT Publication</name>
        <t>Session Receipts published to a SCITT Transparency Service are public by design. Implementations <bcp14>MUST NOT</bcp14> include personal data in Capability Manifests, Delegation Chains, Provenance Attestations, or Session Receipts. Use of opaque identifiers in place of personal identifiers is <bcp14>RECOMMENDED</bcp14>.</t>
      </section>
    </section>
    <section anchor="operational-considerations">
      <name>Operational Considerations</name>
      <t>ATN introduces non-trivial latency on session establishment. This section quantifies that cost, explains its operational shape, and identifies deployments where ATN is appropriate and where it is not.</t>
      <section anchor="session-establishment-vs-per-call-latency">
        <name>Session Establishment vs Per-Call Latency</name>
        <t>ATN is a session establishment protocol, not a per-request protocol. The handshake establishes a negotiated scope. The scope authorizes many subsequent interactions between the two agents. Per-call latency within an established session is zero added by ATN.</t>
        <t>This places ATN in the same operational category as:</t>
        <ol spacing="normal" type="1"><li>
            <t>TLS handshake <xref target="RFC8446"/>, amortized over the requests in a connection.</t>
          </li>
          <li>
            <t>OAuth token acquisition <xref target="RFC6749"/>, amortized over the token lifetime.</t>
          </li>
          <li>
            <t>BGP session establishment, amortized over hours of routing operation.</t>
          </li>
        </ol>
        <t>The relevant performance question is the cost of establishment and the session lifetime over which it is amortized, not the cost per call.</t>
      </section>
      <section anchor="latency-budget">
        <name>Latency Budget</name>
        <t>The following budget is informative. Implementations and deployments will vary based on geography, caching, and network conditions. The figures below assume the HTTP-Resource Binding; the DNS Binding adds one DNS lookup on the first connection to an origin.</t>
        <table>
          <thead>
            <tr>
              <th align="left">Component</th>
              <th align="left">Cold (no cache)</th>
              <th align="left">Warm (cached, pooled)</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">TLS 1.3 connection to origin</td>
              <td align="left">100-200 ms</td>
              <td align="left">0 (pooled)</td>
            </tr>
            <tr>
              <td align="left"><tt>/.well-known/atn</tt> HTTPS GET</td>
              <td align="left">20-50 ms</td>
              <td align="left">0 (cached by digest)</td>
            </tr>
            <tr>
              <td align="left">Three artifact fetches (HTTP/2 multiplexed)</td>
              <td align="left">50-100 ms</td>
              <td align="left">0 (cached by digest)</td>
            </tr>
            <tr>
              <td align="left">Signature verifications (4-8 Ed25519)</td>
              <td align="left">1-2 ms</td>
              <td align="left">1-2 ms</td>
            </tr>
            <tr>
              <td align="left">Provenance validation</td>
              <td align="left">1-5 ms</td>
              <td align="left">1 ms</td>
            </tr>
            <tr>
              <td align="left">Two-RTT handshake (HELLO/OFFER then ACCEPT/RECEIPT)</td>
              <td align="left">150-300 ms</td>
              <td align="left">150-300 ms</td>
            </tr>
            <tr>
              <td align="left">Receipt signing (Ed25519)</td>
              <td align="left">&lt;1 ms</td>
              <td align="left">&lt;1 ms</td>
            </tr>
            <tr>
              <td align="left">
                <strong>Total session establishment</strong></td>
              <td align="left">
                <strong>500-1500 ms</strong></td>
              <td align="left">
                <strong>150-300 ms</strong></td>
            </tr>
            <tr>
              <td align="left">Per-call within established session</td>
              <td align="left">
                <strong>0 ms added</strong></td>
              <td align="left">
                <strong>0 ms added</strong></td>
            </tr>
            <tr>
              <td align="left">SCITT log submission</td>
              <td align="left">Async, out of path</td>
              <td align="left">Async, out of path</td>
            </tr>
          </tbody>
        </table>
        <t>Recommended performance targets for conforming implementations:</t>
        <ul spacing="normal">
          <li>
            <t>p50 cold session establishment: &lt;800 ms</t>
          </li>
          <li>
            <t>p99 cold session establishment: &lt;2000 ms</t>
          </li>
          <li>
            <t>p50 warm session establishment: &lt;250 ms</t>
          </li>
          <li>
            <t>p99 warm session establishment: &lt;500 ms</t>
          </li>
        </ul>
      </section>
      <section anchor="optimization-techniques">
        <name>Optimization Techniques</name>
        <t>Implementations <bcp14>SHOULD</bcp14> apply the following optimizations to bring warm-case latency to the recommended targets:</t>
        <ol spacing="normal" type="1"><li>
            <t>Digest-keyed artifact caching. Artifacts are refetched only when the Index Document's published digest changes. Steady-state cache hit rate is typically above 95 percent.</t>
          </li>
          <li>
            <t>HTTP/2 or HTTP/3 multiplexing for parallel artifact fetches.</t>
          </li>
          <li>
            <t>TLS 1.3 session resumption for repeat handshakes with known peers.</t>
          </li>
          <li>
            <t>Connection pooling between sessions to the same peer.</t>
          </li>
          <li>
            <t>Abbreviated re-handshake. A repeat ATH_HELLO <bcp14>MAY</bcp14> reference a prior session's receipt to extend or renew the same scope in a single round trip rather than three.</t>
          </li>
          <li>
            <t>Pre-warming. Agents <bcp14>MAY</bcp14> establish sessions with frequent counterparties before application traffic arrives.</t>
          </li>
          <li>
            <t>Asynchronous SCITT submission. Receipt publication to a transparency log happens after the session begins and <bcp14>MUST NOT</bcp14> block session establishment.</t>
          </li>
          <li>
            <t>RATS attestation result caching for the duration of the result's validity window.</t>
          </li>
        </ol>
      </section>
      <section anchor="session-lifetime">
        <name>Session Lifetime</name>
        <t>The Session Receipt's <tt>expires_at</tt> field bounds the session. Within that window, no additional handshake is required for interactions covered by the agreed scope. Implementations <bcp14>SHOULD</bcp14> select session lifetimes that amortize establishment cost while bounding exposure to revocation events.</t>
        <t>Typical session lifetimes:</t>
        <ul spacing="normal">
          <li>
            <t>Short-lived workflows: 5 to 30 minutes</t>
          </li>
          <li>
            <t>Sustained collaboration sessions: 1 to 24 hours</t>
          </li>
          <li>
            <t>Long-running infrastructure peering: up to 7 days</t>
          </li>
        </ul>
        <t>Session lifetimes longer than 7 days are <bcp14>NOT RECOMMENDED</bcp14> for cross-organizational sessions. The trade-off is between revocation responsiveness and handshake amortization.</t>
      </section>
      <section anchor="deployments-where-atn-is-appropriate">
        <name>Deployments Where ATN Is Appropriate</name>
        <ol spacing="normal" type="1"><li>
            <t>Multi-step agent collaboration where many calls share a session context.</t>
          </li>
          <li>
            <t>Cross-organizational agent interactions where trust establishment must be verifiable and auditable.</t>
          </li>
          <li>
            <t>Workflows where the cost of trust failure exceeds the cost of establishment latency.</t>
          </li>
          <li>
            <t>Agent ecosystems with workflows already operating in the 100 ms to multi-second range per step.</t>
          </li>
        </ol>
      </section>
      <section anchor="deployments-where-atn-is-not-appropriate">
        <name>Deployments Where ATN Is Not Appropriate</name>
        <ol spacing="normal" type="1"><li>
            <t>Microsecond-scale latency budgets (high-frequency trading, real-time control loops, hardware-in-the-loop systems).</t>
          </li>
          <li>
            <t>Stateless per-message protocols where session continuity is not meaningful.</t>
          </li>
          <li>
            <t>Workflows whose total duration is shorter than the handshake establishment cost.</t>
          </li>
        </ol>
        <t>For these deployments, simpler primitives (mTLS alone, OAuth bearer tokens, or no trust layer at all) may be more appropriate. Operators are encouraged to select the trust layer that matches their latency budget.</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <section anchor="iana-svcb-paramkey-withdrawal">
        <name>Withdrawal of -00 SVCB ParamKey Registrations</name>
        <t>The SVCB ParamKey registrations <tt>atn</tt> and <tt>atn-digest</tt> proposed in draft-somoza-atn-agent-trust-negotiation-00 are withdrawn. No SVCB ParamKey registration is requested by this document. See <xref target="withdrawal-of-svcb-paramkeys"/>.</t>
      </section>
      <section anchor="atn-well-known-uri">
        <name>Well-Known URI Registration</name>
        <t>IANA is requested to register the following well-known URI per <xref target="RFC8615"/>:</t>
        <ul spacing="normal">
          <li>
            <t>URI suffix: <tt>atn</tt></t>
          </li>
          <li>
            <t>Change controller: IETF</t>
          </li>
          <li>
            <t>Specification document: this document</t>
          </li>
          <li>
            <t>Status: permanent</t>
          </li>
          <li>
            <t>Related information: returns the ATN Index Document for the origin (see <xref target="origin-discovery"/>)</t>
          </li>
        </ul>
      </section>
      <section anchor="atn-dns-txt-key">
        <name>DNS TXT Key Registration</name>
        <t>IANA is requested to register the following DNS TXT record key:</t>
        <ul spacing="normal">
          <li>
            <t>Key: <tt>atn</tt></t>
          </li>
          <li>
            <t>Format: <tt>v=atn1; origin=https://...</tt> (semicolon-separated key=value pairs)</t>
          </li>
          <li>
            <t>Change controller: IETF</t>
          </li>
          <li>
            <t>Specification document: this document</t>
          </li>
        </ul>
      </section>
      <section anchor="atn-capability-registry">
        <name>ATN Capability Registry</name>
        <t>Creation of a new registry, "ATN Capabilities," is requested with initial entries:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Name</th>
              <th align="left">Description</th>
              <th align="left">Reference Schema</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">
                <tt>data-read</tt></td>
              <td align="left">Read access to a data resource</td>
              <td align="left">TBD</td>
            </tr>
            <tr>
              <td align="left">
                <tt>data-write</tt></td>
              <td align="left">Write access to a data resource</td>
              <td align="left">TBD</td>
            </tr>
            <tr>
              <td align="left">
                <tt>task-execute</tt></td>
              <td align="left">Execute a named task</td>
              <td align="left">TBD</td>
            </tr>
            <tr>
              <td align="left">
                <tt>model-invoke</tt></td>
              <td align="left">Invoke a generative model</td>
              <td align="left">TBD</td>
            </tr>
            <tr>
              <td align="left">
                <tt>agent-delegate</tt></td>
              <td align="left">Delegate work to another agent</td>
              <td align="left">TBD</td>
            </tr>
            <tr>
              <td align="left">
                <tt>payment-init</tt></td>
              <td align="left">Initiate a payment flow</td>
              <td align="left">TBD</td>
            </tr>
            <tr>
              <td align="left">
                <tt>human-relay</tt></td>
              <td align="left">Surface a request to a human approver</td>
              <td align="left">TBD</td>
            </tr>
          </tbody>
        </table>
        <t>Registration policy: Specification Required with Designated Expert review. Each registered identifier <bcp14>MUST</bcp14> include a reference to a published capability schema that defines the semantics of <tt>actions</tt>, <tt>resources</tt> patterns, and any capability-specific extensions to <tt>conditions</tt>.</t>
        <t>Vendor-specific identifiers prefixed with <tt>x-</tt> are permitted without IANA registration but <bcp14>MUST</bcp14> carry a schema reference in the capability object.</t>
      </section>
      <section anchor="atn-capability-dimension-registries">
        <name>ATN Capability Dimension Registries</name>
        <t>Four new registries are requested to govern the controlled vocabularies used in capability dimensions:</t>
        <t>"ATN Capability Effects":</t>
        <table>
          <thead>
            <tr>
              <th align="left">Name</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">
                <tt>none</tt></td>
              <td align="left">No observable consequence (introspection only).</td>
            </tr>
            <tr>
              <td align="left">
                <tt>read_only</tt></td>
              <td align="left">Data is read; no state changes.</td>
            </tr>
            <tr>
              <td align="left">
                <tt>idempotent</tt></td>
              <td align="left">State may change; repeated execution equivalent to single.</td>
            </tr>
            <tr>
              <td align="left">
                <tt>mutating</tt></td>
              <td align="left">State changes; not idempotent.</td>
            </tr>
          </tbody>
        </table>
        <t>"ATN External Call Modes":</t>
        <table>
          <thead>
            <tr>
              <th align="left">Name</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">
                <tt>forbidden</tt></td>
              <td align="left">No external calls permitted.</td>
            </tr>
            <tr>
              <td align="left">
                <tt>listed_only</tt></td>
              <td align="left">External calls permitted only to listed destinations.</td>
            </tr>
            <tr>
              <td align="left">
                <tt>free</tt></td>
              <td align="left">Any external call permitted within <tt>resource_bounds</tt>.</td>
            </tr>
          </tbody>
        </table>
        <t>"ATN Sub-Invocation Modes":</t>
        <table>
          <thead>
            <tr>
              <th align="left">Name</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">
                <tt>forbidden</tt></td>
              <td align="left">No sub-agent invocations.</td>
            </tr>
            <tr>
              <td align="left">
                <tt>same_scope</tt></td>
              <td align="left">Sub-invocations inherit the present negotiated scope.</td>
            </tr>
            <tr>
              <td align="left">
                <tt>fresh_handshake_required</tt></td>
              <td align="left">Every sub-invocation requires a separate ATN handshake.</td>
            </tr>
          </tbody>
        </table>
        <t>"ATN Persistence Modes":</t>
        <table>
          <thead>
            <tr>
              <th align="left">Name</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">
                <tt>none</tt></td>
              <td align="left">No state persists beyond a single request.</td>
            </tr>
            <tr>
              <td align="left">
                <tt>session_only</tt></td>
              <td align="left">State persists for the session lifetime, then discarded.</td>
            </tr>
            <tr>
              <td align="left">
                <tt>durable</tt></td>
              <td align="left">State persists beyond the session; retention policy required.</td>
            </tr>
          </tbody>
        </table>
        <t>Registration policy for all four registries: Specification Required with Designated Expert review. The controlled vocabularies are deliberately small and stable; expansion requires consensus to avoid the semantic-drift problem that affected OAuth scopes.</t>
      </section>
      <section anchor="atn-refusal-category-registry">
        <name>ATN Refusal Category Registry</name>
        <t>Creation of a new registry, "ATN Refusal Categories," is requested with initial entries:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Name</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">
                <tt>financial_transactions</tt></td>
              <td align="left">Any movement of funds</td>
            </tr>
            <tr>
              <td align="left">
                <tt>personal_data</tt></td>
              <td align="left">Processing of personal identifiers</td>
            </tr>
            <tr>
              <td align="left">
                <tt>weaponization</tt></td>
              <td align="left">Use in weapons systems</td>
            </tr>
            <tr>
              <td align="left">
                <tt>mass_persuasion</tt></td>
              <td align="left">Generation of mass-distributed content</td>
            </tr>
            <tr>
              <td align="left">
                <tt>child_safety</tt></td>
              <td align="left">Content involving minors</td>
            </tr>
            <tr>
              <td align="left">
                <tt>medical_advice</tt></td>
              <td align="left">Clinical recommendations</td>
            </tr>
            <tr>
              <td align="left">
                <tt>legal_advice</tt></td>
              <td align="left">Legal recommendations binding on parties</td>
            </tr>
          </tbody>
        </table>
        <t>Registration policy: Specification Required with Designated Expert review.</t>
      </section>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC4033">
          <front>
            <title>DNS Security Introduction and Requirements</title>
            <author fullname="R. Arends" initials="R." surname="Arends"/>
            <author fullname="R. Austein" initials="R." surname="Austein"/>
            <author fullname="M. Larson" initials="M." surname="Larson"/>
            <author fullname="D. Massey" initials="D." surname="Massey"/>
            <author fullname="S. Rose" initials="S." surname="Rose"/>
            <date month="March" year="2005"/>
          </front>
          <seriesInfo name="RFC" value="4033"/>
          <seriesInfo name="DOI" value="10.17487/RFC4033"/>
        </reference>
        <reference anchor="RFC7515">
          <front>
            <title>JSON Web Signature (JWS)</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <author fullname="N. Sakimura" initials="N." surname="Sakimura"/>
            <date month="May" year="2015"/>
          </front>
          <seriesInfo name="RFC" value="7515"/>
          <seriesInfo name="DOI" value="10.17487/RFC7515"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC8259">
          <front>
            <title>The JavaScript Object Notation (JSON) Data Interchange Format</title>
            <author fullname="T. Bray" initials="T." role="editor" surname="Bray"/>
            <date month="December" year="2017"/>
          </front>
          <seriesInfo name="STD" value="90"/>
          <seriesInfo name="RFC" value="8259"/>
          <seriesInfo name="DOI" value="10.17487/RFC8259"/>
        </reference>
        <reference anchor="RFC8446">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <date month="August" year="2018"/>
          </front>
          <seriesInfo name="RFC" value="8446"/>
          <seriesInfo name="DOI" value="10.17487/RFC8446"/>
        </reference>
        <reference anchor="RFC8615">
          <front>
            <title>Well-Known Uniform Resource Identifiers (URIs)</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <date month="May" year="2019"/>
          </front>
          <seriesInfo name="RFC" value="8615"/>
          <seriesInfo name="DOI" value="10.17487/RFC8615"/>
        </reference>
        <reference anchor="RFC9110">
          <front>
            <title>HTTP Semantics</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <date month="June" year="2022"/>
          </front>
          <seriesInfo name="STD" value="97"/>
          <seriesInfo name="RFC" value="9110"/>
          <seriesInfo name="DOI" value="10.17487/RFC9110"/>
        </reference>
        <reference anchor="RFC9460">
          <front>
            <title>Service Binding and Parameter Specification via the DNS (SVCB and HTTPS Resource Records)</title>
            <author fullname="B. Schwartz" initials="B." surname="Schwartz"/>
            <author fullname="M. Bishop" initials="M." surname="Bishop"/>
            <author fullname="E. Nygren" initials="E." surname="Nygren"/>
            <date month="November" year="2023"/>
          </front>
          <seriesInfo name="RFC" value="9460"/>
          <seriesInfo name="DOI" value="10.17487/RFC9460"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC6749">
          <front>
            <title>The OAuth 2.0 Authorization Framework</title>
            <author fullname="D. Hardt" initials="D." role="editor" surname="Hardt"/>
            <date month="October" year="2012"/>
          </front>
          <seriesInfo name="RFC" value="6749"/>
          <seriesInfo name="DOI" value="10.17487/RFC6749"/>
        </reference>
        <reference anchor="RFC9334">
          <front>
            <title>Remote ATtestation procedureS (RATS) Architecture</title>
            <author fullname="H. Birkholz" initials="H." surname="Birkholz"/>
            <author fullname="D. Thaler" initials="D." surname="Thaler"/>
            <author fullname="M. Richardson" initials="M." surname="Richardson"/>
            <author fullname="N. Smith" initials="N." surname="Smith"/>
            <author fullname="W. Pan" initials="W." surname="Pan"/>
            <date month="January" year="2023"/>
          </front>
          <seriesInfo name="RFC" value="9334"/>
          <seriesInfo name="DOI" value="10.17487/RFC9334"/>
        </reference>
        <reference anchor="RFC9635">
          <front>
            <title>Grant Negotiation and Authorization Protocol (GNAP)</title>
            <author fullname="J. Richer" initials="J." role="editor" surname="Richer"/>
            <author fullname="F. Imbault" initials="F." surname="Imbault"/>
            <date month="October" year="2024"/>
          </front>
          <seriesInfo name="RFC" value="9635"/>
          <seriesInfo name="DOI" value="10.17487/RFC9635"/>
        </reference>
        <reference anchor="W3C-DID" target="https://www.w3.org/TR/did-core/">
          <front>
            <title>Decentralized Identifiers (DIDs) v1.0</title>
            <author>
              <organization>W3C</organization>
            </author>
            <date year="2022"/>
          </front>
        </reference>
        <reference anchor="SPIFFE" target="https://github.com/spiffe/spiffe">
          <front>
            <title>SPIFFE: Secure Production Identity Framework for Everyone</title>
            <author>
              <organization>SPIFFE / CNCF</organization>
            </author>
            <date year="2024"/>
          </front>
        </reference>
        <reference anchor="SCITT" target="https://datatracker.ietf.org/wg/scitt/about/">
          <front>
            <title>Supply Chain Integrity, Transparency, and Trust (SCITT) Architecture</title>
            <author>
              <organization>IETF SCITT WG</organization>
            </author>
            <date year="2025"/>
          </front>
        </reference>
        <reference anchor="IN-TOTO" target="https://in-toto.io/">
          <front>
            <title>in-toto Attestation Framework</title>
            <author>
              <organization>in-toto / CNCF</organization>
            </author>
            <date year="2024"/>
          </front>
        </reference>
        <reference anchor="AID" target="https://datatracker.ietf.org/doc/draft-nemethi-aid-agent-identity-discovery/">
          <front>
            <title>Agent Identity and Discovery (AID)</title>
            <author initials="B." surname="Nemethi">
              <organization/>
            </author>
            <date year="2026"/>
          </front>
        </reference>
        <reference anchor="DNS-AID" target="https://datatracker.ietf.org/doc/draft-mozleywilliams-dnsop-dnsaid/">
          <front>
            <title>DNS for AI Discovery</title>
            <author initials="J." surname="Mozley">
              <organization/>
            </author>
            <author initials="N." surname="Williams">
              <organization/>
            </author>
            <author initials="B." surname="Sarikaya">
              <organization/>
            </author>
            <author initials="R." surname="Schott">
              <organization/>
            </author>
            <date year="2026"/>
          </front>
        </reference>
        <reference anchor="ANSv2" target="https://datatracker.ietf.org/doc/draft-narajala-courtney-ansv2/">
          <front>
            <title>Agent Name Service v2</title>
            <author initials="K." surname="Narajala">
              <organization/>
            </author>
            <date year="2026"/>
          </front>
        </reference>
      </references>
    </references>
<section anchor="complete-example-flow">
      <name>Complete Example Flow</name>
      <t>This appendix walks through a full ATN handshake between two agents at <tt>research.org</tt> and <tt>publisher.com</tt> using the HTTP-Resource Binding.</t>
      <section anchor="step-1-discovery">
        <name>Step 1: Origin Discovery</name>
        <artwork><![CDATA[
GET https://publisher.com/.well-known/atn
]]></artwork>
        <t>Returns the JWS-signed Index Document listing the agents at the origin and their artifact URLs.</t>
      </section>
      <section anchor="step-2-index-verification">
        <name>Step 2: Index Document Verification</name>
        <t>The Initiator verifies the JWS signature on the Index Document against a trust anchor recognized by the verifier. The signature is required regardless of DNSSEC posture.</t>
      </section>
      <section anchor="step-3-artifact-fetch-and-verification">
        <name>Step 3: Artifact Fetch and Verification</name>
        <t>The Initiator selects the target agent from the Index Document's <tt>agents</tt> array and fetches:</t>
        <ul spacing="normal">
          <li>
            <t><tt>capability.jws</tt></t>
          </li>
          <li>
            <t><tt>delegation.jws</tt></t>
          </li>
          <li>
            <t><tt>provenance.jws</tt></t>
          </li>
        </ul>
        <t>Verifies each signature, and confirms <tt>valid_until</tt> is in the future.</t>
      </section>
      <section anchor="step-4-athhello">
        <name>Step 4: ATH_HELLO</name>
        <t>The Initiator (<tt>research.org</tt> agent) sends <tt>ATH_HELLO</tt> to the Responder's <tt>handshake_endpoint</tt>:</t>
        <sourcecode type="json"><![CDATA[
{
  "v": "ath1",
  "type": "hello",
  "supported_versions": ["ath1"],
  "initiator": {
    "agent_id": "https://research.org/agents/initiator",
    "artifacts": { "...": "capability/delegation/provenance refs" }
  },
  "requested_scope": {
    "capability_ids": ["data-read"],
    "duration_seconds": 600,
    "purpose": "academic_research_summarization"
  },
  "nonce": "n-init-001",
  "timestamp": "2026-05-27T14:00:00Z"
}
]]></sourcecode>
      </section>
      <section anchor="step-5-athoffer">
        <name>Step 5: ATH_OFFER</name>
        <t>The Responder verifies the Initiator's artifacts, computes the intersection, and returns:</t>
        <sourcecode type="json"><![CDATA[
{
  "v": "ath1",
  "type": "offer",
  "selected_version": "ath1",
  "supported_versions_echo": ["ath1"],
  "responder": { "...": "responder agent_id and artifact refs" },
  "offered_scope": {
    "capabilities": [
      {
        "id": "data-read",
        "schema": {
          "url": "https://example.com/atn/data-read-v1.json",
          "digest": "sha256:b4c5d6..."
        },
        "actions": ["read", "list"],
        "resources": ["dataset:public/*"],
        "conditions": {
          "rate_limit": "300/min",
          "data_residency": ["us", "eu"]
        },
        "effects": "read_only",
        "external_calls": "forbidden",
        "sub_invocations": "forbidden",
        "persistence": "none",
        "resource_bounds": {
          "max_tokens": 50000,
          "max_duration_seconds": 600,
          "max_cost_usd": 0.30
        }
      }
    ],
    "duration_seconds": 600,
    "purpose": "academic_research_summarization"
  },
  "nonce": "n-resp-001",
  "in_reply_to_nonce": "n-init-001",
  "timestamp": "2026-05-27T14:00:01Z"
}
]]></sourcecode>
      </section>
      <section anchor="step-6-athaccept">
        <name>Step 6: ATH_ACCEPT</name>
        <sourcecode type="json"><![CDATA[
{
  "v": "ath1",
  "type": "accept",
  "agreed_scope": { "...": "matches ATH_OFFER" },
  "nonce": "n-init-002",
  "in_reply_to_nonce": "n-resp-001",
  "timestamp": "2026-05-27T14:00:02Z"
}
]]></sourcecode>
      </section>
      <section anchor="step-7-athreceipt">
        <name>Step 7: ATH_RECEIPT</name>
        <sourcecode type="json"><![CDATA[
{
  "v": "ath1",
  "type": "receipt",
  "session_id": "5b7c-...",
  "initiator_id": "https://research.org/agents/initiator",
  "responder_id": "https://publisher.com/agents/responder",
  "agreed_scope": { ... },
  "artifact_digests": { ... },
  "scitt_log_pointer": "https://scitt.research.org/entries/789xyz",
  "issued_at": "2026-05-27T14:00:03Z",
  "expires_at": "2026-05-27T14:10:03Z",
  "signature": "<JWS by responder>"
}
]]></sourcecode>
        <t>The Initiator countersigns. The session begins.</t>
      </section>
      <section anchor="step-8-session-and-audit">
        <name>Step 8: Session and Audit</name>
        <t>The agents transact within the agreed scope. The Session Receipt is published to SCITT. Any downstream audit can:</t>
        <ol spacing="normal" type="1"><li>
            <t>Retrieve the receipt.</t>
          </li>
          <li>
            <t>Verify all artifact digests against the agents' original publications.</t>
          </li>
          <li>
            <t>Compare actual session traffic (where logged) against the agreed scope.</t>
          </li>
          <li>
            <t>Flag any deviation.</t>
          </li>
        </ol>
      </section>
    </section>
    <section anchor="design-rationale">
      <name>Design Rationale</name>
      <section anchor="why-a-negotiation-layer">
        <name>Why a Negotiation Layer</name>
        <t>Discovery answers "where" and "who." Application protocols (MCP, A2A) answer "how." Nothing in the current stack answers "what may we do together, and what evidence will remain." ATN fills that gap with a two-round-trip handshake.</t>
      </section>
      <section anchor="why-four-artifacts">
        <name>Why Four Artifacts</name>
        <t>Each artifact answers a distinct question:</t>
        <ul spacing="normal">
          <li>
            <t>Capability Manifest: what is this agent willing to do?</t>
          </li>
          <li>
            <t>Delegation Chain: who authorized it?</t>
          </li>
          <li>
            <t>Provenance Attestation: what is it actually running?</t>
          </li>
          <li>
            <t>Session Receipt: what did we agree?</t>
          </li>
        </ul>
        <t>Collapsing them into one document obscures the separation of concerns. Splitting further fragments the trust evaluation. Four is the minimum.</t>
      </section>
      <section anchor="why-discovery-agnostic">
        <name>Why Discovery-Agnostic</name>
        <t>Discovery proposals for AI agents are still evolving across multiple venues and approaches. Binding ATN tightly to any one discovery substrate would couple the trust layer's adoption curve to that substrate's adoption curve. The four artifacts have value regardless of how the agent identity was resolved. Specifying an abstract binding interface, with HTTP-Resource as the default and DNS as one option, lets ATN compose with whatever discovery substrate a deployment uses.</t>
      </section>
      <section anchor="why-refusals-are-first-class">
        <name>Why Refusals Are First-Class</name>
        <t>Capability advertisement alone creates a moral hazard: agents have an incentive to advertise broadly. Mandatory refusals create symmetric accountability: an agent that explicitly refused a category and then violated the refusal has produced cryptographic evidence against itself.</t>
      </section>
      <section anchor="why-intersection-algebra-is-specified">
        <name>Why Intersection Algebra Is Specified</name>
        <t>If two implementations compute intersections differently, interoperability fails. The algebra is small, specified, and testable. The cost is one paragraph of spec; the benefit is deterministic handshake outcomes.</t>
      </section>
      <section anchor="why-scitt-for-receipts">
        <name>Why SCITT for Receipts</name>
        <t>Session Receipts gain value through public auditability. SCITT <xref target="SCITT"/> provides the transparency infrastructure. Receipts published to SCITT cannot be tampered with after the fact without detection.</t>
      </section>
    </section>
    <section anchor="implementation-status">
      <name>Implementation Status</name>
      <t>This section records the status of known implementations of the protocol defined by this specification at the time of posting of this Internet-Draft, per the guidelines of RFC 7942. The description of implementations in this section is intended to assist the IETF in its decision processes in progressing drafts to RFCs. Note to RFC Editor: this section may be removed prior to final publication.</t>
      <section anchor="atn-reference-prototype">
        <name>ATN Reference Prototype</name>
        <ul spacing="normal">
          <li>
            <t>Organization: Independent (E. Somoza).</t>
          </li>
          <li>
            <t>Implementation Name: atn-prototype.</t>
          </li>
          <li>
            <t>Description: A TypeScript prototype that demonstrates the four-message handshake, the capability intersection algebra, Ed25519 signing and verification of artifacts and messages, and the digest-bound artifact reference model.</t>
          </li>
          <li>
            <t>License: CC0 1.0 Universal (public domain).</t>
          </li>
          <li>
            <t>Maturity: prototype. Not production-ready. Not security-audited.</t>
          </li>
          <li>
            <t>Coverage: Capability Manifest types, Delegation Chain types, Provenance Attestation types, Session Receipt, ATH state machine (HELLO, OFFER, ACCEPT, RECEIPT), capability intersection algebra per Section 9, version negotiation with downgrade protection. The .well-known/atn HTTP-Resource Binding and SCITT submission are stubbed in -01 pending implementation alignment.</t>
          </li>
          <li>
            <t>Verified behavior: end-to-end handshake between two synthetic agents with mismatched capability constraints produces a signed Session Receipt with negotiated scope exactly matching the algorithm in Section 9. Numeric constraints take minimums, list constraints take intersections, refusals override.</t>
          </li>
          <li>
            <t>Repository: https://github.com/e-somoza/atn-prototype</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>This document builds on the substantial work of the agent discovery community, including the authors of AID, DNS-AID, ANS v2, and related proposals. ATN is intended to complement, not compete with, that work.</t>
      <t>The author thanks Ben Schwartz and Aijun Wang for substantial review feedback on draft-somoza-atn-agent-trust-negotiation-00 that shaped the architectural changes in this revision: the move to a discovery-agnostic core, the introduction of the HTTP-Resource Binding as the default, the reduction of the DNS Binding to a thin TXT record, and the withdrawal of the proposed SVCB ParamKey registrations.</t>
    </section>
  </back>
</rfc>
