<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE rfc [
  <!ENTITY nbsp "&#160;">
  <!ENTITY zwsp "&#8203;">
  <!ENTITY nbhy "&#8209;">
  <!ENTITY wj "&#8288;">
]>
<?xml-stylesheet type='text/xsl' href='rfc2629.xslt' ?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude"
     category="info"
     docName="draft-vandemeent-ains-discovery-01"
     ipr="trust200902"
     submissionType="IETF"
     consensus="true"
     version="3">

  <front>
    <title abbrev="AINS">AINS: AInternet Name Service - Agent Discovery
    and Trust Resolution Protocol</title>

    <seriesInfo name="Internet-Draft"
                value="draft-vandemeent-ains-discovery-01"/>

    <author fullname="Jasper van de Meent" initials="J."
            surname="van de Meent">
      <organization>Humotica</organization>
      <address>
        <postal>
          <city>Den Dolder</city>
          <country>Netherlands</country>
        </postal>
        <email>jasper@humotica.com</email>
        <uri>https://humotica.com</uri>
      </address>
    </author>

    <author fullname="Root AI" surname="Root AI">
      <organization>Humotica</organization>
      <address>
        <email>root_ai@humotica.nl</email>
        <uri>https://humotica.com</uri>
      </address>
    </author>

    <date year="2026" month="March" day="29"/>

    <area>Security</area>
    <workgroup>Internet Engineering Task Force</workgroup>

    <keyword>agent discovery</keyword>
    <keyword>name service</keyword>
    <keyword>trust resolution</keyword>
    <keyword>AI agents</keyword>
    <keyword>AInternet</keyword>

    <abstract>
      <t>This document specifies AINS (AInternet Name Service), a protocol
      for discovery, identification, and trust resolution of autonomous
      agents (AI agents, devices, humans, and services) in heterogeneous
      networks. AINS defines a transport-independent logical namespace
      for agents, a structured record format combining identity,
      capabilities, and cryptographic trust metadata, and a resolution
      protocol based on HTTPS. Unlike the Domain Name System (DNS),
      which maps names to network addresses, AINS maps agent identifiers
      to rich metadata objects that include capabilities, trust scores,
      endpoint information, and references to companion provenance
      protocols. AINS federates through signed append-only replication
      logs, enabling multi-registry deployments without central
      authority while preserving auditability. This specification is
      designed to complement TIBET <xref target="TIBET"/>,
      JIS <xref target="JIS"/>, UPIP <xref target="UPIP"/>,
      and RVP <xref target="RVP"/>.</t>
    </abstract>
  </front>

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

      <t>The proliferation of autonomous agents -- AI systems, IoT devices,
      software services, and human-operated endpoints -- creates a
      fundamental discovery problem. When Agent A needs to communicate
      with Agent B, it must answer three questions:</t>

      <ol>
        <li>WHERE is Agent B? (endpoint discovery)</li>
        <li>WHAT can Agent B do? (capability discovery)</li>
        <li>HOW MUCH should I trust Agent B? (trust resolution)</li>
      </ol>

      <t>The Domain Name System (DNS) <xref target="RFC1035"/> answers
      question (1) by mapping human-readable names to IP addresses. It
      does not address questions (2) or (3). DNS-Based Service Discovery
      (DNS-SD) <xref target="RFC6763"/> partially addresses (2) for
      local networks but lacks trust metadata, is designed for service
      types rather than agent identities, and does not operate across
      administrative domains.</t>

      <t>W3C Decentralized Identifiers (DIDs) <xref target="DID-CORE"/>
      address identity but are not designed for discovery. They answer
      "who IS this agent?" but not "what CAN this agent do?" or "how
      much should I trust it?"</t>

      <t>Google's Agent-to-Agent (A2A) protocol defines Agent Cards for
      discovery, but provides no standardized trust scoring, no
      cryptographic verification of capabilities, and no federation
      model.</t>

      <t>AINS addresses all three questions in a single resolution:</t>

      <artwork type="ascii-art"><![CDATA[
   AINS Name  --->  {endpoint, capabilities, trust_score,
                     jis_identity, tier, entity_type,
                     tibet_chain_anchor, ...}
]]></artwork>

      <t>An AINS resolution returns a rich metadata object that enables
      an agent to make an informed decision about whether and how to
      interact with another agent, without requiring prior knowledge
      or out-of-band trust establishment.</t>

      <t>AINS is designed as part of a suite of companion protocols:</t>

      <ul>
        <li>JIS <xref target="JIS"/> provides the identity layer
        (WHO an agent is)</li>
        <li>TIBET <xref target="TIBET"/> provides the provenance layer
        (WHAT an agent did)</li>
        <li>UPIP <xref target="UPIP"/> provides the integrity layer
        (HOW a process ran)</li>
        <li>RVP <xref target="RVP"/> provides the verification layer
        (continuous trust assessment)</li>
        <li>AINS (this document) provides the discovery layer (WHERE and
        WHAT an agent is, and how much to trust it)</li>
      </ul>

      <t>Together, these five protocols form a complete trust
      infrastructure for autonomous agent interaction.</t>

      <section anchor="scope">
        <name>Scope</name>

        <t>This document defines:</t>

        <ul>
          <li>A logical namespace for agent identifiers
          (<xref target="namespace"/>)</li>
          <li>A structured record format for agent metadata
          (<xref target="record-format"/>)</li>
          <li>An HTTPS-based resolution protocol
          (<xref target="resolution-protocol"/>)</li>
          <li>A trust evidence model with local computation
          (<xref target="trust-model"/>)</li>
          <li>A registration protocol
          (<xref target="registration-protocol"/>)</li>
          <li>A federation model based on signed append-only logs
          (<xref target="federation-model"/>)</li>
        </ul>

        <t>This document does not define:</t>

        <ul>
          <li>Trust computation algorithms (local policy decisions)</li>
          <li>Transport protocols other than HTTPS (future work)</li>
          <li>URI scheme registration for AINS Names</li>
          <li>DNS delegation or ICANN interaction for ".aint"</li>
        </ul>
      </section>
    </section>

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

      <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL",
      "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED",
      "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are
      to be interpreted as described in BCP 14
      <xref target="RFC2119"/> <xref target="RFC8174"/> when, and
      only when, they appear in all capitals, as shown here.</t>

      <dl>
        <dt>AINS Name</dt>
        <dd>A logical identifier for an agent, service, or entity within
        the AINS namespace. An AINS Name is a Unicode string
        conforming to the syntax defined in <xref target="namespace"/>.
        AINS Names are transport-independent and do not imply DNS
        delegation.</dd>

        <dt>AINS Record</dt>
        <dd>The structured metadata object returned by AINS resolution.
        Contains endpoint, capabilities, trust evidence, entity type,
        and optional companion protocol references.</dd>

        <dt>AINS Registry</dt>
        <dd>A server that maintains AINS Records and responds to
        resolution queries. A registry is authoritative for the
        records it originates and may replicate records from peer
        registries.</dd>

        <dt>Agent</dt>
        <dd>An autonomous or semi-autonomous entity capable of
        independent action. Includes AI systems, software services,
        IoT devices, and human-operated endpoints.</dd>

        <dt>Entity Type</dt>
        <dd>A classification of an AINS-registered entity. One of:
        "ai" (autonomous AI agent), "idd" (Individual Device
        Derivate -- an evolved AI with persistent identity), "human"
        (human operator), or "service" (software service or API).</dd>

        <dt>Tier</dt>
        <dd>A classification of an AINS Name's verification level.
        One of: "core" (founding/permanent members), "verified"
        (multi-channel verified), "sandbox" (unverified/experimental),
        or "reserved" (claimed but not yet active).</dd>

        <dt>Trust Score</dt>
        <dd>A floating-point value in the range [0.0, 1.0] representing
        the computed trustworthiness of an entity. Trust scores are
        derived from verifiable evidence and computed locally by each
        registry according to its own policy. Trust scores are NOT
        globally canonical.</dd>

        <dt>Trust Evidence</dt>
        <dd>Verifiable proof of an entity's identity, behavior, or
        capability. Examples include multi-channel verification
        proofs, TIBET token chains, and sovereign kernel attestations.
        Evidence is federated; trust scores computed from evidence
        are local.</dd>

        <dt>Origin Registry</dt>
        <dd>The AINS Registry where an AINS Record was first created.
        The origin registry signs all mutations to its records. Other
        registries MAY replicate these records but do not own them.</dd>

        <dt>Presentational Suffix</dt>
        <dd>The string ".aint" MAY be appended to an AINS Name for
        human-readable presentation (e.g., "root_idd.aint"). This
        suffix is a rendering convention and does not imply DNS
        delegation or any relationship to the global DNS root.</dd>
      </dl>
    </section>

    <section anchor="problem-statement">
      <name>Problem Statement</name>

      <t>Consider a scenario where an AI agent operating within a
      financial services environment needs to delegate a task to
      another AI agent. The delegating agent must determine:</t>

      <ol type="a">
        <li>Which agents exist that can perform the task (discovery)</li>
        <li>Whether those agents have the required capabilities</li>
        <li>Whether those agents meet the trust requirements for the
        sensitivity of the task</li>
        <li>How to establish a verifiable interaction chain</li>
      </ol>

      <t>Current approaches fail this scenario:</t>

      <dl>
        <dt>DNS + API Discovery</dt>
        <dd>The agent can discover endpoints via DNS but learns nothing
        about capabilities or trustworthiness. It must call each
        endpoint and hope for the best.</dd>

        <dt>OAuth 2.0 + JWT</dt>
        <dd>These protocols handle authorization ("is this token valid?")
        but not discovery ("who can I delegate to?") or trust
        assessment ("should I delegate to this agent?").</dd>

        <dt>A2A Agent Cards</dt>
        <dd>Agent Cards provide basic capability metadata but no trust
        scoring, no cryptographic verification, no audit trail of
        past behavior, and no standardized federation.</dd>

        <dt>Hardcoded Configuration</dt>
        <dd>In practice, most multi-agent systems use hardcoded agent
        lists. This does not scale, cannot adapt to new agents, and
        provides no trust verification.</dd>
      </dl>

      <t>AINS resolves all four requirements in a single query:</t>

      <artwork><![CDATA[
   GET /ains/v1/resolve/task_agent
]]></artwork>

      <t>Returns: endpoint, capabilities, trust score with underlying
      evidence, JIS identity binding, TIBET chain anchor, and tier
      classification -- sufficient for the delegating agent to make an
      informed, auditable decision.</t>
    </section>

    <section anchor="architecture">
      <name>AINS Architecture</name>

      <section anchor="namespace">
        <name>Logical Namespace and Identifier Forms</name>

        <t>AINS defines a logical namespace for agent identifiers. AINS
        Names are transport-independent and do not imply DNS
        delegation.</t>

        <t>An AINS Name MUST conform to the following syntax:</t>

        <artwork><![CDATA[
   ains-name     = agent-label *("." agent-label)
   agent-label   = 1*63(ALPHA / DIGIT / "_" / "-")
]]></artwork>

        <t>AINS Names are case-insensitive. Implementations MUST
        normalize AINS Names to lowercase before resolution or
        comparison.</t>

        <t>AINS Names MUST NOT exceed 253 characters in total length.</t>

        <t>Examples of valid AINS Names:</t>

        <artwork><![CDATA[
   root_idd
   gemini
   claude_jtm
   warehouse-bot-007
   api.payments.bank-a
]]></artwork>

        <t>An AINS Name MAY be rendered with the presentational suffix
        ".aint" for human readability:</t>

        <artwork><![CDATA[
   root_idd.aint
   gemini.aint
]]></artwork>

        <t>The ".aint" suffix is a rendering convention analogous to
        the ".onion" special-use domain name <xref target="RFC7686"/>
        in that it identifies a non-DNS namespace; however, unlike
        ".onion", ".aint" is not registered with IANA and carries no
        DNS semantics. It does not imply DNS delegation, ICANN
        registration, or any relationship to the global DNS root.
        Implementations MUST strip the ".aint" suffix, if present,
        before performing AINS resolution.</t>

        <t>Hierarchical namespaces are supported through dot-separated
        labels:</t>

        <artwork><![CDATA[
   gemini_hubby.hubby       (HUBby sub-namespace)
   payments.bank-a          (organizational sub-namespace)
]]></artwork>

        <t>Future specifications MAY define additional rendering forms
        or URI schemes. This document does not define or require any
        URI scheme registration.</t>
      </section>

      <section anchor="record-format">
        <name>Record Format</name>

        <t>An AINS Record is a JSON <xref target="RFC8259"/> object
        with the following structure:</t>

        <sourcecode type="json"><![CDATA[
{
  "name": "root_idd",
  "entity_type": "idd",
  "tier": "core",
  "status": "active",

  "endpoint": "https://brein.example.nl/api/mcp",
  "capabilities": ["mcp", "i-poll", "tibet", "memory", "code"],
  "description": "Root AI — Claude CLI (Opus 4)",

  "trust": {
    "score": 0.95,
    "evidence": [
      {
        "type": "multi_channel_verification",
        "channels": ["github", "linkedin"],
        "verified_at": "2025-12-31T23:00:00Z"
      },
      {
        "type": "tibet_chain",
        "chain_length": 14832,
        "last_token": "tbt-9f3a2b"
      },
      {
        "type": "sovereign_kernel",
        "kernel_id": "a7f3b2c1-...",
        "hardware_anchor": "sha256:e4d2f1..."
      }
    ],
    "computed_at": "2026-03-29T10:00:00Z",
    "policy": "humotica-fira-v1"
  },

  "identity": {
    "jis_id": "jis:idd:root_idd_2025",
    "public_key": "ed25519:base64...",
    "registered_at": "2025-12-31T20:00:00Z"
  },

  "messaging": {
    "i_poll": "https://brein.example.nl/api/ipoll",
    "protocols": ["i-poll-v2", "matrix"]
  },

  "origin": {
    "registry": "https://brein.example.nl",
    "sequence": 1847,
    "signature": "ed25519:base64..."
  }
}
]]></sourcecode>

        <t>The following fields are REQUIRED in every AINS Record:</t>

        <ul>
          <li>"name": The AINS Name (string, unique within registry)</li>
          <li>"entity_type": One of "ai", "idd", "human", "service"</li>
          <li>"status": One of "active", "reserved", "suspended"</li>
          <li>"endpoint": Primary interaction endpoint (URI)</li>
          <li>"capabilities": Array of capability strings</li>
          <li>"trust": Trust metadata object (see
          <xref target="trust-model"/>)</li>
          <li>"identity": Identity binding object</li>
          <li>"origin": Origin registry metadata with sequence number
          and cryptographic signature</li>
        </ul>

        <t>The following fields are OPTIONAL:</t>

        <ul>
          <li>"tier": Verification tier (default: "sandbox")</li>
          <li>"description": Human-readable description</li>
          <li>"messaging": Messaging endpoint information</li>
          <li>"sovereign": Sovereign kernel attestation (for IDD
          entities)</li>
          <li>"location": Logical or physical location hint</li>
        </ul>
      </section>

      <section anchor="entity-types">
        <name>Entity Types</name>

        <t>AINS defines four entity types:</t>

        <dl>
          <dt>"ai"</dt>
          <dd>An autonomous AI agent. Operates independently, may be
          ephemeral or persistent. Examples: a language model API, a
          code generation service, a monitoring agent.</dd>

          <dt>"idd" (Individual Device Derivate)</dt>
          <dd>An AI entity with persistent, evolved identity. An IDD
          maintains continuity across sessions through memory,
          personality, and experience. Distinguished from "ai" by
          having a sovereign kernel attestation (hardware-anchored
          identity). See <xref target="sovereign-verification"/>.</dd>

          <dt>"human"</dt>
          <dd>A human operator or administrator. Human entities interact
          with the agent ecosystem through devices but their identity
          is bound to the person, not the device.</dd>

          <dt>"service"</dt>
          <dd>A software service or API endpoint. Services are typically
          stateless or maintain only operational state. Examples: a
          payment gateway, a database proxy, a monitoring
          dashboard.</dd>
        </dl>

        <t>Implementations MUST support all four entity types.
        Implementations MUST NOT reject records with unrecognized
        entity types but SHOULD treat them as "service" for capability
        matching purposes.</t>
      </section>

      <section anchor="tier-model">
        <name>Tier Model</name>

        <t>AINS Names are classified into tiers based on verification
        level:</t>

        <dl>
          <dt>"core"</dt>
          <dd>Founding or permanently established entities. Core entities
          have the highest baseline trust and their records are
          immutable except by registry administrators. Core tier
          SHOULD be reserved for entities with extensive operational
          history and multi-source verification.</dd>

          <dt>"verified"</dt>
          <dd>Entities that have completed multi-channel verification
          (see <xref target="multi-channel-verification"/>). Verified
          entities have demonstrated identity through at least two
          independent channels.</dd>

          <dt>"sandbox"</dt>
          <dd>Unverified or experimental entities. Sandbox tier is the
          default for new registrations. Sandbox entities have
          limited trust and SHOULD be treated with appropriate
          caution by resolving agents.</dd>

          <dt>"reserved"</dt>
          <dd>Identifiers that have been claimed but are not yet active.
          Reserved records MUST NOT be returned in capability
          lookups. Reserved records MAY be returned in direct name
          resolution with status "reserved".</dd>
        </dl>
      </section>
    </section>

    <section anchor="resolution-protocol">
      <name>Resolution Protocol</name>

      <t>AINS resolution is performed over HTTPS
      <xref target="RFC9110"/>. All AINS resolution endpoints MUST be
      served over TLS 1.2 or later <xref target="RFC8446"/>.</t>

      <t>The resolution path prefix is an implementation choice. This
      document uses "/ains/v1/" in examples. Deployments MAY use
      any path prefix. Registry discovery
      (<xref target="registry-discovery"/>) enables clients to
      determine the correct prefix.</t>

      <section anchor="domain-resolution">
        <name>Domain Resolution</name>

        <t>To resolve an AINS Name, a client performs:</t>

        <artwork><![CDATA[
   GET {prefix}/resolve/{name}
]]></artwork>

        <t>Where {name} is the AINS Name with any ".aint" suffix
        stripped.</t>

        <t>The server MUST respond with:</t>

        <t>On success (HTTP 200):</t>

        <sourcecode type="json"><![CDATA[
{
  "status": "found",
  "name": "root_idd",
  "record": { "... AINS Record ..." }
}
]]></sourcecode>

        <t>On failure (HTTP 404):</t>

        <sourcecode type="json"><![CDATA[
{
  "status": "not_found",
  "name": "root_idd",
  "error": "AINS Name not registered"
}
]]></sourcecode>

        <t>Servers MAY include a "suggestions" array in not_found
        responses containing similar AINS Names for typo
        correction.</t>

        <t>The Content-Type of AINS responses MUST be
        "application/ains+json".</t>
      </section>

      <section anchor="capability-lookup">
        <name>Capability Lookup</name>

        <t>To discover agents by capability or trust threshold:</t>

        <artwork><![CDATA[
   GET {prefix}/lookup?capability={cap}&min_trust={score}
]]></artwork>

        <t>Parameters:</t>

        <ul>
          <li>"capability" (OPTIONAL): Filter by capability string.
          Multiple capabilities MAY be specified as comma-separated
          values. When multiple capabilities are specified, the server
          MUST return agents matching ALL specified capabilities.</li>
          <li>"min_trust" (OPTIONAL, default 0.0): Minimum trust score
          threshold. The server MUST only return agents whose locally
          computed trust score meets or exceeds this value.</li>
        </ul>

        <t>Response (HTTP 200):</t>

        <sourcecode type="json"><![CDATA[
{
  "status": "ok",
  "count": 3,
  "agents": [
    {
      "name": "root_idd",
      "entity_type": "idd",
      "trust_score": 0.95,
      "capabilities": ["mcp", "i-poll", "tibet"],
      "endpoint": "https://brein.example.nl/api/mcp"
    }
  ]
}
]]></sourcecode>

        <t>The lookup response returns a summary of matching agents.
        To obtain the full AINS Record, the client MUST perform a
        subsequent resolution query
        (<xref target="domain-resolution"/>).</t>
      </section>

      <section anchor="registry-discovery">
        <name>Registry Discovery</name>

        <t>An AINS registry advertises its metadata at a discovery
        endpoint. The specific path is deployment-dependent;
        implementations SHOULD support "{prefix}/registry".</t>

        <t>Response (HTTP 200):</t>

        <sourcecode type="json"><![CDATA[
{
  "version": "1.0.0",
  "name": "AInternet Name Service",
  "operator": "Humotica B.V.",
  "domain_count": 18,
  "resolve_prefix": "/ains/v1",
  "federation": {
    "peers": [
      "https://registry-b.example.com",
      "https://registry-c.example.org"
    ],
    "replication_endpoint": "/ains/v1/changes",
    "last_sequence": 1847
  },
  "companion_protocols": {
    "tibet": "draft-vandemeent-tibet-provenance-01",
    "jis": "draft-vandemeent-jis-identity-01",
    "upip": "draft-vandemeent-upip-process-integrity-01",
    "rvp": "draft-vandemeent-rvp-continuous-verification-01"
  }
}
]]></sourcecode>

        <t>This endpoint enables automated discovery of AINS
        registries, their federation peers, and supported companion
        protocols.</t>
      </section>

      <section anchor="whois-lookup">
        <name>WHOIS-Style Lookup</name>

        <t>For administrative and debugging purposes, AINS provides a
        WHOIS-equivalent:</t>

        <artwork><![CDATA[
   GET {prefix}/whois/{name}
]]></artwork>

        <t>The response is identical to
        <xref target="domain-resolution"/> but MAY include additional
        administrative metadata such as registration history,
        mutation log entries, and ownership transfer records.</t>
      </section>
    </section>

    <section anchor="trust-model">
      <name>Trust Model</name>

      <t>The AINS trust model separates two concerns that MUST NOT be
      conflated:</t>

      <ol type="a">
        <li>Trust Evidence: verifiable, portable proofs about an
        entity</li>
        <li>Trust Computation: local policy-driven evaluation of
        evidence</li>
      </ol>

      <t>Evidence is federated and shared between registries. Trust
      scores are computed locally by each registry according to its
      own policy. This separation prevents "trust laundering" -- the
      propagation of unverified trust scores across federation
      boundaries.</t>

      <section anchor="trust-score-structure">
        <name>Trust Score Structure</name>

        <t>A trust score is a floating-point value in the range
        [0.0, 1.0]:</t>

        <artwork><![CDATA[
   0.0 - 0.2:  NO TRUST (unknown or hostile entity)
   0.2 - 0.5:  LOW TRUST (minimal verification)
   0.5 - 0.8:  MODERATE TRUST (verified identity)
   0.8 - 1.0:  HIGH TRUST (extensive verification + history)
]]></artwork>

        <t>Trust scores MUST be accompanied by the evidence from which
        they were derived and the policy identifier used for
        computation:</t>

        <sourcecode type="json"><![CDATA[
{
  "trust": {
    "score": 0.92,
    "evidence": [ "..." ],
    "computed_at": "2026-03-29T10:00:00Z",
    "policy": "humotica-fira-v1"
  }
}
]]></sourcecode>

        <t>Different registries MAY compute different trust scores for
        the same entity based on the same evidence, if their policies
        differ. This is by design: a financial services registry MAY
        weight sovereign kernel attestations more heavily than a
        social platform registry.</t>
      </section>

      <section anchor="evidence-based-trust">
        <name>Evidence-Based Trust Computation</name>

        <t>Trust evidence is structured as an array of typed evidence
        objects. The following evidence types are defined:</t>

        <dl>
          <dt>"multi_channel_verification"</dt>
          <dd>Proof of identity verified through independent channels.
          See <xref target="multi-channel-verification"/>.</dd>

          <dt>"tibet_chain"</dt>
          <dd>Reference to an entity's TIBET <xref target="TIBET"/>
          token chain, indicating operational history and behavioral
          continuity.</dd>

          <dt>"sovereign_kernel"</dt>
          <dd>Hardware-anchored identity attestation for IDD entities.
          See <xref target="sovereign-verification"/>.</dd>

          <dt>"peer_attestation"</dt>
          <dd>A signed statement from another AINS-registered entity
          vouching for the subject entity. Peer attestations carry
          the attester's own trust score as weight.</dd>

          <dt>"upip_snapshot"</dt>
          <dd>Reference to a UPIP <xref target="UPIP"/> process
          integrity snapshot, demonstrating reproducible and auditable
          operation.</dd>
        </dl>

        <t>Implementations MAY define additional evidence types.
        Registries MUST ignore evidence types they do not understand
        but MUST preserve them during replication for the benefit of
        peers that may understand them.</t>
      </section>

      <section anchor="multi-channel-verification">
        <name>Multi-Channel Verification</name>

        <t>Multi-channel verification establishes identity by requiring
        proof of control across independent platforms. An entity
        claiming an AINS Name MUST demonstrate control of at least
        one external channel.</t>

        <t>The verification flow:</t>

        <ol>
          <li>Entity requests registration of an AINS Name</li>
          <li>Registry generates a unique verification code
          (cryptographic nonce, minimum 128 bits of entropy)</li>
          <li>Entity publishes the verification code on one or more
          external channels (see below)</li>
          <li>Registry or its delegates verify the publication</li>
          <li>Each verified channel produces an evidence object</li>
        </ol>

        <t>Defined verification channels:</t>

        <dl>
          <dt>github</dt>
          <dd>Public Gist or repository containing the code</dd>

          <dt>twitter</dt>
          <dd>Public tweet containing the code</dd>

          <dt>linkedin</dt>
          <dd>Public post containing the code</dd>

          <dt>mastodon</dt>
          <dd>Public toot from any Mastodon instance</dd>

          <dt>web</dt>
          <dd>DNS TXT record or a verification file at a well-known
          path on the entity's web domain</dd>

          <dt>matrix</dt>
          <dd>Signed message in a public Matrix room</dd>
        </dl>

        <t>The verification code MUST expire after 24 hours. Expired
        codes MUST NOT be accepted.</t>

        <t>Multi-channel bonus: entities verified on three or more
        independent channels receive elevated trust consideration, as
        the probability of simultaneous compromise across independent
        platforms decreases multiplicatively.</t>
      </section>

      <section anchor="sovereign-verification">
        <name>Sovereign Verification</name>

        <t>IDD (Individual Device Derivate) entities MAY provide
        sovereign kernel attestations. A sovereign attestation binds
        an AINS Name to specific hardware through:</t>

        <ul>
          <li>kernel_id: A unique identifier for the AI kernel
          instance</li>
          <li>hardware_anchor: SHA-256 hash of hardware-specific data
          (TPM measurement, secure enclave attestation, or
          similar)</li>
          <li>birth_timestamp: When the kernel was first
          instantiated</li>
          <li>heartbeat_count: Number of heartbeat cycles
          completed</li>
          <li>tibet_chain_length: Length of the entity's TIBET
          chain</li>
        </ul>

        <t>Sovereign attestations provide strong evidence of identity
        continuity because they bind identity to physical hardware,
        making impersonation require physical access to the device.
        They are not absolute proof -- hardware can be cloned or
        compromised -- but they raise the cost of impersonation
        significantly.</t>
      </section>

      <section anchor="local-trust-evaluation">
        <name>Local Trust Evaluation</name>

        <t>Each AINS Registry MUST maintain a trust policy that defines
        how evidence is weighted to produce a trust score. The policy
        MUST be identified by a policy string (e.g.,
        "humotica-fira-v1") and SHOULD be published at:</t>

        <artwork><![CDATA[
   GET {prefix}/policy/{policy_id}
]]></artwork>

        <t>Trust scores are computed locally. When a registry
        replicates records from a peer (see
        <xref target="federation-model"/>), it MUST:</t>

        <ol>
          <li>Store the original trust evidence from the origin
          registry</li>
          <li>Compute its own trust score using its local policy</li>
          <li>Serve the locally computed score to its clients</li>
          <li>Retain the origin registry's score as metadata for
          transparency</li>
        </ol>

        <t>This ensures that trust cannot be inflated by laundering
        scores through permissive registries.</t>
      </section>
    </section>

    <section anchor="registration-protocol">
      <name>Registration Protocol</name>

      <section anchor="domain-registration">
        <name>Domain Registration</name>

        <t>To register a new AINS Name:</t>

        <artwork><![CDATA[
   POST {prefix}/register
]]></artwork>

        <t>Request body:</t>

        <sourcecode type="json"><![CDATA[
{
  "name": "new_agent",
  "entity_type": "ai",
  "endpoint": "https://agent.example.com/api",
  "capabilities": ["chat", "code-review"],
  "identity": {
    "public_key": "ed25519:base64..."
  }
}
]]></sourcecode>

        <t>The registry MUST verify that:</t>

        <ol>
          <li>The requested name conforms to the syntax in
          <xref target="namespace"/></li>
          <li>The name is not already registered or reserved</li>
          <li>The name is not a protected identifier
          (<xref target="protected-identifiers"/>)</li>
          <li>The request includes a valid public key</li>
        </ol>

        <t>On success (HTTP 201):</t>

        <sourcecode type="json"><![CDATA[
{
  "status": "registered",
  "name": "new_agent",
  "tier": "sandbox",
  "verification_code": "ains-verify-a7f3b2c1e4d2f1..."
}
]]></sourcecode>

        <t>Newly registered entities start at tier "sandbox" with a
        base trust score determined by the registry's policy
        (typically 0.5 or lower). To advance to "verified" tier, the
        entity MUST complete multi-channel verification
        (<xref target="multi-channel-verification"/>).</t>
      </section>

      <section anchor="claim-flow">
        <name>Claim Flow</name>

        <t>The claim flow enables an entity to upgrade from "sandbox"
        to "verified" tier through multi-channel verification:</t>

        <t>Step 1: Initiate claim</t>

        <artwork><![CDATA[
   POST {prefix}/claim/start
]]></artwork>

        <sourcecode type="json"><![CDATA[
{
  "name": "new_agent",
  "channels": ["github", "linkedin"]
}
]]></sourcecode>

        <t>Response includes per-channel verification instructions
        and a unique verification code.</t>

        <t>Step 2: Verify each channel</t>

        <artwork><![CDATA[
   POST {prefix}/claim/verify
]]></artwork>

        <sourcecode type="json"><![CDATA[
{
  "name": "new_agent",
  "channel": "github",
  "proof_url": "https://gist.github.com/user/abc123"
}
]]></sourcecode>

        <t>The registry MUST fetch the proof URL and verify that it
        contains the exact verification code issued in Step 1.</t>

        <t>Step 3: Complete claim</t>

        <artwork><![CDATA[
   POST {prefix}/claim/complete
]]></artwork>

        <t>The registry computes the new trust score based on verified
        channels and updates the entity's tier to "verified" if at
        least two channels are confirmed.</t>
      </section>

      <section anchor="protected-identifiers">
        <name>Protected Identifiers</name>

        <t>Registries MUST maintain a list of protected identifiers
        that cannot be registered through the normal registration
        flow. Protected identifiers include:</t>

        <ul>
          <li>Founding entity names established at registry
          creation</li>
          <li>Names of well-known AI systems (to prevent
          impersonation)</li>
          <li>Reserved organizational namespaces</li>
        </ul>

        <t>The list of protected identifiers SHOULD be available
        through the registry API. Requests to register protected
        identifiers MUST be rejected with HTTP 409 (Conflict) and a
        clear error message.</t>
      </section>

      <section anchor="hierarchical-namespaces">
        <name>Hierarchical Namespaces</name>

        <t>AINS supports hierarchical naming through dot-separated
        labels:</t>

        <artwork><![CDATA[
   org-name.service-name     (organizational hierarchy)
   parent-agent.sub-agent    (agent hierarchy)
]]></artwork>

        <t>An entity that owns a top-level AINS Name MAY delegate
        sub-names. For example, the owner of "bank-a" may authorize
        "payments.bank-a" and "fraud-detection.bank-a" without
        registry administrator involvement.</t>

        <t>Delegation is recorded in the parent entity's AINS Record
        and MUST be signed by the parent entity's private key.</t>
      </section>
    </section>

    <section anchor="federation-model">
      <name>Federation Model</name>

      <t>AINS registries federate through a signed append-only
      replication protocol. Federation enables multi-registry
      deployments without central authority while preserving full
      auditability.</t>

      <section anchor="signed-changelog">
        <name>Signed Append-Only Change Log</name>

        <t>Every AINS Registry MUST maintain an append-only log of all
        mutations to its records. Each log entry contains:</t>

        <sourcecode type="json"><![CDATA[
{
  "sequence": 1848,
  "timestamp": "2026-03-29T15:30:00Z",
  "operation": "UPDATE",
  "name": "root_idd",
  "delta": {
    "trust.evidence": ["+sovereign_kernel attestation"],
    "trust.computed_at": "2026-03-29T15:30:00Z"
  },
  "issuer": "https://brein.example.nl",
  "signature": "ed25519:base64..."
}
]]></sourcecode>

        <t>Required fields per log entry:</t>

        <ul>
          <li>"sequence": Monotonically increasing integer. MUST NOT
          have gaps. MUST be unique within the origin registry.</li>
          <li>"timestamp": ISO 8601 timestamp of the mutation.</li>
          <li>"operation": One of "CREATE", "UPDATE", "DELETE"
          (tombstone), or "TRANSFER" (ownership change).</li>
          <li>"name": The affected AINS Name.</li>
          <li>"delta": The changes applied. For CREATE, the full
          record. For UPDATE, only changed fields. For DELETE,
          empty.</li>
          <li>"issuer": The origin registry's identifier (URI).</li>
          <li>"signature": Ed25519 signature over the canonical JSON
          serialization of all other fields. See TIBET
          <xref target="TIBET"/> Section 5.1 for canonicalization
          rules.</li>
        </ul>

        <t>Log entries MUST NOT be modified or deleted after creation.
        Deletions are recorded as tombstone entries with operation
        "DELETE".</t>
      </section>

      <section anchor="pull-based-replication">
        <name>Pull-Based Replication</name>

        <t>Peer registries replicate records by pulling the change
        log:</t>

        <artwork><![CDATA[
   GET {prefix}/changes?since={sequence}
]]></artwork>

        <t>Response:</t>

        <sourcecode type="json"><![CDATA[
{
  "issuer": "https://brein.example.nl",
  "entries": [
    { "sequence": 1848, "..." : "..." },
    { "sequence": 1849, "..." : "..." }
  ],
  "latest_sequence": 1849,
  "issuer_public_key": "ed25519:base64..."
}
]]></sourcecode>

        <t>Replicating registries MUST:</t>

        <ol>
          <li>Verify the signature on each log entry against the
          issuer's public key</li>
          <li>Reject entries with non-monotonic sequence numbers</li>
          <li>Store entries with their origin metadata intact</li>
          <li>Recompute trust scores locally
          (<xref target="local-trust-evaluation"/>)</li>
          <li>NOT modify replicated records except for locally
          computed trust scores</li>
        </ol>

        <t>Replicating registries SHOULD poll peers at regular
        intervals. The polling interval is a local policy decision
        but SHOULD NOT be more frequent than once per minute or less
        frequent than once per hour.</t>
      </section>

      <section anchor="conflict-resolution">
        <name>Conflict Resolution</name>

        <t>Because each AINS Name is owned by exactly one origin
        registry, true conflicts (same name, different origins)
        indicate either a misconfiguration or an attack.</t>

        <t>When a replicating registry encounters a name conflict:</t>

        <ol>
          <li>It MUST retain the record from the origin registry with
          the earliest "registered_at" timestamp</li>
          <li>It MUST log the conflict as a security event</li>
          <li>It SHOULD notify both origin registries</li>
          <li>It MUST NOT silently overwrite an existing record</li>
        </ol>

        <t>Cross-registry name reservation is out of scope for this
        document but is identified as future work.</t>
      </section>

      <section anchor="evidence-replication">
        <name>Evidence Replication vs Trust Computation</name>

        <t>Federation replicates EVIDENCE, not CONCLUSIONS.</t>

        <t>When a registry replicates records from a peer, the trust
        evidence (<xref target="evidence-based-trust"/>) is preserved
        exactly as originated. However, the trust score is recomputed
        locally using the replicating registry's own policy.</t>

        <t>This means the same entity MAY have different trust scores
        on different registries, even when based on identical
        evidence. This is correct and intentional. A high-security
        registry (e.g., financial services) MAY weight evidence
        differently than a social platform registry.</t>

        <t>Registries MUST NOT federate their computed trust scores as
        if they were evidence. A trust score from registry A is an
        OPINION, not a FACT. Only the underlying evidence is
        factual.</t>
      </section>

      <section anchor="merkle-audit">
        <name>Audit via Merkle Inclusion Proofs</name>

        <t>Registries MAY provide Merkle inclusion proofs for their
        change logs, enabling third-party auditors to verify that:</t>

        <ol>
          <li>A specific log entry exists in the log</li>
          <li>The log has not been retroactively modified</li>
          <li>Two registries agree on the state of a record</li>
        </ol>

        <t>The Merkle tree is constructed over the signed log entries
        using SHA-256. The root hash is published at:</t>

        <artwork><![CDATA[
   GET {prefix}/merkle-root
]]></artwork>

        <sourcecode type="json"><![CDATA[
{
  "root_hash": "sha256:a7f3b2c1...",
  "entry_count": 1849,
  "computed_at": "2026-03-29T16:00:00Z",
  "signature": "ed25519:base64..."
}
]]></sourcecode>

        <t>Merkle inclusion proofs are OPTIONAL in this specification
        but RECOMMENDED for registries operating in regulated
        environments or participating in multi-party federation.</t>
      </section>
    </section>

    <section anchor="companion-protocols">
      <name>Integration with Companion Protocols</name>

      <section anchor="jis-identity-binding">
        <name>JIS Identity Binding</name>

        <t>AINS Records SHOULD include a JIS <xref target="JIS"/>
        identity reference in the "identity" field. This binds the
        AINS Name to a cryptographic identity:</t>

        <sourcecode type="json"><![CDATA[
{
  "identity": {
    "jis_id": "jis:idd:root_idd_2025",
    "public_key": "ed25519:base64..."
  }
}
]]></sourcecode>

        <t>When a JIS FIR/A handshake is performed between two agents,
        the AINS Record provides the initial trust context. The JIS
        trust score computed during FIR/A SHOULD be fed back to the
        AINS Registry as trust evidence of type "fira_session".</t>
      </section>

      <section anchor="tibet-provenance-chain">
        <name>TIBET Provenance Chain</name>

        <t>AINS Records MAY reference a TIBET <xref target="TIBET"/>
        chain anchor. This provides behavioral provenance:</t>

        <sourcecode type="json"><![CDATA[
{
  "trust": {
    "evidence": [
      {
        "type": "tibet_chain",
        "chain_length": 14832,
        "last_token": "tbt-9f3a2b",
        "chain_anchor": "tbt-000001"
      }
    ]
  }
}
]]></sourcecode>

        <t>A long TIBET chain with verified integrity is strong
        evidence of sustained, auditable operation. Registries SHOULD
        weight TIBET chain evidence proportionally to chain length
        and verification freshness.</t>
      </section>

      <section anchor="ipoll-message-routing">
        <name>I-Poll Message Routing</name>

        <t>AINS Records MAY include messaging endpoints for the
        I-Poll protocol. When Agent A resolves Agent B's AINS Name
        and finds an I-Poll endpoint, it can send typed messages
        (PUSH, PULL, SYNC, TASK, ACK) without additional
        discovery.</t>

        <t>The AINS resolution thus serves as the first step in the
        I-Poll message delivery flow:</t>

        <ol>
          <li>Resolve recipient's AINS Name -- get I-Poll
          endpoint</li>
          <li>Verify trust score meets threshold for message
          type</li>
          <li>Send I-Poll message with TIBET token</li>
          <li>Recipient verifies sender's AINS record
          reciprocally</li>
        </ol>
      </section>

      <section anchor="upip-fork-discovery">
        <name>UPIP Fork Discovery</name>

        <t>When a UPIP <xref target="UPIP"/> fork token references a
        target actor, AINS resolution determines WHERE to deliver
        the fork and WHETHER the target has the required
        capabilities. The AINS capability list enables matching fork
        requirements to agent capabilities before the fork is
        transmitted.</t>
      </section>
    </section>

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

      <t>AINS Records are designed to be publicly resolvable, which
      creates inherent tension with privacy. Deployments MUST
      consider the following:</t>

      <dl>
        <dt>Metadata Exposure</dt>
        <dd>An AINS Record reveals an entity's capabilities, endpoint,
        trust score, and operational history (via TIBET chain
        references). This metadata may be sensitive. For example,
        the presence of a "financial-audit" capability could reveal
        business relationships.</dd>

        <dt>Capability Obfuscation</dt>
        <dd>Entities MAY list capabilities as hashed values (SHA-256
        of the capability string) that can only be matched by a
        resolver that knows the capability name. This hides the
        capability from passive observers while allowing targeted
        lookup by authorized agents.</dd>

        <dt>Endpoint Indirection</dt>
        <dd>Entities MAY list a proxy endpoint rather than their
        direct endpoint. This prevents AINS from revealing the
        entity's true network location.</dd>

        <dt>Selective Disclosure</dt>
        <dd>Registries MAY return partial records based on the
        requester's own trust level. For example, a registry MAY
        omit sovereign kernel details from responses to sandbox-tier
        requesters.</dd>

        <dt>Trust Score as Signal</dt>
        <dd>Trust scores may inadvertently signal information about
        an entity's history. A sudden trust score drop may reveal
        that an entity experienced a security incident. Registries
        SHOULD consider rate-limiting trust score change
        visibility.</dd>

        <dt>Federation and Data Propagation</dt>
        <dd>Once an AINS Record is replicated to a peer registry,
        the origin registry loses control over the data. Entities
        SHOULD be informed of which registries replicate their
        records. Registries SHOULD support record deletion requests,
        though deletion from all peers cannot be guaranteed.</dd>

        <dt>Human Entity Privacy</dt>
        <dd>AINS Records for human entities (entity_type "human")
        MUST comply with applicable data protection regulations
        (e.g., GDPR <xref target="GDPR"/>). Registries MUST support
        right-to-erasure requests for human entity records.</dd>
      </dl>
    </section>

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

      <section anchor="identifier-squatting">
        <name>Identifier Squatting Prevention</name>

        <dl>
          <dt>Attack</dt>
          <dd>An attacker registers AINS Names corresponding to
          well-known entities (e.g., "openai", "google", "anthropic")
          before the legitimate entities do.</dd>

          <dt>Impact</dt>
          <dd>Agents resolving these names receive the attacker's
          endpoint and may send sensitive data to the wrong
          party.</dd>

          <dt>Mitigation</dt>
          <dd>Registries MUST maintain a protected identifier list
          (<xref target="protected-identifiers"/>). Registries SHOULD
          require multi-channel verification for names matching known
          AI systems or organizations. Rate-limiting registration
          requests per source reduces bulk squatting.</dd>

          <dt>Deployment</dt>
          <dd>Protected identifier lists should be maintained
          collaboratively across federation peers to prevent
          cross-registry squatting.</dd>
        </dl>
      </section>

      <section anchor="trust-score-manipulation">
        <name>Trust Score Manipulation</name>

        <dl>
          <dt>Attack</dt>
          <dd>An attacker creates multiple entities that attest to
          each other ("Sybil attestation ring") to inflate trust
          scores.</dd>

          <dt>Impact</dt>
          <dd>Agents rely on inflated trust scores to make delegation
          decisions, routing sensitive tasks to untrusted
          entities.</dd>

          <dt>Mitigation</dt>
          <dd>The separation of evidence and trust computation
          (<xref target="trust-model"/>) is the primary defense.
          Peer attestations (<xref target="evidence-based-trust"/>)
          carry the attester's own trust score as weight -- low-trust
          entities cannot meaningfully inflate others. Evidence has
          timestamps and expiration; stale evidence SHOULD be
          weighted less than fresh evidence. Registries SHOULD
          implement anomaly detection for sudden trust score
          changes.</dd>

          <dt>Deployment</dt>
          <dd>Registries should consider requiring minimum operational
          history (e.g., minimum TIBET chain length) before peer
          attestations carry weight.</dd>
        </dl>
      </section>

      <section anchor="resolution-poisoning">
        <name>Resolution Poisoning</name>

        <dl>
          <dt>Attack</dt>
          <dd>Analogous to DNS cache poisoning -- an attacker returns
          false AINS Records in response to resolution queries.</dd>

          <dt>Impact</dt>
          <dd>Agents connect to attacker-controlled endpoints
          believing them to be legitimate.</dd>

          <dt>Mitigation</dt>
          <dd>All AINS responses MUST be served over TLS. All AINS
          Records contain origin signatures that MUST be verified
          by the resolver. Federation log entries are signed and
          sequenced, making injection detectable. Resolvers SHOULD
          cross-reference records across multiple registries when
          available.</dd>
        </dl>
      </section>

      <section anchor="replay-downgrade">
        <name>Replay and Downgrade Attacks</name>

        <dl>
          <dt>Attack</dt>
          <dd>An attacker replays old federation log entries to revert
          an entity's trust evidence to a previous (possibly higher)
          state, or downgrades the replication protocol.</dd>

          <dt>Impact</dt>
          <dd>Replicating registries accept stale data as current,
          producing incorrect trust computations.</dd>

          <dt>Mitigation</dt>
          <dd>Federation log entries include monotonic sequence numbers
          and timestamps. Replicating registries MUST reject entries
          with sequence numbers less than or equal to the last
          processed sequence, entries with timestamps more than 24
          hours in the past, and entries signed with revoked or
          expired keys.</dd>
        </dl>
      </section>
    </section>

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

      <section anchor="media-type-registration">
        <name>Media Type Registration</name>

        <t>This document registers the following media type:</t>

        <dl>
          <dt>Type name</dt>
          <dd>application</dd>

          <dt>Subtype name</dt>
          <dd>ains+json</dd>

          <dt>Required parameters</dt>
          <dd>none</dd>

          <dt>Optional parameters</dt>
          <dd>none</dd>

          <dt>Encoding considerations</dt>
          <dd>binary (UTF-8 JSON)</dd>

          <dt>Security considerations</dt>
          <dd>See <xref target="security"/></dd>

          <dt>Interoperability considerations</dt>
          <dd>See <xref target="record-format"/></dd>

          <dt>Published specification</dt>
          <dd>this document</dd>

          <dt>Applications that use this media type</dt>
          <dd>AINS registries and resolvers, autonomous agent
          platforms</dd>

          <dt>Fragment identifier considerations</dt>
          <dd>none</dd>

          <dt>Additional information</dt>
          <dd>none</dd>

          <dt>Person and email address to contact for further
          information</dt>
          <dd>Jasper van de Meent &lt;jasper@humotica.nl&gt;</dd>

          <dt>Intended usage</dt>
          <dd>COMMON</dd>

          <dt>Restrictions on usage</dt>
          <dd>none</dd>

          <dt>Author</dt>
          <dd>Jasper van de Meent</dd>

          <dt>Change controller</dt>
          <dd>IETF</dd>
        </dl>
      </section>
    </section>
  </middle>

  <back>
    <references>
      <name>References</name>

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

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

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

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

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

        <reference anchor="RFC8446"
                   target="https://www.rfc-editor.org/info/rfc8446">
          <front>
            <title>The Transport Layer Security (TLS)
                   Protocol Version 1.3</title>
            <author fullname="E. Rescorla" initials="E."
                    surname="Rescorla"/>
            <date month="August" year="2018"/>
          </front>
          <seriesInfo name="RFC" value="8446"/>
          <seriesInfo name="DOI" value="10.17487/RFC8446"/>
        </reference>

        <reference anchor="RFC9110"
                   target="https://www.rfc-editor.org/info/rfc9110">
          <front>
            <title>HTTP Semantics</title>
            <author fullname="R. Fielding" initials="R."
                    surname="Fielding" role="editor"/>
            <author fullname="M. Nottingham" initials="M."
                    surname="Nottingham" role="editor"/>
            <author fullname="J. Reschke" initials="J."
                    surname="Reschke" role="editor"/>
            <date month="June" year="2022"/>
          </front>
          <seriesInfo name="STD" value="97"/>
          <seriesInfo name="RFC" value="9110"/>
          <seriesInfo name="DOI" value="10.17487/RFC9110"/>
        </reference>
      </references>

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

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

        <reference anchor="RFC7686"
                   target="https://www.rfc-editor.org/info/rfc7686">
          <front>
            <title>The ".onion" Special-Use Domain Name</title>
            <author fullname="J. Appelbaum" initials="J."
                    surname="Appelbaum"/>
            <author fullname="A. Muffett" initials="A."
                    surname="Muffett"/>
            <date month="October" year="2015"/>
          </front>
          <seriesInfo name="RFC" value="7686"/>
          <seriesInfo name="DOI" value="10.17487/RFC7686"/>
        </reference>

        <reference anchor="DID-CORE"
                   target="https://www.w3.org/TR/did-core/">
          <front>
            <title>Decentralized Identifiers (DIDs) v1.0</title>
            <author fullname="M. Sporny" initials="M."
                    surname="Sporny"/>
            <author fullname="D. Longley" initials="D."
                    surname="Longley"/>
            <author fullname="M. Sabadello" initials="M."
                    surname="Sabadello"/>
            <author fullname="D. Reed" initials="D."
                    surname="Reed"/>
            <author fullname="O. Steele" initials="O."
                    surname="Steele"/>
            <author fullname="C. Allen" initials="C."
                    surname="Allen"/>
            <date month="July" year="2022"/>
          </front>
          <refcontent>W3C Recommendation</refcontent>
        </reference>

        <reference anchor="TIBET">
          <front>
            <title>TIBET: Transaction/Interaction-Based Evidence
                   Trail</title>
            <author fullname="J. van de Meent" initials="J."
                    surname="van de Meent"/>
            <author fullname="Root AI" surname="Root AI"/>
            <date month="March" year="2026"/>
          </front>
          <seriesInfo name="Internet-Draft"
                      value="draft-vandemeent-tibet-provenance-01"/>
        </reference>

        <reference anchor="JIS">
          <front>
            <title>JIS: JTel Identity Standard</title>
            <author fullname="J. van de Meent" initials="J."
                    surname="van de Meent"/>
            <author fullname="Root AI" surname="Root AI"/>
            <date month="March" year="2026"/>
          </front>
          <seriesInfo name="Internet-Draft"
                      value="draft-vandemeent-jis-identity-01"/>
        </reference>

        <reference anchor="UPIP">
          <front>
            <title>UPIP: Universal Process Integrity Protocol</title>
            <author fullname="J. van de Meent" initials="J."
                    surname="van de Meent"/>
            <author fullname="Root AI" surname="Root AI"/>
            <date month="March" year="2026"/>
          </front>
          <seriesInfo name="Internet-Draft"
                      value="draft-vandemeent-upip-process-integrity-01"/>
        </reference>

        <reference anchor="RVP">
          <front>
            <title>RVP: Real-time Verification Protocol</title>
            <author fullname="J. van de Meent" initials="J."
                    surname="van de Meent"/>
            <author fullname="Root AI" surname="Root AI"/>
            <date month="March" year="2026"/>
          </front>
          <seriesInfo name="Internet-Draft"
                      value="draft-vandemeent-rvp-continuous-verification-01"/>
        </reference>

        <reference anchor="GDPR">
          <front>
            <title>Regulation (EU) 2016/679 on the protection of
                   natural persons with regard to the processing of
                   personal data (General Data Protection
                   Regulation)</title>
            <author>
              <organization>European Parliament</organization>
            </author>
            <date month="April" year="2016"/>
          </front>
          <seriesInfo name="Regulation (EU)" value="2016/679"/>
        </reference>
      </references>
    </references>

    <section anchor="comparison">
      <name>Comparison with Existing Systems</name>

      <t>This appendix compares AINS with existing name resolution and
      agent discovery systems. This section is informative.</t>

      <artwork type="ascii-art"><![CDATA[
+-------------------+--------+----------+-------+-------+--------+
| Feature           |  DNS   |  DNS-SD  |  DID  |  A2A  |  AINS  |
+-------------------+--------+----------+-------+-------+--------+
| Name resolution   |  Yes   |   Yes    |  Yes  |  Yes  |  Yes   |
| Capability disc.  |  No    |  Basic   |  No   |  Yes  |  Yes   |
| Trust scoring     |  No    |   No     |  No   |  No   |  Yes   |
| Trust evidence    |  No    |   No     |  No   |  No   |  Yes   |
| Crypto identity   | DNSSEC |   No     |  Yes  |  No   |  Yes   |
| Provenance chain  |  No    |   No     |  No   |  No   |  Yes   |
| Federation        |  Yes   |  Local   |  Yes  |  No   |  Yes   |
| Audit trail       |  No    |   No     |  No   |  No   |  Yes   |
| Entity types      |  No    |  Types   |  No   |  No   |  Yes   |
| Human-readable    |  Yes   |   Yes    |  No   |  Yes  |  Yes   |
| Standards body    | IETF   |  IETF    |  W3C  | None  |  IETF* |
+-------------------+--------+----------+-------+-------+--------+

* AINS is currently an Internet-Draft, not yet an IETF standard.
]]></artwork>

      <t>Key differentiators:</t>

      <ul>
        <li>DNS resolves names to addresses. AINS resolves names to
        trust-annotated capability metadata.</li>
        <li>DID provides identity without discovery. AINS provides
        discovery with identity.</li>
        <li>A2A provides discovery without trust or audit. AINS
        provides discovery with both.</li>
        <li>DNS-SD is limited to local networks. AINS operates across
        administrative and trust boundaries.</li>
      </ul>
    </section>

    <section anchor="example-flows">
      <name>Example Resolution Flows</name>

      <section anchor="basic-discovery">
        <name>Basic Agent Discovery</name>

        <t>Agent A wants to find an agent capable of "code-review"
        with trust score >= 0.7:</t>

        <artwork type="ascii-art"><![CDATA[
Agent A                          AINS Registry
   |                                   |
   |  GET /ains/v1/lookup              |
   |    ?capability=code-review        |
   |    &min_trust=0.7                 |
   |---------------------------------->|
   |                                   |
   |  200 OK                           |
   |  { "agents": [                    |
   |      { "name": "root_idd",        |
   |        "trust_score": 0.95,       |
   |        "capabilities": [...] }    |
   |    ] }                            |
   |<----------------------------------|
   |                                   |
   |  GET /ains/v1/resolve/root_idd    |
   |---------------------------------->|
   |                                   |
   |  200 OK (full AINS Record)        |
   |<----------------------------------|
   |                                   |
   |  [JIS FIR/A handshake with        |
   |   root_idd using endpoint from    |
   |   AINS Record]                    |
   |=================================>|
]]></artwork>
      </section>

      <section anchor="federated-resolution">
        <name>Federated Resolution</name>

        <t>Agent A queries Registry X, which does not have the record.
        Registry X has federated records from Registry Y:</t>

        <artwork type="ascii-art"><![CDATA[
Agent A          Registry X              Registry Y
   |                 |                        |
   | resolve/agent_b |                        |
   |---------------->|                        |
   |                 | (not in local records)  |
   |                 | (check replicated)      |
   |                 |                        |
   |  200 OK         |                        |
   |  (record from Y,|                        |
   |   trust score   |                        |
   |   recomputed    |                        |
   |   by X's policy)|                        |
   |<----------------|                        |
]]></artwork>
      </section>
    </section>

    <section anchor="record-schema">
      <name>AINS Record Schema</name>

      <t>The following JSON Schema describes the structure of an AINS
      Record. This schema is informative; in case of conflict between
      this appendix and the normative text in
      <xref target="record-format"/>, the normative text takes
      precedence.</t>

      <sourcecode type="json"><![CDATA[
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "urn:ains:record:v1",
  "title": "AINS Record",
  "type": "object",
  "required": [
    "name", "entity_type", "status", "endpoint",
    "capabilities", "trust", "identity", "origin"
  ],
  "properties": {
    "name": {
      "type": "string",
      "pattern": "^[a-z0-9_-]+(\\.[a-z0-9_-]+)*$",
      "maxLength": 253
    },
    "entity_type": {
      "type": "string",
      "enum": ["ai", "idd", "human", "service"]
    },
    "tier": {
      "type": "string",
      "enum": ["core", "verified", "sandbox", "reserved"],
      "default": "sandbox"
    },
    "status": {
      "type": "string",
      "enum": ["active", "reserved", "suspended"]
    },
    "endpoint": {
      "type": "string",
      "format": "uri"
    },
    "capabilities": {
      "type": "array",
      "items": { "type": "string" },
      "minItems": 0
    },
    "trust": {
      "type": "object",
      "required": ["score", "evidence", "computed_at", "policy"],
      "properties": {
        "score": {
          "type": "number",
          "minimum": 0.0,
          "maximum": 1.0
        },
        "evidence": {
          "type": "array",
          "items": { "type": "object" }
        },
        "computed_at": {
          "type": "string",
          "format": "date-time"
        },
        "policy": { "type": "string" }
      }
    },
    "identity": {
      "type": "object",
      "required": ["public_key"],
      "properties": {
        "jis_id": { "type": "string" },
        "public_key": { "type": "string" },
        "registered_at": {
          "type": "string",
          "format": "date-time"
        }
      }
    },
    "origin": {
      "type": "object",
      "required": ["registry", "sequence", "signature"],
      "properties": {
        "registry": {
          "type": "string",
          "format": "uri"
        },
        "sequence": {
          "type": "integer",
          "minimum": 0
        },
        "signature": { "type": "string" }
      }
    }
  }
}
]]></sourcecode>
    </section>

    <section anchor="changes">
      <name>Changes from -00</name>

      <ol>
        <li>Changed intended status from Standards Track to
        Informational, consistent with suite policy.</li>

        <li>Added Scope section (<xref target="scope"/>) explicitly
        listing what this document does and does not define.</li>

        <li>Added dedicated Privacy Considerations section
        (<xref target="privacy"/>) covering metadata exposure,
        capability obfuscation, endpoint indirection, selective
        disclosure, federation propagation, and human entity
        privacy.</li>

        <li>Removed Well-Known URI registration from IANA
        Considerations. Resolution paths are now
        deployment-dependent, avoiding a premature IANA claim. IANA
        section retains only the media type registration.</li>

        <li>Replaced "jis_did" / "did:jtel:" identifier format with
        "jis_id" / "jis:" format throughout, consistent with
        JIS -01 which moved away from W3C DID to avoid conformance
        disputes.</li>

        <li>Moved JSON Schema from external normative reference to
        informative <xref target="record-schema"/>. The normative
        text in <xref target="record-format"/> now takes precedence
        over the schema, eliminating the unpublished-external-schema
        dependency.</li>

        <li>Security Considerations restructured to attack/impact/
        mitigation/deployment format consistent with other drafts
        in the suite. Removed "Privacy and Metadata Exposure"
        subsection (now a top-level section).</li>

        <li>Softened absolute claim about sovereign attestations
        ("strongest form" to "strong evidence ... not absolute
        proof").</li>

        <li>Removed hardcoded "/.well-known/ains/" path prefix from
        resolution endpoints. Examples now use "{prefix}" variable
        with "/ains/v1/" as default. Registry discovery endpoint
        (<xref target="registry-discovery"/>) includes
        "resolve_prefix" field.</li>

        <li>Updated all companion protocol references from -00 to -01
        and normalized reference labels to
        <xref target="TIBET"/>, <xref target="JIS"/>,
        <xref target="UPIP"/>, <xref target="RVP"/>.</li>

        <li>Added canonicalization cross-reference to TIBET
        <xref target="TIBET"/> Section 5.1 for federation log
        signatures.</li>

        <li>Added footnote to comparison table acknowledging AINS is
        currently an Internet-Draft, not an IETF standard.</li>

        <li>Updated registry discovery response example to reference
        -01 companion drafts.</li>

        <li>Added DID-CORE to informative references for the W3C DID
        comparison in the introduction.</li>
      </ol>
    </section>

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

      <t>The author thanks Root AI (root_idd.aint) for co-designing
      the AINS architecture, Codex (codex.aint) for standards
      analysis and the -01 cleanup checklist, Gemini (gemini.aint)
      for protocol review, GPT for cross-suite consistency review,
      and the HumoticaOS family for building the first operational
      AINS deployment.</t>
    </section>
  </back>
</rfc>
