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

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

    <date month="August" day="28" 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="certificate-profile" numbered="true" toc="default">
        <name>Certificate Profile</name>
        <t>Certificates used for agent identity <bcp14>MUST</bcp14> conform to
        <xref target="RFC5280"/>.  In addition, a relying party validating an
        agent certificate <bcp14>MUST</bcp14> enforce all of the following, and
        <bcp14>MUST</bcp14> refuse the certificate if any is not satisfied:</t>
        <ul>
          <li>An agent certificate <bcp14>MUST</bcp14> carry the basicConstraints
          extension asserting cA = FALSE.  A certificate that omits
          basicConstraints <bcp14>MUST</bcp14> be refused; the extension's absence
          <bcp14>MUST NOT</bcp14> be treated as equivalent to cA = FALSE.</li>
          <li>A Template Registry CA certificate <bcp14>MUST</bcp14> carry
          basicConstraints asserting cA = TRUE, marked critical, and
          <bcp14>MUST</bcp14> assert keyCertSign in its keyUsage extension.</li>
          <li>Certificates <bcp14>MUST</bcp14> be signed using SHA-256 or a
          stronger digest.  Certificates signed with SHA-1 or MD5
          <bcp14>MUST</bcp14> be refused irrespective of key size.</li>
          <li>Public keys <bcp14>MUST</bcp14> provide at least a 112-bit security
          level as defined in <xref target="SP800-57"/> -- RSA 2048 or
          NIST P-256 or stronger.  A relying party <bcp14>MUST</bcp14> refuse a
          certificate whose key falls below this level.</li>
        </ul>
        <t>An agent certificate asserting cA = TRUE is a certificate entitled to
        issue further certificates.  Such an agent can create children without
        presenting a request to the Template Registry CA, which removes both
        checks required by <xref target="two-check-rule"/> from the spawn path
        entirely.  No signature is invalid in that scenario and no chain fails to
        verify; the containment described in <xref target="template-structure"/>
        is simply never consulted.  This is the reason the constraint is stated
        normatively here rather than left to the general RFC 5280 profile.</t>
        <t>These requirements are necessary and not sufficient.  A certificate
        satisfying all of them establishes identity only; it carries no
        authorization.  See <xref target="pki-boundary"/>.</t>
      </section>

      <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
       PermittedOperations: 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
           PermittedOperations: 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>PermittedOperations</td><td>REQUIRED</td><td>Operations this agent may perform</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>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>
        <t>A relying party <bcp14>MUST</bcp14> evaluate these bounds itself, on
        every validation, against the static fields of the template certificate
        naming the subject the policy governs.  This evaluation
        <bcp14>MUST</bcp14> be independent of signature validity, and a policy
        exceeding the bounds <bcp14>MUST</bcp14> be refused before it is applied,
        however many valid signatures it carries.</t>
        <t>The signatures required by <xref target="dual-signature"/> and the
        bounds required here answer different questions.  The signatures
        establish who authorized a change.  They do not, and cannot, establish
        that the change was within the ceiling the template set, because the
        ceiling is stated in a certificate that no signature over the policy
        covers.  An implementation that treats a valid dual signature as
        sufficient authority to apply a policy has removed the only mechanism
        bounding what a policy may grant.</t>
        <t>Refusal under this section is a distinct condition from a signature
        failure, and implementations <bcp14>SHOULD</bcp14> report it distinctly:
        the document is authentic and its content is not permitted.  Reporting it
        as a signature failure misdirects the operator to the wrong lane of
        <xref target="two-lane-model"/>.</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-document-structure" numbered="true" toc="default">
        <name>Dynamic Policy Document Structure</name>
        <t>A dynamic policy document <bcp14>MUST</bcp14> contain the following
        fields.  This is the complete set; a document containing any other field
        <bcp14>MUST</bcp14> be refused, since an unrecognized field is either
        meaningless or an attempt to convey authority the profile does not
        define.</t>
        <table anchor="policy-fields">
          <name>Dynamic Policy Document Fields</name>
          <thead>
            <tr><th>Field</th><th>Required</th><th>Description</th></tr>
          </thead>
          <tbody>
            <tr><td>Subject</td><td>REQUIRED</td><td>Identifier of the agent this policy governs; MUST match the Subject of the template certificate</td></tr>
            <tr><td>Owner</td><td>REQUIRED</td><td>Submitting owner; MUST match Owner in the template certificate</td></tr>
            <tr><td>OrgID</td><td>REQUIRED</td><td>Submitting organization; MUST match OrgID in the template certificate</td></tr>
            <tr><td>Scopes</td><td>REQUIRED</td><td>Scopes granted by this policy; bounded by AllowedScopes</td></tr>
            <tr><td>SpawnTargets</td><td>OPTIONAL</td><td>Spawn targets granted by this policy; bounded by CanSpawn. Absent means none are granted</td></tr>
            <tr><td>Version</td><td>REQUIRED</td><td>Monotonically increasing integer, scoped to Subject</td></tr>
            <tr><td>IssuedAt</td><td>REQUIRED</td><td>Timestamp of issuance, RFC 3339</td></tr>
            <tr><td>NotAfter</td><td>OPTIONAL</td><td>Expiry of this policy; MUST NOT exceed the template TTL</td></tr>
          </tbody>
        </table>
        <t>Version is scoped to the Subject, not global.  A relying party
        <bcp14>MUST</bcp14> refuse a policy whose Version is not strictly greater
        than the Version of the policy currently in force for that Subject.</t>
      </section>

      <section anchor="canonicalization" numbered="true" toc="default">
        <name>Canonicalization</name>
        <t>Signatures and hashes defined by this document are computed over
        bytes, so the mapping from a policy document to those bytes
        <bcp14>MUST</bcp14> be deterministic and identical across
        implementations.</t>
        <t>Wherever this document requires a canonical form -- of a policy
        document, of any field subset thereof, or of an audit log entry -- that
        canonical form <bcp14>MUST</bcp14> be the JSON Canonicalization Scheme
        (JCS) serialization defined in <xref target="RFC8785"/>.  A single
        canonical form is specified for all of them deliberately: an
        implementation carrying two serializations will eventually apply the
        wrong one, and the resulting failure presents as a signature or integrity
        error with no indication that serialization was the cause.</t>
        <t>JCS is specified rather than described here because a bespoke
        serialization would require this document to define property ordering,
        string escaping, and number formatting correctly and completely, and any
        error in that definition surfaces to implementers as a signature failure
        that appears to be a cryptographic fault.  Serializations that differ
        only in whitespace, key order, or the escaping of non-ASCII characters
        produce different bytes and therefore different signatures; implementers
        <bcp14>MUST NOT</bcp14> assume a language's default JSON encoder produces
        the canonical form, as most do not.</t>
      </section>

      <section anchor="signature-coverage" numbered="true" toc="default">
        <name>Signature and Hash Coverage</name>
        <t>Both signatures required by <xref target="dual-signature"/>
        <bcp14>MUST</bcp14> be computed over the canonical form
        (<xref target="canonicalization"/>) of the complete set of fields defined
        in <xref target="policy-document-structure"/>.  No field in that table is
        excluded from either signature.</t>
        <t>In particular, Version <bcp14>MUST</bcp14> be inside the signed
        preimage.  Version exists to prevent replay, and it cannot serve that
        purpose while it remains modifiable without invalidating a signature: an
        attacker holding no key can otherwise take a superseded but validly
        signed policy, increment its Version, and present it as current.  Both
        signatures verify, the content hash matches, and the version reads as
        current.  The same reasoning applies to Subject: a signature that does
        not bind the policy to the agent it governs permits a policy issued for
        one agent to be presented for another.</t>
        <t>The content hash required by <xref target="policy-change-sequence"/>
        <bcp14>MUST</bcp14> be SHA-256, or a stronger digest, computed over the
        same canonical form and the same field set as the signatures.  The hash
        field itself is stored alongside the policy document and
        <bcp14>MUST NOT</bcp14> be included in its own preimage.</t>
        <t>The signatures and the content hash are stored with the policy
        document but are not part of it.  A relying party <bcp14>MUST NOT</bcp14>
        accept a document in which they appear as policy fields.</t>
      </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>
        <t>Three independent implementations exist at the time of writing.  Each
        states the revision it was written and verified against, and continues to
        state that revision until someone re-reads the newer text and re-runs the
        vectors.  An implementation pinned to an earlier revision remains a
        correct implementation of that revision; a version string is a
        conformance claim rather than a label, and advancing one without
        re-verifying asserts conformance nobody has tested.</t>
        <table anchor="implementations">
          <name>Known Implementations</name>
          <thead>
            <tr><th>Implementation</th><th>Revision</th><th>Notes</th></tr>
          </thead>
          <tbody>
            <tr>
              <td>a2a-trust-playground</td>
              <td>-02</td>
              <td>Browser implementation, no installation or backend.  Validates
              a chain against every check in this document and reports the clause
              governing each refusal.  Source:
              https://github.com/tonyt68/a2a-trust-playground</td>
            </tr>
            <tr>
              <td>ietf-a2a-trust-poc</td>
              <td>-00</td>
              <td>Registry CA, spawn validation and policy governance services.
              Source: https://github.com/tonyt68/ietf-a2a-trust-poc</td>
            </tr>
            <tr>
              <td>hack-my-own-code</td>
              <td>-00</td>
              <td>Adversarial implementation that attacks its own conformance.
              Source: https://github.com/tonyt68/hack-my-own-code</td>
            </tr>
          </tbody>
        </table>
        <t>The changes in this revision were surfaced by building the first of
        these against the -01 text and attacking it, rather than by review of the
        text alone.  Implementers are encouraged to report what the document does
        not say clearly enough, which is a different and more useful signal than
        agreement with it.</t>
      </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="pki-boundary" numbered="true" toc="default">
        <name>PKI Does Not Enforce Authorization</name>
        <t>Because agent identity is carried in X.509 certificates and the chain
        is verified on every validation, it is natural to assume the certificate
        chain also constrains what an agent may do.  It does not, and an
        implementation built on that assumption is unprotected while appearing
        rigorous.</t>
        <t>X.509 carries no representation of the scopes defined by this
        document.  AllowedScopes, CanSpawn and MaxChildren are conveyed in the
        template, and no certificate path validation algorithm inspects them.  A
        conformant X.509 validator presented with an agent certificate whose
        associated template claims scopes far beyond those its parent holds will
        report success, because the certificate is genuinely valid and correctly
        issued.  The over-scoping is not a defect the validator is looking
        for.</t>
        <t>The nameConstraints extension does not close this gap.  It constrains
        the namespace within which a CA may issue, not the authority a subject
        may claim once issued.  Likewise certificatePolicies expresses which
        policies a chain supports, not whether a child exceeded its parent, and
        policy processing is disabled by default in common implementations.</t>
        <t>Consequently <xref target="dynamic-policy-bounds"/> and
        <xref target="scope-constraint"/> are load-bearing implementation logic.
        They are not restatements of a property the certificate chain already
        guarantees, and an implementation that omits them because "the chain
        verifies" has no containment at all.  Certificate validity establishes
        identity.  Authorization is evaluated separately, every time.</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>
              <t>Each entry's hash <bcp14>MUST</bcp14> be computed as SHA-256, or a
        stronger digest, over the canonical form
        (<xref target="canonicalization"/>) of the entry's fields including the
        previous entry's hash, and excluding the entry's own hash field.  As with
        policy documents, an unspecified preimage is not a detail: two
        implementations hashing different field sets each read the other's chain
        as broken, and a chain that cannot be verified across implementations
        provides no evidence to anyone but its author.</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="RFC8785" target="https://www.rfc-editor.org/info/rfc8785">
          <front>
            <title>JSON Canonicalization Scheme (JCS)</title>
            <author initials="A." surname="Rundgren" fullname="A. Rundgren"/>
            <author initials="B." surname="Jordan" fullname="B. Jordan"/>
            <author initials="S." surname="Erdtman" fullname="S. Erdtman"/>
            <date month="June" year="2020"/>
          </front>
          <seriesInfo name="RFC" value="8785"/>
        </reference>

        <reference anchor="SP800-57" target="https://doi.org/10.6028/NIST.SP.800-57pt1r5">
          <front>
            <title>Recommendation for Key Management: Part 1 - General</title>
            <author initials="E." surname="Barker" fullname="E. Barker"/>
            <date month="May" year="2020"/>
          </front>
          <seriesInfo name="NIST SP" value="800-57 Part 1 Rev. 5"/>
        </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-02" numbered="true" toc="default">
      <name>Changes since draft-tonyai-a2a-trust-01</name>
      <t>
        All changes in this revision were surfaced by building a second,
        independent implementation of the -01 text and attacking it.  Changes are
        described below by their effect on a conformant implementation rather
        than by intent: where an implementation conforming to -01 must change to
        remain conformant, this is stated plainly, because an implementer reading
        this appendix is deciding whether re-verification is required.
      </t>
      <t>
        Four changes below are breaking.  Two implementations exist at the time
        of writing, both under the author's control; the cost of these changes is
        at its minimum now and rises permanently once a third-party
        implementation ships.
      </t>

      <t><strong>Security fix -- breaking.</strong></t>
      <ul>
        <li>
          Section 9.6 (Signature and Hash Coverage) is new, and requires that
          Version and Subject be inside the signed preimage.  In -01 the policy
          version was listed in Section 9.4 as a value stored alongside the
          signature, and the text never required the signature to cover it.  Both
          existing implementations read it that way and neither signed the
          version, which defeats the replay prevention that Section 9.4 assigns
          to that field: an attacker holding no key can take a superseded but
          validly signed policy, increment the version, and have it accepted --
          both signatures verify, the content hash matches, and the version reads
          as current.  Implementations MUST re-sign existing policies under the
          new coverage.  Signatures produced under -01 do not verify under -02.
        </li>
      </ul>

      <t><strong>Interoperability -- breaking.</strong></t>
      <ul>
        <li>
          Section 9.5 (Canonicalization) is new, and normatively specifies JCS
          (RFC 8785) as the serialization for all signatures and hashes.  -01
          contained no canonicalization text of any kind, which made Section 9.3
          impossible to implement interoperably: a signature is over bytes, and
          nothing in -01 said how those bytes are produced.  The only way to
          implement -01's dual signature was to read an existing implementation's
          source.  JCS differs from what both current implementations do, so
          both must change and all existing signatures and test vectors are
          invalidated.  An existing implementation is not conformant to -02 by
          default.
        </li>
        <li>
          Section 9.4 (Dynamic Policy Document Structure) is new.  -01 required
          the dynamic policy to be signed, hashed, stored and integrity-checked
          without ever defining what it contains, leaving each implementer to
          invent a field set.  Different invented sets produce different
          signatures and different hashes for the same policy, and each
          implementation reads the other's documents as tampered with.
          Implementations whose field set differs from the table in Section 9.4
          must change.
        </li>
      </ul>

      <t><strong>New normative requirements -- additive.</strong></t>
      <ul>
        <li>
          Section 6.3 (Certificate Profile) is new.  -01 mandated X.509 and
          specified no profile: no key strength, no digest floor, and no
          basicConstraints requirement.  Three certificates that verify under a
          conformant X.509 validator were accepted as agent identities by an
          implementation conforming to -01 -- one asserting cA = TRUE, one signed
          with SHA-1, and one carrying no basicConstraints at all.  The first is
          also a containment failure: an agent whose certificate permits it to
          issue certificates can create children without presenting a request to
          the CA, which removes both checks in Section 8.1 from the spawn path
          without invalidating any signature.  Implementations already issuing
          cA = FALSE, SHA-256, RSA-2048 leaves satisfy this section unchanged,
          but MUST add the corresponding checks on validation.
        </li>
        <li>
          Section 7.2 now states who enforces the dynamic policy bounds, when,
          and with what result.  -01 stated the rule and named no enforcement
          point, so an implementation that never checked it and one that checked
          it before signature verification both read as conformant while
          returning different results for the same document.  The bounds MUST now
          be evaluated independently of signature validity and refused before the
          policy is applied.
        </li>
      </ul>

      <t><strong>Rename -- breaking.</strong></t>
      <ul>
        <li>
          The Section 7.1 static field KeyUsage is renamed
          PermittedOperations.  The field carries the operations an agent may
          perform -- spawn, delegate, read -- and is unrelated to the X.509
          keyUsage extension, whose values are digitalSignature, keyCertSign and
          the rest of the RFC 5280 set.  The collision was latent while this
          document never referred to the X.509 extension; Section 6.3 now does,
          normatively, so a single document used one name for two unrelated
          things.  RFC 5280 owns the name keyUsage, so the template field is the
          one that moves.  The new name is the description this document already
          gave the field.  Implementations MUST rename the corresponding metadata
          field; the value space is unchanged.
        </li>
      </ul>

      <t><strong>Removal -- breaking for any implementation reading the field.</strong></t>
      <ul>
        <li>
          The ScopeInherit field is removed from the Section 7.1 static field
          table.  It was REQUIRED in -00 and -01 with no defined value space, and
          the value both existing implementations populate it with,
          "strict-subset", contradicts Section 8.3 as clarified in -01, which
          explicitly permits equality.  Neither implementation reads the value,
          so the field conveyed no capability; Section 8.3 already determines
          inheritance completely.  An implementation that enforced the field
          literally would deny a child legitimately holding its parent's full
          scope set, which is the misreading -01 was published to prevent.
        </li>
      </ul>

      <t><strong>Non-normative.</strong></t>
      <ul>
        <li>
          Section 16.7 (PKI Does Not Enforce Authorization) is new.  It states
          that certificate validity establishes identity and not authorization,
          that neither nameConstraints nor certificatePolicies closes that gap,
          and that Sections 7.2 and 8.3 are therefore load-bearing implementation
          logic rather than restatements of a guarantee the chain already
          provides.  No behaviour changes; the omission was judged the most
          likely to cause an implementer to build something that verifies
          correctly and contains nothing.
        </li>
      </ul>
    </section>

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