<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude"
     ipr="trust200902"
     docName="draft-noss-jeftovic-groundmark-core-00"
     category="exp"
     submissionType="independent"
     version="3"
     xml:lang="en"
     tocInclude="true"
     symRefs="true"
     sortRefs="true">

  <front>
    <title abbrev="Groundmark Core">DNS-Anchored Identity Discovery for Autonomous Agents</title>
    <seriesInfo name="Internet-Draft" value="draft-noss-jeftovic-groundmark-core-00"/>

    <author fullname="Elliot Noss" initials="E." surname="Noss">
      <organization>Groundmark</organization>
      <address>
        <email>elliot@noss.org</email>
        <uri>https://groundmark.org</uri>
      </address>
    </author>

    <author fullname="Mark Jeftovic" initials="M." surname="Jeftovic">
      <organization>easyDNS Technologies Inc.</organization>
      <address>
        <email>markjr@easydns.com</email>
      </address>
    </author>

    <date year="2026"/>

    <area>Applications</area>
    <workgroup>Independent Submission</workgroup>

    <keyword>DNS</keyword>
    <keyword>agents</keyword>
    <keyword>identity</keyword>
    <keyword>HTTP Message Signatures</keyword>
    <keyword>DNSSEC</keyword>

    <abstract>
      <t>This document defines the core of Groundmark, a protocol for
      DNS-anchored identity discovery and request authentication for
      autonomous software agents. Operators publish an agent's signing
      public key in a DNS TXT record under a reserved label, and
      optionally publish references to externally hosted attestations
      under a second reserved label. Agents authenticate HTTP requests
      using HTTP Message Signatures (RFC 9421) with a key identifier
      that resolves through DNS. DNSSEC is required for all Groundmark
      DNS lookups. The protocol provides operator accountability
      discovery without a central registry, and is designed to compose
      with existing identity, authorization, and payment systems rather
      than to replace them.</t>

      <t>The attestation framework, including the role of Identity
      Service Providers, the attestation level taxonomy, and the claim
      vocabulary, is defined in a companion document.</t>
    </abstract>
  </front>

  <middle>

    <section anchor="introduction">
      <name>Introduction</name>

      <t>Autonomous software agents are increasingly conducting
      transactions on the Internet on behalf of human and
      organizational principals. Existing work addresses several
      adjacent concerns: HTTP-native payment flows <xref target="X402"/>,
      per-session delegated authorization protocols, and tool
      invocation frameworks. None of these answers a prior question:
      when an agent presents itself to a counterparty, is there an
      accountable party behind it, and how is that established without
      a central registry?</t>

      <t>This document defines Groundmark, a protocol that uses the
      Domain Name System (DNS) as the discovery anchor for agent
      identity. DNS is well suited to this role: it is open and
      well-governed; domain registrants are verified by registrars
      operating under established policy; the infrastructure is
      universally deployed; and any domain holder can publish agent
      identity records without any new global registry or delegation.
      The approach is modelled on DomainKeys Identified Mail (DKIM)
      <xref target="RFC6376"/>, which established the pattern of
      publishing a public key in a DNS TXT record under a reserved
      label for the purpose of verifying cryptographic assertions in
      an application-layer protocol.</t>

      <t>Groundmark separates three concerns:</t>

      <ul>
        <li>Identity discovery: locating an agent's signing public key
        in DNS.</li>
        <li>Request authentication: binding an HTTP request to an
        agent's key using HTTP Message Signatures
        <xref target="RFC9421"/>.</li>
        <li>Attestation discovery: pointing relying parties to
        externally hosted attestations describing what has been
        verified about the operator.</li>
      </ul>

      <t>The first two are specified in this document. The third is
      introduced mechanically here, by defining a DNS record that
      references attestation endpoints; the trust semantics of those
      attestations are defined in the companion document
      <xref target="I-D.noss-jeftovic-groundmark-attestation"/>.</t>

      <t>The semantics of the agent's domain string itself are not
      material to this protocol. An agent at "agent47.example.com"
      carries the same protocol weight as one at "x7q.example.com".
      What matters is the verifiable chain of control from the DNS
      root through a registrar-verified registrant to the holder of
      the agent's subdomain.</t>

      <section anchor="design-principles">
        <name>Design Principles</name>

        <t>Groundmark is designed around the following principles:</t>

        <ul>
          <li>Authenticate the minimum necessary. The intent is to
          enable permissionless interaction by default and to make
          stronger attestations available only where a relying
          party's risk profile demands them.</li>
          <li>DNS is a discovery layer, not a claims database. TXT
          records publish cryptographic material and point to where
          attestations are held. Attestations themselves are served
          over HTTPS.</li>
          <li>No single point of control. DNS is the common substrate,
          but no single entity controls which operators may publish
          agent identities, and the attestation framework defined in
          the companion document permits a diversity of Identity
          Service Providers.</li>
        </ul>
      </section>

      <section anchor="non-goals">
        <name>Non-Goals</name>

        <t>This specification explicitly does not:</t>

        <ul>
          <li>Define legal identity, human identification, or any form
          of personal attribution requirement.</li>
          <li>Define a global trust framework, governance regime, or
          compliance requirement.</li>
          <li>Mandate participation. An operator may decline to publish
          Groundmark records; a relying party may decline to require
          them.</li>
          <li>Replace decentralized identifiers (DIDs), Verifiable
          Credentials, OAuth, OpenID Connect, MCP, or any other
          identity, authorization, or capability protocol. Groundmark
          is designed to compose with these systems and MAY act as a
          discovery and bootstrap layer for any of them.</li>
          <li>Define a new cryptographic primitive. Request
          authentication uses HTTP Message Signatures
          <xref target="RFC9421"/> with conventional algorithms.</li>
          <li>Define attestation semantics, IDSP obligations,
          attestation levels, or claim vocabularies. Those are the
          subject of the companion document
          <xref target="I-D.noss-jeftovic-groundmark-attestation"/>.</li>
        </ul>

        <t>A consequence of the first three of these non-goals is that
        anonymous and pseudonymous agent operation remains a
        first-class deployment mode under Groundmark. The presence of
        an agent's public key in DNS does not, by itself, identify or
        accountably link the operator to a legal person; that linkage
        is the subject of optional attestations described in the
        companion document, and is opt-in by both the operator (who
        chooses whether to obtain and publish an attestation) and the
        relying party (which chooses whether to require one).</t>
      </section>

      <section anchor="requirements-language">
        <name>Requirements Language</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 14 <xref target="RFC2119"/>
        <xref target="RFC8174"/> when, and only when, they appear in
        all capitals, as shown here.</t>
      </section>
    </section>

    <section anchor="terminology">
      <name>Terminology</name>

      <dl>
        <dt>Operator</dt>
        <dd>Any person or organization that deploys and controls an
        autonomous agent. The operator is the principal whose
        accountability is at issue in the attestation framework
        defined by the companion document.</dd>

        <dt>Agent</dt>
        <dd>An autonomous software instance acting on behalf of an
        operator. An agent holds a cryptographic key pair; its public
        key is published in DNS under its agent domain.</dd>

        <dt>Agent Domain</dt>
        <dd>A fully qualified domain name (FQDN) that serves as the
        agent's identity anchor in DNS. Typically a subdomain under
        the operator's registered domain (e.g.,
        "purchasing.acmecorp.example") but MAY be a second-level
        domain.</dd>

        <dt>Identity Service Provider (IDSP)</dt>
        <dd>A trusted third party that verifies a claim about an
        operator or agent and issues a signed attestation. Defined
        fully in
        <xref target="I-D.noss-jeftovic-groundmark-attestation"/>;
        referenced here only insofar as the _agentclaim record points
        to attestations issued by IDSPs.</dd>

        <dt>Relying Party</dt>
        <dd>An agent, API endpoint, or service that receives an
        agent's request, verifies the request signature against the
        agent's DNS-published key, and optionally evaluates
        attestations referenced from DNS.</dd>
      </dl>
    </section>

    <section anchor="system-overview">
      <name>System Overview</name>

      <t>A Groundmark-enabled HTTP request proceeds as follows.</t>

      <ol>
        <li>The operator publishes an _agentid TXT record at the agent
        domain, containing the agent's signing public key, and
        OPTIONALLY one or more _agentclaim TXT records referencing
        externally hosted attestations. All such records MUST be
        published in a DNSSEC-signed zone.</li>

        <li>The agent signs each HTTP request using HTTP Message
        Signatures <xref target="RFC9421"/> as profiled in
        <xref target="signing"/>. The signature uses the agent's
        private key and identifies the corresponding public key
        through a keyid parameter that resolves to the agent
        domain.</li>

        <li>The relying party retrieves the _agentid TXT record for the
        agent domain using a DNSSEC-validating resolver and verifies
        the request signature against the published public key. A
        successful verification establishes that the request
        originated from a party that controls the agent domain.</li>

        <li>If the relying party's policy requires attestations beyond
        what is established by signature verification alone, it
        retrieves _agentclaim records for the agent domain, fetches
        the referenced attestations, and evaluates them according to
        the framework specified in the companion document.</li>
      </ol>

      <t>DNS in this design is a discovery layer. It points to where
      keys and attestations are found; it does not itself host claim
      content. This mirrors the role DNS already plays for email
      authentication mechanisms such as DKIM
      <xref target="RFC6376"/> and DMARC <xref target="RFC7489"/>.</t>

      <section anchor="example">
        <name>Worked Example</name>

        <t>The following non-normative example illustrates a complete
        Groundmark exchange. An operator deploys an agent under the
        domain "purchasing.acmecorp.example", publishing one identity
        record and one attestation reference:</t>

