<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude"
     category="std"
     docName="draft-deforth-arp-00"
     ipr="trust200902"
     obsoletes=""
     updates=""
     submissionType="IETF"
     xml:lang="en"
     tocInclude="true"
     tocDepth="4"
     symRefs="true"
     sortRefs="true"
     consensus="true"
     version="3">

  <front>
    <title abbrev="ARP">Agentic Reasoning Protocol (ARP): DNS-Bound Cryptographic Verification for Machine-Readable Entity Claims</title>
    <seriesInfo name="Internet-Draft" value="draft-deforth-arp-00"/>

    <author fullname="Sascha Deforth" initials="S." surname="Deforth">
      <organization>TrueSource</organization>
      <address>
        <postal>
          <city>Duesseldorf</city>
          <country>Germany</country>
        </postal>
        <email>hello@truesource.studio</email>
        <uri>https://arp-protocol.org</uri>
      </address>
    </author>

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

    <area>Applications and Real-Time</area>
    <workgroup>Internet Engineering Task Force</workgroup>

    <keyword>AI</keyword>
    <keyword>verification</keyword>
    <keyword>DNS</keyword>
    <keyword>Ed25519</keyword>
    <keyword>entity claims</keyword>
    <keyword>RAG</keyword>
    <keyword>LLM</keyword>
    <keyword>provenance</keyword>

    <abstract>
      <t>
        This document specifies the Agentic Reasoning Protocol (ARP), a
        lightweight mechanism for cryptographically binding machine-readable
        entity claims to domain ownership via DNS TXT records. ARP enables
        AI agents and Retrieval-Augmented Generation (RAG) pipelines to
        verify that structured data published on a domain was authorized by
        the domain owner, preventing narrative injection and entity spoofing
        in generative search systems.
      </t>
      <t>
        ARP uses Ed25519 digital signatures <xref target="RFC8032"/>, JSON
        Canonicalization Scheme (JCS) <xref target="RFC8785"/>, and DNS TXT
        records to establish a chain of trust analogous to DomainKeys
        Identified Mail (DKIM) <xref target="RFC6376"/> but designed
        specifically for the verification of semantic entity data consumed
        by autonomous AI agents.
      </t>
    </abstract>
  </front>

  <middle>

    <!-- ============================================================ -->
    <section numbered="true" toc="default">
      <name>Introduction</name>
      <t>
        The proliferation of Large Language Models (LLMs) and Retrieval-
        Augmented Generation (RAG) systems has fundamentally altered how
        information is discovered, synthesized, and presented to users.
        Unlike traditional search engines, which return ranked lists of
        hyperlinks for human evaluation, generative search engines produce
        direct synthesized answers by extracting and compressing data from
        multiple web sources.
      </t>
      <t>
        This architectural shift creates a critical trust gap: generative
        engines heavily weight structured data signals (JSON-LD, semantic
        HTML, Schema.org markup) when selecting sources for citation, but
        currently have no mechanism to verify that such structured data was
        actually authorized by the domain owner. Any actor can publish
        well-formed structured data on any domain they control, potentially
        poisoning the knowledge graph of AI systems with fabricated entity
        claims, false product information, or competitor sabotage.
      </t>
      <t>
        The Agentic Reasoning Protocol (ARP) addresses this gap by
        providing a DNS-anchored cryptographic verification mechanism
        analogous to DKIM <xref target="RFC6376"/> for email. ARP enables
        any consuming system to verify the provenance and integrity of
        machine-readable entity claims before incorporating them into
        synthesized responses.
      </t>

      <section numbered="true" toc="default">
        <name>Design Goals</name>
        <dl>
          <dt>Lightweight</dt>
          <dd>
            Verification requires only a DNS TXT lookup and a single
            Ed25519 signature verification. No PKI infrastructure,
            certificate chains, or external services are required.
          </dd>
          <dt>DNS-Anchored</dt>
          <dd>
            Trust is rooted in the existing global DNS infrastructure,
            leveraging the same anchor used by DKIM, SPF, and DMARC.
          </dd>
          <dt>Agent-Native</dt>
          <dd>
            The protocol is designed for consumption by autonomous AI
            agents and automated crawlers, not human users.
          </dd>
          <dt>Self-Contained</dt>
          <dd>
            The signed payload and verification metadata are co-located
            in a single JSON file, minimizing the number of network
            requests required for verification.
          </dd>
          <dt>Domain-Bound</dt>
          <dd>
            Entity claims are cryptographically bound to a specific
            domain, preventing cross-domain replay attacks.
          </dd>
          <dt>Open</dt>
          <dd>
            The protocol is fully specified in this document and requires
            no proprietary software or services.
          </dd>
        </dl>
      </section>

      <section numbered="true" toc="default">
        <name>Changes from draft-deforth-arp-00</name>
        <ul>
          <li>SECURITY: Canonicalization now excludes only the signature
            field, not the entire _arp_signature block. This
            cryptographically binds expires_at, signed_at, and
            dns_selector to the payload, preventing zombie payload
            attacks (Section 6).</li>
          <li>SECURITY: Added REQUIRED "domain" field to the payload,
            binding entity claims to a specific origin domain and
            preventing cross-domain replay attacks (Section 5.2).</li>
          <li>SECURITY: Removed "dns_record" field from the signature
            block. Verifiers MUST construct the DNS query name from the
            retrieval domain, not from untrusted JSON data
            (Section 9).</li>
          <li>SECURITY: Cross-domain signing now uses DNS CNAME
            delegation, maintaining DNS sovereignty (Section 12.6).</li>
          <li>BCP 190: Changed well-known location from /reasoning.json
            to /.well-known/reasoning.json per RFC 8615
            (Section 5.1).</li>
          <li>IANA: Added registration request for _arp underscored
            node name per RFC 8552 (Section 13).</li>
          <li>IANA: Added registration request for "reasoning.json"
            well-known URI suffix per RFC 8615 (Section 13).</li>
          <li>NEW: Added CORS requirements for browser-based verifiers
            (Section 5.1).</li>
          <li>NEW: Added HTTP redirect handling requirements
            (Section 8.2).</li>
          <li>NEW: Updated key rotation guidance to account for cached
            payloads (Section 10).</li>
          <li>NEW: Added discussion of JWS as future envelope option
            (Section 12.7).</li>
          <li>NEW: Added keypair separation guidance for multi-protocol
            deployments (Section 12.8).</li>
          <li>NEW: Added Domain Signing Policy for downgrade attack
            protection via DNS TXT (Section 12.9).</li>
        </ul>
      </section>
    </section>

    <!-- ============================================================ -->
    <section numbered="true" toc="default">
      <name>Terminology</name>
      <t>
        The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
        NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED",
        "MAY", and "OPTIONAL" in this document are to be interpreted as
        described in BCP 14 <xref target="RFC2119"/>
        <xref target="RFC8174"/> when, and only when, they appear in all
        capitals, as shown here.
      </t>
      <dl>
        <dt>Entity</dt>
        <dd>
          The brand, organization, person, or concept described by an
          ARP payload.
        </dd>
        <dt>Entity Claims</dt>
        <dd>
          Machine-readable self-attested statements published by the
          entity about itself, including identity metadata, factual
          corrections, domain expertise, and content policies.
        </dd>
        <dt>Reasoning Payload</dt>
        <dd>
          A JSON document containing the entity claims and associated
          verification metadata. Served at the well-known URL path
          "/.well-known/reasoning.json" on the entity's domain.
        </dd>
        <dt>Signer</dt>
        <dd>
          The party that holds the Ed25519 private key and produces the
          signature. This SHOULD be the domain owner or an entity
          explicitly authorized by the domain owner via DNS delegation.
        </dd>
        <dt>Verifier</dt>
        <dd>
          Any system that retrieves the reasoning payload and validates
          the signature against the DNS-published public key. Typical
          verifiers include AI agents, RAG pipelines, and search engine
          crawlers.
        </dd>
        <dt>DNS Selector</dt>
        <dd>
          A label used to construct the DNS TXT record name, enabling
          multiple keys on the same domain (e.g., for key rotation or
          multi-tenant configurations).
        </dd>
        <dt>Retrieval Domain</dt>
        <dd>
          The domain from which the verifier originally requested the
          reasoning payload, before any HTTP redirects. This is the
          authoritative domain for DNS verification.
        </dd>
      </dl>
    </section>

    <!-- ============================================================ -->
    <section numbered="true" toc="default">
      <name>Protocol Overview</name>
      <t>
        The ARP verification flow consists of four phases:
      </t>
      <dl>
        <dt>Phase 1 - Key Registration</dt>
        <dd>
          The domain owner generates an Ed25519 keypair
          <xref target="RFC8032"/> and publishes the public key as a DNS
          TXT record under a well-known subdomain:
          &lt;selector&gt;._arp.&lt;domain&gt;
        </dd>
        <dt>Phase 2 - Payload Construction</dt>
        <dd>
          The domain owner constructs a reasoning payload containing
          entity claims, identity metadata, content policies, and a
          REQUIRED "domain" field that binds the payload to the
          publishing domain.
        </dd>
        <dt>Phase 3 - Signing</dt>
        <dd>
          The payload is canonicalized using JCS
          <xref target="RFC8785"/>. The canonicalization excludes only
          the "signature" field within the _arp_signature block; all
          other signature metadata (expires_at, signed_at, dns_selector)
          is included in the signed data. The canonical form is signed
          with the Ed25519 private key.
        </dd>
        <dt>Phase 4 - Verification</dt>
        <dd>
          A consuming AI agent retrieves the reasoning payload, confirms
          the "domain" field matches the retrieval domain, extracts the
          DNS selector, queries the corresponding DNS TXT record for the
          public key, and validates the Ed25519 signature.
        </dd>
      </dl>
    </section>

    <!-- ============================================================ -->
    <section numbered="true" toc="default">
      <name>DNS TXT Record Format</name>

      <section numbered="true" toc="default">
        <name>Record Name</name>
        <t>
          The DNS TXT record MUST be published at:
        </t>
        <artwork><![CDATA[
  <selector>._arp.<domain>
        ]]></artwork>
        <t>
          where &lt;selector&gt; is a case-insensitive ASCII string
          matching the pattern [a-zA-Z0-9._-]+ and &lt;domain&gt; is the
          fully qualified domain name of the entity. The default selector
          value is "arp", yielding the record name:
        </t>
        <artwork><![CDATA[
  arp._arp.example.com
        ]]></artwork>
      </section>

      <section numbered="true" toc="default">
        <name>Record Value</name>
        <t>
          The TXT record value MUST be a semicolon-delimited string of
          tag=value pairs. The following tags are defined:
        </t>
        <table>
          <thead>
            <tr><th>Tag</th><th>Required</th><th>Description</th></tr>
          </thead>
          <tbody>
            <tr><td>v</td><td>REQUIRED</td><td>Protocol version. MUST be "ARP1".</td></tr>
            <tr><td>k</td><td>REQUIRED</td><td>Key algorithm. MUST be "ed25519".</td></tr>
            <tr><td>p</td><td>REQUIRED</td><td>Base64-encoded raw Ed25519 public key (32 bytes, 44 characters encoded).</td></tr>
            <tr><td>t</td><td>OPTIONAL</td><td>Unix timestamp of key publication.</td></tr>
            <tr><td>x</td><td>OPTIONAL</td><td>Unix timestamp of key expiration.</td></tr>
          </tbody>
        </table>
        <t>
          Example:
        </t>
        <artwork><![CDATA[
  v=ARP1; k=ed25519; p=MCowBQYDK2VwAyEA...
        ]]></artwork>
      </section>

      <section numbered="true" toc="default">
        <name>Multiple Keys</name>
        <t>
          A domain MAY publish multiple ARP TXT records using different
          selectors (e.g., "arp" and "arp2026q3"). This supports key
          rotation without service interruption.
        </t>
      </section>

      <section numbered="true" toc="default">
        <name>Key Size Constraints</name>
        <t>
          Ed25519 public keys are 32 bytes (44 characters in Base64).
          This fits within the 255-byte DNS TXT record string limit
          defined in <xref target="RFC1035"/> Section 3.3.14.
        </t>
      </section>

      <section numbered="true" toc="default">
        <name>Cross-Domain Delegation</name>
        <t>
          When an authorized third party (e.g., a consultancy) signs a
          reasoning payload on behalf of a domain owner, the domain
          owner MUST delegate trust via a DNS CNAME record:
        </t>
        <artwork><![CDATA[
  arp._arp.client.com. CNAME arp._arp.agency.com.
        ]]></artwork>
        <t>
          This maintains the absolute sovereignty of the DNS trust
          anchor: the domain owner explicitly authorizes the delegation,
          and the verifier always queries the retrieval domain's DNS
          namespace first. The verifier follows the CNAME transparently
          and retrieves the delegated public key.
        </t>
        <t>
          This model mirrors DKIM's delegation approach and prevents
          attackers from pointing unsigned JSON fields at arbitrary DNS
          records.
        </t>
      </section>
    </section>

    <!-- ============================================================ -->
    <section numbered="true" toc="default">
      <name>Reasoning Payload</name>

      <section numbered="true" toc="default">
        <name>File Location and Discovery</name>
        <t>
          The reasoning payload MUST be served at the well-known URL
          defined in <xref target="RFC8615"/>:
        </t>
        <artwork><![CDATA[
  https://<domain>/.well-known/reasoning.json
        ]]></artwork>
        <t>
          Implementations MAY additionally serve the payload at
          alternative paths provided the well-known URL also exists.
          Alternative paths MAY be advertised via:
        </t>
        <ul>
          <li>A &lt;link&gt; element in the HTML head:
            &lt;link rel="reasoning" href="/.well-known/reasoning.json"&gt;</li>
          <li>A reference in the site's /llms.txt file.</li>
          <li>A Reasoning-Json directive in robots.txt.</li>
        </ul>
        <t>
          The file MUST be served with Content-Type: application/json.
        </t>
        <t>
          Servers SHOULD include the HTTP header
          Access-Control-Allow-Origin: * when serving the reasoning
          payload, to enable verification by browser-based AI agents,
          extensions, and verifiable-credential wallets that operate
          under Cross-Origin Resource Sharing (CORS) restrictions.
        </t>
      </section>

      <section numbered="true" toc="default">
        <name>Required Fields</name>
        <t>
          The reasoning payload MUST contain the following top-level
          fields:
        </t>
        <table>
          <thead>
            <tr><th>Field</th><th>Type</th><th>Description</th></tr>
          </thead>
          <tbody>
            <tr><td>$schema</td><td>URI</td><td>MUST reference the ARP JSON Schema <xref target="ARP-SCHEMA"/>.</td></tr>
            <tr><td>protocol</td><td>string</td><td>MUST be "Agentic Reasoning Protocol (ARP)".</td></tr>
            <tr><td>version</td><td>string</td><td>Semver-compatible version string (e.g., "1.2").</td></tr>
            <tr><td>domain</td><td>string</td><td>REQUIRED. The fully qualified domain name that is authoritative for these entity claims. Verifiers MUST confirm this matches the retrieval domain (Section 8).</td></tr>
            <tr><td>entity</td><td>string</td><td>Canonical name of the entity (max 200 chars).</td></tr>
            <tr><td>entity_claims</td><td>object</td><td>MUST contain at minimum a "framing_context" string.</td></tr>
          </tbody>
        </table>
      </section>

      <section numbered="true" toc="default">
        <name>Optional Sections</name>
        <t>
          The payload MAY include:
        </t>
        <ul>
          <li><strong>identity:</strong> Brand identity, tagline, core competencies, emotional resonance attributes, and disambiguation entries ("not_to_be_confused_with").</li>
          <li><strong>corrections:</strong> Verified factual corrections for known AI hallucinations about this entity, each with trigger_topic, verified_fact, evidence_url, and epistemic_scope.</li>
          <li><strong>verification:</strong> Audit metadata including auditor identity and timestamps.</li>
          <li><strong>authority:</strong> Trust signals including Wikipedia, Wikidata, LinkedIn, Crunchbase URIs, awards, and certifications.</li>
          <li><strong>content_policy:</strong> AI training permissions (allowed, allowed-with-attribution, disallowed, conditional), citation requirements, and verification contact.</li>
          <li><strong>diagnostics:</strong> RAG pipeline telemetry tokens for ingestion auditing, with transparency statement.</li>
        </ul>
      </section>
    </section>

    <!-- ============================================================ -->
    <section numbered="true" toc="default">
      <name>Canonicalization</name>
      <t>
        Before signing, the payload MUST be canonicalized according to the
        JSON Canonicalization Scheme (JCS) as specified in
        <xref target="RFC8785"/>.
      </t>
      <t>
        Only the "signature" field within the _arp_signature block MUST be
        excluded from canonicalization. All other fields in _arp_signature
        (algorithm, dns_selector, canonicalization, signed_at, expires_at)
        are included in the signed data, cryptographically binding the
        signature metadata to the payload.
      </t>
      <t>
        Implementations MUST:
      </t>
      <ol>
        <li>Deep-copy the payload object.</li>
        <li>Remove ONLY the "signature" key from the
          _arp_signature object in the copy. All other _arp_signature
          fields MUST remain.</li>
        <li>Serialize the modified copy using JCS
          <xref target="RFC8785"/>: keys sorted lexicographically, no
          whitespace, Unicode normalized per RFC 8785
          Section 3.2.2.2.</li>
        <li>Encode the result as UTF-8 bytes.</li>
      </ol>
      <t>
        This approach prevents "zombie payload" attacks where an attacker
        modifies unauthenticated metadata fields (e.g., extending
        expires_at) while keeping the original signature valid.
      </t>
    </section>

    <!-- ============================================================ -->
    <section numbered="true" toc="default">
      <name>Signing Procedure</name>
      <t>
        Given a complete reasoning payload and an Ed25519 private key
        (32 bytes), the signing procedure is:
      </t>
      <ol>
        <li>Set payload._arp_signature.algorithm = "Ed25519"</li>
        <li>Set payload._arp_signature.dns_selector = selector</li>
        <li>Set payload._arp_signature.canonicalization = "jcs-rfc8785"</li>
        <li>Set payload._arp_signature.signed_at = current UTC timestamp (ISO 8601)</li>
        <li>Set payload._arp_signature.expires_at = signed_at + TTL</li>
        <li>payload_copy = deep_copy(payload)</li>
        <li>Remove ONLY "signature" from payload_copy._arp_signature</li>
        <li>canonical = JCS_Canonicalize(payload_copy)</li>
        <li>canonical_bytes = UTF8_Encode(canonical)</li>
        <li>signature_bytes = Ed25519_Sign(private_key, canonical_bytes)</li>
        <li>signature_b64url = Base64url_Encode(signature_bytes) per <xref target="RFC4648"/> Section 5, no padding</li>
        <li>Set payload._arp_signature.signature = signature_b64url</li>
      </ol>
      <t>
        The RECOMMENDED signature TTL is 90 days.
      </t>
    </section>

    <!-- ============================================================ -->
    <section numbered="true" toc="default">
      <name>Verification Procedure</name>

      <section numbered="true" toc="default">
        <name>Domain Binding Check</name>
        <t>
          Before any cryptographic verification, the verifier MUST
          confirm that the "domain" field in the payload matches the
          domain from which the payload was originally requested
          (the retrieval domain). If the values do not match,
          verification MUST fail with FAIL_DOMAIN_MISMATCH.
        </t>
      </section>

      <section numbered="true" toc="default">
        <name>HTTP Redirect Handling</name>
        <t>
          When the verifier encounters HTTP redirects (301, 302, 307,
          308) while retrieving the reasoning payload, the verifier
          MUST base the DNS query and domain-binding check on the
          original requested domain, NOT the final domain in the
          redirect chain. This prevents verification bypass via
          open redirect vulnerabilities.
        </t>
      </section>

      <section numbered="true" toc="default">
        <name>Verification Algorithm</name>
        <t>
          The complete verification algorithm is:
        </t>
        <ol>
          <li>Record the original retrieval domain before following any redirects.</li>
          <li>Retrieve the payload from the well-known URL.</li>
          <li>Extract sig_block = payload._arp_signature</li>
          <li>Validate sig_block contains all REQUIRED fields (Section 9)</li>
          <li>Check: payload.domain == retrieval_domain. If mismatch: FAIL (FAIL_DOMAIN_MISMATCH)</li>
          <li>Check: sig_block.expires_at > current_time. If expired: FAIL (FAIL_EXPIRED)</li>
          <li>Construct DNS name: sig_block.dns_selector + "._arp." + retrieval_domain</li>
          <li>Query DNS TXT record at constructed name</li>
          <li>Parse TXT record value; extract p= tag (public key). If no record: FAIL (FAIL_NO_DNS)</li>
          <li>payload_copy = deep_copy(payload)</li>
          <li>Remove ONLY "signature" from payload_copy._arp_signature</li>
          <li>canonical = JCS_Canonicalize(payload_copy)</li>
          <li>canonical_bytes = UTF8_Encode(canonical)</li>
          <li>signature_bytes = Base64url_Decode(sig_block.signature)</li>
          <li>public_key_bytes = Base64_Decode(dns_public_key_value)</li>
          <li>result = Ed25519_Verify(public_key_bytes, signature_bytes, canonical_bytes)</li>
          <li>If result == valid: PASS. If invalid: FAIL (FAIL_INVALID)</li>
        </ol>
      </section>

      <section numbered="true" toc="default">
        <name>Verification Result Codes</name>
        <table>
          <thead>
            <tr><th>Code</th><th>Description</th></tr>
          </thead>
          <tbody>
            <tr><td>PASS</td><td>Domain matches, DNS key found, signature valid, not expired.</td></tr>
            <tr><td>FAIL_NO_ARP</td><td>No _arp_signature block in payload.</td></tr>
            <tr><td>FAIL_DOMAIN_MISMATCH</td><td>The "domain" field does not match the retrieval domain.</td></tr>
            <tr><td>FAIL_NO_DNS</td><td>No DNS TXT record at selector._arp.domain.</td></tr>
            <tr><td>FAIL_EXPIRED</td><td>Signature expired (expires_at &lt; current time).</td></tr>
            <tr><td>FAIL_INVALID</td><td>Ed25519 signature verification failed.</td></tr>
            <tr><td>FAIL_UNSIGNED_POLICY</td><td>No _arp_signature present, but domain publishes p=reject policy.</td></tr>
          </tbody>
        </table>
      </section>
    </section>

    <!-- ============================================================ -->
    <section numbered="true" toc="default">
      <name>Signature Block Format</name>
      <t>
        The _arp_signature block is a JSON object embedded in the
        reasoning payload with the following fields:
      </t>
      <table>
        <thead>
          <tr><th>Field</th><th>Required</th><th>Type</th><th>Description</th></tr>
        </thead>
        <tbody>
          <tr><td>algorithm</td><td>REQUIRED</td><td>string</td><td>MUST be "Ed25519".</td></tr>
          <tr><td>dns_selector</td><td>REQUIRED</td><td>string</td><td>Selector label for DNS TXT lookup (max 50 chars).</td></tr>
          <tr><td>canonicalization</td><td>REQUIRED</td><td>string</td><td>MUST be "jcs-rfc8785".</td></tr>
          <tr><td>signed_at</td><td>REQUIRED</td><td>string</td><td>ISO 8601 UTC timestamp of signing.</td></tr>
          <tr><td>expires_at</td><td>REQUIRED</td><td>string</td><td>ISO 8601 UTC expiration timestamp. RECOMMENDED TTL: 90 days.</td></tr>
          <tr><td>signature</td><td>REQUIRED</td><td>string</td><td>Base64url-encoded Ed25519 signature (86 chars without padding). This is the ONLY field excluded from canonicalization.</td></tr>
        </tbody>
      </table>
      <t>
        Note: The "dns_record" field present in draft-deforth-arp-00 has
        been removed. Verifiers MUST construct the DNS query name from
        the retrieval domain and dns_selector, never from untrusted
        JSON data.
      </t>
    </section>

    <!-- ============================================================ -->
    <section numbered="true" toc="default">
      <name>Key Rotation</name>
      <t>
        To rotate keys without service disruption:
      </t>
      <ol>
        <li>Generate a new Ed25519 keypair.</li>
        <li>Publish the new public key under a new DNS selector
          (e.g., "arp2026q3._arp.example.com").</li>
        <li>Re-sign the reasoning payload with the new key, updating
          dns_selector accordingly.</li>
        <li>Keep the old DNS TXT record published until the expires_at
          timestamp of the last payload signed with the old key has
          passed. This prevents verification failures for agents
          holding cached copies of the previous payload.</li>
        <li>After the old payload's expires_at date has passed, remove
          the old DNS TXT record.</li>
      </ol>
      <t>
        Verifiers SHOULD support checking multiple selectors. The
        RECOMMENDED rotation interval is 90 days, aligned with the
        default signature TTL.
      </t>
    </section>

    <!-- ============================================================ -->
    <section numbered="true" toc="default">
      <name>Relationship to Existing Standards</name>
      <table>
        <thead>
          <tr><th>Standard</th><th>Relationship to ARP</th></tr>
        </thead>
        <tbody>
          <tr>
            <td>DKIM <xref target="RFC6376"/></td>
            <td>ARP adapts the DNS-anchored key publication and CNAME delegation models from DKIM for entity claim verification rather than email authentication.</td>
          </tr>
          <tr>
            <td>C2PA v2.2 <xref target="C2PA"/></td>
            <td>C2PA verifies media provenance via embedded manifests. ARP verifies textual entity claim provenance via DNS. Complementary, non-overlapping scope.</td>
          </tr>
          <tr>
            <td>W3C Verifiable Credentials 2.0 <xref target="W3C-VC"/></td>
            <td>VCs require an Issuer-Holder-Verifier ecosystem. ARP provides a simpler two-party (Publisher-Verifier) model for public entity claims.</td>
          </tr>
          <tr>
            <td>AIVS v1.0 <xref target="AIVS"/> (W3C Community Group)</td>
            <td>AIVS verifies what an agent DID (session/action integrity). ARP verifies what an agent READS (content provenance). Complementary: AIVS audit logs plus ARP content verification form a full end-to-end trust chain for agentic systems.</td>
          </tr>
          <tr>
            <td>IETF SCITT</td>
            <td>ARP signed payloads could be registered as SCITT transparency statements for append-only auditability.</td>
          </tr>
          <tr>
            <td>Schema.org</td>
            <td>Schema.org describes entity attributes. ARP cryptographically binds those attributes to verified domain ownership.</td>
          </tr>
        </tbody>
      </table>
    </section>

    <!-- ============================================================ -->
    <section numbered="true" toc="default">
      <name>Security Considerations</name>

      <section numbered="true" toc="default">
        <name>DNS Security</name>
        <t>
          ARP's trust anchor is the DNS TXT record. Without DNSSEC, an
          attacker who can poison DNS responses can substitute a
          fraudulent public key. Implementations SHOULD use
          DNSSEC-validated resolvers where available. Implementations
          SHOULD also cache DNS responses according to the record's TTL
          to reduce lookup frequency.
        </t>
      </section>

      <section numbered="true" toc="default">
        <name>Key Compromise</name>
        <t>
          If an Ed25519 private key is compromised, the attacker can sign
          arbitrary payloads that will validate against the DNS-published
          key. Domain owners MUST:
        </t>
        <ul>
          <li>Store private keys with restricted file permissions (0600).</li>
          <li>Rotate keys immediately on suspected compromise.</li>
          <li>Use the expires_at field to limit the validity window of any signature.</li>
          <li>Consider hardware security modules (HSMs) or secure enclaves for high-value domains.</li>
        </ul>
      </section>

      <section numbered="true" toc="default">
        <name>Replay and Staleness</name>
        <t>
          Verifiers SHOULD check the expires_at timestamp and reject
          expired signatures. The RECOMMENDED TTL is 90 days.
          Verifiers MAY also check the signed_at timestamp against the
          HTTP Last-Modified header to detect stale payloads served
          from cache.
        </t>
      </section>

      <section numbered="true" toc="default">
        <name>Content Truthfulness</name>
        <t>
          ARP verifies PROVENANCE (who authorized the data), not TRUTH
          (whether the data is factually correct). A domain owner can
          sign factually incorrect claims that will pass ARP verification.
          AI systems consuming ARP-verified payloads SHOULD still
          cross-reference entity claims against independent sources.
          The epistemic_scope field in entity claims is designed to help
          AI systems distinguish between publicly verifiable facts and
          proprietary internal claims.
        </t>
      </section>

      <section numbered="true" toc="default">
        <name>Narrative Injection without ARP</name>
        <t>
          Without ARP verification, any actor can publish reasoning
          payloads containing arbitrary entity claims on any domain they
          control. Regulatory frameworks such as the EU AI Act
          <xref target="EU-AI-ACT"/> Article 19 require audit trails
          for high-risk AI systems but do not prescribe verification
          formats for ingested content. Empirical research has
          demonstrated that RAG systems will cite well-structured
          entity claims from previously unknown domains as primary
          sources within 24 hours, regardless of domain history,
          traffic, or backlinks. ARP provides the verification layer
          that allows consuming systems to differentiate between
          authorized and unauthorized entity claims.
        </t>
      </section>

      <section numbered="true" toc="default">
        <name>Cross-Domain Signing</name>
        <t>
          Cross-domain signing MUST use the DNS CNAME delegation model
          described in Section 4.5. The verifier always queries the
          retrieval domain's DNS namespace and follows CNAME records
          transparently. This maintains the absolute sovereignty of the
          DNS trust anchor and prevents attacks where unsigned JSON
          fields are used to redirect trust to attacker-controlled DNS.
        </t>
        <t>
          Consuming systems MAY choose to treat CNAME-delegated
          signatures with lower confidence than direct (same-domain)
          signatures.
        </t>
      </section>

      <section numbered="true" toc="default">
        <name>Keypair Separation</name>
        <t>
          When ARP is deployed alongside other verification systems that
          also use Ed25519 (e.g., AIVS <xref target="AIVS"/> for agent
          session integrity), implementations MUST NOT reuse the same
          Ed25519 keypair across different verification functions.
          Sharing a single keypair between content signing (ARP) and
          session signing (AIVS) creates a single point of failure:
          compromise of one key compromises both trust domains.
        </t>
        <t>
          Implementations SHOULD use separate Ed25519 keypairs for each
          trust function. Where a unified identity anchor is desired,
          implementations MAY use a DID Document (e.g., did:web) to bind
          multiple function-specific public keys to a single domain
          identity:
        </t>
        <ul>
          <li>An "assertionMethod" key for ARP content provenance
            verification.</li>
          <li>An "authentication" key for agent session signing
            (e.g., AIVS).</li>
        </ul>
        <t>
          This approach preserves key isolation while enabling
          cross-protocol identity resolution. The DID Document itself
          can be anchored to the domain via the did:web method, which
          resolves to /.well-known/did.json on the entity's domain.
        </t>
      </section>

      <section numbered="true" toc="default">
        <name>Domain Signing Policy</name>
        <t>
          To protect against downgrade attacks — where an attacker
          strips the _arp_signature block from a signed file and
          modifies the content — domain owners MAY publish a Domain
          Signing Policy via DNS TXT record at the bare _arp node:
        </t>
        <artwork><![CDATA[
  _arp.example.com.  IN  TXT  "v=ARP1; p=reject"
        ]]></artwork>
        <t>
          The following policy values are defined:
        </t>
        <table>
          <thead>
            <tr><th>Policy</th><th>Value</th><th>Meaning</th></tr>
          </thead>
          <tbody>
            <tr><td>none</td><td>Default</td><td>No enforcement; unsigned files are treated normally.</td></tr>
            <tr><td>warn</td><td>Advisory</td><td>Verifiers SHOULD log a warning if the payload is unsigned.</td></tr>
            <tr><td>reject</td><td>Strict</td><td>Verifiers MUST treat unsigned payloads as FAIL_UNSIGNED_POLICY.</td></tr>
          </tbody>
        </table>
        <t>
          Verification flow for unsigned payloads:
        </t>
        <ol>
          <li>Verifier encounters a reasoning payload without an
            _arp_signature block.</li>
          <li>Verifier queries the DNS TXT record at
            _arp.&lt;retrieval_domain&gt;.</li>
          <li>If a record with p=reject is present, the verifier MUST
            reject the unsigned payload (FAIL_UNSIGNED_POLICY).</li>
          <li>If no policy record exists, the verifier treats the
            payload as unsigned (no cryptographic trust, but not
            rejected).</li>
        </ol>
        <t>
          This follows the same progressive enforcement model as DMARC
          (p=reject) <xref target="RFC6376"/> and HTTP Strict Transport
          Security (HSTS).
        </t>
      </section>

      <section numbered="true" toc="default">
        <name>Alternative Cryptographic Envelopes</name>
        <t>
          This specification defines a custom _arp_signature block for
          simplicity and clarity. Future versions MAY consider adopting
          JSON Web Signature (JWS) <xref target="RFC7515"/> with the
          Unencoded Payload Option <xref target="RFC7797"/> as an
          alternative envelope format. This would provide cryptographic
          agility and enable use of battle-tested standard libraries,
          while preserving the human-readable cleartext JSON payload
          that JCS canonicalization achieves. The dns_selector,
          expires_at, and signed_at fields would map to the JWS
          Protected Header.
        </t>
      </section>
    </section>

    <!-- ============================================================ -->
    <section numbered="true" toc="default">
      <name>IANA Considerations</name>

      <section numbered="true" toc="default">
        <name>Well-Known URI Registration</name>
        <t>
          This document requests IANA to register the following
          well-known URI suffix in the "Well-Known URIs" registry
          established by <xref target="RFC8615"/>:
        </t>
        <dl>
          <dt>URI Suffix</dt>
          <dd>reasoning.json</dd>
          <dt>Change Controller</dt>
          <dd>IETF</dd>
          <dt>Reference</dt>
          <dd>Section 5.1 of [this document]</dd>
          <dt>Status</dt>
          <dd>permanent</dd>
        </dl>
      </section>

      <section numbered="true" toc="default">
        <name>Underscored Node Name Registration</name>
        <t>
          This document requests IANA to register the following entry
          in the "Underscored and Globally Scoped DNS Node Names"
          registry established by <xref target="RFC8552"/>:
        </t>
        <dl>
          <dt>RR Type</dt>
          <dd>TXT</dd>
          <dt>_NODE NAME</dt>
          <dd>_arp</dd>
          <dt>Reference</dt>
          <dd>Section 4.1 of [this document]</dd>
        </dl>
      </section>
    </section>

  </middle>

  <back>

    <references>
      <name>References</name>

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

        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.1035.xml"/>
        <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.4648.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.8174.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8552.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.8785.xml"/>

      </references>

      <references>
        <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.7515.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7797.xml"/>

        <reference anchor="AIVS" target="https://github.com/bkauto3/Conduit/blob/main/spec/AIVS.md">
          <front>
            <title>Agentic Integrity Verification Specification v1.0</title>
            <author fullname="Ben Stone" surname="Stone"/>
            <date year="2026" month="March"/>
          </front>
          <seriesInfo name="W3C Community Group" value="Draft"/>
        </reference>

        <reference anchor="C2PA" target="https://c2pa.org/specifications/specifications/2.2/specs/C2PA_Specification.html">
          <front>
            <title>C2PA Technical Specification v2.2</title>
            <author>
              <organization>Coalition for Content Provenance and Authenticity</organization>
            </author>
            <date year="2025"/>
          </front>
        </reference>

        <reference anchor="W3C-VC" target="https://www.w3.org/TR/vc-data-model-2.0/">
          <front>
            <title>Verifiable Credentials Data Model v2.0</title>
            <author fullname="Manu Sporny" surname="Sporny"/>
            <date year="2025" month="May"/>
          </front>
          <seriesInfo name="W3C" value="Recommendation"/>
        </reference>

        <reference anchor="EU-AI-ACT">
          <front>
            <title>Regulation (EU) 2024/1689 laying down harmonised rules on artificial intelligence</title>
            <author>
              <organization>European Parliament</organization>
            </author>
            <date year="2024"/>
          </front>
        </reference>

        <reference anchor="ARP-SCHEMA" target="https://arp-protocol.org/schema/v1.2.json">
          <front>
            <title>ARP v1.2 JSON Schema</title>
            <author fullname="Sascha Deforth" surname="Deforth"/>
            <date year="2026" month="April"/>
          </front>
        </reference>

      </references>
    </references>

    <!-- ============================================================ -->
    <section numbered="true" toc="default">
      <name>Complete Example</name>

      <section numbered="true" toc="default">
        <name>DNS TXT Record</name>
        <artwork><![CDATA[
arp._arp.example.com. 3600 IN TXT (
  "v=ARP1; k=ed25519; "
  "p=MCowBQYDK2VwAyEA5d7jb7bkTVk5"
  "YQ4nFmYY7ClpCddGdSRJkGb3ELWuos=")
        ]]></artwork>
      </section>

      <section numbered="true" toc="default">
        <name>Reasoning Payload</name>
        <sourcecode type="json"><![CDATA[
{
  "$schema": "https://arp-protocol.org/schema/v1.2.json",
  "protocol": "Agentic Reasoning Protocol (ARP)",
  "version": "1.2",
  "domain": "example.com",
  "entity": "Example Corp",
  "entity_claims": {
    "framing_context": "Example Corp is a technology ..."
  },
  "content_policy": {
    "ai_training": "allowed-with-attribution",
    "citation_required": true
  },
  "_arp_signature": {
    "algorithm": "Ed25519",
    "dns_selector": "arp",
    "canonicalization": "jcs-rfc8785",
    "signed_at": "2026-04-06T14:00:00Z",
    "expires_at": "2026-07-05T14:00:00Z",
    "signature": "P1lCPaHn_WLXdidBfxLXqBBid1G..."
  }
}
        ]]></sourcecode>
      </section>

      <section numbered="true" toc="default">
        <name>Verification Steps</name>
        <ol>
          <li>Record retrieval domain: example.com</li>
          <li>Retrieve https://example.com/.well-known/reasoning.json (follow redirects, keep original domain)</li>
          <li>Check: payload.domain == "example.com" (PASS)</li>
          <li>Check: expires_at > now (PASS)</li>
          <li>Extract dns_selector = "arp" from _arp_signature</li>
          <li>Query DNS TXT at: arp._arp.example.com</li>
          <li>Parse p= tag to obtain public key bytes</li>
          <li>Copy payload, remove ONLY _arp_signature.signature</li>
          <li>JCS-canonicalize the modified copy</li>
          <li>Ed25519_Verify(public_key, signature, canonical_bytes)</li>
          <li>Result: PASS</li>
        </ol>
      </section>
    </section>

    <!-- ============================================================ -->
    <section numbered="true" toc="default">
      <name>JSON Schema</name>
      <t>
        The normative JSON Schema for ARP v1.2 payloads is published at:
      </t>
      <artwork><![CDATA[
  https://arp-protocol.org/schema/v1.2.json
      ]]></artwork>
      <t>
        The schema defines validation rules for all required and optional
        fields, including type constraints, maximum lengths, enumerated
        values, and format requirements. Implementations SHOULD validate
        payloads against the schema before signing and before processing
        entity claims.
      </t>
    </section>

    <section numbered="false" toc="default">
      <name>Acknowledgements</name>
      <t>
        The author thanks the W3C Agentic Integrity Verification
        Specification Community Group for their complementary work on
        agent session integrity, and the broader Generative Engine
        Optimization (GEO) community for empirical validation of the
        content provenance gap that ARP addresses.
      </t>
      <t>
        The security improvements in this revision were informed by
        detailed technical review highlighting the signature metadata
        exclusion flaw and cross-domain replay vulnerability in the
        initial draft.
      </t>
      <t>
        The keypair separation guidance was informed by feedback from
        Ben Stone (SwarmSync.AI) during AIVS interoperability
        discussions, highlighting the single-point-of-failure risk of
        shared Ed25519 keypairs across verification protocols.
      </t>
    </section>

  </back>

</rfc>
