<?xml version="1.0" encoding="UTF-8"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude"
     docName="draft-tonyai-a2a-trust-00"
     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-00"/>

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

    <date month="May" 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 strict subset of the
        parent agent's AllowedScopes.  Scope escalation across agent
        hops is explicitly prohibited.</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 adding the template
        certificate to the CA's CRL.  All agent certificates derived
        from a revoked template <bcp14>MUST</bcp14> be treated as untrusted on next
        CRL 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 that child agent scopes are a strict
        subset of parent scopes at every hop.  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>
  </back>

</rfc>