<sourcecode type="dns"><![CDATA[
_agentid.purchasing.acmecorp.example. 300 IN TXT
  "v=gm1; k=ed25519; p=oW8nN1xJxGv...HzG"

_agentclaim.purchasing.acmecorp.example. 300 IN TXT
  "v=gm1; claim=operator-verified;
   idsp=verify.example.net;
   ref=https://verify.example.net/a/4f9f3e1c7ab93d4f8d22;
   exp=2026-12-01"
]]></sourcecode>

        <t>When the agent issues an HTTP POST to a relying party, the
        request carries Signature-Input, Signature, and Content-Digest
        header fields per <xref target="RFC9421"/> and
        <xref target="RFC9530"/>:</t>

<sourcecode type="http-message"><![CDATA[
POST /orders HTTP/1.1
Host: api.supplier.example
Content-Type: application/json
Content-Digest: \
  sha-256=:X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE=:
Signature-Input: gm=("@method" "@authority" "@target-uri" \
    "content-digest");created=1747654321;\
    expires=1747654621;\
    keyid="purchasing.acmecorp.example";alg="ed25519"
Signature: gm=:9R...base64url...==:

{"sku":"X-42","quantity":3}
]]></sourcecode>

        <t>The relying party:</t>

        <ol>
          <li>Parses Signature-Input and confirms required components
          and parameters.</li>
          <li>Resolves _agentid.purchasing.acmecorp.example via a
          DNSSEC-validating resolver.</li>
          <li>Verifies the Content-Digest against the request
          body.</li>
          <li>Reconstructs the <xref target="RFC9421"/> signature base
          from the covered components.</li>
          <li>Verifies the Ed25519 signature against the public key
          from the _agentid record.</li>
        </ol>

        <t>If the relying party's policy requires more than Level 0,
        it additionally retrieves
        _agentclaim.purchasing.acmecorp.example, fetches the
        attestation at the ref= URL, verifies it per
        <xref target="I-D.noss-jeftovic-groundmark-attestation"/>, and
        applies its policy.</t>
      </section>
    </section>

    <section anchor="dns-record-formats">
      <name>DNS Record Formats</name>

      <t>Groundmark defines two TXT record formats published under
      reserved underscore labels at the agent domain. Both share the
      version tag "v=gm1" to distinguish them from other TXT record
      uses at the same domain.</t>

      <t>The use of two distinct labels reflects a deliberate
      separation of concerns: _agentid carries the cryptographic
      material that is the root of request authentication, and is
      expected to be small, stable, and aggressively cached only
      within a short TTL. _agentclaim carries references to
      attestations whose lifecycle is independent of the signing key
      and which may be added, removed, or replaced without affecting
      the agent's underlying identity.</t>

      <section anchor="agentid-record">
        <name>The _agentid TXT Record</name>

        <t>The _agentid TXT record is published at:</t>

