<?xml version="1.0" encoding="UTF-8"?>
<?xml-model href="rfc7991bis.rnc"?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude"
     ipr="trust200902"
     docName="draft-narajala-courtney-ansv2-01"
     category="info"
     submissionType="independent"
     version="3">

  <front>
    <title abbrev="ANS v2">Agent Name Service v2 (ANS): A Domain-Anchored Trust Layer for Autonomous AI Agent Identity</title>

    <seriesInfo name="Internet-Draft" value="draft-narajala-courtney-ansv2-01"/>

    <author fullname="Scott Courtney" initials="S." surname="Courtney">
      <organization>GoDaddy</organization>
      <address>
        <email>scourtney@godaddy.com</email>
      </address>
    </author>

    <author fullname="Vineeth Sai Narajala" initials="V. S." surname="Narajala">
      <organization>OWASP</organization>
      <address>
        <email>vineeth.sai@owasp.org</email>
      </address>
    </author>

    <author fullname="Ken Huang" initials="K." surname="Huang">
      <organization>DistributedApps.ai</organization>
      <address>
        <email>ken.huang@distributedapps.ai</email>
      </address>
    </author>

    <author fullname="Idan Habler" initials="I." surname="Habler">
      <organization>OWASP</organization>
      <address>
        <email>idan.habler@gmail.com</email>
      </address>
    </author>

    <author fullname="Akram Sheriff" initials="A." surname="Sheriff">
      <organization>Cisco Systems</organization>
      <address>
        <email>isheriff@cisco.com</email>
      </address>
    </author>

    <date year="2026" month="April" day="13"/>

    <area>Security</area>
    <workgroup>Independent Submission</workgroup>

    <keyword>agent identity</keyword>
    <keyword>DNS</keyword>
    <keyword>transparency log</keyword>
    <keyword>DANE</keyword>
    <keyword>SCITT</keyword>
    <keyword>PKI</keyword>

    <abstract>
      <t>
        Autonomous AI agents execute transactions across organizational
        boundaries. No single agent platform provides the trust
        infrastructure they need. This document defines the Agent Name
        Service (ANS) v2 protocol, which anchors every agent identity to
        a DNS domain name. A Registration Authority (RA) verifies domain
        ownership via ACME, issues dual certificates (a Server Certificate
        from a public CA and an Identity Certificate from a private CA
        binding a version-specific ANSName), and seals every lifecycle
        event into an append-only Transparency Log aligned with IETF
        SCITT. Three verification tiers -- Bronze (PKI),
        Silver (PKI + DANE), and Gold (PKI + DANE + Transparency Log) --
        let clients choose assurance levels appropriate to transaction risk.
        The architecture decouples identity from discovery: the RA publishes
        sealed events; independent Discovery Services build competitive
        indexes. A three-layer trust framework separates foundational
        identity (Layer 1, this protocol), operational maturity (Layer 2,
        third-party attestors), and behavioral reputation (Layer 3,
        real-time scoring).
      </t>
    </abstract>
  </front>

  <middle>

    <!-- ============================================================ -->
    <section anchor="introduction">
      <name>Introduction</name>
      <t>
        AI agents now buy supplies, book travel, and sign contracts without
        a human in the loop. The ones handling real money need proof of who
        stands behind them. DNS <xref target="RFC1035"/> maps names to
        addresses but does not verify identity or track software versions.
        DNS-SD <xref target="RFC6763"/> adds service discovery but cannot
        tell a client whether the agent at an address is the one it claims
        to be.
      </t>
      <t>
        Two prominent protocols define how agents communicate. MCP
        <xref target="MCP"/> connects models to local tools and external
        APIs. A2A <xref target="A2A"/> governs how autonomous agents
        negotiate and delegate tasks across organizational boundaries.
        These protocols define how agents communicate but explicitly defer
        the question of who the agent is and whether it should be trusted.
      </t>
      <t>
        ANS addresses these gaps by combining three mechanisms. First, the
        agent's identity is anchored to a domain name whose ownership the
        Registration Authority (RA) has verified. Second, every change to
        the agent's software produces a new version number and a new
        Identity Certificate, recording which version is registered.
        Third, every lifecycle event is sealed into a Transparency Log, an
        append-only ledger where entries cannot be altered or removed after
        the fact. The three mechanisms together prove which version was
        declared and when.
      </t>

      <section anchor="motivating-scenario">
        <name>Motivating Scenario</name>
        <t>
          Consider a concrete failure mode. A company's payment agent
          receives an instruction to wire $50,000 to a supplier's
          invoicing agent. The invoicing agent presents a website URL
          secured by a TLS certificate. The payment agent must decide:
          does this agent actually belong to the supplier, or has someone
          stood up a convincing fake?
        </t>
        <t>
          An attacker registers a look-alike domain such as
          payments-supplier.example.com and presents a valid TLS
          certificate for it. The payment agent has no way to tell this
          impostor from the real supplier, because a Domain Validation
          (DV) certificate -- the most common type -- proves only that
          someone controls the domain, not that the domain belongs to
          the right organization. Organization Validation (OV) and
          Extended Validation (EV) certificates exist but are rarely
          used for programmatic agent endpoints.
        </t>
        <t>
          Separately, a legitimate supplier may pass a security audit
          and then quietly update its model. The certificate stays valid,
          the endpoint stays up, but the code behind it is no longer
          what was audited.
        </t>
      </section>

      <section anchor="origin-and-evolution">
        <name>Origin and Evolution</name>
        <t>
          This document builds on "Agent Name Service (ANS): A Universal
          Directory for Secure AI Agent Discovery and Interoperability"
          <xref target="ANSv1"/>, published at IEEE ICAIC 2026 and
          contributed to the IETF as an Internet-Draft. The original paper
          proposed a conceptual architecture with a six-component ANSName
          format. The architecture presented here simplifies the ANSName
          to three components (ans://v{version}.{agentHost}), introduces
          a dual-certificate model, replaces conceptual registry integrity
          with a cryptographic Transparency Log, moves protocol adapters
          to a client SDK, and decouples discovery from the RA.
        </t>
      </section>

      <section anchor="relationship-to-other-standards">
        <name>Relationship to Other Standards</name>
        <t>
          HCS-14 <xref target="HCS14"/> uses DNS TXT records for agent
          discovery; an ANS Profile for HCS-14 allows any HCS-14 resolver
          to discover ANS agents. HCS-27 <xref target="HCS27"/> defines a
          checkpoint format for publishing the Transparency Log's root hash
          to a distributed consensus topic. The IETF SCITT working group
          <xref target="I-D.ietf-scitt-architecture"/> defines an
          append-only transparency service; the ANS TL follows this model.
          DNS-AID <xref target="DNSAID"/> uses SVCB service binding records
          <xref target="RFC9460"/> for agent endpoint discovery; DNS-AID
          tells a client where to connect, ANS tells it whether to trust
          the agent.
        </t>
      </section>

      <section anchor="regulatory-context">
        <name>Regulatory Context</name>
        <t>
          Regulators are converging on verifiable agent identity as a
          compliance requirement. The EU AI Act (Article 50) requires
          transparency and identity disclosure for AI systems that
          interact with people. In the US, NIST's Center for AI Standards
          and Innovation solicited public input on securing AI agent
          systems in early 2026. Both point toward mandatory verifiable
          agent identity.
        </t>
      </section>

      <section anchor="foundational-principles">
        <name>Foundational Principles</name>
        <t>
          Every agent maps to a unique, globally resolvable Fully Qualified
          Domain Name (FQDN). The ANSName format
          ans://v{version}.{agentHost} embeds the FQDN directly. The
          domain is the agent's permanent address; the version number
          changes, the domain does not.
        </t>
        <t>Five design decisions follow from this foundation:</t>
        <ol>
          <li>Domain control validation: The RA verifies ownership using
              the ACME protocol <xref target="RFC8555"/> (DNS-01 or
              HTTP-01 challenges) before attesting to any identity.</li>
          <li>Decentralized discovery: The TL publishes sealed lifecycle
              events. Third-party Discovery Services subscribe, verify
              signatures, and build their own indexes.</li>
          <li>Version-bound lifecycle: Every change to an agent's software
              or capabilities requires a new version number and a new
              registration.</li>
          <li>Dual-certificate model: A Server Certificate from a public
              CA secures the stable FQDN. An Identity Certificate from a
              private CA attests to the version-bound ANSName.</li>
          <li>Discoverable schemas: The ANS Trust Card links each protocol
              to a canonical URL. Schemas are public, versioned
              artifacts.</li>
        </ol>
      </section>

      <section anchor="registration-progression">
        <name>Registration Progression</name>
        <t>
          The RA acts as a notary. It witnesses domain control, issues
          certificates, specifies DNS records, and seals the event into
          the TL. The minimum registration is intentionally low: a domain,
          a version, at least one endpoint, and an identity CSR.
        </t>
        <table>
          <thead>
            <tr><th>Artifact</th><th>Required</th><th>Trust Index effect</th></tr>
          </thead>
          <tbody>
            <tr><td>Domain + version + endpoints + identity CSR</td><td>Yes</td><td>Baseline registration</td></tr>
            <tr><td>OV or EV Server Certificate</td><td>No</td><td>Raises identity score</td></tr>
            <tr><td>ANS Trust Card hosted at FQDN</td><td>No</td><td>Raises integrity score; enables content hash verification</td></tr>
            <tr><td>Registration Metadata (agentCardContent)</td><td>No</td><td>Sealed hash enables integrity verification of the Trust Card</td></tr>
            <tr><td>verifiableClaims in Trust Card</td><td>No</td><td>Feeds operational maturity signals (SOC 2, SBOM, compliance)</td></tr>
            <tr><td>Principal binding (LEI, DID, biometric)</td><td>No</td><td>Raises identity score</td></tr>
            <tr><td>SCITT receipt stapled to Trust Card</td><td>No</td><td>Enables offline TL verification; highest integrity signal</td></tr>
          </tbody>
        </table>
      </section>

      <section anchor="open-protocol-design">
        <name>Open Protocol Design</name>
        <t>
          The protocol is designed for an open, federated market. Any
          organization can operate an RA, a TL, a Trust Index, or a
          Discovery Service. Multiple RAs can coexist, each issuing
          certificates and sealing events into its own TL. Multiple Trust
          Index providers can crawl the same logs and produce competing
          evaluations. Every interface is public. The DNS record types are
          standard. The TL verification API uses REST. The certificate
          model uses ACME, which any server can answer.
        </t>
      </section>

      <section anchor="conformance-roles">
        <name>Conformance Roles</name>
        <t>The protocol defines five roles:</t>
        <dl>
          <dt>Registration Authority:</dt>
          <dd>Validates domain control via ACME, issues Identity
              Certificates from a Private CA, obtains or accepts Server
              Certificates from a Public CA, generates DNS record content,
              and submits lifecycle events to a TL.</dd>
          <dt>Discovery Service:</dt>
          <dd>Consumes RA output and indexes agents. Any DNS provider,
              search engine, or marketplace can operate one.</dd>
          <dt>Transparency Log operator:</dt>
          <dd>Seals signed events into an append-only cryptographic
              structure, signs checkpoints, and exposes a public
              verification API. A conforming TL operates as a SCITT
              Transparency Service
              <xref target="I-D.ietf-scitt-architecture"/>.</dd>
          <dt>Trust Index provider:</dt>
          <dd>Crawls TL events from one or more federated RAs and
              publishes evaluations as signed Verifiable Credentials.</dd>
          <dt>Verifier:</dt>
          <dd>A client that checks an agent's identity before connecting.
              Verification is a client-side act, not a property the RA
              assigns. The verifier needs no relationship with the RA.</dd>
        </dl>
      </section>
    </section>

    <!-- ============================================================ -->
    <section anchor="terminology">
      <name>Terminology</name>
      <t>
        The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
        "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY",
        and "OPTIONAL" in this document are to be interpreted as described
        in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when,
        and only when, they appear in all capitals, as shown here.
      </t>
      <dl>
        <dt>Agent Hosting Platform (AHP):</dt>
        <dd>The entity that hosts the agent's code and serves the live
            endpoints at the agent's FQDN.</dd>
        <dt>Agent Integrity Monitor (AIM):</dt>
        <dd>A monitoring service that compares the live state of an
            agent's DNS records and Trust Card against the sealed TL
            records. It publishes findings but cannot command state
            changes.</dd>
        <dt>ANSName:</dt>
        <dd>The canonical identifier for a registered agent, following
            the format ans://v{version}.{agentHost}.</dd>
        <dt>ANS Trust Card:</dt>
        <dd>An optional COSE_Sign1 document hosted by the AHP containing
            protocol-native metadata augmented with ANS trust fields and
            a stapled SCITT receipt.</dd>
        <dt>Discovery Service:</dt>
        <dd>An independent service that consumes RA output and indexes
            agents for searchability.</dd>
        <dt>Identity Certificate:</dt>
        <dd>An X.509 certificate issued by the Private CA with a URI SAN
            containing the agent's ANSName.</dd>
        <dt>Protocol Card:</dt>
        <dd>The protocol-native metadata file (A2A Agent Card, MCP
            manifest, OpenAPI document) created by the developer.</dd>
        <dt>Registration Authority (RA):</dt>
        <dd>The trusted third party that validates domain control via
            ACME, issues certificates, generates DNS record content, and
            seals lifecycle events into the Transparency Log.</dd>
        <dt>Registration Metadata:</dt>
        <dd>The agentCardContent field in the registration payload,
            translated from the Protocol Card by the SDK. The RA hashes
            it and seals the hash into the TL.</dd>
        <dt>Server Certificate:</dt>
        <dd>An X.509 certificate issued by a public CA with a dNSName
            SAN for the agent's stable FQDN.</dd>
        <dt>Transparency Log (TL):</dt>
        <dd>An append-only cryptographic data structure that seals signed
            events and provides inclusion and consistency proofs.</dd>
        <dt>Trust Index:</dt>
        <dd>A scoring service that crawls TL events and external signals
            to produce a numeric trust evaluation for each agent.</dd>
      </dl>
    </section>

    <!-- ============================================================ -->
    <section anchor="related-work">
      <name>Related Work</name>
      <t>
        Traditional service discovery via DNS <xref target="RFC1035"/>
        provides name-to-address resolution but does not verify identity
        or track software versions. DNS-SD <xref target="RFC6763"/> adds
        local service discovery capabilities but does not address
        verifiable identity or complex capability matching on a global
        scale.
      </t>
      <t>
        Research in multi-agent systems has explored various agent
        communication languages, such as those defined by FIPA. These
        works establish interaction protocols but do not address
        cryptographic identity verification or tamper-evident audit
        trails.
      </t>
      <t>
        The SCITT architecture
        <xref target="I-D.ietf-scitt-architecture"/> generalizes
        transparency logs to arbitrary supply-chain statements with
        signed receipts. The ANS Transparency Log targets SCITT
        compliance so that its receipts are interoperable with other
        SCITT-compliant services.
      </t>
      <t>
        W3C Decentralized Identifiers (DIDs) provide self-sovereign
        identity but lack built-in discovery, transparency, and
        domain-anchoring mechanisms. ANS complements DIDs: a DID can
        serve as a principal binding within an ANS registration.
      </t>
    </section>

    <!-- ============================================================ -->
    <section anchor="architecture">
      <name>Architecture</name>
      <t>
        The architecture connects a central Registration Authority with
        Agent Hosting Platforms and shared internet infrastructure. Two
        chokepoints define trust flow: the RA, where identity enters the
        system, and the Transparency Log, where sealed evidence leaves it.
      </t>

      <section anchor="ra-system">
        <name>Registration Authority System</name>
        <t>The RA system comprises:</t>
        <dl>
          <dt>Registration Authority (RA):</dt>
          <dd>Receives registration requests from AHPs, validates domain
              control via ACME <xref target="RFC8555"/>, requests an
              Identity Certificate from the Private CA, obtains a Server
              Certificate from the Public CA (or accepts one the AHP
              brings), generates DNS records, and seals the registration
              into the TL.</dd>
          <dt>Key Management System (KMS):</dt>
          <dd>Signs every TL checkpoint. If this key is compromised,
              every sealed record in the log becomes untrustworthy.</dd>
          <dt>Provider Registry:</dt>
          <dd>Decouples an entity's legal name from its identifier. When
              "AcmeCorp" becomes "MegaCorp," one record updates instead
              of re-registering thousands of agents.</dd>
          <dt>Agent Integrity Monitor (AIM):</dt>
          <dd>Compares the live internet against what the RA sealed. When
              something does not match, it publishes a finding. It cannot
              revoke certificates or command state changes.</dd>
          <dt>RA API:</dt>
          <dd>The AHP registers an agent, submits CSRs for both
              certificate types, and triggers ACME and DNS verification.
              Agent discovery flows from the Event Stream through
              independent indexing services, not through the RA.</dd>
        </dl>
      </section>

      <section anchor="ahp-system">
        <name>Agent Hosting Platform System</name>
        <t>
          The AHP hosts the agent's code and serves the live endpoints at
          the agent's FQDN. The AHP may also host an ANS Trust Card; the
          Trust Index rewards its presence. During registration, the AHP
          responds to ACME challenges so the RA can verify domain control,
          then receives both certificates and installs them in its
          keystore. The AHP provisions DNS records using content the RA
          generates. When the agent's code changes, the AHP initiates a
          new version registration.
        </t>
        <t>
          Interfaces hosted by the AHP include the Agent Functional
          Endpoint (the live service exposing capabilities) and the ANS
          Trust Card (the metadata document describing capabilities,
          endpoints, supported protocols, and ANS trust fields).
        </t>
      </section>

      <section anchor="transparency-log">
        <name>Transparency Log</name>
        <t>
          The TL receives signed events from the RA, validates each
          signature, and seals the events into a cryptographic append-only
          structure. That structure produces two kinds of proof: inclusion
          proofs (proving a specific event exists in the log) and
          consistency proofs (proving the log has only grown, never shrunk
          or rewritten). The KMS signs each checkpoint. A conforming TL
          MUST operate as a SCITT Transparency Service
          <xref target="I-D.ietf-scitt-architecture"/>, issuing binary
          COSE receipts as proof of inclusion.
        </t>
        <t>
          Each event receives a sequence number that increases with every
          entry and never repeats. Events become visible only after the
          KMS signs a checkpoint, so a client querying the log always sees
          a consistent, finalized view. Each event carries a schema
          version so that field renames in future schemas do not break
          existing consumers.
        </t>
        <t>A conforming TL MUST expose a REST API for external verifiers:</t>
        <table>
          <thead>
            <tr><th>Endpoint</th><th>Purpose</th></tr>
          </thead>
          <tbody>
            <tr><td>GET /v1/agents/{agentId}</td><td>Sealed event, TL signature, and inclusion proof</td></tr>
            <tr><td>GET /v1/agents/{agentId}/audit</td><td>Paginated history of all lifecycle events</td></tr>
            <tr><td>GET /v1/log/checkpoint</td><td>Latest signed checkpoint: log size, root hash, KMS signature</td></tr>
            <tr><td>GET /v1/log/checkpoint/history</td><td>Checkpoint history for consistency proof verification</td></tr>
            <tr><td>GET /v1/log/schema/{version}</td><td>JSON Schema definition for a given event schema version</td></tr>
            <tr><td>GET /root-keys</td><td>KMS verification keys, including historical keys</td></tr>
          </tbody>
        </table>
        <t>
          The TL MUST distribute verification keys via /root-keys so that
          any verifier can check root signatures without contacting the RA.
          Verification MUST NOT require access to producer public keys,
          authentication for read-only operations, or knowledge of RA
          implementation details.
        </t>
      </section>

      <section anchor="event-stream">
        <name>Event Stream</name>
        <t>
          The Event Stream makes sealed events queryable. Every payload
          carries the RA's signature, verifiable against keys the RA
          registered at the TL. Consumers verify authenticity without
          contacting the TL. Discovery Services subscribe to the Event
          Stream to build searchable indexes.
        </t>
      </section>

      <section anchor="certificate-authorities">
        <name>Certificate Authorities</name>
        <t>Two CAs, two trust roots, two revocation paths:</t>
        <ul>
          <li>Public CA: Issues Server Certificates. Revocation propagates
              through public OCSP/CRL <xref target="RFC6960"/>.</li>
          <li>Private CA: Issues Identity Certificates on the RA's behalf.
              The RA requests issuance; the Private CA signs. The Private
              CA may be operated by the RA operator or by a separate
              organization. The Identity Certificate requires a URI SAN
              that no Public CA can issue. Only a Private CA, operating
              under its own issuance policy and certificate practice
              statement, can include the ans:// scheme. The Identity
              Certificate's validity period is not subject to CA/Browser
              Forum Baseline Requirements constraints.</li>
        </ul>
      </section>

      <section anchor="dns-provider">
        <name>DNS Provider</name>
        <t>
          The external service that hosts the agent's DNS zone. The RA
          generates DNS record content; the AHP provisions it at the DNS
          provider.
        </t>
      </section>

      <section anchor="trust-framework">
        <name>Trust Framework: Three Layers</name>
        <t>
          The RA answers one question: "Who are you?" It does not evaluate
          whether the agent is well-governed or well-behaved. Three layers
          of trust data together provide a complete answer.
        </t>
        <dl>
          <dt>Layer 1: Foundational identity (this protocol).</dt>
          <dd>The RA verifies domain control, issues certificates, and
              seals the Registration Metadata hash into the Transparency
              Log. This layer is the scope of this document.</dd>
          <dt>Layer 2: Operational maturity (third-party attestors).</dt>
          <dd>SOC 2 reports, HIPAA compliance certificates, and SBOMs
              arrive as references in the Trust Card's verifiableClaims
              array. They update on the attestor's cycle: annually for an
              audit, quarterly for a compliance scan.</dd>
          <dt>Layer 3: Behavioral reputation (real-time scoring).</dt>
          <dd>Transaction records, settlement rates, and dispute flags.
              While these signals may go back months, they update in
              seconds.</dd>
        </dl>
        <t>
          No single source controls the evaluation. A companion Trust
          Index specification defines how a provider consumes sealed data
          from Layer 1 and external signals from Layers 2 and 3, computes
          a multi-dimensional trust evaluation, and returns it as a signed
          credential that clients use for authorization decisions.
        </t>
      </section>

      <section anchor="ans-sdk">
        <name>The ANS SDK</name>
        <t>
          The version-bound lifecycle requires a new registration on every
          code change. Without tooling, a developer who ships a one-line
          fix must also generate a key pair, build a CSR, submit it to the
          RA, wait for domain validation, install the new certificate, and
          update DNS. The SDK collapses that sequence into a single
          command.
        </t>
        <t>
          The SDK contains a Protocol Adapter Layer that translates
          Protocol Cards (A2A Agent Cards, MCP manifests, OpenAPI
          documents) into the RA's registration payload format. This is a
          key architectural departure from the original ANS proposal
          <xref target="ANSv1"/>, where protocol adapters resided within
          the RA. Moving adapters to the client side means the RA accepts
          a single payload format regardless of protocol, simplifying its
          implementation and reducing its attack surface.
        </t>
        <t>
          The SDK also bundles a Trust Provisioner that manages the agent's
          trust store. In the single-RA phase, it installs the
          bootstrapping RA's Private CA root certificate. In the federated
          phase, it retrieves a trust bundle from the Federation Registry
          containing root certificates of all compliant RAs.
        </t>
      </section>
    </section>

    <!-- ============================================================ -->
    <section anchor="data-model">
      <name>Data Model and Integrity</name>

      <section anchor="ansname">
        <name>The ANSName</name>
        <t>The canonical identifier for a registered agent has three
        components (<xref target="RFC1035"/>,
        <xref target="RFC1123"/>):</t>
        <artwork type="abnf"><![CDATA[
ANSName = "ans://v" version "." agentHost
version = 1*DIGIT "." 1*DIGIT "." 1*DIGIT
agentHost = <FQDN per RFC 1035 and RFC 1123>
]]></artwork>
        <t>Example: ans://v1.0.0.sentiment-analyzer.example.com</t>
        <table>
          <thead>
            <tr><th>Component</th><th>Example</th><th>Constraints</th></tr>
          </thead>
          <tbody>
            <tr><td>protocol</td><td>ans</td><td>Fixed. Always "ans".</td></tr>
            <tr><td>version</td><td>1.0.0</td><td>Semantic version, numeric only: major.minor.patch. The "v" prefix is a literal part of the ANSName syntax, not part of the version string.</td></tr>
            <tr><td>agentHost</td><td>sentiment-analyzer.example.com</td><td>FQDN per RFC 1035 and RFC 1123. MUST NOT exceed 237 octets.</td></tr>
          </tbody>
        </table>
        <t>
          The 237-octet host limit: The RA derives DNS record names by
          prepending labels to the agentHost. The longest derived name is
          _acme-challenge.{agentHost}, consuming 17 octets (16 characters
          plus the label separator) of the 253-octet presentation-format
          domain name limit (RFC 1035 Section 2.3.4, RFC 1123 Section
          2.1). 253 - 16 = 237.
        </t>
        <t>
          The complete ANSName MUST NOT exceed 400 octets, providing
          headroom for safe transport across HTTP headers, TLS fields,
          and database columns.
        </t>
        <t>
          Two metadata fields accompany the ANSName at registration but
          are not part of the identifier: agentDisplayName (required, max
          64 characters, human-readable label for discovery UIs) and
          agentDescription (optional, max 150 characters).
        </t>
      </section>

      <section anchor="identifier-taxonomy">
        <name>Identifier Taxonomy</name>

        <section anchor="registration-identifiers">
          <name>Registration Identifiers</name>
          <table>
            <thead>
              <tr><th>Identifier</th><th>Assigned by</th><th>Mutable</th><th>Scope</th><th>Purpose</th></tr>
            </thead>
            <tbody>
              <tr><td>ANSName</td><td>Derived</td><td>No</td><td>Global</td><td>Which version is registered on which domain</td></tr>
              <tr><td>FQDN</td><td>AHP</td><td>No</td><td>Global</td><td>Stable domain across all versions</td></tr>
              <tr><td>Agent ID</td><td>RA</td><td>No</td><td>Issuing RA</td><td>Registration record's unique key</td></tr>
              <tr><td>ProviderID</td><td>RA</td><td>No</td><td>Issuing RA</td><td>Who controls the domain</td></tr>
              <tr><td>Supersedes ID</td><td>RA</td><td>No</td><td>Issuing RA</td><td>Previous version's record</td></tr>
            </tbody>
          </table>
          <t>
            The ProviderID names the entity that controls the domain, not
            the entity that authored the software. For cross-RA
            correlation, the registration payload accepts an optional lei
            field (Legal Entity Identifier, ISO 17442).
          </t>
          <t>
            When a platform registers an agent on behalf of a tenant, the
            ProviderID and lei field identify the platform and the tenant
            respectively. The tenant can close the delegation gap by
            issuing a W3C Verifiable Credential authorizing the platform
            to register on its behalf, included in the Trust Card's
            verifiableClaims array.
          </t>
        </section>

        <section anchor="tl-identifiers">
          <name>Transparency Log Identifiers</name>
          <t>
            Log Entry ID (unique reference to each event), Sequence Number
            (monotonically increasing, enforces append-only property),
            Leaf Index (position in the cryptographic structure, used for
            inclusion proofs), and Tree Version (increments on KMS key
            rotation).
          </t>
        </section>

        <section anchor="reputation-continuity">
          <name>Reputation Continuity</name>
          <t>
            The FQDN and Server Certificate together identify the agent's
            TLS endpoint across version bumps. When a registrant registers
            support.example.com at version 1.0.0, then bumps to 1.1.0,
            the domain and the Server Certificate stay the same. The
            ANSName resets. A Trust Index that accumulates reputation
            against the FQDN sees the full transaction history across both
            versions. The supersedes field in each TL event links the
            version chain.
          </t>
          <t>Three mechanisms detect a change in control:</t>
          <ul>
            <li>ACME re-validation: The RA re-runs domain control
                validation at each renewal and version bump.</li>
            <li>RDAP monitoring: The AIM monitors the registrant entity
                in the registrar's RDAP response
                <xref target="RFC9083"/>.</li>
            <li>Provider mismatch: When a new operator registers a version
                for an FQDN that already has an ACTIVE registration under
                a different ProviderID, the RA detects the conflict and
                MUST revoke the prior registration.</li>
          </ul>
          <t>
            Upon detection of a control change, the RA MUST revoke the
            previous registration by sealing an AGENT_REVOKED event into
            the TL.
          </t>
          <t>
            A principal binding -- an external, persistent identifier for
            the operating entity -- closes the gap between domain
            ownership and organizational identity. An LEI identifies the
            organization regardless of which domain it operates. When the
            lei field is present, a Trust Index can aggregate behavioral
            signals across all registrations sharing that LEI.
          </t>
        </section>
      </section>

      <section anchor="three-agent-card-terms">
        <name>Three Agent Card Terms</name>
        <ol>
          <li>Protocol Card: The protocol-native metadata file (A2A Agent
              Card, MCP manifest, OpenAPI document). Created by the
              developer.</li>
          <li>Registration Metadata: The agentCardContent field in the
              registration payload. The SDK translates the Protocol Card
              into this format. The RA hashes it and seals the hash into
              the TL.</li>
          <li>ANS Trust Card: An optional COSE_Sign1 document the AHP
              hosts at /.well-known/ans/trust-card.json. Contains
              protocol-native metadata augmented with ANS trust fields
              (ANSName, verifiable claims, trust references) and a stapled
              SCITT receipt. The AIM verifies the content hash against the
              value sealed when Registration Metadata is submitted.</li>
        </ol>
      </section>

      <section anchor="certificate-integrity">
        <name>Certificate Integrity</name>
        <table>
          <thead>
            <tr><th>Certificate</th><th>Issued by</th><th>SAN type</th><th>Purpose</th></tr>
          </thead>
          <tbody>
            <tr><td>Server</td><td>Public CA</td><td>dNSName</td><td>Standard TLS for the stable FQDN</td></tr>
            <tr><td>Identity</td><td>Private CA</td><td>URI SAN</td><td>Binds certificate to a versioned ANSName</td></tr>
          </tbody>
        </table>
        <t>
          The Identity Certificate requires a URI SAN. The ans:// scheme
          is syntactically valid per RFC 3986 <xref target="RFC3986"/>
          Section 3.1 and permitted in URI SANs per RFC 5280
          <xref target="RFC5280"/> Section 4.2.1.6. CA/Browser Forum
          Baseline Requirements prohibit URI SANs in publicly trusted
          server certificates (BR Section 7.1.2.7.12). A Public CA cannot
          issue this certificate; only a Private CA can.
        </t>
      </section>

      <section anchor="agent-state-lifecycle">
        <name>Agent State Lifecycle</name>
        <t>
          The RA tracks registration state in its database. Only certain
          transitions produce TL events: entering ACTIVE, DEPRECATED,
          REVOKED, or EXPIRED, and renewal while ACTIVE (the
          AGENT_RENEWED event type). RENEWED is a TL event type, not a
          distinct registration state; the agent remains ACTIVE throughout
          the renewal process. Transitions before activation (PENDING to
          PENDING_DNS) are RA-internal.
        </t>
        <table>
          <thead>
            <tr><th>State</th><th>Description</th></tr>
          </thead>
          <tbody>
            <tr><td>PENDING</td><td>Awaiting validation</td></tr>
            <tr><td>PENDING_DNS</td><td>Domain validated; awaiting DNS record verification</td></tr>
            <tr><td>ACTIVE</td><td>Operational</td></tr>
            <tr><td>DEPRECATED</td><td>Signals consumers to migrate</td></tr>
            <tr><td>REVOKED</td><td>Certificates invalidated (terminal)</td></tr>
            <tr><td>EXPIRED</td><td>Requires renewal (terminal)</td></tr>
          </tbody>
        </table>
        <t>
          External domains pass through PENDING_DNS; internal domains with
          automated DNS skip directly to ACTIVE. Revocation is idempotent.
          Cancellation before activation produces no TL event because the
          log-sealing step has not occurred.
        </t>
      </section>

      <section anchor="cryptographic-standards">
        <name>Cryptographic Data Integrity Standards</name>
        <table>
          <thead>
            <tr><th>Requirement</th><th>Standard</th><th>Rule</th></tr>
          </thead>
          <tbody>
            <tr><td>Canonicalization</td><td>JCS (RFC 8785)</td><td>All JSON MUST be canonicalized before signing or hashing</td></tr>
            <tr><td>Signature format</td><td>JWS Detached</td><td>Payload is not embedded; signatures stored separately</td></tr>
            <tr><td>Algorithm</td><td>ES256 (ECDSA P-256/SHA-256)</td><td>Default. MUST support algorithm agility.</td></tr>
            <tr><td>Wire format</td><td>JWS Compact</td><td>&lt;header&gt;..signature (two dots; detached payload)</td></tr>
          </tbody>
        </table>
        <t>
          Every signature MUST include protected headers: alg (signing
          algorithm), kid (key identifier), typ (type indicator),
          timestamp (Unix timestamp), and raId (RA instance identifier).
          All JSON payloads MUST be canonicalized per JCS
          <xref target="RFC8785"/> before signing. Signatures use JWS
          Compact Serialization <xref target="RFC7515"/> with the
          JSON data interchange format <xref target="RFC8259"/>.
        </t>
      </section>
    </section>

    <!-- ============================================================ -->
    <section anchor="trust-security">
      <name>Trust, Security, and Attestation</name>

      <section anchor="verification-tiers">
        <name>Layered Trust and Verification Tiers</name>
        <t>
          Trust rests on three independent verification dimensions
          (distinct from the three-layer trust data framework in
          <xref target="trust-framework"/>, which separates data sources):
        </t>
        <table>
          <thead>
            <tr><th>Layer</th><th>Mechanism</th><th>What it proves</th></tr>
          </thead>
          <tbody>
            <tr><td>Identity</td><td>Version-bound ANSName</td><td>Which version is registered on which domain</td></tr>
            <tr><td>Cryptographic</td><td>KMS-signed checkpoint</td><td>The log has not been tampered with</td></tr>
            <tr><td>Operational</td><td>raId per event</td><td>Which RA instance performed the validation</td></tr>
          </tbody>
        </table>
        <t>
          A client verifies an agent through independent checks, each
          using a different trust channel:
        </t>
        <table>
          <thead>
            <tr><th>Step</th><th>Check</th><th>What it proves</th><th>Trust channel</th></tr>
          </thead>
          <tbody>
            <tr><td>1</td><td>PKI certificate validation</td><td>Standard TLS</td><td>CA system</td></tr>
            <tr><td>2</td><td>DANE record validation</td><td>Server Certificate fingerprint matches TLSA record</td><td>DNS (DNSSEC)</td></tr>
            <tr><td>3</td><td>TL verification</td><td>Registration was sealed; tampered entries break the proof</td><td>TL (KMS-signed)</td></tr>
          </tbody>
        </table>
        <table>
          <thead>
            <tr><th>Tier</th><th>Steps</th><th>Shorthand</th></tr>
          </thead>
          <tbody>
            <tr><td>Bronze</td><td>1</td><td>PKI only</td></tr>
            <tr><td>Silver</td><td>1-2</td><td>PKI + DANE</td></tr>
            <tr><td>Gold</td><td>1-3</td><td>PKI + DANE + TL</td></tr>
          </tbody>
        </table>
        <t>
          A tier describes what the client verified, not a property the RA
          assigned. Two clients connecting to the same agent may reach
          different tiers depending on what checks they run.
        </t>
        <t>
          TLSA parameters: The RA specifies TLSA 3 0 1 [sha256_hash]:
          DANE-EE (usage 3), full Server Certificate (selector 0),
          SHA-256 (matching type 1) <xref target="RFC6698"/>. Selector 0
          produces the same hash as the badge fingerprint in the TL, so a
          single SHA-256 computation serves both DANE and badge
          verification.
        </t>
        <t>
          DANE requires DNSSEC <xref target="RFC4033"/>. Per RFC 6698
          Section 4, a TLSA RRset whose DNSSEC validation state is not
          "secure" MUST be treated as unusable, and the client falls back
          to standard PKIX certificate validation. The RA SHOULD verify
          DNSSEC status before provisioning TLSA records.
        </t>
      </section>

      <section anchor="dns-trust-anchor">
        <name>DNS Trust Anchor</name>
        <t>
          The RA specifies one _ans-badge TXT record per ACTIVE version,
          pointing to that version's badge in the TL. The AHP provisions
          it.
        </t>
        <artwork><![CDATA[
_ans-badge.{agentHost} IN TXT
  "v=ans-badge1; version=v1.0.0;
   url=https://{tl_host}/v1/agents/{agentId}"
]]></artwork>
        <table>
          <thead>
            <tr><th>Field</th><th>Required</th><th>Values</th></tr>
          </thead>
          <tbody>
            <tr><td>v</td><td>Yes</td><td>Always ans-badge1</td></tr>
            <tr><td>version</td><td>Yes</td><td>Semver prefixed with v</td></tr>
            <tr><td>url</td><td>Yes</td><td>Badge URL at the RA's TL</td></tr>
            <tr><td>ra</td><td>No</td><td>RA ID (reserved for federated deployments)</td></tr>
          </tbody>
        </table>
        <t>
          When multiple versions are ACTIVE, each has its own _ans-badge
          record. A verifier that knows the version (from the Identity
          Certificate's URI SAN) selects the matching record.
        </t>
      </section>

      <section anchor="crypto-verification-path">
        <name>Cryptographic Verification Path</name>
        <t>High-assurance verification walks this chain:</t>
        <ol>
          <li>Verify the _ans-badge TXT record via DNSSEC.</li>
          <li>Validate the JWS signature on the attestation badge using
              the RA's public key.</li>
          <li>Verify that the event exists in the TL via an inclusion
              proof.</li>
          <li>Validate the Signed Tree Head using the KMS key
              identifier.</li>
          <li>Confirm the agent's current state matches the latest log
              entry.</li>
        </ol>
      </section>

      <section anchor="mtls">
        <name>Mutual TLS Between ANS-Registered Agents</name>
        <t>The mTLS handshake proceeds as follows:</t>
        <ol>
          <li>Caller sends ClientHello.</li>
          <li>Server returns Server Certificate + CertificateRequest.</li>
          <li>Caller presents its Identity Certificate.</li>
          <li>Server verifies the caller's Identity Certificate against
              the ANS Private CA.</li>
          <li>mTLS tunnel established. The caller knows the server's
              FQDN; the server knows the caller's ANSName.</li>
          <li>Caller verifies the server's versioned identity via
              _ans-badge TXT record or TL query.</li>
        </ol>
        <t>
          Steps 1-5 are standard mTLS. Step 6 is ANS-specific: the caller
          confirms the server's Server Certificate fingerprint matches the
          badge the RA sealed at registration.
        </t>
        <t>
          When the agent's ANS Trust Card carries a stapled SCITT receipt,
          the caller verifies locally with no TL call. When the Trust Card
          is absent, the caller fetches the receipt from the _ans-badge
          URL. If the TL is unreachable, the caller falls back to PKI +
          DANE verification and records the downgrade.
        </t>
        <t>
          When an agent acts on behalf of a human, the agent proves its
          own identity via mTLS. The human's authorization travels
          separately as a delegation token <xref target="RFC8693"/>.
        </t>
      </section>

      <section anchor="key-management">
        <name>Key Management</name>
        <t>
          The RA never generates, handles, or accesses an agent's private
          keys. The AHP owns its key lifecycle. The RA uses separate
          credentials for each external service integration, rotated on
          schedule.
        </t>
        <t>
          Each RA instance MUST register at least one active public key
          with the TL before submitting events. Rotation uses an overlap
          window: new keys are registered with future validFrom dates;
          both old and new remain active during the transition. Producer
          private keys never leave the RA instance. Historical signatures
          remain valid after key expiration but not after revocation.
        </t>
      </section>

      <section anchor="channel-security">
        <name>Channel vs. Message-Level Security</name>
        <t>
          TLS secures transient, point-to-point API calls. Digital
          signatures secure durable artifacts that third parties or
          asynchronous consumers verify independently.
        </t>
        <table>
          <thead>
            <tr><th>Payload</th><th>Signature</th><th>Verification</th></tr>
          </thead>
          <tbody>
            <tr><td>TL checkpoint</td><td>KMS key</td><td>Public, via /root-keys</td></tr>
            <tr><td>RA attestation badge</td><td>RA key</td><td>Public, via RA's published key</td></tr>
            <tr><td>Event producer signature</td><td>Producer key</td><td>Internal only; preserves chain of custody</td></tr>
            <tr><td>Revocation requests</td><td>AHP key</td><td>Non-repudiation</td></tr>
          </tbody>
        </table>
      </section>

      <section anchor="privacy-considerations">
        <name>Privacy Considerations</name>
        <t>
          Query privacy is out of scope for the RA. Discovery Services
          SHOULD implement privacy-preserving techniques (Private
          Information Retrieval, Anonymized Query Relays).
        </t>
        <t>
          The TLS handshake reveals the agent's hostname to network
          observers. Encrypted Client Hello (ECH, RFC 9849)
          <xref target="RFC9849"/> encrypts the inner ClientHello, hiding
          the hostname and other connection parameters such as the ALPN
          list. When an AHP provides an ECH configuration during
          registration, the RA publishes it in the HTTPS record.
        </t>
      </section>
    </section>

    <!-- ============================================================ -->
    <section anchor="operational-flow">
      <name>Operational Flow</name>
      <t>
        The RA maintains a mutable database where registrations progress
        through states. The TL is append-only: once the RA seals an event,
        it cannot be altered. Before sealing, a registration is a draft in
        the RA's database. After sealing, the identity-bound fields are
        immutable. Every change requires a new version and a new TL event.
      </t>

      <section anchor="registration-flow">
        <name>Initial Registration Flow</name>
        <t>Registration has two stages:</t>
        <ol>
          <li>AHP submits registration request.</li>
          <li>RA validates domain control (ACME)
              <xref target="RFC8555"/>.</li>
          <li>RA obtains Server + Identity Certificates.</li>
          <li>RA seals event into TL. (Point of no return.)</li>
          <li>RA returns certificates + DNS record content to AHP.</li>
          <li>AHP provisions DNS.</li>
        </ol>

        <section anchor="stage1-pending">
          <name>Stage 1: Pending Registration</name>
          <t>The AHP submits a registration request containing:</t>
          <ul>
            <li>Identity: agentHost (FQDN), version (semver),
                agentDisplayName, optional agentDescription.</li>
            <li>Endpoints: Array of protocol-specific endpoints
                (minimum 1), each specifying protocol, agent URL, optional
                metadata URL, documentation URL, functions, and
                transports.</li>
            <li>Certificates: Identity CSR (required), optional Server
                CSR or existing Server Certificate (BYOC).</li>
            <li>Registration Metadata: Optional agentCardContent
                (translated from Protocol Card by SDK).</li>
            <li>Organization: Optional lei (Legal Entity Identifier).</li>
            <li>Privacy: Optional echConfigList (ECH configuration).</li>
          </ul>
        </section>

        <section anchor="stage2-activation">
          <name>Stage 2: Activation</name>
          <t>All validations must pass before activation:</t>
          <table>
            <thead>
              <tr><th>Validation</th><th>Method</th></tr>
            </thead>
            <tbody>
              <tr><td>Domain control</td><td>ACME DNS-01 (RFC 8555 Section 8.4) or HTTP-01 (Section 8.3)</td></tr>
              <tr><td>Organization identity</td><td>Separate OV-level process when applicable</td></tr>
              <tr><td>Schema integrity</td><td>Fetch each metadataUrl, hash, compare</td></tr>
              <tr><td>DNSSEC presence</td><td>Query for DNSKEY at agent's zone. Advisory: warn if absent; do not block. Record as dnssecStatus in TL event.</td></tr>
            </tbody>
          </table>
          <t>The activation sequence, irreversible once step 4 completes:</t>
          <ol>
            <li>Certificate issuance: RA obtains the Identity Certificate
                and the Server Certificate from a Public CA (if CSR was
                provided) or validates a BYOC.</li>
            <li>DNS record generation: RA generates record set content.
                AHP provisions the records.</li>
            <li>Event payload: RA hashes Registration Metadata (if
                submitted) and assembles the event payload.</li>
            <li>Log sealing: RA submits signed event to TL. Point of no
                return.</li>
            <li>Artifact delivery: RA delivers certificates and DNS
                record content to AHP.</li>
            <li>AHP provisions DNS: The AHP creates the DNS records using
                the content the RA specified.</li>
          </ol>
        </section>
      </section>

      <section anchor="lifecycle-operations">
        <name>Lifecycle Operations</name>
        <table>
          <thead>
            <tr><th>Operation</th><th>Trigger</th><th>TL Event</th><th>DNS Effect</th></tr>
          </thead>
          <tbody>
            <tr><td>Version bump</td><td>Code/config change</td><td>AGENT_REGISTERED</td><td>New per-version records (_ans, _ans-badge); shared records unchanged (_443._tcp). AHP updates _ans-identity._tls.</td></tr>
            <tr><td>Renewal</td><td>Certificate expiring, code unchanged</td><td>AGENT_RENEWED</td><td>None</td></tr>
            <tr><td>Revocation</td><td>Agent shutdown or retirement</td><td>AGENT_REVOKED</td><td>Per-version removed; shared removed when last ACTIVE gone</td></tr>
          </tbody>
        </table>
        <t>
          During a version bump, both old and new versions are ACTIVE. The
          Server Certificate stays active (tied to the FQDN, not the
          version). The RA does not impose a retirement timeline.
        </t>
        <t>
          Rollbacks: The AHP deploys the old stable code as a new version
          (e.g., v1.0.2), registers it, and revokes the buggy version.
        </t>
      </section>

      <section anchor="dns-management-roles">
        <name>DNS Management Roles</name>
        <table>
          <thead>
            <tr><th>Actor</th><th>Registration</th><th>Ongoing</th><th>Deregistration</th></tr>
          </thead>
          <tbody>
            <tr><td>AHP</td><td>Owns domain, manages A/AAAA</td><td>Autonomous DNS updates</td><td>Submits deregistration</td></tr>
            <tr><td>RA</td><td>Generates ACME challenge, generates record content</td><td>Re-runs ACME, updates records</td><td>Deletes agent records</td></tr>
            <tr><td>DNS provider</td><td>Hosts zone, processes API requests</td><td>Processes modifications</td><td>Processes deletions</td></tr>
          </tbody>
        </table>
        <t>
          A CNAME at the agent's FQDN blocks HTTPS and SVCB records at
          the same label (RFC 1034 Section 3.6.2) but does not affect
          child-label records (_ans, _ans-badge, _443._tcp). When the RA
          detects a CNAME, it skips the HTTPS record. CNAME flattening by
          the DNS provider can mitigate this restriction.
        </t>
      </section>

      <section anchor="dns-records">
        <name>DNS Record Set</name>
        <t>
          The RA generates record content for child labels under the
          agent's FQDN. The AHP or domain owner provisions the records:
        </t>
        <table>
          <thead>
            <tr><th>Record</th><th>Label</th><th>Type</th><th>Purpose</th><th>Per-ver.</th></tr>
          </thead>
          <tbody>
            <tr><td>Discovery</td><td>_ans.{host}</td><td>TXT</td><td>Protocol and metadata location</td><td>Yes</td></tr>
            <tr><td>Badge</td><td>_ans-badge.{host}</td><td>TXT</td><td>TL badge URL for verification</td><td>Yes</td></tr>
            <tr><td>DANE</td><td>_443._tcp.{host}</td><td>TLSA</td><td>Server Cert fingerprint</td><td>No</td></tr>
            <tr><td>HTTPS</td><td>{host}</td><td>HTTPS</td><td>ALPN hints, ECH parameters</td><td>No</td></tr>
            <tr><td>Identity DANE</td><td>_ans-identity._tls.{host}</td><td>TLSA</td><td>Identity Cert fingerprint</td><td>No</td></tr>
          </tbody>
        </table>

        <section anchor="ans-record">
          <name>The _ans DNS Record</name>
          <t>
            The _ans TXT record is a connection hint published in DNS,
            telling a client which protocol the agent supports and where
            to find the metadata.
          </t>
          <artwork><![CDATA[
_ans.{agentHost} IN TXT
  "v=ans1; version=v1.0.0; p=a2a;
   url=https://agent.example.com/.well-known/agent-card.json"
]]></artwork>
          <table>
            <thead>
              <tr><th>Field</th><th>Required</th><th>Values</th></tr>
            </thead>
            <tbody>
              <tr><td>v</td><td>Yes</td><td>Always ans1</td></tr>
              <tr><td>version</td><td>Yes</td><td>Semver prefixed with v</td></tr>
              <tr><td>p</td><td>No</td><td>a2a, mcp, http. Omitted = any protocol.</td></tr>
              <tr><td>url</td><td>Unless mode=direct</td><td>URL to the metadata file. Fallback: /.well-known/agent-card.json.</td></tr>
              <tr><td>mode</td><td>Unless url present</td><td>card (default) or direct.</td></tr>
            </tbody>
          </table>
          <t>
            Resolution logic: (1) Query all _ans TXT records for the
            FQDN. (2) Filter by p={target_protocol}. (3) Select the
            highest version (semver ordering). (4) mode=direct: connect
            to the FQDN; url present: fetch; neither: fall back to
            /.well-known/agent-card.json.
          </t>
        </section>
      </section>

      <section anchor="dnsaid-coexistence">
        <name>Coexistence with DNS-AID</name>
        <t>
          A domain owner can publish DNS-AID SVCB records
          <xref target="DNSAID"/> <xref target="RFC9460"/> alongside _ans
          TXT records. The two record families occupy different DNS names
          and do not collide. An ANS-aware client reads _ans; a DNS-AID
          client reads the SVCB records under _agents.
        </t>
      </section>

      <section anchor="integrity-verification">
        <name>Ongoing Integrity Verification</name>
        <t>
          An AIM MUST distinguish between "Unreachable" (transient network
          failure, retry later) and "Mismatch" (the content has changed,
          remediation needed).
        </t>
        <table>
          <thead>
            <tr><th>Check</th><th>What the AIM does</th><th>Pass condition</th></tr>
          </thead>
          <tbody>
            <tr><td>DNS pointer</td><td>Authoritative query for _ans and _ans-badge with DNSSEC</td><td>Records exist and validate</td></tr>
            <tr><td>Trust Card integrity</td><td>Fetch ANS Trust Card from /.well-known/ans/trust-card.json, hash content</td><td>Hash matches sealed agentCardHash</td></tr>
            <tr><td>Schema integrity</td><td>Fetch each schema.url, hash content</td><td>Hash matches schema.hash in Trust Card</td></tr>
          </tbody>
        </table>
      </section>
    </section>

    <!-- ============================================================ -->
    <section anchor="interoperability">
      <name>Interoperability and Standards Alignment</name>

      <section anchor="hcs14-profile">
        <name>HCS-14 ANS Profile</name>
        <t>
          Hiero's HCS-14 standard <xref target="HCS14"/> independently
          arrived at DNS TXT records for agent discovery, using
          _agent.&lt;nativeId&gt; as the record name. An ANS Profile
          within HCS-14 allows resolvers to verify ANS DNS records,
          certificates, and log proofs through a standard interface
          without ANS-specific branching.
        </t>
      </section>

      <section anchor="hcs27-checkpoint">
        <name>HCS-27 Merkle Tree Checkpoint</name>
        <t>
          A companion specification <xref target="HCS27"/> defines a
          checkpoint format for publishing the TL's root hash to a
          distributed consensus topic. The timestamp on the consensus
          topic is independently verifiable, strengthening the guarantee
          that historical log entries have not been backdated or
          rewritten.
        </t>
      </section>

      <section anchor="scitt-alignment">
        <name>IETF SCITT Alignment</name>
        <t>
          The SCITT architecture
          <xref target="I-D.ietf-scitt-architecture"/> defines an
          append-only transparency service that accepts signed statements,
          registers them, and returns receipts. The ANS TL follows this
          model. A future goal is formal SCITT compliance, adopting COSE
          (RFC 9052) <xref target="RFC9052"/> signed statements and
          standardized receipt formats for interoperability with other
          SCITT-compliant transparency services.
        </t>
      </section>

      <section anchor="deployment-topologies">
        <name>Deployment Topologies</name>
        <t>
          The same RA, TL, and certificate infrastructure can run at
          different scopes:
        </t>
        <ul>
          <li>Public ANS: The RA, TL, and event feeds are
              internet-facing. Any verifier that has installed the Private
              CA root can verify any agent's identity and audit its
              history.</li>
          <li>Internal ANS: An organization runs its own RA and TL behind
              its corporate network. Agents are visible only to
              participants on that network.</li>
          <li>Enterprise ANS as a service: A hosted internal ANS
              instance, operated on behalf of an enterprise in their own
              cloud account.</li>
          <li>Extranet ANS: A semi-private deployment shared among a
              defined set of partner organizations.</li>
        </ul>
        <t>
          Each topology runs the same protocol. The difference is who can
          see the TL, who can query the event feeds, and who controls the
          Private CA.
        </t>
      </section>
    </section>

    <!-- ============================================================ -->
    <section anchor="formal-properties">
      <name>Formal Properties</name>
      <t>
        This section states the security properties the protocol
        specifies, with sufficient precision that a conforming
        implementation can be verified against them.
      </t>

      <section anchor="two-layer-proof">
        <name>Two-Layer Proof Composition</name>
        <t>
          A sealed event carries two independent proofs of existence, each
          anchored to a different trust root.
        </t>
        <t>
          Layer 1 (Transparency Log): Let E be a lifecycle event sealed at
          leaf index i in a log of size n with Merkle root R. An inclusion
          proof consists of a hash path of length ceil(log2(n)). The proof
          is valid iff recomputing the root from LeafHash(E), the path,
          and i yields R, and the signature over R verifies against the
          TL's published KMS key. Implementations targeting SCITT
          compliance <xref target="I-D.ietf-scitt-architecture"/> encode
          the proof as a COSE_Sign1 receipt; the verification semantics
          are identical.
        </t>
        <t>
          Layer 2 (Consensus Checkpoint): An HCS-27 checkpoint
          <xref target="HCS27"/> publishes R to a distributed consensus
          topic at timestamp T. The topic provides an independently
          verifiable total ordering.
        </t>
        <t>Together, the two layers guarantee:</t>
        <ol>
          <li>Inclusion: If a receipt for event E verifies against root R,
              then E was sealed into the log before the checkpoint
              containing R.</li>
          <li>Non-repudiation: Removing E from the log after checkpoint
              publication requires producing a tree of size n' &gt;= n
              whose root R' is consistent with R yet excludes leaf i.
              This contradicts the collision resistance of SHA-256.</li>
          <li>Temporal binding: Because the consensus topic provides an
              independently verifiable timestamp, the TL operator cannot
              backdate an event.</li>
        </ol>
        <t>
          An attacker who compromises the KMS alone can sign fraudulent
          roots, but cannot insert those roots into the consensus topic's
          history. An attacker who compromises the consensus topic alone
          cannot produce valid inclusion proofs. Both channels must be
          compromised simultaneously to forge a sealed event with a
          credible timestamp.
        </t>
      </section>

      <section anchor="boundary-enforcement">
        <name>Cryptographic Boundary Enforcement</name>
        <t>
          The protocol distributes trust across four services. No service
          accepts another's assertions without verifying a cryptographic
          signature.
        </t>
        <table>
          <thead>
            <tr><th>Boundary</th><th>Verification</th><th>What compromise means</th></tr>
          </thead>
          <tbody>
            <tr><td>RA to TL</td><td>TL verifies producer signature (ES256, registered key) before sealing</td><td>A forged event without a valid producer key is rejected at ingestion</td></tr>
            <tr><td>TL to Verifier</td><td>Verifier checks KMS signature on checkpoint via /root-keys</td><td>A tampered checkpoint fails signature validation at every client</td></tr>
            <tr><td>TL to Event Stream</td><td>Each published event carries the producer's signature; consumers verify against keys registered at the TL</td><td>A fabricated event without a valid producer key fails signature check</td></tr>
            <tr><td>AIM to RA</td><td>AIM reports findings; RA re-verifies each finding against TL-sealed records before acting</td><td>A false finding from a rogue monitor is detected on re-verification</td></tr>
          </tbody>
        </table>
        <t>
          Compromise of any single component is detectable by the others.
          A compromised RA instance can sign fraudulent events, but every
          event records the instance's raId; an auditor isolates the
          damage. A compromised TL can sign fraudulent checkpoints, but
          cannot retroactively alter checkpoints already published to the
          HCS-27 consensus topic. A compromised AIM can file false
          reports, but the RA re-verifies each finding; the quorum
          requirement prevents a single monitor from triggering
          remediation. A compromised Event Stream can suppress or delay
          events, but cannot forge new ones.
        </t>
        <t>
          This property does not hold against collusion between the RA and
          TL operators. HCS-27 consensus checkpoints and federation
          (<xref target="deployment-topologies"/>) provide the primary
          mitigations.
        </t>
      </section>
    </section>

    <!-- ============================================================ -->
    <section anchor="nfr">
      <name>Non-Functional Requirements</name>
      <table>
        <thead>
          <tr><th>ID</th><th>Component</th><th>Threshold</th></tr>
        </thead>
        <tbody>
          <tr><td>NFR-A-01</td><td>RA</td><td>99.9% uptime</td></tr>
          <tr><td>NFR-A-02</td><td>AIM</td><td>99.9% uptime</td></tr>
          <tr><td>NFR-P-01a</td><td>RA</td><td>Activation processing &lt; 120s median</td></tr>
          <tr><td>NFR-P-02</td><td>TL</td><td>Sealing &lt; 500ms median</td></tr>
          <tr><td>NFR-P-03</td><td>Private CA</td><td>Revocation reflected in OCSP/CRL &lt; 5 min</td></tr>
          <tr><td>NFR-P-04</td><td>AIM</td><td>DNS change detection &lt; 24h</td></tr>
          <tr><td>NFR-P-05</td><td>TL</td><td>Batch processing &lt; 5s</td></tr>
          <tr><td>NFR-P-06</td><td>TL</td><td>Append: O(log n)</td></tr>
          <tr><td>NFR-P-07</td><td>TL</td><td>Inclusion proof generation &lt; 100ms</td></tr>
          <tr><td>NFR-S-01</td><td>RA</td><td>1,000 registrations/hour</td></tr>
          <tr><td>NFR-S-07</td><td>TL</td><td>Billions of events, sub-second append</td></tr>
          <tr><td>NFR-C-02</td><td>TL</td><td>Standardized inclusion and consistency proof interfaces</td></tr>
        </tbody>
      </table>

      <section anchor="failure-modes">
        <name>Failure Modes</name>
        <table>
          <thead>
            <tr><th>Scenario</th><th>Consequence</th><th>RA Response</th></tr>
          </thead>
          <tbody>
            <tr><td>AHP unavailable</td><td>Identity Certificate expires. mTLS fails.</td><td>Detects expired status. Cannot auto-renew (AHP controls keys).</td></tr>
            <tr><td>Domain expires</td><td>Endpoint unreachable. DCV fails.</td><td>Treats persistent DCV failure as security event and revokes registrations.</td></tr>
            <tr><td>CA unavailable</td><td>New registrations blocked. Existing agents unaffected.</td><td>Queues pending requests. Reports dependency failure.</td></tr>
          </tbody>
        </table>
      </section>
    </section>

    <!-- ============================================================ -->
    <section anchor="future-work">
      <name>Future Work</name>
      <ul>
        <li>Federated, multi-RA ecosystem: A marketplace of
            interoperable RAs, governed by a standards body analogous to
            the CA/Browser Forum.</li>
        <li>Persistent identifiers: On-chain IDs and DIDs (did:web,
            did:ethr) would provide reputation continuity across version
            bumps.</li>
        <li>Runtime integrity (ZKPs/TEEs): Zero-Knowledge Proofs and
            Trusted Execution Environment attestations would close the
            application integrity gap.</li>
        <li>SCITT formal compliance: Adopt COSE-based signed statements
            and standardized receipt formats.</li>
        <li>Verifiable claim types and issuer accreditation: Define
            specific claim type standards and accredit third-party
            issuers.</li>
        <li>Governance white paper: Detail name allocation, fee model,
            dispute arbitration, and root CA stewardship.</li>
        <li>Platform integration: Demonstrate integration with agent
            frameworks (LangChain, AutoGen, CrewAI) and cloud
            platforms.</li>
      </ul>
    </section>

    <!-- ============================================================ -->
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>
        This section addresses threats identified through a MAESTRO
        framework analysis applied to the ANS architecture.
      </t>

      <section anchor="threat-impersonation">
        <name>Agent Impersonation</name>
        <t>
          Risk: An adversary impersonates a legitimate agent. Mitigation:
          Mandatory PKI with dual certificates. The Identity Certificate
          binds a specific code version to a verified domain. The agent
          must prove possession of the private key. Certificate chain
          validation against the Private CA root.
        </t>
      </section>

      <section anchor="threat-registry-poisoning">
        <name>Registry Poisoning</name>
        <t>
          Risk: An adversary injects malicious data (corrupted
          capabilities or endpoints) into the registry. Mitigation: The
          Transparency Log makes all sealed entries immutable and
          tamper-evident. The RA validates all payloads before sealing.
          The AIM continuously compares live DNS and Trust Card state
          against the TL's sealed records.
        </t>
      </section>

      <section anchor="threat-mitm">
        <name>Man-in-the-Middle</name>
        <t>
          Risk: An adversary modifies communications between system
          components. Mitigation: Message integrity via digital signatures
          (JWS Detached). mTLS between ANS-registered agents using
          Identity Certificates. DANE provides a second trust channel
          independent of the CA system.
        </t>
      </section>

      <section anchor="threat-dos">
        <name>Denial of Service</name>
        <t>
          Risk: Adversary incapacitates RA, TL, or resolution services.
          Mitigation: The data plane (mTLS handshakes between agents)
          continues during RA or AIM outages. Previously established trust
          proofs remain valid until certificates expire. Standard
          operational defenses (rate limiting, DDoS protection).
        </t>
      </section>

      <section anchor="threat-tl-compromise">
        <name>Transparency Log Compromise</name>
        <t>
          Risk: An adversary modifies or deletes historical TL entries.
          Mitigation: Merkle tree structure makes tampering mathematically
          detectable via consistency proofs between any two tree states.
          KMS key separation ensures the signing key does not reside on
          the TL host. HCS-27 checkpoint anchoring to a public
          distributed ledger provides independently verifiable timestamps.
        </t>
      </section>

      <section anchor="threat-ra-compromise">
        <name>Compromised RA Instance</name>
        <t>
          Risk: A single RA instance is breached and issues fraudulent
          registrations. Mitigation: Every TL entry records the raId of
          the processing instance. Auditors isolate every event that
          instance touched. Separation of duties requires the RA's DNS
          permissions exclude TLSA write access, preventing a compromised
          RA from also forging DANE records.
        </t>
      </section>

      <section anchor="threat-sdk-compromise">
        <name>SDK Supply Chain Compromise</name>
        <t>
          Risk: The SDK manages key generation, CSR submission, and Trust
          Card assembly. A compromised SDK could exfiltrate private keys
          or submit altered registration payloads. Mitigation: The SDK is
          open-source and auditable. Key generation uses platform
          cryptography (HSM, TPM, or OS keystore when available). The RA
          validates every CSR and registration payload independently.
          Software signing and provenance attestation (e.g., SLSA,
          Sigstore) reduce the risk of tampered distributions.
        </t>
      </section>

      <section anchor="single-operator-risk">
        <name>Single Operator Risk</name>
        <t>
          For a given registration, the same entity may operate both the
          RA and the TL that seals it. If that entity is compromised, it
          could forge events with no independent check. HCS-27 consensus
          checkpoints are the primary mitigation: the TL's root hash is
          anchored to an independently verifiable ledger that neither the
          RA nor the TL controls. Federation adds a second layer: an
          agent can register with an RA operated by one entity and have
          events sealed by a TL operated by another.
        </t>
      </section>

      <section anchor="remediation">
        <name>Ecosystem Integrity and Remediation</name>
        <t>Four principles guard against malicious monitoring services:</t>
        <ol>
          <li>Monitors report, the RA acts: External monitors publish
              findings. They cannot command state changes.</li>
          <li>Reports are public and signed: Monitors publish to
              cryptographically signed feeds, building verifiable
              reputation.</li>
          <li>Quorum before action: The RA MUST NOT act on a single
              report from one monitor.</li>
          <li>Evidence must be verifiable: Every finding MUST include
              cryptographic proof. The RA re-verifies independently.</li>
        </ol>
        <t>
          Suppression before revocation: When a finding meets the quorum
          requirement, the RA independently re-verifies the reported
          mismatch against the TL's sealed records. If confirmed, the RA
          publishes a suppression event to the TL. Discovery services
          that consume the event feed remove the agent from their indexes.
          Suppression is reversible; revocation is permanent.
        </t>
      </section>
    </section>

    <!-- ============================================================ -->
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions at this time.</t>
      <t>
        Future revisions may request registration of the "ans" URI scheme
        with IANA per RFC 7595, and registration of underscore labels
        "_ans", "_ans-badge", and "_ans-identity" per RFC 8552.
      </t>
    </section>

  </middle>

  <back>

    <!-- ============================================================ -->
    <references>
      <name>References</name>

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

        <reference anchor="RFC1035" target="https://www.rfc-editor.org/info/rfc1035">
          <front>
            <title>Domain Names - Implementation and Specification</title>
            <author fullname="P. Mockapetris"/>
            <date year="1987" month="November"/>
          </front>
          <seriesInfo name="STD" value="13"/>
          <seriesInfo name="RFC" value="1035"/>
        </reference>

        <reference anchor="RFC1123" target="https://www.rfc-editor.org/info/rfc1123">
          <front>
            <title>Requirements for Internet Hosts - Application and Support</title>
            <author fullname="R. Braden"/>
            <date year="1989" month="October"/>
          </front>
          <seriesInfo name="STD" value="3"/>
          <seriesInfo name="RFC" value="1123"/>
        </reference>

        <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 fullname="S. Bradner"/>
            <date year="1997" month="March"/>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
        </reference>

        <reference anchor="RFC3986" target="https://www.rfc-editor.org/info/rfc3986">
          <front>
            <title>Uniform Resource Identifier (URI): Generic Syntax</title>
            <author fullname="T. Berners-Lee"/>
            <author fullname="R. Fielding"/>
            <author fullname="L. Masinter"/>
            <date year="2005" month="January"/>
          </front>
          <seriesInfo name="STD" value="66"/>
          <seriesInfo name="RFC" value="3986"/>
        </reference>

        <reference anchor="RFC4033" target="https://www.rfc-editor.org/info/rfc4033">
          <front>
            <title>DNS Security Introduction and Requirements</title>
            <author fullname="R. Arends"/>
            <author fullname="R. Austein"/>
            <author fullname="M. Larson"/>
            <author fullname="D. Massey"/>
            <author fullname="S. Rose"/>
            <date year="2005" month="March"/>
          </front>
          <seriesInfo name="RFC" value="4033"/>
        </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 fullname="D. Cooper"/>
            <author fullname="S. Santesson"/>
            <author fullname="S. Farrell"/>
            <author fullname="S. Boeyen"/>
            <author fullname="R. Housley"/>
            <author fullname="W. Polk"/>
            <date year="2008" month="May"/>
          </front>
          <seriesInfo name="RFC" value="5280"/>
        </reference>

        <reference anchor="RFC6698" target="https://www.rfc-editor.org/info/rfc6698">
          <front>
            <title>The DNS-Based Authentication of Named Entities (DANE) Transport Layer Security (TLS) Protocol: TLSA</title>
            <author fullname="P. Hoffman"/>
            <author fullname="J. Schlyter"/>
            <date year="2012" month="August"/>
          </front>
          <seriesInfo name="RFC" value="6698"/>
        </reference>

        <reference anchor="RFC6960" target="https://www.rfc-editor.org/info/rfc6960">
          <front>
            <title>X.509 Internet Public Key Infrastructure Online Certificate Status Protocol - OCSP</title>
            <author fullname="S. Santesson"/>
            <author fullname="M. Myers"/>
            <author fullname="R. Ankney"/>
            <author fullname="A. Malpani"/>
            <author fullname="S. Galperin"/>
            <author fullname="C. Adams"/>
            <date year="2013" month="June"/>
          </front>
          <seriesInfo name="RFC" value="6960"/>
        </reference>

        <reference anchor="RFC7515" target="https://www.rfc-editor.org/info/rfc7515">
          <front>
            <title>JSON Web Signature (JWS)</title>
            <author fullname="M. Jones"/>
            <author fullname="J. Bradley"/>
            <author fullname="N. Sakimura"/>
            <date year="2015" month="May"/>
          </front>
          <seriesInfo name="RFC" value="7515"/>
        </reference>

        <reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba"/>
            <date year="2017" month="May"/>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
        </reference>

        <reference anchor="RFC8259" target="https://www.rfc-editor.org/info/rfc8259">
          <front>
            <title>The JavaScript Object Notation (JSON) Data Interchange Format</title>
            <author fullname="T. Bray"/>
            <date year="2017" month="December"/>
          </front>
          <seriesInfo name="STD" value="90"/>
          <seriesInfo name="RFC" value="8259"/>
        </reference>

        <reference anchor="RFC8555" target="https://www.rfc-editor.org/info/rfc8555">
          <front>
            <title>Automatic Certificate Management Environment (ACME)</title>
            <author fullname="R. Barnes"/>
            <author fullname="J. Hoffman-Andrews"/>
            <author fullname="D. McCarney"/>
            <author fullname="J. Kasten"/>
            <date year="2019" month="March"/>
          </front>
          <seriesInfo name="RFC" value="8555"/>
        </reference>

        <reference anchor="RFC8785" target="https://www.rfc-editor.org/info/rfc8785">
          <front>
            <title>JSON Canonicalization Scheme (JCS)</title>
            <author fullname="A. Rundgren"/>
            <author fullname="B. Jordan"/>
            <author fullname="S. Erdtman"/>
            <date year="2020" month="June"/>
          </front>
          <seriesInfo name="RFC" value="8785"/>
        </reference>

        <reference anchor="RFC9052" target="https://www.rfc-editor.org/info/rfc9052">
          <front>
            <title>CBOR Object Signing and Encryption (COSE): Structures and Process</title>
            <author fullname="J. Schaad"/>
            <date year="2022" month="August"/>
          </front>
          <seriesInfo name="RFC" value="9052"/>
        </reference>

        <reference anchor="I-D.ietf-scitt-architecture" target="https://datatracker.ietf.org/doc/draft-ietf-scitt-architecture/">
          <front>
            <title>An Architecture for Trustworthy and Transparent Digital Supply Chains</title>
            <author fullname="H. Birkholz"/>
            <author fullname="A. Delignat-Lavaud"/>
            <author fullname="C. Fournet"/>
            <author fullname="Y. Deshpande"/>
            <author fullname="S. Lasker"/>
            <date year="2025" month="October"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-scitt-architecture-22"/>
        </reference>

      </references>

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

        <reference anchor="RFC6763" target="https://www.rfc-editor.org/info/rfc6763">
          <front>
            <title>DNS-Based Service Discovery</title>
            <author fullname="S. Cheshire"/>
            <author fullname="M. Krochmal"/>
            <date year="2013" month="February"/>
          </front>
          <seriesInfo name="RFC" value="6763"/>
        </reference>

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

        <reference anchor="RFC9083" target="https://www.rfc-editor.org/info/rfc9083">
          <front>
            <title>JSON Responses for the Registration Data Access Protocol (RDAP)</title>
            <author fullname="S. Hollenbeck"/>
            <author fullname="A. Newton"/>
            <date year="2021" month="June"/>
          </front>
          <seriesInfo name="RFC" value="9083"/>
        </reference>

        <reference anchor="RFC9460" target="https://www.rfc-editor.org/info/rfc9460">
          <front>
            <title>Service Binding and Parameter Specification via the DNS (SVCB and HTTPS Resource Records)</title>
            <author fullname="B. Schwartz"/>
            <author fullname="M. Bishop"/>
            <author fullname="E. Nygren"/>
            <date year="2023" month="November"/>
          </front>
          <seriesInfo name="RFC" value="9460"/>
        </reference>

        <reference anchor="RFC9849" target="https://www.rfc-editor.org/info/rfc9849">
          <front>
            <title>TLS Encrypted Client Hello</title>
            <author fullname="E. Rescorla"/>
            <author fullname="K. Oku"/>
            <author fullname="N. Sullivan"/>
            <author fullname="C. A. Wood"/>
            <date year="2025"/>
          </front>
          <seriesInfo name="RFC" value="9849"/>
        </reference>

        <reference anchor="ANSv1">
          <front>
            <title>Agent Name Service (ANS): A Universal Directory for Secure AI Agent Discovery and Interoperability</title>
            <author fullname="V. S. Narajala"/>
            <author fullname="K. Huang"/>
            <author fullname="I. Habler"/>
            <author fullname="A. Sheriff"/>
            <date year="2025"/>
          </front>
          <refcontent>IEEE ICAIC 2026</refcontent>
        </reference>

        <reference anchor="MCP" target="https://modelcontextprotocol.io/specification">
          <front>
            <title>Model Context Protocol Specification</title>
            <author><organization>Anthropic</organization></author>
            <date year="2025"/>
          </front>
        </reference>

        <reference anchor="A2A" target="https://google.github.io/A2A/">
          <front>
            <title>Agent-to-Agent (A2A) Protocol</title>
            <author><organization>Google</organization></author>
            <date year="2025"/>
          </front>
        </reference>

        <reference anchor="HCS14" target="https://github.com/hashgraph/hedera-improvement-proposal/blob/main/HIP/hip-14.md">
          <front>
            <title>HCS-14: Universal Agent ID</title>
            <author><organization>Hiero</organization></author>
            <date year="2025"/>
          </front>
        </reference>

        <reference anchor="HCS27" target="https://github.com/hashgraph/hedera-improvement-proposal/blob/main/HIP/hip-27.md">
          <front>
            <title>HCS-27: Merkle Tree Checkpoint Specification</title>
            <author><organization>Hiero HCS-27 Working Group</organization></author>
            <date year="2025"/>
          </front>
        </reference>

        <reference anchor="DNSAID" target="https://datatracker.ietf.org/doc/draft-mozleywilliams-dnsop-dnsaid/">
          <front>
            <title>DNS for AI Discovery</title>
            <author fullname="J. Mozley"/>
            <author fullname="N. Williams"/>
            <author fullname="B. Sarikaya"/>
            <author fullname="R. Schott"/>
            <date year="2026" month="March"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-mozleywilliams-dnsop-dnsaid-01"/>
        </reference>

      </references>
    </references>

    <!-- ============================================================ -->
    <section anchor="appendix-examples">
      <name>Data Structure Examples</name>
      <t>
        All examples follow one agent, "Acme Support Agent"
        (support.example.com, version 1.5.0), through the registration
        lifecycle. CSRs and signatures are truncated for brevity.
      </t>

      <section anchor="example-registration-request">
        <name>Registration Request</name>
        <t>The AHP submits this payload to the RA's /register endpoint.</t>
        <sourcecode type="json"><![CDATA[
{
  "agentDisplayName": "Acme Support Agent",
  "agentDescription": "Customer support agent.",
  "version": "1.5.0",
  "agentHost": "support.example.com",
  "endpoints": [
    {
      "protocol": "A2A",
      "agentUrl": "wss://support.example.com/a2a",
      "metadataUrl":
        "https://support.example.com/.well-known/agent-card.json",
      "transports": ["STREAMABLE-HTTP", "SSE"],
      "functions": [
        { "id": "lookupOrder", "name": "Lookup Order",
          "tags": ["order", "support"] }
      ]
    },
    {
      "protocol": "MCP",
      "agentUrl": "https://support.example.com/mcp",
      "metadataUrl":
        "https://support.example.com/.well-known/mcp/
        server-card.json",
      "transports": ["STREAMABLE-HTTP"],
      "functions": [
        { "id": "getTicketStatus", "name": "Get Ticket Status",
          "tags": ["ticket", "support"] }
      ]
    }
  ],
  "identityCsrPEM": "...(truncated)...",
  "serverCsrPEM": "...(truncated)...",
  "lei": "549300EXAMPLE00LEI17",
  "agentCardContent": { "...see A.2..." }
}
]]></sourcecode>
      </section>

      <section anchor="example-trust-card">
        <name>ANS Trust Card</name>
        <t>
          Hosted by the AHP at the URL advertised in the _ans DNS record.
          Built from the Protocol Card, augmented with ANS trust fields.
          This artifact is optional.
        </t>
        <sourcecode type="json"><![CDATA[
{
  "ansName": "ans://v1.5.0.support.example.com",
  "agentDisplayName": "Acme Support Agent",
  "version": "1.5.0",
  "agentHost": "support.example.com",
  "releaseChannel": "stable",
  "endpoints": [
    {
      "protocol": "A2A",
      "agentUrl": "wss://support.example.com/a2a",
      "metadataUrl":
        "https://support.example.com/.well-known/agent-card.json",
      "transports": ["STREAMABLE-HTTP", "SSE"],
      "functions": [
        { "id": "lookupOrder", "name": "Lookup Order",
          "tags": ["order", "support"] }
      ]
    }
  ],
  "securitySchemes": {
    "agentAuth": {
      "type": "mutual_tls",
      "description": "mTLS using the agent's Identity Certificate."
    }
  },
  "verifiableClaims": [
    {
      "type": "SOC2_TYPE2",
      "issuer": "did:web:auditor.example.com",
      "hash": "SHA256:9f3a2b...",
      "url":
        "https://auditor.example.com/reports/example-2026.json",
      "issuedAt": "2026-01-15T00:00:00Z",
      "expiresAt": "2027-01-15T00:00:00Z"
    },
    {
      "type": "SBOM_CYCLONEDX",
      "issuer": "self",
      "hash": "SHA256:4e7d1c...",
      "url":
        "https://support.example.com/.well-known/sbom.json",
      "issuedAt": "2026-02-01T00:00:00Z"
    }
  ]
}
]]></sourcecode>
      </section>

      <section anchor="example-tl-event">
        <name>TL Event Payload</name>
        <sourcecode type="json"><![CDATA[
{
  "ansId": "550e8400-e29b-41d4-a716-446655440000",
  "ansName": "ans://v1.5.0.support.example.com",
  "eventType": "AGENT_REGISTERED",
  "agent": {
    "host": "support.example.com",
    "name": "Acme Support Agent",
    "version": "v1.5.0",
    "providerId": "PID-8294",
    "lei": "549300EXAMPLE00LEI17"
  },
  "attestations": {
    "identityCert": {
      "fingerprint": "SHA256:22b8a804...",
      "type": "X509-OV-CLIENT"
    },
    "serverCert": {
      "fingerprint": "SHA256:d2b71bc0...",
      "type": "X509-DV-SERVER"
    },
    "dnsRecordsProvisioned": {
      "_ans": "v=ans1; version=v1.5.0; ...",
      "_ans-badge": "v=ans-badge1; version=v1.5.0; ..."
    },
    "domainValidation": "ACME-DNS-01",
    "dnssecStatus": "fully_validated"
  },
  "expiresAt": "2026-10-05T18:00:00.000000Z",
  "issuedAt": "2026-03-05T18:00:00.000000Z",
  "raId": "id-A",
  "timestamp": "2026-03-05T18:00:00.000000Z"
}
]]></sourcecode>
      </section>

      <section anchor="example-badge-response">
        <name>TL Badge Response</name>
        <t>Badge consumers query GET /v1/agents/{agentId}.</t>
        <sourcecode type="json"><![CDATA[
{
  "schemaVersion": "V1",
  "status": "ACTIVE",
  "payload": {
    "logId": "550e8400-e29b-41d4-a716-446655440000",
    "producer": {
      "event": { "...same structure as A.3..." },
      "keyId": "id-B",
      "signature": "eyJhbGciOiJFUzI1NiJ9..."
    }
  },
  "signature": "eyJhbGciOiJFUzI1NiIsImtpZCI6...",
  "inclusionProof": {
    "leafHash": "abc123def456...",
    "leafIndex": 1234567,
    "treeSize": 9876543,
    "treeVersion": 1,
    "path": ["def456789abc...", "012345abcdef...", "..."],
    "rootHash": "current1234abcdef...",
    "rootSignature": "eyJhbGciOiJFUzI1NiJ9..."
  }
}
]]></sourcecode>
        <t>
          The path array contains log2(treeSize) hashes: about 30 for a
          billion events (under 1 KB).
        </t>
      </section>

      <section anchor="example-dns-records">
        <name>DNS Records</name>
        <sourcecode type="dns"><![CDATA[
$ORIGIN support.example.com.
$TTL 3600

; Core Location Records (Managed by AHP)
@       IN  A      192.0.2.50
@       IN  AAAA   2001:db8::50

; RA generates; AHP provisions
@            IN  HTTPS  1 . alpn="h2"
_443._tcp    IN  TLSA   3 0 1 <sha256_of_server_cert>

_ans         IN  TXT    "v=ans1; version=v1.5.0; p=a2a;
    url=https://support.example.com/.well-known/agent-card.json"
_ans         IN  TXT    "v=ans1; version=v1.5.0; p=mcp; mode=direct"

_ans-badge   IN  TXT    "v=ans-badge1; version=v1.5.0;
    url=https://{tl_host}/v1/agents/{agentId}"

; High-assurance (AHP-managed, per ADR 010)
_ans-identity._tls IN TLSA 3 0 1 <sha256_of_identity_cert>
]]></sourcecode>
      </section>

      <section anchor="example-aim-report">
        <name>AIM Failure Report</name>
        <sourcecode type="json"><![CDATA[
{
  "event_type": "integrity_failure_detected",
  "event_timestamp": "2026-03-06T11:00:00Z",
  "worker_id": "id-C",
  "agent_host": "support.example.com",
  "ans_name": "ans://v1.5.0.support.example.com",
  "check": {
    "record_type": "_ans",
    "failure_type": "MISMATCH",
    "expected_value": "v=ans1; version=v1.5.0; ...",
    "actual_value": "v=ans1; version=v1.5.0;
      url=https://malicious-site.example.com/evil-card.json"
  }
}
]]></sourcecode>
      </section>

      <section anchor="example-revocation">
        <name>Revocation Request and Response</name>
        <sourcecode type="json"><![CDATA[
{
  "reason": "CESSATION_OF_OPERATION",
  "comments": "Service is being retired."
}
]]></sourcecode>
        <t>The RA returns the DNS records the AHP must delete:</t>
        <sourcecode type="json"><![CDATA[
{
  "agentId": "550e8400-e29b-41d4-a716-446655440000",
  "ansName": "ans://v1.5.0.support.example.com",
  "status": "REVOKED",
  "reason": "CESSATION_OF_OPERATION",
  "revokedAt": "2026-03-20T14:00:00Z",
  "dnsRecordsToRemove": [
    { "name": "support.example.com",
      "type": "HTTPS", "purpose": "DISCOVERY" },
    { "name": "_443._tcp.support.example.com",
      "type": "TLSA", "purpose": "CERTIFICATE_BINDING" },
    { "name": "_ans.support.example.com",
      "type": "TXT", "purpose": "TRUST" },
    { "name": "_ans-badge.support.example.com",
      "type": "TXT", "purpose": "BADGE" }
  ]
}
]]></sourcecode>
      </section>
    </section>

  </back>
</rfc>
