<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp    "&#8203;">
  <!ENTITY nbhy    "&#8209;">
  <!ENTITY wj      "&#8288;">
]>
<!--
  draft-miller-aeo-00 : The AEO1 Discovery Mechanism
  xml2rfc v3 (RFC 7991) source. Structure verified 2026-07-06 against
  the official IETF template repository
  (github.com/ietf-authors/rfcxml-templates-and-schemas,
  draft-rfcxml-general-template-standard-00.xml) and RFC 7991.
  Reflects spec v0.2 as published at https://aeorecord.org.
  Upload this file at https://datatracker.ietf.org/submit/ -
  the Datatracker generates the canonical text/HTML/PDF renderings.
-->
<rfc
  xmlns:xi="http://www.w3.org/2001/XInclude"
  category="info"
  docName="draft-miller-aeo-00"
  ipr="trust200902"
  obsoletes=""
  updates=""
  submissionType="independent"
  xml:lang="en"
  version="3">

  <front>
    <title abbrev="AEO1">The AEO1 Discovery Mechanism: A DNS-Anchored, Signed Pointer to Owner-Attested Fact Catalogs for AI Answer Engines</title>
    <seriesInfo name="Internet-Draft" value="draft-miller-aeo-00"/>

    <author fullname="Garrett Miller" initials="G." surname="Miller">
      <organization>Meadow Mountain AI LLC</organization>
      <address>
        <email>support@aeorecord.org</email>
        <uri>https://aeorecord.org</uri>
      </address>
    </author>

    <!-- Empty date element: xml2rfc / the Datatracker fills in the
         submission date automatically on render. Do not hard-code. -->
    <date/>

    <keyword>AEO</keyword>
    <keyword>answer engine</keyword>
    <keyword>DNS TXT</keyword>
    <keyword>well-known URI</keyword>
    <keyword>fact catalog</keyword>
    <keyword>Ed25519</keyword>

    <abstract>
      <t>This document specifies AEO1 (Answer Engine Optimization,
      version 1), a discovery mechanism that allows a domain owner to
      publish a verifiable, machine-readable pointer to a structured,
      owner-attested fact catalog for that domain.  AEO1 consists of
      three coordinated surfaces: a DNS TXT record at the "_aeo"
      subdomain, a JSON document at the well-known URI
      "/.well-known/aeo.json", and an optional HTML link hint.
      Records may carry an Ed25519 signature issued by an issuing
      authority, enabling consuming agents such as AI answer engines
      to distinguish verified, current, domain-authorized data from
      unverified crawled content.  The design follows the
      DNS-authenticated trust-anchor pattern established by SPF,
      DKIM, and DMARC.  This document also requests provisional
      registration of the "aeo.json" well-known URI suffix.</t>
    </abstract>
  </front>

  <middle>

    <section anchor="introduction">
      <name>Introduction</name>
      <t>AI answer engines (large language model based systems that
      answer natural-language questions with a synthesized response
      rather than a list of links) increasingly serve as a primary
      interface through which users discover information about
      organizations, businesses, products, and services.  These
      systems typically ground their answers in web crawls, search
      index snapshots, or general training data.  None of those
      sources provide a reliable, machine-checkable signal of:</t>
      <ol spacing="normal" type="(%c)">
        <li>whether any party has verified facts about the
        organization associated with a domain;</li>
        <li>where a canonical, structured, currently maintained
        record of those facts can be retrieved;</li>
        <li>whether time-sensitive facts (hours, pricing, service
        area) are current; and</li>
        <li>whether publication of the data was authorized by the
        domain owner.</li>
      </ol>
      <t>This document defines AEO1, a discovery convention that
      gives a domain owner a predictable, verifiable place to publish
      a pointer to a structured fact catalog, together with a
      verification tier, tenure information, and an optional
      cryptographic signature.  The design intentionally mirrors SPF
      <xref target="RFC7208"/>, DKIM <xref target="RFC6376"/>, and
      DMARC <xref target="RFC7489"/>: a low-friction DNS TXT record
      at a conventionally named subdomain, checked by automated
      systems before trusting domain-associated content.  The
      well-known URI surface follows the precedent of security.txt
      <xref target="RFC9116"/>.</t>
      <t>The AEO1 format is an open specification.  The living
      specification, JSON Schema, and worked examples are published
      at <eref target="https://aeorecord.org"/>
      <xref target="AEO-SPEC"/>.  This document describes version
      0.2 of that specification.  An open-source verifier is
      available as the "aeo-record" package in the npm registry.</t>
    </section>

    <section anchor="conventions">
      <name>Conventions and Terminology</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST
      NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>",
      "<bcp14>SHALL NOT</bcp14>", "<bcp14>SHOULD</bcp14>",
      "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>",
      "<bcp14>NOT RECOMMENDED</bcp14>", "<bcp14>MAY</bcp14>", and
      "<bcp14>OPTIONAL</bcp14>" in this document are to be
      interpreted as described in BCP&nbsp;14 <xref target="RFC2119"/>
      <xref target="RFC8174"/> when, and only when, they appear in
      all capitals, as shown here.</t>
      <dl newline="false" spacing="normal">
        <dt>Answer engine:</dt>
        <dd>A system that synthesizes a natural-language response to
        a user query, typically citing one or more sources.</dd>
        <dt>Consuming agent:</dt>
        <dd>Any crawler, AI agent, answer engine, or automated tool
        that reads an AEO record to decide how to retrieve
        domain-associated data.</dd>
        <dt>Issuing authority:</dt>
        <dd>An entity that verifies facts about a domain and issues
        an "id=" token and Ed25519 signature after confirming the
        requester controls that domain.  This document does not
        mandate a single issuing authority; it defines the record
        format any authority <bcp14>MAY</bcp14> use.</dd>
        <dt>Fact catalog:</dt>
        <dd>A structured, machine-readable document of facts about
        the organization associated with a domain, retrievable over
        HTTPS.</dd>
      </dl>
    </section>

    <section anchor="discovery">
      <name>The AEO1 Discovery Mechanism</name>
      <t>AEO1 defines three coordinated discovery surfaces.  A
      consuming agent <bcp14>SHOULD</bcp14> attempt them in the
      following order, stopping at the first successful
      retrieval:</t>
      <ol spacing="normal" type="1">
        <li>the well-known URI (<xref target="wellknown"/>);</li>
        <li>the DNS TXT record (<xref target="dnsrecord"/>);</li>
        <li>the HTML link hint (<xref target="linkhint"/>);</li>
        <li>lower-precedence fallbacks: a pointer within the
        domain's llms.txt file if present, a listing in a public
        Model Context Protocol (MCP) directory if the agent supports
        MCP, and finally conventional HTML retrieval of the domain
        (an unverified fallback).</li>
      </ol>

      <section anchor="dnsrecord">
        <name>The DNS TXT Record</name>
        <t>The authoritative anchor of an AEO1 deployment is a TXT
        resource record published at the "_aeo" subdomain of the
        domain being described, following the convention established
        by DMARC's "_dmarc" prefix:</t>
        <sourcecode type="dns-rr"><![CDATA[
_aeo.example.com.  IN  TXT  "v=AEO1; id=grd_a1b2c3;
    catalog=https://issuer.example/c/example.com;
    tier=verified; ts=20260629; sig=<base64-ed25519-signature>"
]]></sourcecode>
        <t>Placing the record under "_aeo" rather than at the domain
        apex avoids collision with other TXT records (SPF, domain
        verification tokens, etc.) commonly present at the apex.
        The record value is a semicolon-separated list of tag=value
        pairs.  Whitespace around separators is ignored.</t>

        <t>All AEO1 tag names and the "v=AEO1" version token are
        US-ASCII protocol constants; they are never localized or
        translated, following the practice of SPF, DKIM, and DMARC.
        Where the domain being described is an internationalized
        domain name, the "_aeo" label is prepended to the domain's
        A-label (Punycode) form as defined by IDNA2008
        <xref target="RFC5890"/>, and a consuming agent resolves the
        record using that A-label form.</t>

        <section anchor="requiredtags">
          <name>Required Tags</name>
          <dl newline="false" spacing="normal">
            <dt>v=</dt>
            <dd><bcp14>REQUIRED</bcp14>.  Version tag.  <bcp14>MUST</bcp14>
            be the literal string "AEO1" for records conforming to
            this specification.  If present, this tag
            <bcp14>MUST</bcp14> appear first in the record.</dd>
            <dt>catalog=</dt>
            <dd><bcp14>REQUIRED</bcp14>.  An HTTPS URL of the
            structured, machine-readable fact catalog for the
            domain.  The URL <bcp14>MUST</bcp14> use the "https"
            scheme.</dd>
            <dt>tier=</dt>
            <dd><bcp14>REQUIRED</bcp14>.  Verification depth.
            <bcp14>MUST</bcp14> be one of "self_declared", "listed",
            "verified", or "grounded" (see
            <xref target="tiers"/>).  Consuming agents
            <bcp14>MUST</bcp14> treat unrecognized tier values as
            equivalent to "self_declared".</dd>
            <dt>ts=</dt>
            <dd><bcp14>REQUIRED</bcp14>.  The date the record was
            first verified or issued, in YYYYMMDD format.  In this
            version of the specification, ts= expresses TENURE (how
            long the domain has held a verified record), not
            freshness.  Consuming agents <bcp14>MUST
            NOT</bcp14> reject or down-rank a record solely because
            its ts= value is old.  Freshness is carried by the
            "verified_at" and "last_confirmed_at" fields of the
            aeo.json document (<xref target="aeojson"/>).</dd>
          </dl>
        </section>

        <section anchor="optionaltags">
          <name>Optional Tags</name>
          <dl newline="false" spacing="normal">
            <dt>id=</dt>
            <dd><bcp14>OPTIONAL</bcp14>.  A token issued by an
            issuing authority as proof that the domain owner
            authorized the catalog entry.  Absent for self-issued,
            self-declared records.</dd>
            <dt>sig=</dt>
            <dd><bcp14>OPTIONAL</bcp14>.  An Ed25519 signature
            <xref target="RFC8032"/> issued by an issuing authority,
            covering the canonical string defined in
            <xref target="signing"/>.  A record carrying a valid
            sig= from a known issuing authority provides
            cryptographic evidence that the authority issued the
            stated tier for the stated domain and catalog
            content.</dd>
            <dt>area=</dt>
            <dd><bcp14>OPTIONAL</bcp14>.  For domains representing
            entities with a geographically bounded service area, a
            short structured description of that area.</dd>
          </dl>
          <t>Note: an earlier revision of the AEO1 specification
          defined a "method=" DNS tag expressing retrieval-method
          preference.  That tag was removed in specification
          version 0.2; retrieval preference is expressed only by the
          "method_preference" field of the aeo.json document
          (<xref target="aeojson"/>).  Consuming agents
          <bcp14>MUST</bcp14> ignore unrecognized tags, including
          "method=", if encountered.</t>
        </section>
      </section>

      <section anchor="wellknown">
        <name>The Well-Known URI: /.well-known/aeo.json</name>
        <t>Because DNS-record checking requires explicit
        implementation by a consuming agent, this document also
        defines an equivalent discovery surface at a well-known URI
        <xref target="RFC8615"/>:</t>
        <artwork align="left"><![CDATA[
https://example.com/.well-known/aeo.json
]]></artwork>
        <t>This resource, when present, <bcp14>MUST</bcp14> contain
        a JSON <xref target="RFC8259"/> object with fields
        semantically equivalent to the tags defined in
        <xref target="dnsrecord"/>, as described in
        <xref target="aeojson"/>.  Retrieval of the resource is safe
        and idempotent: it is read-only JSON with no side effects.</t>
        <t>A consuming agent <bcp14>MAY</bcp14> check this URI in
        place of, or prior to, a DNS TXT lookup.  When both surfaces
        are present and disagree, the DNS record is authoritative.
        The well-known resource exists to enable adoption by systems
        that already fetch /.well-known/ resources (per the
        precedent of security.txt <xref target="RFC9116"/> and
        WebFinger <xref target="RFC7033"/>) but do not yet perform
        AEO-specific DNS lookups.</t>
      </section>

      <section anchor="linkhint">
        <name>The HTML Link Hint</name>
        <t>A domain <bcp14>MAY</bcp14> additionally advertise its
        AEO record from within its HTML pages using a link element
        with the link relation type "aeo":</t>
        <sourcecode type="html"><![CDATA[
<link rel="aeo" href="/.well-known/aeo.json">
]]></sourcecode>
        <t>This hint lets agents that parse page markup, but that
        would not otherwise probe well-known URIs or DNS, discover
        the record in-page.  The hint is advisory only: a consuming
        agent that follows it <bcp14>MUST</bcp14> apply the same
        validation it would apply to a directly fetched
        /.well-known/aeo.json resource.  Registration of the "aeo"
        link relation type in the IANA "Link Relation Types"
        registry <xref target="RFC8288"/> may be requested
        separately; the hint functions without such registration.</t>
      </section>

      <section anchor="tiers">
        <name>Verification Tiers</name>
        <t>The tier value expresses verification depth on an ordinal
        scale so that consuming agents can weight trust
        appropriately:</t>
        <dl newline="false" spacing="normal">
          <dt>self_declared:</dt>
          <dd>Data supplied by the domain owner with no independent
          corroboration and no issuing authority involved.</dd>
          <dt>listed:</dt>
          <dd>The domain is enrolled with an issuing authority and
          its catalog is published, without independent fact
          review.</dd>
          <dt>verified:</dt>
          <dd>Data reviewed by a human operator at the issuing
          authority, or independently spot-checked against at least
          one additional source.</dd>
          <dt>grounded:</dt>
          <dd>Data cross-corroborated against multiple independent
          sources with agreement, and cryptographically signed.</dd>
        </dl>
        <t>Consuming agents <bcp14>MAY</bcp14> apply different trust
        thresholds depending on the sensitivity of the query (for
        example, requiring "grounded" tier before citing
        time-sensitive or safety-relevant facts such as business
        hours for urgent or emergency services).</t>
      </section>
    </section>

    <section anchor="aeojson">
      <name>The aeo.json Document</name>
      <t>The /.well-known/aeo.json resource contains a single JSON
      object.  A JSON Schema for the document is published at
      <eref target="https://aeorecord.org/aeo.schema.json"/>; the
      living specification <xref target="AEO-SPEC"/> is normative
      for field-level detail.  Example:</t>
      <sourcecode type="json"><![CDATA[
{
  "v": "AEO1",
  "catalog": "https://issuer.example/c/example.com",
  "mcp": "mcp://api.issuer.example",
  "api": "https://api.issuer.example/v1/companies/example.com",
  "tier": "verified",
  "verified_at": "2026-06-29",
  "last_confirmed_at": "2026-07-04",
  "method_preference": ["mcp", "api", "crawl"]
}
]]></sourcecode>
      <dl newline="false" spacing="normal">
        <dt>v:</dt>
        <dd><bcp14>REQUIRED</bcp14>.  The literal string "AEO1".</dd>
        <dt>catalog:</dt>
        <dd><bcp14>REQUIRED</bcp14>.  As in the DNS record
        (<xref target="requiredtags"/>).</dd>
        <dt>tier:</dt>
        <dd><bcp14>REQUIRED</bcp14>.  As in the DNS record.</dd>
        <dt>verified_at:</dt>
        <dd>Date (RFC 3339 full-date) of the most recent
        system-performed verification or re-signing event.  This is
        the primary machine freshness signal.</dd>
        <dt>last_confirmed_at:</dt>
        <dd>Date of the most recent owner-attested confirmation that
        the catalog facts remain accurate.  This field is purely
        additive: its presence and recency <bcp14>MAY</bcp14> raise
        an agent's confidence, but its absence or age <bcp14>MUST
        NOT</bcp14> be treated as invalidating the record.</dd>
        <dt>mcp, api:</dt>
        <dd><bcp14>OPTIONAL</bcp14>.  Endpoints for structured
        retrieval of the catalog via a Model Context Protocol server
        or a conventional HTTPS API, respectively.</dd>
        <dt>method_preference:</dt>
        <dd><bcp14>OPTIONAL</bcp14>.  An ordered array of preferred
        retrieval methods.  Defined values: "mcp", "api", "crawl".
        Consuming agents <bcp14>SHOULD</bcp14> attempt methods in
        the listed order and fall back to the next on failure.</dd>
      </dl>
      <t>All AEO1 JSON resources &#8212; the aeo.json document and the
      fact catalog it references &#8212; are encoded in UTF-8
      <xref target="RFC8259"/>, so fact values in any language or
      writing system are carried without transformation.  A
      human-readable fact value <bcp14>MAY</bcp14> carry an associated
      language tag per BCP&#160;47 <xref target="RFC5646"/>, and an
      issuing authority <bcp14>MAY</bcp14> publish the same fact in
      more than one language so that a consuming agent can cite the
      value whose language matches the query.  Language tagging does
      not alter canonicalization (<xref target="canonicalization"/>):
      every published value, whatever its language, is normalized and
      hashed by the single procedure defined there.</t>
    </section>

    <section anchor="signing">
      <name>Signing and Verification</name>
      <t>An issuing authority signs records with Ed25519
      <xref target="RFC8032"/>.  The signature carried in the sig=
      DNS tag is computed over the canonical string:</t>
      <artwork align="left"><![CDATA[
AEO1|domain|tier|ts|facts_hash
]]></artwork>
      <t>where "domain" is the domain being described, "tier" and
      "ts" are the values published in the DNS record, and
      "facts_hash" is the SHA-256 digest of the canonical fact-catalog
      content defined in <xref target="canonicalization"/>.  Binding the
      hash of the catalog content into the signed string allows a
      consuming agent to detect tampering with catalog content after
      issuance.  The issuing authority re-signs the record whenever the
      catalog facts or tier change.</t>

      <section anchor="canonicalization">
        <name>Fact-Catalog Canonicalization</name>
        <t>The "facts_hash" is computed over a deterministic canonical
        form of the domain's published facts, so that every conforming
        implementation reproduces an identical hash regardless of
        platform, locale, or text encoding.  Each published fact is
        reduced to a JSON object with exactly the three string members
        "fact_type", "key", and "value".  Canonicalization proceeds as
        follows:</t>
        <ol spacing="normal" type="1">
          <li>Every string field <bcp14>MUST</bcp14> be normalized to
          Unicode Normalization Form C (NFC) <xref target="UAX15"/>.
          This ensures that text which is identical to a reader but
          differs only in composed versus decomposed encoding &#8212;
          for example U+00E9 versus the sequence U+0065 U+0301, both
          rendering "&#233;" &#8212; produces the same bytes, and
          therefore the same signature.</li>
          <li>The fact objects <bcp14>MUST</bcp14> be sorted in
          ascending order, comparing "fact_type", then "key", then
          "value", by Unicode code point &#8212; not by UTF-16 code
          unit, which would misorder characters outside the Basic
          Multilingual Plane.</li>
          <li>The sorted array <bcp14>MUST</bcp14> be serialized as
          JSON <xref target="RFC8259"/>, each object emitting its
          members in the order "fact_type", "key", "value", with no
          insignificant whitespace.</li>
          <li>"facts_hash" is the lowercase hexadecimal SHA-256 digest
          of the UTF-8 encoding of that serialization.</li>
        </ol>
        <t>Because the canonical form is UTF-8 and ordered by code
        point, it is script-independent: facts in any language or
        writing system canonicalize deterministically under this single
        procedure, with no locale-dependent behavior.  Verifiers
        <bcp14>MUST</bcp14> apply the identical canonicalization before
        checking a signature.</t>
      </section>

      <section anchor="keypub">
        <name>Public-Key Publication</name>
        <t>An issuing authority <bcp14>MUST</bcp14> publish its
        verification keys as a JSON document at the well-known path
        "/.well-known/aeo-public-key.json" on the authority's own
        domain.  Each key entry carries at minimum a key identifier
        ("key_id"), the Ed25519 public key, and a status of
        "active", "retired", or "revoked".</t>
        <!-- Note: this document requests IANA registration only for
             "aeo.json" (Section 8).  The aeo-public-key.json path is
             described here as issuing-authority practice; it can be
             registered in a future revision if desired. -->
      </section>

      <section anchor="revocation">
        <name>Key Revocation and Status</name>
        <t>Verifiers <bcp14>MUST</bcp14> refuse signatures made with
        keys whose published status is "revoked".  Verifiers
        <bcp14>MUST</bcp14> accept signatures made with "active"
        keys and <bcp14>SHOULD</bcp14> accept signatures made with
        "retired" keys (keys rotated out of service but not
        compromised), so that previously issued records remain
        verifiable across routine rotation.</t>
      </section>

      <section anchor="verifyproc">
        <name>Verification Procedure</name>
        <ol spacing="normal" type="1">
          <li>Resolve the _aeo TXT record (or fetch
          /.well-known/aeo.json) for the target domain and parse the
          tags.</li>
          <li>If sig= is absent, treat the record as carrying no
          cryptographic assurance; apply tier semantics with
          correspondingly lower weight.</li>
          <li>If sig= is present, fetch the issuing authority's
          public-key document, select the applicable key, and check
          its status per <xref target="revocation"/>.</li>
          <li>Reconstruct the canonical string and verify the
          Ed25519 signature.  On failure, the record
          <bcp14>MUST</bcp14> be treated as no better than
          "self_declared".</li>
        </ol>
        <t>A reference verifier is available as the open-source
        "aeo-record" package in the npm registry.</t>
      </section>
    </section>

    <section anchor="relationship">
      <name>Relationship to Other Mechanisms</name>
      <dl newline="false" spacing="normal">
        <dt>robots.txt:</dt>
        <dd>Governs crawler access permissions.  Orthogonal: an AEO
        record does not override robots.txt directives.</dd>
        <dt>llms.txt:</dt>
        <dd>A file-based content index for AI crawlers.
        Complementary: an AEO-aware llms.txt <bcp14>SHOULD</bcp14>
        include a pointer to the domain's AEO record.  llms.txt
        provides no DNS-layer authentication, freshness signal, or
        verification depth.</dd>
        <dt>AIPREF (IETF AI Preferences):</dt>
        <dd>The IETF AI Preferences (AIPREF) working group standardizes
        a vocabulary for expressing AI usage preferences &#8212; whether
        and how an AI system may collect, train on, or display content
        &#8212; along with related work on cryptographic grants that
        lift those preferences.  Complementary and orthogonal: AIPREF
        governs usage permissions, whereas AEO1 governs verified
        publication of factual claims and the publisher authority
        behind them.  The AIPREF grant-binding work explicitly places
        establishing that an issuer is authoritative for an asset out
        of scope; AEO1's DNS-control and issuer-signature model supplies
        exactly that domain-authority anchor, which usage- and
        grant-signaling mechanisms assume but do not themselves
        define.  Related independent efforts add a verifiable
        authority-and-timestamp binding to those preference signals
        (for example the ADP-1 declaration format, which anchors a
        signed reservation's authorship and time to a public
        transparency substrate).  Such work binds who reserved a usage
        right and when; AEO1 is orthogonal in object, binding publisher
        authority and signature to positive factual claims for
        citation rather than to usage reservations, and could compose
        with a shared authority substrate rather than duplicate it.</dd>
        <dt>schema.org markup:</dt>
        <dd>Page-level structured data.  Orthogonal: AEO operates at
        the domain/DNS layer, not the page layer, and is
        authenticated by DNS control and issuer signature.</dd>
        <dt>SPF/DKIM/DMARC:</dt>
        <dd>Direct structural precedent for this specification's
        DNS-TXT, subdomain-prefixed, tag=value record design
        <xref target="RFC7208"/> <xref target="RFC6376"/>
        <xref target="RFC7489"/>.</dd>
        <dt>security.txt:</dt>
        <dd>Precedent for publishing machine-readable,
        domain-scoped metadata at a well-known location
        <xref target="RFC9116"/>.</dd>
      </dl>
    </section>

    <section anchor="security">
      <name>Security Considerations</name>

      <section anchor="sec-spoofing">
        <name>Spoofing and Self-Declared Records</name>
        <t>Because DNS TXT records can only be modified by parties
        with access to the domain's authoritative DNS zone,
        publication of a "v=AEO1" record is itself evidence of
        domain-owner intent, consistent with the trust model used by
        SPF and DMARC.  However, a self-declared record (no id=, no
        sig=) carries no assurance beyond DNS publication.
        Consuming agents <bcp14>MUST NOT</bcp14> treat
        self-declared records as equivalent to "verified" or
        "grounded" records, and <bcp14>MUST NOT</bcp14> trust a
        claimed tier value that is not backed by a valid issuer
        signature.  A malicious domain owner can claim any tier in
        an unsigned record; the tier is only meaningful when the
        signature verifies against a known issuing authority.</t>
      </section>

      <section anchor="sec-keycompromise">
        <name>Key Compromise and Revocation</name>
        <t>Compromise of an issuing authority's private key would
        allow forgery of signed records at any tier.  Authorities
        <bcp14>MUST</bcp14> be able to mark keys "revoked" in their
        public-key document, and verifiers <bcp14>MUST</bcp14>
        honor that status (<xref target="revocation"/>).
        Authorities <bcp14>SHOULD</bcp14> rotate keys periodically
        (publishing superseded keys as "retired") and
        <bcp14>SHOULD</bcp14> protect private keys in managed
        secret storage.  Verifiers <bcp14>SHOULD NOT</bcp14> cache
        public-key documents beyond a modest lifetime, so that
        revocation takes effect promptly.</t>
      </section>

      <section anchor="sec-dns">
        <name>DNS Trust</name>
        <t>Unsigned DNS responses can be spoofed by on-path
        attackers or through cache poisoning.  Deployments
        <bcp14>SHOULD</bcp14> sign the zones carrying _aeo records
        with DNSSEC, and consuming agents <bcp14>SHOULD</bcp14>
        validate DNSSEC where available.  Absent DNSSEC, the
        Ed25519 issuer signature (<xref target="signing"/>) remains
        the strongest integrity signal, since a spoofed record
        cannot carry a valid signature over attacker-chosen
        values.</t>
      </section>

      <section anchor="sec-ssrf">
        <name>Server-Side Request Forgery on Catalog Fetch</name>
        <t>The catalog=, mcp=, and api= values are
        attacker-controllable URLs from the consuming agent's
        perspective.  An agent that dereferences them from
        server-side infrastructure is exposed to server-side
        request forgery (SSRF).  Consuming agents
        <bcp14>MUST</bcp14> require the "https" scheme,
        <bcp14>SHOULD</bcp14> refuse to fetch URLs that resolve to
        loopback, link-local, or private address ranges,
        <bcp14>SHOULD</bcp14> re-apply these checks on every hop of
        an HTTP redirect chain, and <bcp14>SHOULD</bcp14> bound
        redirect depth, response size, and fetch time.</t>
      </section>

      <section anchor="sec-staleness">
        <name>Stale Data</name>
        <t>Because ts= expresses tenure rather than freshness
        (<xref target="requiredtags"/>), agents seeking a freshness
        signal <bcp14>SHOULD</bcp14> consult "verified_at" and
        "last_confirmed_at" in the aeo.json document and weight
        confidence accordingly, rather than rejecting records by
        age.  Fact catalogs remain assertions by their publisher
        and issuing authority; AEO1 conveys who attested what and
        when, not ground truth.</t>
      </section>
    </section>

    <section anchor="iana">
      <name>IANA Considerations</name>
      <t>IANA is requested to register the following entry in the
      "Well-Known URIs" registry, following the procedure of
      <xref target="RFC8615"/>:</t>
      <dl newline="false" spacing="normal">
        <dt>URI Suffix:</dt>
        <dd>aeo.json</dd>
        <dt>Change Controller:</dt>
        <dd>Meadow Mountain AI LLC</dd>
        <dt>Specification Document(s):</dt>
        <dd>This document (Sections <xref target="wellknown"
        format="counter"/> and <xref target="aeojson"
        format="counter"/>) and
        <eref target="https://aeorecord.org"/></dd>
        <dt>Status:</dt>
        <dd>provisional</dd>
        <dt>Related Information:</dt>
        <dd>The companion DNS TXT record convention and signature
        scheme are defined in Sections <xref target="dnsrecord"
        format="counter"/> and <xref target="signing"
        format="counter"/> of this document.</dd>
      </dl>
      <t>A provisional registration for this suffix, with the same
      change controller and referencing
      <eref target="https://aeorecord.org"/>, was requested through
      the IANA protocol-assignment process in July 2026 and may
      already appear in the registry; in that case this document
      serves as an additional specification document for the
      existing entry rather than a new registration.</t>
      <t>This document makes no other requests of IANA.  It creates
      no new registries.</t>
    </section>

  </middle>

  <back>
    <references>
      <name>References</name>
      <references anchor="normative">
        <name>Normative References</name>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8032.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8259.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8615.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5646.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5890.xml"/>
        <reference anchor="UAX15" target="https://www.unicode.org/reports/tr15/">
          <front>
            <title>Unicode Standard Annex #15: Unicode Normalization Forms</title>
            <author>
              <organization>The Unicode Consortium</organization>
            </author>
            <date year="2024"/>
          </front>
        </reference>
      </references>
      <references anchor="informative">
        <name>Informative References</name>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6376.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7033.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7208.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7489.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8288.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9116.xml"/>
        <reference anchor="AEO-SPEC" target="https://aeorecord.org">
          <front>
            <title>The AEO Record Standard (v=AEO1), Specification v0.2</title>
            <author>
              <organization>Meadow Mountain AI LLC</organization>
            </author>
            <date year="2026"/>
          </front>
        </reference>
      </references>
    </references>

    <section anchor="acknowledgements" numbered="false">
      <name>Acknowledgements</name>
      <t>The record design draws directly on the deployment
      experience of SPF, DKIM, DMARC, and security.txt.</t>
    </section>
  </back>
</rfc>
