<?xml version="1.0" encoding="UTF-8"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude"
     docName="draft-tonyai-a2a-trust-01"
     category="info"
     ipr="trust200902"
     submissionType="independent"
     version="3">

  <front>
    <title abbrev="A2A Trust">Agent-to-Agent Trust, Identity, and Verifiable Provenance</title>
    <seriesInfo name="Internet-Draft" value="draft-tonyai-a2a-trust-01"/>

    <author fullname="Tony Trujillo (tonyai)" initials="T." surname="Trujillo">
      <organization>Individual Submission</organization>
      <address>
        <email>ajtrujillo68@gmail.com</email>
      </address>
    </author>

    <date month="July" day="25" year="2026"/>

    <area>General</area>

    <abstract>
      <t>This document defines a trust model for agent-to-agent (A2A)
      interactions in multi-agent AI systems.  It specifies how agents
      obtain verifiable identities via CA-signed templates, how spawn
      chains are cryptographically established and validated, how dynamic
      policies are governed under a dual-signature model, and how
      cross-organizational agent interactions are explicitly authorized.
      The model applies existing PKI primitives (X.509, CRL, CSR) and
      established identity patterns (OAuth 2.0, On-Behalf-Of) to the
      problem of agent provenance.  This document does not address
      agent-to-resource access control, human-in-the-loop orchestration,
      or agent behavior, as those concerns belong to the resource
      enforcement layer and the orchestration layer respectively.</t>
    </abstract>
  </front>

  <middle>

    <section anchor="introduction" numbered="true" toc="default">
      <name>Introduction</name>
      <t>Multi-agent AI systems introduce identity and authorization gaps
      that existing standards do not fully address.  When Agent A spawns
      Agent B, and Agent B calls a resource, no current standard defines
      how the resource verifies that Agent B was legitimately spawned,
      that its scope has not been escalated, or that its origin template
      is trusted.</t>

      <t>This document proposes a trust model based on:</t>

      <ul>
        <li>Agent templates as first-class, CA-signed identity artifacts.</li>
        <li>Verifiable spawn chains where each agent's provenance is
        cryptographically traceable to a registered template.</li>
        <li>Two-lane governance separating static identity (cert-based)
        from dynamic policy (OPA-gated).</li>
        <li>Fail-closed enforcement at every verification step.</li>
      </ul>

      <t>The model reuses proven PKI primitives and applies them to a new
      surface -- agent identity -- rather than inventing new
      cryptographic mechanisms.</t>
    </section>

    <section anchor="conventions" numbered="true" toc="default">
      <name>Conventions Used in This Document</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>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this
      document are to be interpreted as described in
      <xref target="RFC2119"/>.</t>
    </section>

    <section anchor="terminology" numbered="true" toc="default">
      <name>Terminology</name>
      <dl>
        <dt>Agent:</dt>
        <dd>An ephemeral, autonomous process that performs tasks on
        behalf of a user or another agent.</dd>

        <dt>Agent Template:</dt>
        <dd>A CA-signed artifact defining an agent's identity,
        allowed scopes, spawn rules, and policy reference.</dd>

        <dt>Template Registry:</dt>
        <dd>The authoritative store of approved, signed
        agent templates for an organization.</dd>

        <dt>Template Registry CA:</dt>
        <dd>The Certificate Authority that signs agent
        templates -- the root of trust for the agent ecosystem.</dd>

        <dt>Spawn:</dt>
        <dd>The act of an agent instantiating a child agent from an
        approved template.</dd>

        <dt>Spawn Chain:</dt>
        <dd>The ordered, cryptographically verifiable sequence of
        agents from the root orchestrator to the current agent.</dd>

        <dt>Policy Authority:</dt>
        <dd>The entity responsible for countersigning dynamic
        policy changes after automated gate validation.</dd>

        <dt>CRL:</dt>
        <dd>Certificate Revocation List -- the list of revoked template
        and agent certificates maintained by the CA.</dd>

        <dt>CSR:</dt>
        <dd>Certificate Signing Request -- the template author's request
        to the CA for a signed template certificate.</dd>

        <dt>Cross-Org Grant:</dt>
        <dd>An explicit, signed authorization allowing agents
        from one organization to spawn from a template owned by another.</dd>
      </dl>
    </section>

    <section anchor="problem-statement" numbered="true" toc="default">
      <name>Problem Statement</name>
      <t>Multi-agent orchestration creates identity and authorization gaps:</t>

      <figure>
        <artwork type="ascii-art"><![CDATA[
   Agent A --> spawns --> Agent B --> calls --> Resource
        ]]></artwork>
      </figure>

      <ul>
        <li>Which identity does the Resource see?</li>
        <li>How does authorization propagate across the chain without escalating?</li>
        <li>If Agent B is compromised, can it impersonate Agent A?</li>
        <li>Who owns the audit trail across the full chain?</li>
        <li>How does the Resource prove Agent B was authorized to be spawned?</li>
      </ul>

      <t>No current standard (W3C, IETF, or vendor) fully addresses agent
      provenance in multi-hop chains.</t>
    </section>

    <section anchor="existing-patterns" numbered="true" toc="default">
      <name>Existing Patterns and Gaps</name>

      <section anchor="obo" numbered="true" toc="default">
        <name>On-Behalf-Of (OBO)</name>
        <t>Microsoft Entra ID OBO provides user-to-service delegation:</t>

        <figure>
          <artwork type="ascii-art"><![CDATA[
   User --> Agent A (token A) -->
   Agent A requests token for Agent B on behalf of user -->
   Entra validates the chain -->
   Issues scoped delegated token
          ]]></artwork>
        </figure>

        <t>Key insight: a trusted third party validates the delegation chain.
        Agents do not self-assert trust.</t>

        <t>OBO breaks down for agent-to-agent because agents are ephemeral,
        agent spawning is dynamic, and no registry exists for agent
        templates.</t>
      </section>

      <section anchor="token-exchange" numbered="true" toc="default">
        <name>OAuth 2.0 Token Exchange (RFC 8693)</name>
        <t><xref target="RFC8693"/> defines scope constraint across delegation hops --
        downstream tokens <bcp14>MUST</bcp14> be a subset of upstream grants.  This
        document adopts that principle for agent scope inheritance.</t>
      </section>
    </section>

    <section anchor="agent-identity" numbered="true" toc="default">
      <name>Agent Identity</name>
      <t>Agent identity <bcp14>MUST</bcp14> be established using X.509 certificate chains
      <xref target="RFC5280"/>.  This reuses the same trust model used by TLS and
      existing workload identity systems.</t>

      <section anchor="csr-flow" numbered="true" toc="default">
        <name>Certificate Signing Request Flow</name>
        <figure>
          <artwork type="ascii-art"><![CDATA[
   Template Author
       | defines template (scopes, spawn rules, TTL, owner)
       | generates CSR
       v
   Template Registry CA
       | validates template conformance
       | signs the template certificate
       v
   Signed Agent Template (registered)
       |
       v
   Orchestrator spawns agent from signed template
       | agent receives certificate derived from template certificate
       | CA chain proves provenance
       v
   Resource validates certificate chain:
       - certificate signed by trusted template?
       - template signed by CA?
       - scope within bounds?
       - ALLOW or DENY
          ]]></artwork>
        </figure>
      </section>

      <section anchor="cert-chain-structure" numbered="true" toc="default">
        <name>Certificate Chain Structure</name>
        <figure>
          <artwork type="ascii-art"><![CDATA[
   Template Registry CA (root of trust)
       |
       v
   Orchestrator Agent Certificate
       Subject:       orchestrator-v1
       Issuer:        Template Registry CA
       Owner:         owner@example.com
       OrgID:         org-123
       KeyUsage:      spawn, delegate
       AllowedScopes: read:data, write:data
       CanSpawn:      [reader-template-v1], MaxChildren: 5
       PolicyRef:     policy-store/orchestrator-v1/current
       TTL:           1h
            |
            v
       Child Agent Certificate
           Subject:       reader-agent-v1
           Issuer:        orchestrator-v1
           CA Chain:      orchestrator-v1 -> Template Registry CA
           KeyUsage:      read only
           AllowedScopes: read:data (MUST be subset of parent)
           TTL:           15min (SHOULD be shorter than parent)
          ]]></artwork>
        </figure>
      </section>
    </section>

    <section anchor="template-structure" numbered="true" toc="default">
      <name>Template Structure</name>

      <section anchor="static-fields" numbered="true" toc="default">
        <name>Static Fields</name>
        <t>The following fields <bcp14>MUST</bcp14> be present in every agent template
        certificate and <bcp14>MUST NOT</bcp14> be modified without full re-certification:</t>

        <table>
          <thead>
            <tr><th>Field</th><th>Required</th><th>Description</th></tr>
          </thead>
          <tbody>
            <tr><td>Subject</td><td>REQUIRED</td><td>Unique template identifier</td></tr>
            <tr><td>Issuer</td><td>REQUIRED</td><td>Template Registry CA</td></tr>
            <tr><td>Owner</td><td>REQUIRED</td><td>Verified identity of template owner</td></tr>
            <tr><td>OrgID</td><td>REQUIRED</td><td>CA-validated organization identifier</td></tr>
            <tr><td>KeyUsage</td><td>REQUIRED</td><td>Permitted operations</td></tr>
            <tr><td>AllowedScopes</td><td>REQUIRED</td><td>Maximum scopes this agent may hold</td></tr>
            <tr><td>CanSpawn</td><td>REQUIRED</td><td>Whitelist of permitted child templates</td></tr>
            <tr><td>MaxChildren</td><td>REQUIRED</td><td>Maximum concurrent child agents</td></tr>
            <tr><td>ScopeInherit</td><td>REQUIRED</td><td>Scope inheritance constraint</td></tr>
            <tr><td>PolicyRef</td><td>REQUIRED</td><td>Pointer to dynamic policy store</td></tr>
            <tr><td>TTL</td><td>REQUIRED</td><td>Maximum agent lifetime</td></tr>
          </tbody>
        </table>
      </section>

      <section anchor="dynamic-policy-bounds" numbered="true" toc="default">
        <name>Dynamic Policy Bounds</name>
        <t>Dynamic policies <bcp14>MUST</bcp14> be bounded by the static template fields.
        A dynamic policy <bcp14>MUST NOT</bcp14> grant scopes beyond AllowedScopes.
        A dynamic policy <bcp14>MUST NOT</bcp14> add spawn targets beyond CanSpawn.</t>
      </section>
    </section>

    <section anchor="spawn-chain-validation" numbered="true" toc="default">
      <name>Spawn Chain Validation</name>

      <section anchor="two-check-rule" numbered="true" toc="default">
        <name>Two-Check Spawn Rule</name>
        <t>Every spawn <bcp14>MUST</bcp14> pass two independent checks.  Either check
        failing <bcp14>MUST</bcp14> result in spawn denial with no fallback.</t>

        <t>Check 1 -- Static (CanSpawn in certificate):
        The requested child template <bcp14>MUST</bcp14> appear in the spawning
        agent's CanSpawn list.</t>

        <t>Check 2 -- Dynamic (Registry live lookup):
        The requested child template <bcp14>MUST</bcp14> be currently registered,
        CA-signed, not self-signed, owned by an authorized party,
        and not present in the current CRL.</t>

        <t>Rationale: CanSpawn alone is insufficient because the certificate
        may be stale and a template may have been revoked since issuance.
        Registry lookup alone is insufficient because any party could
        forge a request claiming any template.  Both checks <bcp14>MUST</bcp14> pass.</t>
      </section>

      <section anchor="spawn-validation-sequence" numbered="true" toc="default">
        <name>Spawn Validation Sequence</name>
        <figure>
          <artwork type="ascii-art"><![CDATA[
   1.  CanSpawn check -- child template in CanSpawn list?
       NO  --> DENY, audit log
       YES --> continue

   2.  Registry check -- registered, CA-signed, not revoked?
       NO  --> DENY, audit log
       YES --> continue

   3.  Scope check -- requested scope subset of parent scopes?
       NO  --> DENY, audit log
       YES --> continue

   4.  MaxChildren check -- current children < MaxChildren?
       NO  --> DENY, audit log
       YES --> spawn approved

   5.  Child certificate issued with:
       - parent identity embedded (delegation chain)
       - scope equal to requested scope (not exceeding parent)
       - spawn timestamp and nonce (replay prevention)
       - audit log entry written
          ]]></artwork>
        </figure>
      </section>

      <section anchor="scope-constraint" numbered="true" toc="default">
        <name>Scope Constraint</name>
        <t>A child agent's AllowedScopes <bcp14>MUST</bcp14> be a subset of the
        parent agent's AllowedScopes: every scope granted to the child
        <bcp14>MUST</bcp14> also be held by the parent.  A child <bcp14>MUST
        NOT</bcp14> be granted any scope the parent does not itself hold;
        scope escalation across agent hops is explicitly prohibited.
        Equality is permitted -- a child <bcp14>MAY</bcp14> be granted the
        same scope set as its parent, or fewer.</t>

        <t>Example:</t>
        <figure>
          <artwork type="ascii-art"><![CDATA[
   Parent has:  read:data, write:data
   Child gets:  read:data              -- valid
   Child gets:  read:data, write:data  -- valid (same as parent)
   Child gets:  admin:data             -- MUST be rejected
          ]]></artwork>
        </figure>
      </section>

      <section anchor="audit-requirements" numbered="true" toc="default">
        <name>Audit Requirements</name>
        <t>Every spawn event <bcp14>MUST</bcp14> be logged with: spawning agent identity,
        child template identity, requested scope, granted scope,
        timestamp, outcome (ALLOWED or DENIED), and reason if denied.</t>
      </section>
    </section>

    <section anchor="dynamic-policy-governance" numbered="true" toc="default">
      <name>Dynamic Policy Governance</name>

      <section anchor="two-lane-model" numbered="true" toc="default">
        <name>Two-Lane Model</name>
        <t>Template certificate (static): WHO the agent is and WHO it
        can spawn.  Changes require full re-certification.</t>

        <t>Dynamic policy (fast lane): WHAT the agent can do within
        the bounds of the template certificate.  Changes require
        dual signature (<xref target="dual-signature"/>).</t>

        <t>Dynamic policies <bcp14>MUST NOT</bcp14> exceed the bounds defined in the
        static template certificate.</t>
      </section>

      <section anchor="ownership" numbered="true" toc="default">
        <name>Ownership</name>
        <t>Template ownership <bcp14>MUST</bcp14> be established at certificate signing
        time and embedded in the Owner and OrgID fields.  Only the
        verified owner of the organization that signed the template
        <bcp14>MAY</bcp14> submit policy changes.</t>
      </section>

      <section anchor="dual-signature" numbered="true" toc="default">
        <name>Dual Signature Requirement</name>
        <t>Every policy change <bcp14>MUST</bcp14> be signed by two independent parties:</t>

        <ol>
          <li>Owner -- proves the right to change the policy.</li>
          <li>Policy Authority -- proves the policy passed automated
          validation gates.</li>
        </ol>

        <t>Neither signature alone is sufficient.  Both <bcp14>MUST</bcp14> be present
        and valid for a policy to be accepted.</t>

        <figure>
          <artwork type="ascii-art"><![CDATA[
   Owner key  +  Policy Authority key  =  policy accepted
       ^                  ^
   who owns it        passed the gates
          ]]></artwork>
        </figure>
      </section>

      <section anchor="policy-change-sequence" numbered="true" toc="default">
        <name>Policy Change Sequence</name>
        <figure>
          <artwork type="ascii-art"><![CDATA[
   1.  Identity and ownership verification
       - requester matches Owner in template certificate?
       - requester OrgID matches certificate OrgID?
       NO  --> rejected, audit logged

   2.  Automated gate (OPA):
       - scope within AllowedScopes?
       - spawn targets within CanSpawn?
       - no conflicts with active policies?
       ANY FAIL --> rejected

   3.  Dual signature applied:
       Owner signs, Policy Authority countersigns

   4.  Policy stored with dual signature, version, timestamp,
       and content hash

   5.  Agent validates at runtime:
       - both signatures valid?
       - version current? (replay prevention)
       - hash matches? (tamper detection)
       - policy within template certificate bounds?
       ANY FAIL --> DENY, audit logged
          ]]></artwork>
        </figure>
      </section>

      <section anchor="threat-coverage" numbered="true" toc="default">
        <name>Threat Coverage</name>
        <table>
          <thead>
            <tr><th>Scenario</th><th>Single Sig Gap</th><th>Dual Sig Fix</th></tr>
          </thead>
          <tbody>
            <tr>
              <td>Rogue Policy Authority</td>
              <td>Pushes bad policy</td>
              <td>Owner key missing</td>
            </tr>
            <tr>
              <td>Rogue owner</td>
              <td>Bypasses OPA gates</td>
              <td>PA won't countersign</td>
            </tr>
            <tr>
              <td>Compromised owner key</td>
              <td>Attacker modifies</td>
              <td>OPA gates enforced</td>
            </tr>
            <tr>
              <td>Compromised Policy Auth</td>
              <td>Pushes bad policy</td>
              <td>Owner key missing</td>
            </tr>
          </tbody>
        </table>
      </section>
    </section>

    <section anchor="template-versioning" numbered="true" toc="default">
      <name>Template Versioning</name>

      <section anchor="full-re-verification" numbered="true" toc="default">
        <name>Full Re-Verification Required</name>
        <t>A new template version <bcp14>MUST</bcp14> undergo full re-verification from
        scratch.  Trust <bcp14>MUST NOT</bcp14> be inherited from a previous version.</t>

        <t>Rationale: inheriting trust from v1 would allow a compromised
        v1 certificate to bootstrap trust for v2.</t>
      </section>

      <section anchor="versioning-principle" numbered="true" toc="default">
        <name>Versioning Principle</name>
        <t>Everything on the old template chain continues to work unchanged
        as long as the certificate is valid.  New connections and
        functionality are opt-in -- only available after the new template
        chain is fully verified and explicitly adopted.</t>
      </section>

      <section anchor="non-inheritance-rules" numbered="true" toc="default">
        <name>Non-Inheritance Rules</name>
        <t>The following <bcp14>MUST NOT</bcp14> be inherited from a previous version:</t>
        <ul>
          <li>Trust chain</li>
          <li>Cross-organizational grants</li>
          <li>CanSpawn list</li>
          <li>Dynamic policies</li>
        </ul>
      </section>

      <section anchor="template-lifecycle" numbered="true" toc="default">
        <name>Template Lifecycle</name>
        <dl>
          <dt>ACTIVE:</dt>
          <dd>Template is trusted.  New spawns accepted.</dd>
          <dt>DISABLED:</dt>
          <dd>No new spawns.  Existing agents run to TTL expiry.  Reversible.</dd>
          <dt>DELETED:</dt>
          <dd>Certificate revoked, CRL updated, registry entry removed.
          Irreversible.  Audit log preserved.</dd>
        </dl>

        <t>Disable <bcp14>SHOULD</bcp14> precede delete.  Implementations <bcp14>SHOULD</bcp14> enforce
        a mandatory waiting period between DISABLED and DELETED.</t>
      </section>

      <section anchor="cross-org-grant-reissuance" numbered="true" toc="default">
        <name>Cross-Organizational Grant Re-Issuance</name>
        <t>Cross-organizational grants <bcp14>MUST</bcp14> be explicitly re-issued for
        each new template version.  Grants <bcp14>MUST NOT</bcp14> automatically roll
        over on version upgrade.</t>
      </section>
    </section>

    <section anchor="cross-org-interaction" numbered="true" toc="default">
      <name>Cross-Organizational Agent Interaction</name>

      <section anchor="explicit-grant" numbered="true" toc="default">
        <name>Explicit Grant Requirement</name>
        <t>Cross-organizational agent spawning <bcp14>MUST</bcp14> be explicitly authorized
        by the resource-owning organization.  No implicit trust exists
        between organizations.</t>
      </section>

      <section anchor="grant-structure" numbered="true" toc="default">
        <name>Grant Structure</name>
        <t>A cross-organizational grant <bcp14>MUST</bcp14> contain:</t>
        <table>
          <thead>
            <tr><th>Field</th><th>Description</th></tr>
          </thead>
          <tbody>
            <tr><td>Grantor</td><td>Resource-owning organization</td></tr>
            <tr><td>Grantee</td><td>Requesting organization</td></tr>
            <tr><td>Template</td><td>Specific template identifier</td></tr>
            <tr><td>AllowedScopes</td><td>MUST be subset of template scopes</td></tr>
            <tr><td>TTL</td><td>Grant validity period</td></tr>
            <tr><td>MaxSpawns</td><td>Maximum concurrent agents permitted</td></tr>
            <tr><td>Signature</td><td>Dual signature (grantor owner + Policy Authority)</td></tr>
          </tbody>
        </table>
      </section>

      <section anchor="trust-anchor-options" numbered="true" toc="default">
        <name>Trust Anchor Options</name>
        <dl>
          <dt>Federated CA:</dt>
          <dd>Both organizations trust a shared root CA.</dd>
          <dt>Explicit CA trust:</dt>
          <dd>Org-B explicitly trusts Org-A's CA.</dd>
          <dt>Third-party CA:</dt>
          <dd>Both organizations use a public CA.</dd>
        </dl>
      </section>

      <section anchor="unilateral-revocation" numbered="true" toc="default">
        <name>Unilateral Revocation</name>
        <t>The granting organization <bcp14>MAY</bcp14> revoke a cross-organizational grant
        without the cooperation of the receiving organization.  Upon
        revocation, all agents spawned under the affected grant <bcp14>MUST</bcp14> be
        treated as untrusted on next validation.</t>
      </section>

      <section anchor="federated-audit" numbered="true" toc="default">
        <name>Federated Audit</name>
        <t>Each organization <bcp14>MUST</bcp14> maintain its own independent audit trail.
        Audit records <bcp14>MUST NOT</bcp14> depend on the other organization's systems.</t>
      </section>
    </section>

    <section anchor="revocation" numbered="true" toc="default">
      <name>Revocation</name>

      <section anchor="template-revocation" numbered="true" toc="default">
        <name>Template Revocation</name>
        <t>Template revocation <bcp14>MUST</bcp14> be performed by recording the
        template certificate as revoked in the CA's revocation state -- an
        X.509 CRL, an OCSP responder, or an equivalent revocation registry
        consulted on every validation.  All agent certificates derived
        from a revoked template <bcp14>MUST</bcp14> be treated as untrusted on the
        next revocation check.</t>
      </section>

      <section anchor="individual-agent-revocation" numbered="true" toc="default">
        <name>Individual Agent Revocation</name>
        <t>Individual agents <bcp14>MAY</bcp14> be revoked by explicit certificate
        revocation or by removal of authorization relationships at the
        resource layer.</t>
      </section>

      <section anchor="automation-requirement" numbered="true" toc="default">
        <name>Automation Requirement</name>
        <t>Routine revocation (TTL expiry, task completion) <bcp14>MUST</bcp14> be fully
        automated.  Human involvement <bcp14>SHOULD</bcp14> be reserved for incident
        response and high-impact decisions.</t>
      </section>
    </section>

    <section anchor="failure-model" numbered="true" toc="default">
      <name>Failure Model</name>

      <section anchor="fail-closed" numbered="true" toc="default">
        <name>Fail Closed</name>
        <t>Any verification step that cannot be completed <bcp14>MUST</bcp14> result in
        DENY.  This includes:</t>
        <ul>
          <li>CA unreachable</li>
          <li>Registry unreachable</li>
          <li>CRL unreachable</li>
          <li>Certificate expired or revoked</li>
          <li>Scope escalation attempt</li>
          <li>Policy invalid or unsigned</li>
          <li>Dual signature missing or invalid</li>
        </ul>
        <t>Implementations <bcp14>MUST NOT</bcp14> provide a degraded mode that allows
        partial spawning or execution when verification infrastructure
        is unavailable.</t>
      </section>
    </section>

    <section anchor="conformance-requirements" numbered="true" toc="default">
      <name>Conformance Requirements</name>

      <section anchor="field-placement" numbered="true" toc="default">
        <name>Field Placement</name>
        <t>Implementations <bcp14>MUST</bcp14> place every field in the location specified
        by this document.  Variable element placement is NOT permitted.</t>
      </section>

      <section anchor="csr-validation" numbered="true" toc="default">
        <name>CSR Validation</name>
        <t>Non-conforming CSRs <bcp14>MUST</bcp14> be rejected by the CA.  A non-conforming
        template <bcp14>MUST NOT</bcp14> be signed.</t>
      </section>

      <section anchor="test-vectors" numbered="true" toc="default">
        <name>Test Vectors</name>
        <t>Implementations <bcp14>MUST</bcp14> provide test vectors -- concrete examples of
        valid and invalid template chains -- for conformance validation.</t>
      </section>

      <section anchor="conformance-certification" numbered="true" toc="default">
        <name>Conformance Certification</name>
        <t>Implementations claiming conformance with this document <bcp14>MUST</bcp14> pass
        conformance certification before shipping.</t>
      </section>

      <section anchor="reference-implementation" numbered="true" toc="default">
        <name>Reference Implementation</name>
        <t>A reference implementation <bcp14>SHOULD</bcp14> be made available including:</t>
        <ul>
          <li>Template Registry CA</li>
          <li>Spawn chain validation</li>
          <li>SDK with certificate chain validation, registry lookup,
          and CRL check handling</li>
          <li>Template linter for pre-submission CSR validation</li>
        </ul>
      </section>
    </section>

    <section anchor="iana-considerations" numbered="true" toc="default">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>

    <section anchor="security-considerations" numbered="true" toc="default">
      <name>Security Considerations</name>

      <section anchor="scope-escalation" numbered="true" toc="default">
        <name>Scope Escalation</name>
        <t>Implementations <bcp14>MUST</bcp14> enforce at every hop that child
        agent scopes are a subset of parent scopes: child scopes are
        contained within parent scopes, and no scope may be introduced that
        the parent does not already hold.  Failure to enforce this
        allows privilege escalation across the agent chain.</t>
      </section>

      <section anchor="replay-attacks" numbered="true" toc="default">
        <name>Replay Attacks</name>
        <t>Spawn requests <bcp14>MUST</bcp14> include a timestamp and nonce.
        Implementations <bcp14>MUST</bcp14> reject spawn requests where the timestamp
        exceeds a defined freshness window or the nonce has been seen
        previously.</t>
      </section>

      <section anchor="compromised-templates" numbered="true" toc="default">
        <name>Compromised Templates</name>
        <t>A compromised template certificate <bcp14>MUST</bcp14> be revoked immediately.
        A single CRL update invalidates all downstream agent certificates
        derived from that template.</t>
      </section>

      <section anchor="single-point-of-compromise" numbered="true" toc="default">
        <name>Single Point of Compromise</name>
        <t>The dual signature requirement (<xref target="dual-signature"/>) ensures no single
        compromised party can push unauthorized policy changes.  CA
        compromise requires full ecosystem re-issuance.</t>
      </section>

      <section anchor="cross-org-trust" numbered="true" toc="default">
        <name>Cross-Organizational Trust</name>
        <t>Cross-organizational grants <bcp14>MUST</bcp14> be explicitly issued.  Implicit
        trust between organizations is prohibited.</t>
      </section>

      <section anchor="audit-integrity" numbered="true" toc="default">
        <name>Audit Integrity</name>
        <t>Audit logs <bcp14>MUST</bcp14> be tamper-evident.  Logs <bcp14>MUST NOT</bcp14> be deletable
        by agents or orchestrators.  Audit log infrastructure <bcp14>SHOULD</bcp14>
        be outside the control of the agent ecosystem itself.</t>
      </section>
    </section>

  </middle>

  <back>
    <references>
      <name>References</name>

      <references>
        <name>Normative References</name>

        <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author initials="S." surname="Bradner" fullname="S. Bradner"/>
            <date month="March" year="1997"/>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
        </reference>

        <reference anchor="RFC5280" target="https://www.rfc-editor.org/info/rfc5280">
          <front>
            <title>Internet X.509 Public Key Infrastructure Certificate and
            Certificate Revocation List (CRL) Profile</title>
            <author initials="D." surname="Cooper" fullname="D. Cooper"/>
            <author initials="S." surname="Santesson" fullname="S. Santesson"/>
            <author initials="S." surname="Farrell" fullname="S. Farrell"/>
            <author initials="S." surname="Boeyen" fullname="S. Boeyen"/>
            <author initials="R." surname="Housley" fullname="R. Housley"/>
            <author initials="W." surname="Polk" fullname="W. Polk"/>
            <date month="May" year="2008"/>
          </front>
          <seriesInfo name="RFC" value="5280"/>
        </reference>

        <reference anchor="RFC6749" target="https://www.rfc-editor.org/info/rfc6749">
          <front>
            <title>The OAuth 2.0 Authorization Framework</title>
            <author initials="D." surname="Hardt" fullname="D. Hardt"/>
            <date month="October" year="2012"/>
          </front>
          <seriesInfo name="RFC" value="6749"/>
        </reference>

        <reference anchor="RFC8693" target="https://www.rfc-editor.org/info/rfc8693">
          <front>
            <title>OAuth 2.0 Token Exchange</title>
            <author initials="M." surname="Jones" fullname="M. Jones"/>
            <author initials="A." surname="Campbell" fullname="A. Campbell"/>
            <author initials="C." surname="Mortimore" fullname="C. Mortimore"/>
            <date month="January" year="2020"/>
          </front>
          <seriesInfo name="RFC" value="8693"/>
        </reference>
      </references>

      <references>
        <name>Informative References</name>

        <reference anchor="NIST800-207">
          <front>
            <title>Zero Trust Architecture</title>
            <author initials="S." surname="Rose" fullname="S. Rose"/>
            <author initials="O." surname="Borchert" fullname="O. Borchert"/>
            <author initials="S." surname="Mitchell" fullname="S. Mitchell"/>
            <author initials="S." surname="Connelly" fullname="S. Connelly"/>
            <date month="August" year="2020"/>
          </front>
          <seriesInfo name="NIST SP" value="800-207"/>
        </reference>

        <reference anchor="SPIFFE" target="https://spiffe.io">
          <front>
            <title>Secure Production Identity Framework for Everyone</title>
            <author>
              <organization>SPIFFE Project</organization>
            </author>
            <date/>
          </front>
        </reference>

        <reference anchor="OpenFGA" target="https://openfga.dev">
          <front>
            <title>OpenFGA Specification</title>
            <author>
              <organization>OpenFGA Project</organization>
            </author>
            <date/>
          </front>
        </reference>

        <reference anchor="VAULTPKI"
                   target="https://developer.hashicorp.com/vault/docs/secrets/pki">
          <front>
            <title>Vault PKI Secrets Engine</title>
            <author>
              <organization>HashiCorp</organization>
            </author>
            <date/>
          </front>
        </reference>
      </references>
    </references>

    <section anchor="changes-01" numbered="true" toc="default">
      <name>Changes since draft-tonyai-a2a-trust-00</name>
      <t>
        Clarified two areas identified as ambiguous during development of a
        reference implementation:
      </t>
      <ul>
        <li>
          Section 8.3/16.1 scope-subset language now explicitly permits
          equality between a child's requested scope and its parent's
          granted scope; only escalation (a superset) is prohibited. The
          prior wording could be misread as requiring a strict/proper
          subset, which would wrongly deny a child that legitimately needs
          the same scope as its parent.
        </li>
        <li>
          Section 12.1 revocation-check language now explicitly accepts an
          X.509 CRL, an OCSP responder, or an equivalent revocation
          registry, rather than implying a CRL specifically. The
          normative requirement is that revocation state is consulted on
          every validation, not the specific mechanism used to represent
          it.
        </li>
      </ul>
      <t>
        Neither change alters the normative requirements themselves; both
        make explicit what the -00 text intended. Both were surfaced by
        building and red-teaming a conformance reference implementation
        against the -00 text.
      </t>
    </section>
  </back>

</rfc>