<sourcecode type="dns"><![CDATA[
_agentid.<agent-domain>. IN TXT
  "v=gm1; k=ed25519; p=<base64url-public-key>"
]]></sourcecode>

        <t>The record declares the agent's signing public key and
        algorithm. It is the root of cryptographic verification for
        the agent identity.</t>

        <section anchor="agentid-abnf">
          <name>ABNF Grammar</name>

<sourcecode type="abnf"><![CDATA[
agentid-record  = version 1*( ";" SP agentid-param )
version         = "v=gm1"
agentid-param   = key-alg-param / pubkey-param / keyid-param /
                  ext-param
key-alg-param   = "k=" key-alg
key-alg         = "ed25519" / x-token
pubkey-param    = "p=" base64url-value
keyid-param     = "kid=" 1*( ALPHA / DIGIT / "-" / "_" / "." )
ext-param       = param-name "=" param-value
param-name      = 1*( ALPHA / DIGIT / "-" )
param-value     = *( %x21-3A / %x3C-7E )
                  ; printable ASCII excluding ";"
base64url-value = 1*( ALPHA / DIGIT / "-" / "_" / "=" )
x-token         = "x-" 1*( ALPHA / DIGIT / "-" )
]]></sourcecode>

          <t>The OPTIONAL "kid=" parameter allows an operator to
          publish an explicit key identifier matching the keyid
          parameter used in the request signature, which supports key
          rotation by deploying multiple _agentid records during
          transition (see <xref target="key-rotation"/>).</t>
        </section>

        <section anchor="agentid-processing">
          <name>Processing Requirements</name>

          <t>The "k=" (key algorithm) and "p=" (public key) parameters
          MUST be present. The version tag "v=gm1" MUST appear
          first.</t>

          <t>This document defines "ed25519" as the only
          mandatory-to-implement algorithm. The "p=" field MUST
          contain the Base64url-encoded <xref target="RFC4648"/> raw
          public key bytes for the specified algorithm (32 bytes for
          Ed25519). Support for additional algorithms MAY be added by
          future documents updating this specification.</t>

          <t>An operator publishing a single signing key MUST publish
          exactly one _agentid record. An operator may publish
          multiple _agentid records only as part of a key rotation
          procedure (see <xref target="key-rotation"/>); in that case,
          every published record MUST carry a distinct "kid=" value,
          and request signatures MUST identify the intended key by
          keyid.</t>

          <t>A relying party MUST treat the identity as invalid, and
          MUST NOT proceed with signature verification against any
          record at the label, if any of the following conditions hold
          at the time of lookup:</t>

          <ul>
            <li>More than one _agentid record is present at the label
            and any of them lacks a "kid=" parameter.</li>
            <li>More than one _agentid record is present and two or
            more of them share the same "kid=" value.</li>
          </ul>

          <t>Operators SHOULD set the TTL of the _agentid record to
          300 seconds or less to enable timely revocation. Relying
          parties MUST respect DNS TTL values and MUST NOT cache
          _agentid records beyond their TTL.</t>

          <t>Relying parties MUST use a DNSSEC-validating resolver
          when retrieving _agentid records. A response that fails
          DNSSEC validation MUST be treated as an invalid identity.
          See <xref target="security-dnssec"/>.</t>
        </section>
      </section>

      <section anchor="agentclaim-record">
        <name>The _agentclaim TXT Record</name>

        <t>The _agentclaim TXT record points to an externally hosted
        attestation about the operator or agent. The semantics of
        attestations themselves are defined in
        <xref target="I-D.noss-jeftovic-groundmark-attestation"/>;
        this document defines only the DNS record format and
        processing requirements.</t>

        <t>The most common form references an IDSP-hosted
        attestation:</t>

<sourcecode type="dns"><![CDATA[
_agentclaim.<agent-domain>. IN TXT
  "v=gm1; claim=<type>; idsp=<domain>;
   ref=<https-url>; exp=<ISO8601-date>"
]]></sourcecode>

        <t>A self-asserted variant uses "val=" instead of "ref=" and
        "idsp=", and carries no IDSP signature:</t>

<sourcecode type="dns"><![CDATA[
_agentclaim.<agent-domain>. IN TXT
  "v=gm1; claim=operator-contact;
   val=ops@acmecorp.example"
]]></sourcecode>

        <t>Relying parties MUST treat self-asserted claims as
        unverified operator assertions. The companion document
        specifies how such records are incorporated into the
        attestation level taxonomy.</t>

        <t>Multiple _agentclaim records MAY be present at the same
        label. Each represents an independent claim from a potentially
        different IDSP and is evaluated independently.</t>

        <section anchor="agentclaim-abnf">
          <name>ABNF Grammar</name>

<sourcecode type="abnf"><![CDATA[
agentclaim-record = version 1*( ";" SP agentclaim-param )
version           = "v=gm1"
agentclaim-param  = claim-param / idsp-param / ref-param /
                    exp-param / val-param / ext-param
claim-param       = "claim=" claim-type
claim-type        = token / x-token
idsp-param        = "idsp=" hostname
ref-param         = "ref=" https-url
exp-param         = "exp=" date-value
val-param         = "val=" param-value
ext-param         = param-name "=" param-value
token             = 1*( ALPHA / DIGIT / "-" )
hostname          = 1*( ALPHA / DIGIT / "." / "-" )
https-url         = "https://" *( %x21-7E )
date-value        = 4DIGIT "-" 2DIGIT "-" 2DIGIT
                    [ "T" 2DIGIT ":" 2DIGIT ":" 2DIGIT
                      [ "Z" /
                        ( ( "+" / "-" ) 2DIGIT ":" 2DIGIT ) ] ]
param-name        = 1*( ALPHA / DIGIT / "-" )
param-value       = *( %x21-3A / %x3C-7E )
x-token           = "x-" 1*( ALPHA / DIGIT / "-" )
]]></sourcecode>
        </section>

        <section anchor="agentclaim-processing">
          <name>Processing Requirements</name>

          <t>The "claim=" field MUST be present in all _agentclaim
          records.</t>

          <t>When "ref=" is present, "idsp=" MUST also be present.
          When "val=" is present, "ref=" and "idsp=" MUST NOT be
          present. A record that satisfies neither shape MUST be
          ignored.</t>

          <t>Relying parties MUST ignore records with unrecognized
          "claim=" values rather than treating them as errors, to
          preserve forward compatibility.</t>

          <t>"ref=" URLs MUST use the HTTPS scheme. The path component
          of a "ref=" URL MUST contain at least 128 bits of
          cryptographically random entropy (for example, a UUIDv4 or
          22-character Base64url-encoded random string). This document
          does not treat "ref=" URLs as confidential, but the entropy
          requirement defends against enumeration attacks against IDSP
          attestation endpoints (see
          <xref target="security-ref-entropy"/>).</t>

          <t>Operators SHOULD set the TTL of _agentclaim records to
          300 seconds or less. The "exp=" value provides claim-level
          expiry that is independent of DNS TTL; relying parties MUST
          NOT use a claim whose "exp=" time has passed, regardless of
          cache state.</t>

          <t>Relying parties MUST use a DNSSEC-validating resolver
          when retrieving _agentclaim records. A response that fails
          DNSSEC validation MUST be treated as an absent record.</t>
        </section>
      </section>
    </section>

    <section anchor="signing">
      <name>Request Authentication</name>

      <t>Groundmark profiles HTTP Message Signatures
      <xref target="RFC9421"/> for the purpose of authenticating agent
      requests. This document does not define a bespoke signing
      mechanism: the signature base, the Signature-Input header field,
      and the Signature header field are all as defined by
      <xref target="RFC9421"/>. This section specifies which of the
      choices left open by <xref target="RFC9421"/> are constrained
      for Groundmark implementations.</t>

      <t>The use of <xref target="RFC9421"/> provides body integrity,
      authority binding, nonce semantics, and a well-reviewed
      canonicalization, and avoids introducing a novel cryptographic
      construction.</t>

      <section anchor="signing-algorithm">
        <name>Signing Algorithm</name>

        <t>Groundmark implementations MUST support Ed25519
        <xref target="RFC8032"/>, identified in Signature-Input by
        the algorithm name "ed25519" as registered in the "HTTP
        Signature Algorithms" registry established by
        <xref target="RFC9421"/>. Other algorithms MAY be used where
        both signer and verifier support them, but Ed25519 is the
        only mandatory-to-implement algorithm in this document.</t>
      </section>

      <section anchor="key-identification">
        <name>Key Identification</name>

        <t>The keyid signature parameter in Signature-Input MUST be
        one of the following two forms:</t>

        <ul>
          <li>The agent's fully qualified domain name (FQDN), in
          lowercase ASCII, with no "#" suffix. In this form, the
          relying party retrieves the _agentid record at the named
          domain; verification proceeds if and only if exactly one
          record is present at the label. (Equivalently, the bare-FQDN
          form is only valid outside of a key-rotation window.)</li>

          <li>The agent's FQDN followed by "#" and an opaque key
          identifier; for example,
          "purchasing.acmecorp.example#k2". In this form, the
          relying party retrieves the _agentid records at the named
          domain and selects the record whose "kid=" parameter matches
          the identifier after the "#". This form MUST be used
          whenever multiple _agentid records are concurrently
          published during key rotation.</li>
        </ul>

        <t>A relying party MUST reject a signature whose keyid does
        not resolve to exactly one usable _agentid record under the
        rules above.</t>
      </section>

      <section anchor="required-covered-components">
        <name>Required Covered Components</name>

        <t>A Groundmark-compliant signature MUST cover, at minimum,
        the following <xref target="RFC9421"/> derived components:</t>

        <ul>
          <li>@method</li>
          <li>@authority</li>
          <li>@target-uri</li>
        </ul>

        <t>A Groundmark-compliant signature on any HTTP request that
        carries a request body MUST additionally cover the
        Content-Digest HTTP field as defined in
        <xref target="RFC9530"/>. The signer MUST include a
        Content-Digest field in the signed request and MUST select an
        algorithm from the "Hash Algorithms for HTTP Digest Fields"
        registry; the algorithm "sha-256" is mandatory to implement
        for both signers and verifiers.</t>

        <t>A signature on a request with no body (for example, most
        GET requests) MAY omit Content-Digest.</t>
      </section>

      <section anchor="required-signature-parameters">
        <name>Required Signature Parameters</name>

        <t>The Signature-Input header field MUST include the following
        parameters:</t>

        <ul>
          <li>"created": the time of signing, as a UNIX timestamp in
          seconds.</li>
          <li>"keyid": as specified in
          <xref target="key-identification"/>.</li>
          <li>"alg": present and matching the algorithm associated
          with the public key in the _agentid record. (As a profile
          of <xref target="RFC9421"/>, this document REQUIRES "alg"
          to be present, although <xref target="RFC9421"/> itself
          permits the algorithm to be derived from the key.)</li>
        </ul>

        <t>The Signature-Input header field SHOULD include "expires",
        set to a time no more than 300 seconds after "created".
        Relying parties MUST reject signatures whose "created" time
        differs from the verifier's current clock by more than 300
        seconds in either direction, and MUST reject signatures whose
        "expires" time, if present, is in the past.</t>

        <t>For higher-risk transactions, relying parties SHOULD
        require a "nonce" parameter, MUST track recently observed
        nonces for the duration of the verification window, and MUST
        reject a signature whose nonce has been observed within that
        window. Maintenance of a nonce cache is a relying-party
        concern; the size of the cache and its eviction policy are out
        of scope for this specification.</t>
      </section>

      <section anchor="verification-steps">
        <name>Verification Steps</name>

        <t>A relying party verifying a Groundmark request signature
        MUST perform the following steps. Failure of any step MUST
        result in rejection of the signature.</t>

        <ol>
          <li>Parse the Signature-Input and Signature header fields
          per <xref target="RFC9421"/>. Confirm that the required
          covered components and signature parameters specified in
          <xref target="required-covered-components"/> and
          <xref target="required-signature-parameters"/> are
          present.</li>

          <li>Verify that "created" is within 300 seconds of the
          verifier's current clock, and that "expires", if present, is
          in the future.</li>

          <li>Resolve the agent domain from the keyid parameter and
          retrieve the appropriate _agentid TXT record using a
          DNSSEC-validating resolver. If DNSSEC validation fails or
          no usable record is present, reject the request.</li>

          <li>If a request body is present, verify that the value in
          the Content-Digest header field matches a digest of the
          received body, computed using an algorithm the verifier
          supports.</li>

          <li>Reconstruct the signature base per
          <xref target="RFC9421"/> from the covered components in the
          order indicated by Signature-Input.</li>

          <li>Verify the signature in the Signature header field
          against the reconstructed signature base using the public
          key from the _agentid record.</li>

          <li>If the verifier's policy requires attestations beyond
          identity verification, proceed to retrieve and evaluate
          _agentclaim records per
          <xref target="I-D.noss-jeftovic-groundmark-attestation"/>.</li>
        </ol>
      </section>
    </section>

    <section anchor="revocation">
      <name>Revocation</name>

      <t>Two independent revocation mechanisms are available to
      operators.</t>

      <dl>
        <dt>DNS-layer revocation</dt>
        <dd>The operator deletes or rotates the _agentid record. The
        agent identity becomes invalid within the record's TTL.
        Operators performing emergency revocation SHOULD also publish
        an empty replacement record or otherwise serve a known-unusable
        value during the TTL window, and SHOULD set TTLs to 300
        seconds or less in normal operation to minimize the worst-case
        revocation delay.</dd>

        <dt>Claim-layer revocation</dt>
        <dd>The IDSP marks a specific attestation as revoked at the
        attestation endpoint or its associated revocation endpoint.
        The agent identity remains usable; only the specific claim is
        invalidated. The mechanics of claim-layer revocation are
        specified in
        <xref target="I-D.noss-jeftovic-groundmark-attestation"/>.</dd>
      </dl>

      <t>These mechanisms are independent: deletion of an _agentid
      record revokes the entire agent identity (and implicitly
      invalidates all attestations referencing it); revocation of a
      single _agentclaim leaves the underlying identity intact.</t>

      <section anchor="key-rotation">
        <name>Key Rotation</name>

        <t>Operators rotating an agent signing key SHOULD use the
        following procedure to avoid request rejection during
        transition.</t>

        <t>If the operator's current _agentid record does not carry a
        "kid=" parameter, the operator MUST first publish a
        replacement of the current record that includes a "kid="
        parameter, and wait at least one TTL period before proceeding.
        This is because, during rotation, the validity rule of
        <xref target="agentid-processing"/> requires every published
        record to carry a "kid=".</t>

        <t>The rotation itself proceeds as follows:</t>

        <ol>
          <li>Generate the new key pair.</li>
          <li>Publish a second _agentid record at the agent domain,
          with a "kid=" parameter distinct from the existing
          record.</li>
          <li>Begin issuing requests with the new key. Requests MUST
          identify the new key via the keyid signature parameter using
          the "&lt;FQDN&gt;#&lt;kid&gt;" form specified in
          <xref target="key-identification"/>.</li>
          <li>After a transition period not less than twice the
          published _agentid TTL, remove the previous _agentid
          record.</li>
        </ol>

        <t>Relying parties supporting key rotation MUST select the
        _agentid record matching the keyid value carried in the
        signature. Relying parties MAY cache multiple _agentid records
        concurrently up to their respective TTLs.</t>
      </section>
    </section>

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

      <section anchor="security-dnssec">
        <name>DNSSEC Requirement</name>

        <t>All DNS lookups in the Groundmark verification flow MUST be
        performed using a DNSSEC-validating resolver
        <xref target="RFC4033"/>. Without DNSSEC validation, DNS cache
        poisoning attacks could substitute an attacker's public key
        for the legitimate agent's key, rendering the entire
        verification flow meaningless. Implementations MUST treat any
        of the following as a fatal verification failure: a SERVFAIL
        response from a validating resolver, an explicit AD=0 response
        from a recursive resolver that the implementation relies on
        for validation, or any other condition in which the
        implementation cannot confirm a validated answer.</t>

        <t>This DNSSEC requirement applies to operators publishing
        _agentid and _agentclaim records, and to IDSPs publishing
        their own signing keys. It does not require DNSSEC adoption
        across the general Internet. Entities making the deliberate
        decision to participate in Groundmark are the appropriate
        population to bear this operational requirement, and the
        requirement is proportionate to the trust being claimed.</t>

        <t>Implementations MAY use DNS-over-HTTPS
        <xref target="RFC8484"/> or other authenticated transport to
        a trusted recursive resolver as part of their DNSSEC strategy,
        but the validation chain itself MUST be verified end-to-end.</t>
      </section>

      <section anchor="replay-attacks">
        <name>Replay Attacks</name>

        <t>The 300-second "created" window in
        <xref target="RFC9421"/> signatures limits replay exposure.
        Relying parties servicing high-value transactions SHOULD
        require a "nonce" parameter and maintain a nonce cache for
        the duration of the verification window; this prevents
        replay within the window at the cost of relying-party
        state.</t>

        <t>The "@authority" covered component, required by
        <xref target="required-covered-components"/>, binds the
        signature to a specific target host, preventing
        cross-service replay even if the signature is otherwise
        valid.</t>
      </section>

      <section anchor="body-integrity">
        <name>Body Integrity</name>

        <t>For requests with a body, the Content-Digest
        covered-component requirement of
        <xref target="required-covered-components"/> provides body
        integrity: an intermediary that modifies the request body
        will invalidate the signature. Implementations MUST verify
        the Content-Digest value against the received body before
        accepting the signature as valid.</t>
      </section>

      <section anchor="security-ref-entropy">
        <name>ref= URL Entropy</name>

        <t>"ref=" URLs function as opaque bearer references to
        attestation content. The minimum 128-bit entropy requirement
        in <xref target="agentclaim-processing"/> defends against
        enumeration of IDSP attestation endpoints. IDSPs MUST use
        cryptographically random URL path components and MUST NOT
        use sequential, predictable, or low-entropy identifiers.
        Implementations SHOULD avoid unnecessary exposure of "ref="
        URLs in logs, telemetry, or third-party-accessible
        interfaces.</t>

        <t>The high-entropy "ref=" design does not by itself render
        attestation content confidential at the network layer;
        rather, it ensures that relying parties retrieve
        attestations by reference rather than by guessable
        enumeration. Confidentiality properties of attestation
        content are specified by the companion document.</t>
      </section>

      <section anchor="subdomain-takeover">
        <name>Subdomain Takeover and Endpoint Decommissioning</name>

        <t>"ref=" URLs are embedded in DNS TXT records and may be
        cached by relying parties. If an IDSP decommissions a
        subdomain referenced by outstanding attestations without
        first invalidating those attestations, a third party who
        later acquires the subdomain could serve fraudulent
        attestations at existing URLs. To mitigate this:</t>

        <ul>
          <li>IDSPs MUST NOT release a hostname used in attestation
          "ref=" URLs until all attestations referencing that
          hostname have either expired (per "exp=" in their
          _agentclaim records) or been explicitly revoked.</li>
          <li>IDSPs SHOULD serve HTTP 410 Gone responses at
          decommissioned attestation paths for a minimum of 90 days
          before releasing the hostname.</li>
          <li>Relying parties MUST treat a TLS certificate change or
          unreachable endpoint at a previously valid "ref=" URL as
          cause for re-checking the corresponding _agentclaim record
          and the IDSP's identity-discovery records.</li>
        </ul>

        <t>Additional revocation and decommissioning guidance specific
        to the IDSP role is given in
        <xref target="I-D.noss-jeftovic-groundmark-attestation"/>.</t>
      </section>

      <section anchor="key-compromise">
        <name>Key Compromise</name>

        <t>Compromise of an agent signing key permits an attacker to
        impersonate the agent until the corresponding _agentid record
        is removed and caches expire. To minimize exposure:</t>

        <ul>
          <li>Operators SHOULD set _agentid TTLs to 300 seconds or
          less.</li>
          <li>Operators SHOULD provision the rotation procedure of
          <xref target="key-rotation"/> in advance so that emergency
          key replacement can be performed without delay.</li>
          <li>Relying parties MUST NOT cache _agentid records beyond
          their DNS-declared TTL.</li>
        </ul>

        <t>This document defines no mechanism for an emergency "kill"
        signal distinct from DNS-level deletion. Operators requiring
        more aggressive revocation guarantees should consider running
        their authoritative nameservers with the capacity to make
        rapid zone updates and short TTLs.</t>
      </section>
    </section>

    <section anchor="privacy-considerations">
      <name>Privacy Considerations</name>

      <t>This section addresses the privacy properties of the protocol
      defined in this document, in the spirit of
      <xref target="RFC6973"/>. Privacy considerations arising from
      specific attestation types are the subject of the companion
      document.</t>

      <section anchor="org-disclosure">
        <name>Organizational Disclosure Model</name>

        <t>Groundmark's primary deployment model is organizational.
        The operator is, in the typical case, a company or other
        organization deploying agents in a commercial or operational
        context, under domains that already publish substantial
        public metadata: MX records, SPF, DKIM selectors, DMARC
        policy, CAA records, and (subject to applicable law)
        registrant data. The addition of _agentid and _agentclaim
        records extends this existing organizational-disclosure
        model, rather than introducing a new category of
        disclosure.</t>

        <t>What is publicly visible when an operator publishes
        Groundmark records is:</t>

        <ul>
          <li>The fact that the named agent domain participates in
          Groundmark.</li>
          <li>The agent's signing public key.</li>
          <li>The type of any attestations available for the agent
          (the "claim=" field) and the identity of the IDSP issuing
          them (the "idsp=" field).</li>
        </ul>

        <t>Attestation content itself is not in DNS. It is reachable
        only by following the high-entropy "ref=" URL, which is not
        enumerable from the DNS record alone.</t>
      </section>

      <section anchor="individual-operator">
        <name>Individual Operator Considerations</name>

        <t>The organizational framing above does not address the case
        of an individual operator (sole proprietor, freelancer, or
        hobbyist) deploying agents under a personal domain. A
        _agentclaim record indicating, for example, that a kyc-basic
        attestation exists under the operator's personal domain
        reveals compliance posture in a way that is qualitatively
        different from the same record under a corporate domain.</t>

        <t>For this case, the recommended pattern is provider-hosted
        agent identities, analogous to the WHOIS privacy proxy model
        long used in domain registration. An individual operator
        participating in Groundmark SHOULD publish agent identity
        records under a provider's domain rather than under a
        personal domain, where the provider's underlying relationship
        with the operator preserves the accountability chain that an
        IDSP-issued attestation depends on. This keeps the operator's
        personal domain outside the public record while preserving
        the attestation framework's accountability semantics.</t>

        <t>This is a recommendation, not a normative requirement;
        nothing in this specification prevents an individual operator
        from publishing Groundmark records under a personal domain if
        they choose.</t>
      </section>

      <section anchor="selective-disclosure">
        <name>Selective Disclosure</name>

        <t>The protocol publishes only public keys in _agentid and
        only attestation references (not values) in _agentclaim. The
        attestation framework specified in the companion document is
        built around minimal disclosure: attestation values are
        bounded predicates such as "the operator is over 18", not the
        underlying personal data.</t>
      </section>

      <section anchor="resolver-side">
        <name>Resolver-Side Observation</name>

        <t>DNS resolution of _agentid and _agentclaim records is, like
        any DNS lookup, observable by network operators on the path
        between the relying party and the authoritative servers.
        Relying parties concerned about this leakage SHOULD use
        authenticated, encrypted transports to their recursive
        resolver (such as DNS-over-HTTPS
        <xref target="RFC8484"/>).</t>
      </section>
    </section>

    <section anchor="operational-considerations">
      <name>Operational Considerations</name>

      <section anchor="caching-load">
        <name>Caching and Resolver Load</name>

        <t>Groundmark verification is designed to be amortized through
        caching, not performed in full on every request. A relying
        party that has recently verified a request from a given agent
        domain may have its _agentid record cached at the local
        resolver; an attestation fetched once may be valid for hours
        or days, subject to its "exp=" time and the IDSP's
        Cache-Control directives.</t>

        <t>To support this:</t>

        <ul>
          <li>IDSPs MUST set Cache-Control max-age values on
          attestation responses consistent with the attestation's
          expected freshness, and MUST NOT set values so short as to
          force effectively per-request revalidation. Specific
          normative guidance for IDSPs is given in the companion
          document.</li>
          <li>Relying parties SHOULD cache _agentid records and
          attestation payloads up to the lesser of the resource's
          stated lifetime and any local cache policy.</li>
          <li>Implementations operating at high transaction volumes
          (for example, serving requests from AI agent fleets) SHOULD
          prefer a resolver architecture that aggregates DNS lookups
          for an agent domain rather than re-resolving per
          request.</li>
        </ul>

        <t>The two-level structure (cheap, near-constant _agentid
        lookups; less frequent, cacheable attestation fetches) is
        intended to make Groundmark workable at scales characteristic
        of automated agent deployments.</t>
      </section>

      <section anchor="coexistence">
        <name>Coexistence with Other Protocols</name>

        <t>_agentid and _agentclaim are scoped underscored node names
        under <xref target="RFC8552"/>. They do not conflict with
        other underscore-labeled records published at the same
        domain, including _dmarc, _dkim, DANE TLSA records, or
        vendor-defined labels such as those used by
        <xref target="IoDNS"/>. An operator MAY simultaneously
        publish Groundmark identity records and IoDNS metadata
        records under the same agent domain without interaction at
        the DNS layer.</t>
      </section>
    </section>

    <section anchor="related-work">
      <name>Related Work</name>

      <t>This section positions Groundmark relative to other work in
      adjacent problem spaces. Groundmark is designed to compose with
      these specifications rather than to replace them.</t>

      <section anchor="rw-rfc9421">
        <name>HTTP Message Signatures (RFC 9421)</name>

        <t>Groundmark uses <xref target="RFC9421"/> for request
        authentication. It does not modify or extend
        <xref target="RFC9421"/>; it specifies a profile (covered
        components, required signature parameters, key identification
        convention) suitable for DNS-anchored agent identity.</t>
      </section>

      <section anchor="rw-dkim-dmarc">
        <name>DKIM and DMARC</name>

        <t>Groundmark's DNS publication pattern is modelled on DKIM
        <xref target="RFC6376"/>, which established the practical
        pattern of publishing a public key in a DNS TXT record under
        a reserved label for the purpose of application-layer
        signature verification. <xref target="RFC7489"/> (DMARC)
        demonstrates the extension of this pattern to policy
        publication. Groundmark applies the same pattern to agent
        identity rather than email authentication.</t>
      </section>

      <section anchor="rw-did-vc">
        <name>W3C Decentralized Identifiers and Verifiable Credentials</name>

        <t>Groundmark and the W3C identity ecosystem operate at
        different layers. Groundmark addresses operator-accountability
        discovery: a stable, DNS-anchored pointer to who stands behind
        an agent. Decentralized Identifiers (DIDs) and Verifiable
        Credentials (VCs) address identifier resolution and credential
        format and presentation. The two are composable: an IDSP
        operating within the Groundmark framework MAY issue a
        Verifiable Credential as its attestation payload and reference
        it via a Groundmark "ref=" URL, and an operator MAY publish a
        DID in addition to or instead of a domain-anchored identity
        by extending _agentid semantics under future versions of this
        specification. Nothing in Groundmark precludes any of these
        compositions.</t>
      </section>

      <section anchor="rw-ans-dnsaid">
        <name>Agent Name Service (ANSv2) and DNS-AID</name>

        <t>Several other DNS-anchored agent-discovery proposals exist
        as Internet-Drafts at the time of writing. ANSv2 addresses
        agent naming and versioning; DNS-AID addresses DNS-based
        agent discovery using SVCB records. Groundmark addresses
        operator identity and attestation under different
        underscored DNS labels and may coexist with these protocols
        at the same domain. The architectural distinction is that
        ANSv2 and DNS-AID address what an agent is and how it is
        reached, while Groundmark addresses who is accountable for
        the agent and what has been verified about that accountable
        party.</t>
      </section>

      <section anchor="rw-x402-iodns">
        <name>x402 and IoDNS</name>

        <t><xref target="X402"/> defines an HTTP-native payment
        protocol in which an agent receiving an HTTP 402 response
        pays in stablecoins and retries the request.
        <xref target="IoDNS"/> is a DNS metadata framework that
        publishes structured machine-readable documents at a
        domain, including payment endpoint discovery as one
        document type. Groundmark's _agentid and _agentclaim
        records coexist with IoDNS metadata records and with any
        x402 discovery records at the same agent domain, under
        different underscored labels. An agent presenting both
        Groundmark request signatures and IoDNS-advertised payment
        capability provides relying parties with operator
        accountability and payment routing from a single DNS
        hierarchy.</t>
      </section>
    </section>

    <section anchor="iana-considerations">
      <name>IANA Considerations</name>

      <section anchor="iana-underscored">
        <name>Underscored and Globally Scoped DNS Node Names Registry</name>

        <t>IANA is requested to add the following entries to the
        "Underscored and Globally Scoped DNS Node Names" registry
        established by <xref target="RFC8552"/>:</t>

        <table>
          <name>Groundmark underscore label registrations</name>
          <thead>
            <tr><th>RR Type</th><th>_NODE NAME</th><th>Reference</th></tr>
          </thead>
          <tbody>
            <tr><td>TXT</td><td>_agentid</td><td>This document</td></tr>
            <tr><td>TXT</td><td>_agentclaim</td><td>This document</td></tr>
          </tbody>
        </table>

        <t>The registry operates under Expert Review per
        <xref target="RFC8552"/>.</t>
      </section>

      <section anchor="iana-http-sig">
        <name>HTTP Signature Algorithms</name>

        <t>This document does not define new entries in the "HTTP
        Signature Algorithms" registry established by
        <xref target="RFC9421"/>. Groundmark implementations use
        registered algorithms only; the mandatory-to-implement
        algorithm "ed25519" is already registered by
        <xref target="RFC9421"/>.</t>
      </section>
    </section>

  </middle>

  <back>

    <references>
      <name>References</name>

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

        <reference anchor="RFC4033" target="https://www.rfc-editor.org/rfc/rfc4033">
          <front>
            <title>DNS Security Introduction and Requirements</title>
            <author initials="R." surname="Arends"/>
            <author initials="R." surname="Austein"/>
            <author initials="M." surname="Larson"/>
            <author initials="D." surname="Massey"/>
            <author initials="S." surname="Rose"/>
            <date year="2005" month="March"/>
          </front>
          <seriesInfo name="RFC" value="4033"/>
        </reference>

        <reference anchor="RFC4648" target="https://www.rfc-editor.org/rfc/rfc4648">
          <front>
            <title>The Base16, Base32, and Base64 Data Encodings</title>
            <author initials="S." surname="Josefsson"/>
            <date year="2006" month="October"/>
          </front>
          <seriesInfo name="RFC" value="4648"/>
        </reference>

        <reference anchor="RFC8032" target="https://www.rfc-editor.org/rfc/rfc8032">
          <front>
            <title>Edwards-Curve Digital Signature Algorithm (EdDSA)</title>
            <author initials="S." surname="Josefsson"/>
            <author initials="I." surname="Liusvaara"/>
            <date year="2017" month="January"/>
          </front>
          <seriesInfo name="RFC" value="8032"/>
        </reference>

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

        <reference anchor="RFC8552" target="https://www.rfc-editor.org/rfc/rfc8552">
          <front>
            <title>Scoped Interpretation of DNS Resource Records through "Underscored" Naming of Attribute Leaves</title>
            <author initials="D." surname="Crocker"/>
            <date year="2019" month="March"/>
          </front>
          <seriesInfo name="BCP" value="222"/>
          <seriesInfo name="RFC" value="8552"/>
        </reference>

        <reference anchor="RFC9421" target="https://www.rfc-editor.org/rfc/rfc9421">
          <front>
            <title>HTTP Message Signatures</title>
            <author initials="A." surname="Backman" role="editor"/>
            <author initials="J." surname="Richer" role="editor"/>
            <author initials="M." surname="Sporny"/>
            <date year="2024" month="February"/>
          </front>
          <seriesInfo name="RFC" value="9421"/>
        </reference>

        <reference anchor="RFC9530" target="https://www.rfc-editor.org/rfc/rfc9530">
          <front>
            <title>Digest Fields</title>
            <author initials="R." surname="Polli"/>
            <author initials="L." surname="Pardue"/>
            <date year="2024" month="February"/>
          </front>
          <seriesInfo name="RFC" value="9530"/>
        </reference>
      </references>

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

        <reference anchor="RFC6376" target="https://www.rfc-editor.org/rfc/rfc6376">
          <front>
            <title>DomainKeys Identified Mail (DKIM) Signatures</title>
            <author initials="D." surname="Crocker" role="editor"/>
            <author initials="T." surname="Hansen" role="editor"/>
            <author initials="M." surname="Kucherawy" role="editor"/>
            <date year="2011" month="September"/>
          </front>
          <seriesInfo name="STD" value="76"/>
          <seriesInfo name="RFC" value="6376"/>
        </reference>

        <reference anchor="RFC6973" target="https://www.rfc-editor.org/rfc/rfc6973">
          <front>
            <title>Privacy Considerations for Internet Protocols</title>
            <author initials="A." surname="Cooper"/>
            <author initials="H." surname="Tschofenig"/>
            <author initials="B." surname="Aboba"/>
            <author initials="J." surname="Peterson"/>
            <author initials="J." surname="Morris"/>
            <author initials="M." surname="Hansen"/>
            <author initials="R." surname="Smith"/>
            <date year="2013" month="July"/>
          </front>
          <seriesInfo name="RFC" value="6973"/>
        </reference>

        <reference anchor="RFC7489" target="https://www.rfc-editor.org/rfc/rfc7489">
          <front>
            <title>Domain-based Message Authentication, Reporting, and Conformance (DMARC)</title>
            <author initials="M." surname="Kucherawy" role="editor"/>
            <author initials="E." surname="Zwicky" role="editor"/>
            <date year="2015" month="March"/>
          </front>
          <seriesInfo name="RFC" value="7489"/>
        </reference>

        <reference anchor="RFC8484" target="https://www.rfc-editor.org/rfc/rfc8484">
          <front>
            <title>DNS Queries over HTTPS (DoH)</title>
            <author initials="P." surname="Hoffman"/>
            <author initials="P." surname="McManus"/>
            <date year="2018" month="October"/>
          </front>
          <seriesInfo name="RFC" value="8484"/>
        </reference>

        <reference anchor="I-D.noss-jeftovic-groundmark-attestation">
          <front>
            <title>Groundmark Attestation Framework and Identity Service Provider Profile</title>
            <author initials="E." surname="Noss" fullname="Elliot Noss"/>
            <author initials="M." surname="Jeftovic" fullname="Mark Jeftovic"/>
            <date year="2026"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-noss-jeftovic-groundmark-attestation-00"/>
        </reference>

        <reference anchor="IoDNS" target="https://github.com/easydns/iodns">
          <front>
            <title>Intelligence-over-DNS (IoDNS)</title>
            <author initials="M." surname="Jeftovic" fullname="Mark Jeftovic"/>
            <date year="2025"/>
          </front>
        </reference>

        <reference anchor="X402" target="https://x402.org">
          <front>
            <title>x402: An HTTP-Native Payment Protocol</title>
            <author>
              <organization>Coinbase</organization>
            </author>
            <date year="2025"/>
          </front>
        </reference>

        <reference anchor="Cameron2005" target="https://www.identityblog.com/?p=352">
          <front>
            <title>The Laws of Identity</title>
            <author initials="K." surname="Cameron" fullname="Kim Cameron"/>
            <date year="2005" month="May"/>
          </front>
        </reference>
      </references>
    </references>

    <section anchor="acknowledgements" numbered="false">
      <name>Acknowledgements</name>

      <t>The authors thank Doc Searls for substantive review of
      earlier drafts, and the broader registrar and DNS community
      whose infrastructure makes this approach viable. The authors
      thank Kim Cameron, whose Laws of Identity
      <xref target="Cameron2005"/> informed the design of the
      attestation framework defined in the companion document.</t>
    </section>

    <section anchor="changelog" numbered="false">
      <name>Change Log</name>

      <section anchor="cl-00" numbered="false">
        <name>-00</name>

        <ul>
          <li>Initial submission.</li>
          <li>Split from prior draft
          draft-noss-groundmark-agent-identity-dns into a narrow core
          protocol document plus a companion attestation framework
          document.</li>
          <li>Replaced the bespoke Agent-Identity HTTP header with a
          profile of HTTP Message Signatures
          <xref target="RFC9421"/> including required coverage of
          @method, @authority, @target-uri, and Content-Digest
          <xref target="RFC9530"/> for requests with bodies.</li>
          <li>Added explicit Non-Goals section.</li>
          <li>Added Privacy Considerations and Operational
          Considerations sections.</li>
          <li>Added Related Work section.</li>
          <li>Specified key rotation procedure using a "kid="
          parameter and the keyid signature parameter.</li>
        </ul>
      </section>
    </section>

  </back>
</rfc>
