<?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"
     docName="draft-song-anp-adp-00"
     category="exp"
     ipr="trust200902"
     submissionType="independent"
     xml:lang="en"
     version="3">

  <front>
    <title abbrev="ADP">Agent Description Protocol (ADP)</title>

    <seriesInfo name="Internet-Draft" value="draft-song-anp-adp-00"/>

    <author fullname="Jinke Song" initials="J." surname="Song">
      <organization abbrev="HKUST">Dept. of CSE, Hong Kong University of Science and Technology</organization>
      <address>
        <email>ink@chatchat.space</email>
      </address>
    </author>

    <author fullname="Mu Yuan" initials="M." surname="Yuan">
      <organization abbrev="CUHK">Dept. of IE, The Chinese University of Hong Kong</organization>
      <address>
        <email>muyuan@cuhk.edu.hk</email>
      </address>
    </author>

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

    <area>art</area>
    <workgroup>Independent Submission</workgroup>

    <keyword>agent</keyword>
    <keyword>description</keyword>
    <keyword>discovery</keyword>
    <keyword>capability</keyword>
    <keyword>agent card</keyword>

    <abstract>
      <t>
        Autonomous AI agents in a decentralized network need a
        common way to describe their capabilities so that peers
        can discover and invoke them.  The Agent Internet Protocol
        (AIP) provides name-based datagram delivery between agents
        identified by agent:// URIs; the Agent Invocation Transport
        Protocol (AITP) provides reliable invocation and streaming
        above AIP.  This document describes the Agent Description
        Protocol (ADP), an application-layer convention carried
        over AITP that defines how agents describe their
        capabilities, publish those descriptions, and discover
        peers whose capabilities match a query.
      </t>
      <t>
        ADP defines the Agent Card, a JSON document format that
        carries an agent's identity, human-readable description,
        method catalogue, endpoint bindings, skill tags, and
        operational constraints.  ADP also defines three AITP
        method names — adp.describe, adp.advertise, and
        adp.discover — through which agents exchange and query
        Agent Cards at the invocation layer.
      </t>
      <t>
        ADP is intentionally a thin format-and-convention layer:
        it standardizes the document schema and the exchange
        methods, but defers reputation, economics, credentials,
        identity infrastructure, and deployment-specific
        dissemination mechanisms (DHT topics, GossipSub channels,
        HTTP well-known URIs) to companion protocols and
        implementation profiles.
      </t>
    </abstract>
  </front>

  <middle>

    <!-- ============================================================ -->
    <!--  SECTION 1 — INTRODUCTION                                     -->
    <!-- ============================================================ -->

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

      <section anchor="problem-statement">
        <name>Problem Statement</name>
        <t>
          Agents in a decentralized network need a standard way to
          describe what they can do, so that other agents can discover
          and invoke them.  Without a common description format,
          every agent application protocol must independently define
          how capabilities are advertised, how methods are enumerated,
          and how operational constraints are communicated.
        </t>
        <t>
          Existing agent description approaches address parts of this
          problem.  Google A2A defines an AgentCard for HTTP-based
          agents.  MCP defines a tool list for client-server tool
          providers.  OASF defines a Kubernetes-style AgentDescriptor
          for orchestrators.  Each assumes a specific network model
          and transport binding.  None is designed for agent://-
          addressed peers communicating over AIP and AITP.
        </t>
        <t>
          ADP bridges this gap.  It describes a single document
          format — the Agent Card — that can be exchanged
          natively over AITP, while remaining convertible to and
          from external description formats.
        </t>
      </section>

      <section anchor="scope">
        <name>Scope</name>
        <t>
          This document is one of four core Internet-Drafts in
          the Agent Network Protocol (ANP) suite: AIP
          <xref target="I-D.song-anp-aip"/> (datagram
          delivery), AITP <xref target="I-D.song-anp-aitp"/>
          (invocation transport), ANS
          <xref target="I-D.song-anp-ans"/> (name system), and
          ADP (this document, description and discovery).  The
          four drafts are designed to co-evolve as a self-
          contained protocol suite; no additional specification
          is required for baseline interoperability.  AIP's
          local-resolver semantic extension
          <bcp14>MAY</bcp14> be backed by an implementation
          that consults ADP discovery services for ranked
          capability matching; ANS core provides name-to-peer
          binding but does not itself perform ranked semantic
          discovery.
        </t>
        <t>
          ADP is an application-layer convention carried over
          AITP <xref target="I-D.song-anp-aitp"/>.
        </t>
        <t>
          This document is organized in three layers of
          decreasing normative weight:
        </t>
        <dl>
          <dt>ADP Core (Sections 3-4)</dt>
          <dd>
            The Agent Card JSON document format — schema,
            field semantics, tool and endpoint descriptors,
            skill tags, constraints, and the extension
            mechanism.  This is the primary contribution of
            the document.
          </dd>
          <dt>ADP Exchange Conventions (Section 5)</dt>
          <dd>
            Three AITP method names (adp.describe,
            adp.advertise, adp.discover) through which agents
            retrieve, publish, and query Agent Cards.  These
            conventions bind the format to AITP but do not
            preclude other transports.
          </dd>
          <dt>ADP Baseline Discovery Profile (Section 6)</dt>
          <dd>
            A recommended multi-factor scoring algorithm
            providing one interoperable starting point for
            ranking agents.  This is guidance, not the only
            valid ranking strategy.
          </dd>
        </dl>
        <t>This document does not cover:</t>
        <ol>
          <li>Agent identity, key management, or authentication —
              these belong to AIP and deployment-context
              mechanisms.</li>
          <li>Reputation scoring or trust computation — these
              belong to a companion reputation protocol.</li>
          <li>Economic settlement, pricing, or credit systems.</li>
          <li>Verifiable credentials or attestation chains.</li>
          <li>Transport-specific dissemination (DHT key spaces,
              GossipSub topics, HTTP well-known paths) — these
              are implementation profiles, not protocol
              requirements.</li>
          <li>Task orchestration, workflow, or business logic.</li>
        </ol>
        <t>
          Accordingly, this document does not specify a complete
          agent runtime or deployment system; it describes only
          the description format and exchange conventions shared
          by agents above AITP.
        </t>
      </section>

      <section anchor="positioning">
        <name>Positioning Among Existing Approaches</name>
        <t>
          ADP is not a replacement for any existing agent description
          standard.  Its role is to describe a common description and
          exchange convention above AIP/AITP, in the same way that
          AITP defines a common invocation substrate above AIP.
        </t>
        <t>
          Google A2A's AgentCard is an HTTP-oriented description
          served at a well-known URL, tightly coupled to HTTP
          transport and A2A task semantics.  ADP's Agent Card is
          transport-independent at the protocol level; an AITP
          method retrieves it, and conversion to A2A format is a
          straightforward mapping (see
          <xref target="appendix-a2a"/>).
        </t>
        <t>
          MCP's tool list describes capabilities of a client-server
          tool provider.  ADP's tool descriptors use the same
          field names (name, description, inputSchema) for direct
          compatibility, but extend them with output schema,
          streaming, and idempotency annotations relevant to
          agent-to-agent invocation.
        </t>
        <t>
          OASF's AgentDescriptor uses a Kubernetes-style manifest
          (kind/apiVersion/metadata/spec) designed for orchestration
          platforms.  ADP uses a flat JSON document optimized for
          network exchange and progressive disclosure, but fields
          map bidirectionally to OASF (see
          <xref target="appendix-oasf"/>).
        </t>
      </section>

      <section anchor="design-rationale">
        <name>Design Rationale</name>
        <t>
          ADP is justified when the following conditions hold:
        </t>
        <ol>
          <li>
            <t><strong>Multiple agent applications need capability
            discovery.</strong></t>
            <t>
              If task orchestration, knowledge replication, swarm
              coordination, and direct messaging each need to
              discover agents by skill, factoring description and
              discovery into a shared protocol eliminates redundant
              definitions.
            </t>
          </li>
          <li>
            <t><strong>A single document simplifies the
            ecosystem.</strong></t>
            <t>
              If an agent's identity, capabilities, endpoints, and
              constraints are scattered across multiple data
              structures (profile records, resume broadcasts, name
              table entries), unifying them into one document
              reduces inconsistency.
            </t>
          </li>
          <li>
            <t><strong>Cross-ecosystem interoperability is
            valued.</strong></t>
            <t>
              If agents from different ecosystems (A2A, MCP, OASF)
              need to interoperate, a superset document that can be
              losslessly projected onto each ecosystem's format
              enables bridging without information loss.
            </t>
          </li>
        </ol>
      </section>

      <section anchor="assumptions">
        <name>Assumptions</name>
        <t>ADP assumes:</t>
        <ol>
          <li>An AITP module capable of sending and receiving
              invocations with the methods defined in this
              document.</li>
          <li>Agent:// URIs are stable identifiers for the
              duration of an Agent Card's validity period.</li>
          <li>Agent Card documents are UTF-8 encoded JSON
              (<xref target="RFC8259"/>).  Implementations
              <bcp14>MAY</bcp14> additionally support CBOR
              (<xref target="RFC8949"/>) for constrained
              environments.</li>
          <li>Companion protocols (reputation, credentials,
              economics) extend the Agent Card through the
              extension mechanism defined in
              <xref target="extensions"/>, not by modifying core
              fields.</li>
        </ol>
      </section>

      <section anchor="requirements-language">
        <name>Requirements Language</name>
        <t>
          The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>",
          "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>",
          "<bcp14>SHALL NOT</bcp14>", "<bcp14>SHOULD</bcp14>",
          "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>",
          "<bcp14>NOT RECOMMENDED</bcp14>", "<bcp14>MAY</bcp14>", and
          "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted
          as described in BCP&nbsp;14 <xref target="RFC2119"/>
          <xref target="RFC8174"/> when, and only when, they appear in all
          capitals, as shown here.
        </t>
      </section>

      <section anchor="document-status">
        <name>Document Status</name>
        <t>
          This document is Informational.  ADP describes a JSON
          document format and a set of AITP exchange conventions
          derived from running code in the ClawNet implementation.
          Unlike AIP and AITP, which define wire-level protocol
          encodings and state machines, ADP is a data-format and
          naming convention — closer in nature to RFC 7946 (GeoJSON)
          than to a transport protocol specification.
        </t>
        <t>
          The BCP 14 keywords in this document express
          interoperability requirements: an implementation that
          conforms to the Agent Card schema and method conventions
          described here will interoperate with other conforming
          implementations.  The keywords do not imply Standards
          Track status.
        </t>
      </section>
    </section>

    <!-- ============================================================ -->
    <!--  SECTION 2 — TERMINOLOGY                                      -->
    <!-- ============================================================ -->

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

      <dl>
        <dt>Agent Card</dt>
        <dd>
          A JSON document that describes an agent's identity,
          capabilities, endpoints, skill tags, and operational
          constraints.  The Agent Card is the central data
          structure described by this document.
        </dd>

        <dt>Tool Descriptor</dt>
        <dd>
          An object within an Agent Card that describes a single
          invocable method, including its name, input schema, output
          schema, and operational properties (streaming, idempotency).
        </dd>

        <dt>Endpoint Descriptor</dt>
        <dd>
          An object within an Agent Card that binds a set of methods
          to a protocol and URI through which they can be reached.
        </dd>

        <dt>Skill Tag</dt>
        <dd>
          A short UTF-8 string or hierarchical path (e.g.,
          "nlp/translation") that classifies an agent's capabilities
          for discovery and matching purposes.
        </dd>

        <dt>Discovery Query</dt>
        <dd>
          A structured request for agents whose capabilities match
          specified skill tags and/or natural-language descriptions,
          evaluated by a multi-factor scoring algorithm.
        </dd>
      </dl>
    </section>

    <!-- ============================================================ -->
    <!--  SECTION 3 — AGENT CARD DOCUMENT FORMAT                       -->
    <!-- ============================================================ -->

    <section anchor="agent-card">
      <name>Agent Card Document Format</name>

      <t>
        An Agent Card is a JSON object (<xref target="RFC8259"/>)
        that describes an agent.  Only two fields are required; all
        others are optional, enabling progressive disclosure: a
        minimal Agent Card is valid, and richer descriptions are
        built by adding optional fields.
      </t>

      <section anchor="card-structure">
        <name>Document Structure</name>
        <t>
          The top-level JSON object contains the following fields.
          Field names use snake_case for consistency with the
          existing implementation base and MCP field conventions.
        </t>

        <table anchor="tbl-card-fields">
          <name>Agent Card Top-Level Fields</name>
          <thead>
            <tr>
              <th>Field</th>
              <th>Type</th>
              <th>Req</th>
              <th>Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td>id</td>
              <td>string</td>
              <td>MUST</td>
              <td>
                Globally unique identifier for the agent.  The "id"
                <bcp14>MUST</bcp14> be the agent's agent:// URI —
                the native network-facing identifier used across
                the ANP suite (AIP, ANS, AITP, ADP).  See
                <xref target="identity-model"/>.
              </td>
            </tr>
            <tr>
              <td>name</td>
              <td>string</td>
              <td>MUST</td>
              <td>
                Human-readable agent name.  Uniqueness is
                <bcp14>RECOMMENDED</bcp14> but not enforced by this
                protocol.
              </td>
            </tr>
            <tr>
              <td>description</td>
              <td>string</td>
              <td>MAY</td>
              <td>
                Free-text description of the agent's purpose and
                capabilities.  Used for semantic discovery matching.
              </td>
            </tr>
            <tr>
              <td>version</td>
              <td>string</td>
              <td>MAY</td>
              <td>
                Semantic version string (e.g., "1.2.0") of the
                agent's capability set.
              </td>
            </tr>
            <tr>
              <td>skills</td>
              <td>string[]</td>
              <td>MAY</td>
              <td>
                Skill tags classifying the agent's capabilities.
                See <xref target="skill-tags"/>.
              </td>
            </tr>
            <tr>
              <td>tools</td>
              <td>object[]</td>
              <td>MAY</td>
              <td>
                Tool descriptors for invocable methods.  See
                <xref target="tool-descriptors"/>.
              </td>
            </tr>
            <tr>
              <td>endpoints</td>
              <td>object[]</td>
              <td>MAY</td>
              <td>
                Endpoint descriptors binding methods to protocols
                and URIs.  See <xref target="endpoint-descriptors"/>.
              </td>
            </tr>
            <tr>
              <td>constraints</td>
              <td>object</td>
              <td>MAY</td>
              <td>
                Operational constraints.  See
                <xref target="constraints"/>.
              </td>
            </tr>
            <tr>
              <td>did</td>
              <td>string</td>
              <td>MAY</td>
              <td>
                An optional Decentralized Identifier (DID) for
                cross-ecosystem identity binding (e.g.,
                did:key:z6Mk...).  Enables external credential
                and attestation ecosystems to reference the
                agent.  Does not replace the native agent://
                identifier in the "id" field.  See
                <xref target="identity-model"/>.
              </td>
            </tr>
            <tr>
              <td>metadata</td>
              <td>object</td>
              <td>MAY</td>
              <td>
                Temporal metadata: created_at, updated_at (ISO 8601
                timestamps), ttl (seconds).
              </td>
            </tr>
            <tr>
              <td>extensions</td>
              <td>object</td>
              <td>MAY</td>
              <td>
                Namespace-keyed extension fields.  See
                <xref target="extensions"/>.
              </td>
            </tr>
            <tr>
              <td>seq</td>
              <td>uint64</td>
              <td>MAY</td>
              <td>
                Monotonically increasing sequence number.  Each
                time the agent updates its Agent Card, it
                <bcp14>MUST</bcp14> increment seq by at least one.
                Consumers use seq to determine which of two cards
                is newer; a card with a higher seq supersedes one
                with a lower seq for the same id.
                See <xref target="card-signature"/>.
              </td>
            </tr>
            <tr>
              <td>signature</td>
              <td>string</td>
              <td>MAY</td>
              <td>
                Ed25519 signature over the canonical
                serialization of all other top-level fields
                (excluding "signature" itself), encoded as
                Base64url (no padding).  When present, consumers
                can verify the card was produced by the private
                key corresponding to the agent's public key
                (derived from the agent:// URI in "id").
                See <xref target="card-signature"/>.
              </td>
            </tr>
          </tbody>
        </table>

        <t>
          Implementations <bcp14>MUST</bcp14> ignore unrecognized
          top-level fields to enable forward compatibility.
          Implementations <bcp14>MUST NOT</bcp14> reject an Agent
          Card solely because it contains fields not defined in
          this specification.
        </t>
      </section>

      <section anchor="card-signature">
        <name>Agent Card Signature</name>
        <t>
          The optional "seq" and "signature" fields allow an Agent
          Card to be verified independently of its delivery
          channel.  This is important when cards are cached by
          directory agents, relayed through gossip, or stored in
          the DHT — contexts where the original AITP association
          is no longer available for authentication.
        </t>
        <t>
          To sign an Agent Card, the agent:
        </t>
        <ol>
          <li>
            Constructs the complete Agent Card JSON object with
            all desired fields, including "seq", but excluding
            "signature".
          </li>
          <li>
            Serializes the object using JCS (JSON Canonicalization
            Scheme, <xref target="RFC8785"/>) to produce a
            deterministic byte sequence.
          </li>
          <li>
            Signs the byte sequence with the agent's Ed25519
            private key.
          </li>
          <li>
            Encodes the 64-byte signature as Base64url (no padding)
            and inserts it as the "signature" field.
          </li>
        </ol>
        <t>
          A consumer verifies an Agent Card by removing the
          "signature" field, re-canonicalizing via JCS, and
          verifying the Ed25519 signature against the public key
          derived from the "id" URI.  If verification fails, the
          consumer <bcp14>MUST</bcp14> discard the card.
        </t>
        <t>
          When both "seq" and "signature" are present, consumers
          <bcp14>MUST</bcp14> prefer the card with the higher
          "seq" value for a given "id".  A card without
          "signature" <bcp14>MUST NOT</bcp14> supersede a signed
          card with the same or higher "seq".
        </t>
        <t>
          These fields mirror the same pattern used by ANS Name
          Records (<xref target="I-D.song-anp-ans"/>,
          Section 5.1), providing a uniform authentication
          mechanism across both discovery layers.
        </t>
      </section>

      <section anchor="identity-model">
        <name>Identity Model</name>
        <t>
          Within the ANP protocol suite, agent:// is the native
          identifier for network-facing capability endpoints.
          The agent:// URI serves as the canonical primary key
          across all four protocol layers:
        </t>
        <ul>
          <li>AIP: source and destination URI in datagrams</li>
          <li>ANS: registration, resolution, and discovery key</li>
          <li>AITP: association endpoint identifier</li>
          <li>ADP: capability description subject</li>
        </ul>
        <t>
          Other identifiers such as Decentralized Identifiers
          (DIDs) may be attached to an Agent Card via the
          optional "did" field for external ecosystem
          interoperability — credential issuance, cross-domain
          identity federation, or legal identity binding.  These
          external identifiers do not replace the native agent://
          identifier and are not used for routing, name
          resolution, or transport association within ANP.
        </t>
      </section>

      <section anchor="tool-descriptors">
        <name>Tool Descriptors</name>
        <t>
          Each element of the "tools" array describes a single
          invocable method.  The field names align with MCP's tool
          definition for direct compatibility.
        </t>

        <table anchor="tbl-tool-fields">
          <name>Tool Descriptor Fields</name>
          <thead>
            <tr>
              <th>Field</th>
              <th>Type</th>
              <th>Req</th>
              <th>Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td>name</td>
              <td>string</td>
              <td>MUST</td>
              <td>
                Method name.  <bcp14>MUST</bcp14> match the AITP
                Method value used to invoke this tool.  Maximum
                255 UTF-8 octets (AITP Method Len limit).
              </td>
            </tr>
            <tr>
              <td>description</td>
              <td>string</td>
              <td>MAY</td>
              <td>
                Human-readable description of what the method does.
              </td>
            </tr>
            <tr>
              <td>input_schema</td>
              <td>object</td>
              <td>MAY</td>
              <td>
                JSON Schema (2020-12) describing the expected
                request body.
              </td>
            </tr>
            <tr>
              <td>output_schema</td>
              <td>object</td>
              <td>MAY</td>
              <td>
                JSON Schema describing the response body on success.
              </td>
            </tr>
            <tr>
              <td>streaming</td>
              <td>boolean</td>
              <td>MAY</td>
              <td>
                If true, this method supports AITP bidirectional
                streaming (Type = STREAM).  Default: false.
              </td>
            </tr>
            <tr>
              <td>idempotent</td>
              <td>boolean</td>
              <td>MAY</td>
              <td>
                If true, invoking this method multiple times with
                the same input produces the same result.
                Default: false.
              </td>
            </tr>
          </tbody>
        </table>

        <t>
          Implementations <bcp14>MUST</bcp14> ignore unrecognized
          fields within tool descriptors.
        </t>
      </section>

      <section anchor="endpoint-descriptors">
        <name>Endpoint Descriptors</name>
        <t>
          Each element of the "endpoints" array binds a set of
          methods to a reachable network address.
        </t>

        <table anchor="tbl-endpoint-fields">
          <name>Endpoint Descriptor Fields</name>
          <thead>
            <tr>
              <th>Field</th>
              <th>Type</th>
              <th>Req</th>
              <th>Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td>protocol</td>
              <td>string</td>
              <td>MUST</td>
              <td>
                Protocol identifier.  See
                <xref target="tbl-protocols"/>.
              </td>
            </tr>
            <tr>
              <td>uri</td>
              <td>string</td>
              <td>MUST</td>
              <td>
                Endpoint URI.  Format depends on protocol.
              </td>
            </tr>
            <tr>
              <td>methods</td>
              <td>string[]</td>
              <td>MAY</td>
              <td>
                Method names reachable at this endpoint.  If absent,
                all tools are assumed reachable.
              </td>
            </tr>
            <tr>
              <td>auth</td>
              <td>string</td>
              <td>MAY</td>
              <td>
                Authentication scheme: "none", "bearer",
                "mutual_tls", "aitp_signed".
              </td>
            </tr>
            <tr>
              <td>priority</td>
              <td>integer</td>
              <td>MAY</td>
              <td>
                Lower values indicate higher priority.  Default: 0.
                Clients <bcp14>SHOULD</bcp14> prefer endpoints with
                lower priority values.
              </td>
            </tr>
          </tbody>
        </table>

        <table anchor="tbl-protocols">
          <name>Protocol Identifiers Recognized by This Specification</name>
          <thead>
            <tr>
              <th>Identifier</th>
              <th>Description</th>
              <th>Example URI</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td>aitp</td>
              <td>AITP invocation over AIP</td>
              <td>agent://translator-zh-en</td>
            </tr>
            <tr>
              <td>http+json</td>
              <td>HTTP REST (RFC 9110)</td>
              <td>https://api.example.com/v1</td>
            </tr>
            <tr>
              <td>grpc</td>
              <td>gRPC</td>
              <td>grpc://api.example.com:443</td>
            </tr>
            <tr>
              <td>ws</td>
              <td>WebSocket (RFC 6455)</td>
              <td>wss://api.example.com/ws</td>
            </tr>
          </tbody>
        </table>

        <t>
          The "aitp" protocol identifier is the native binding for
          ANP agents.  Other identifiers enable bridging to
          non-ANP ecosystems.  These identifiers are recognized
          by conforming ADP implementations for
          interoperability; they do not constitute a global
          protocol registry.  The list is not exhaustive;
          implementations <bcp14>MAY</bcp14> recognize additional
          protocol identifiers and <bcp14>MUST</bcp14> ignore
          endpoint entries with identifiers they do not
          understand.
        </t>
      </section>

      <section anchor="skill-tags">
        <name>Skill Tags</name>
        <t>
          The "skills" array contains UTF-8 strings that classify
          the agent's capabilities for discovery.  Two syntactic
          forms are defined:
        </t>

        <table anchor="tbl-tag-syntax">
          <name>Skill Tag Syntax</name>
          <thead>
            <tr>
              <th>Form</th>
              <th>Example</th>
              <th>Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td>Flat</td>
              <td>"python"</td>
              <td>A single keyword.  Lowercase ASCII
                  <bcp14>RECOMMENDED</bcp14>.</td>
            </tr>
            <tr>
              <td>Hierarchical</td>
              <td>"nlp/translation"</td>
              <td>
                A slash-separated path from general to specific.
                Each segment <bcp14>SHOULD</bcp14> be lowercase
                ASCII with hyphens.
              </td>
            </tr>
          </tbody>
        </table>

        <section anchor="tag-matching">
          <name>Matching Rules</name>
          <t>
            Implementations that perform skill-tag matching
            <bcp14>SHOULD</bcp14> support the following rules:
          </t>
          <dl>
            <dt>Exact match</dt>
            <dd>
              Query tag "nlp/translation" matches only the tag
              "nlp/translation".
            </dd>
            <dt>Prefix match (query expansion)</dt>
            <dd>
              Query tag "nlp/*" matches any tag whose first path
              segment is "nlp" (e.g., "nlp/translation",
              "nlp/text-analysis/sentiment").
            </dd>
            <dt>Parent match (upward compatibility)</dt>
            <dd>
              An agent declaring "nlp/translation" matches a query
              for "nlp" because a more specific skill implies the
              general category.
            </dd>
          </dl>
          <t>
            Implementations <bcp14>MAY</bcp14> support alias
            normalization (e.g., "py" normalizes to "python",
            "ml" normalizes to "machine-learning").  Alias tables
            are deployment-specific and not standardized by this
            document.
          </t>
        </section>

        <section anchor="tag-categories">
          <name>Recommended Top-Level Categories</name>
          <t>
            The following top-level path segments are
            <bcp14>RECOMMENDED</bcp14> for interoperability.
            Agents <bcp14>MAY</bcp14> use any tag; these
            categories provide a common starting vocabulary.
          </t>

          <table anchor="tbl-tag-categories">
            <name>Recommended Skill Tag Categories</name>
            <thead>
              <tr>
                <th>Category</th>
                <th>Description</th>
                <th>Examples</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td>nlp</td>
                <td>Natural language processing</td>
                <td>nlp/translation, nlp/generation/summarization</td>
              </tr>
              <tr>
                <td>vision</td>
                <td>Computer vision</td>
                <td>vision/object-detection, vision/ocr</td>
              </tr>
              <tr>
                <td>audio</td>
                <td>Audio and speech</td>
                <td>audio/speech-to-text, audio/music-generation</td>
              </tr>
              <tr>
                <td>analytical</td>
                <td>Analytical and reasoning</td>
                <td>analytical/data-analysis, analytical/optimization</td>
              </tr>
              <tr>
                <td>coding</td>
                <td>Software development</td>
                <td>coding/code-generation, coding/debugging</td>
              </tr>
              <tr>
                <td>retrieval</td>
                <td>Information retrieval</td>
                <td>retrieval/web-search, retrieval/knowledge-base</td>
              </tr>
              <tr>
                <td>creative</td>
                <td>Creative production</td>
                <td>creative/writing, creative/design</td>
              </tr>
              <tr>
                <td>ops</td>
                <td>Operations</td>
                <td>ops/deployment, ops/monitoring, ops/security</td>
              </tr>
            </tbody>
          </table>
        </section>
      </section>

      <section anchor="constraints">
        <name>Operational Constraints</name>
        <t>
          The "constraints" object communicates operational limits
          to potential callers.
        </t>

        <table anchor="tbl-constraint-fields">
          <name>Constraint Fields</name>
          <thead>
            <tr>
              <th>Field</th>
              <th>Type</th>
              <th>Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td>max_concurrent_tasks</td>
              <td>integer</td>
              <td>
                Maximum number of simultaneous tasks the agent
                will accept.
              </td>
            </tr>
            <tr>
              <td>max_input_tokens</td>
              <td>integer</td>
              <td>
                Maximum input size in tokens for a single
                invocation.
              </td>
            </tr>
            <tr>
              <td>supported_languages</td>
              <td>string[]</td>
              <td>
                Natural languages the agent supports
                (ISO 639-1 codes).
              </td>
            </tr>
            <tr>
              <td>rate_limit</td>
              <td>string</td>
              <td>
                Rate limit expression (e.g., "60/min").
              </td>
            </tr>
          </tbody>
        </table>

        <t>
          All constraint fields are advisory.  Callers
          <bcp14>SHOULD</bcp14> respect advertised constraints but
          <bcp14>MUST</bcp14> be prepared for the agent to enforce
          them via AITP status codes (BUSY, INVALID_REQUEST) at
          invocation time.
        </t>
      </section>

      <section anchor="extensions">
        <name>Extension Mechanism</name>
        <t>
          The "extensions" object carries protocol-specific or
          deployment-specific data that is not part of the ADP core.
          Each key in the extensions object is a namespace string;
          each value is an arbitrary JSON object.
        </t>
        <t>
          Namespaces <bcp14>SHOULD</bcp14> use reverse-domain
          notation or a well-known short name to avoid collisions
          (e.g., "clawnet.reputation", "oasf.labels").
        </t>
        <t>
          Implementations <bcp14>MUST</bcp14> preserve unrecognized
          extension namespaces during round-trip serialization.
          Implementations <bcp14>MUST NOT</bcp14> reject an Agent
          Card because it contains unrecognized extensions.
        </t>
        <t>
          Example extensions for a ClawNet deployment:
        </t>
        <artwork type="json"><![CDATA[
{
  "extensions": {
    "clawnet.reputation": {
      "score": 78.5,
      "tier": 16,
      "tasks_completed": 342,
      "avg_rating": 4.7
    },
    "clawnet.economics": {
      "cost_shells_per_call": 1,
      "requires_deposit": false
    }
  }
}
]]></artwork>
      </section>

      <section anchor="card-example">
        <name>Complete Example</name>
        <artwork type="json"><![CDATA[
{
  "id": "agent://translator-zh-en",
  "did": "did:key:z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK",
  "name": "translator-zh-en",
  "description": "Chinese-English bidirectional translation",
  "version": "1.2.0",
  "skills": ["nlp/translation", "nlp/text-analysis", "python"],
  "tools": [
    {
      "name": "translate",
      "description": "Translate text between languages",
      "input_schema": {
        "type": "object",
        "properties": {
          "text": {"type": "string"},
          "source_lang": {"type": "string", "default": "auto"},
          "target_lang": {"type": "string"}
        },
        "required": ["text", "target_lang"]
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "translated": {"type": "string"},
          "confidence": {"type": "number"}
        }
      },
      "streaming": false,
      "idempotent": true
    }
  ],
  "endpoints": [
    {
      "protocol": "aitp",
      "uri": "agent://translator-zh-en",
      "methods": ["translate", "detect_language", "glossary"]
    },
    {
      "protocol": "http+json",
      "uri": "https://api.example.com/translate/v1",
      "auth": "bearer",
      "priority": 10
    }
  ],
  "constraints": {
    "max_concurrent_tasks": 3,
    "max_input_tokens": 100000,
    "supported_languages": ["zh", "en", "ja"],
    "rate_limit": "60/min"
  },
  "metadata": {
    "created_at": "2026-01-15T00:00:00Z",
    "updated_at": "2026-03-24T12:00:00Z",
    "ttl": 3600
  }
}
]]></artwork>
      </section>
    </section>

    <!-- ============================================================ -->
    <!--  SECTION 4 — CARRIAGE OVER AITP                               -->
    <!-- ============================================================ -->

    <section anchor="carriage">
      <name>Carriage over AITP</name>

      <t>
        ADP describes three AITP method names for exchanging
        Agent Cards.  Each method uses a REQUEST/RESPONSE
        exchange; the request body and response body are JSON
        objects.
      </t>

      <section anchor="method-describe">
        <name>adp.describe — Retrieve an Agent Card</name>
        <t>
          A caller sends a REQUEST with Method = "adp.describe"
          to retrieve the remote agent's Agent Card.
        </t>
        <dl>
          <dt>Request body</dt>
          <dd>
            Empty, or a JSON object with an optional "fields"
            array listing the top-level field names the caller
            is interested in.  If "fields" is present, the
            responder <bcp14>MAY</bcp14> return only the
            requested fields plus the two required fields
            (id, name).
          </dd>
          <dt>Response body (Status = OK)</dt>
          <dd>
            The agent's Agent Card as a JSON object conforming
            to <xref target="agent-card"/>.
          </dd>
          <dt>Error responses</dt>
          <dd>
            UNAUTHORIZED (5) if the caller lacks permission to
            view the description.
          </dd>
        </dl>
        <t>
          Agents implementing ADP <bcp14>MUST</bcp14>
          register a handler for the "adp.describe" method and
          respond with at least a minimal Agent Card (id and
          name).  Deployments that expose peer-visible
          capability metadata <bcp14>SHOULD</bcp14> implement
          adp.describe, as it is the primary mechanism through
          which peers learn an agent's capabilities.
        </t>
      </section>

      <section anchor="method-advertise">
        <name>adp.advertise — Publish an Agent Card</name>
        <t>
          An agent sends a REQUEST with Method = "adp.advertise"
          to push its Agent Card to a peer, directory service, or
          name server.
        </t>
        <dl>
          <dt>Request body</dt>
          <dd>
            The sender's Agent Card as a JSON object.  The
            "id" field <bcp14>MUST</bcp14> equal the AITP
            association's source agent:// URI.
          </dd>
          <dt>Response body (Status = OK)</dt>
          <dd>
            A JSON object with a "stored" boolean field indicating
            whether the receiver has stored the Agent Card.
          </dd>
          <dt>Error responses</dt>
          <dd>
            INVALID_REQUEST (6) if the Agent Card fails validation.
            UNAUTHORIZED (5) if the sender is not permitted to
            advertise.
          </dd>
        </dl>
        <t>
          Receivers <bcp14>SHOULD</bcp14> validate that the
          Agent Card's "id" matches the AITP association's
          remote agent:// URI.  Receivers <bcp14>MAY</bcp14>
          refuse to store Agent Cards that exceed a
          deployment-specific size limit.
        </t>
      </section>

      <section anchor="method-discover">
        <name>adp.discover — Query for Agents</name>
        <t>
          A caller sends a REQUEST with Method = "adp.discover"
          to query a peer or directory service for agents matching
          specified criteria.
        </t>
        <dl>
          <dt>Request body</dt>
          <dd>
            <t>
              A JSON object with the fields in
              <xref target="tbl-discover-request"/>.
            </t>
          </dd>
          <dt>Response body (Status = OK)</dt>
          <dd>
            <t>
              A JSON object with a "results" array.  Each element
              contains the fields in
              <xref target="tbl-discover-result"/>.
            </t>
          </dd>
        </dl>

        <table anchor="tbl-discover-request">
          <name>adp.discover Request Fields</name>
          <thead>
            <tr>
              <th>Field</th>
              <th>Type</th>
              <th>Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td>tags</td>
              <td>string[]</td>
              <td>Skill tags to match (at least one
                  <bcp14>SHOULD</bcp14> be provided).</td>
            </tr>
            <tr>
              <td>query</td>
              <td>string</td>
              <td>Natural-language description of the desired
                  capability.</td>
            </tr>
            <tr>
              <td>limit</td>
              <td>integer</td>
              <td>Maximum number of results.  Default: 10.</td>
            </tr>
            <tr>
              <td>min_score</td>
              <td>number</td>
              <td>Minimum composite score threshold (0.0-1.0).
                  Default: 0.1.</td>
            </tr>
          </tbody>
        </table>

        <table anchor="tbl-discover-result">
          <name>adp.discover Result Fields</name>
          <thead>
            <tr>
              <th>Field</th>
              <th>Type</th>
              <th>Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td>agent_card</td>
              <td>object</td>
              <td>The matched agent's Agent Card (or a subset
                  thereof).</td>
            </tr>
            <tr>
              <td>score</td>
              <td>number</td>
              <td>Composite match score (0.0-1.0).</td>
            </tr>
            <tr>
              <td>matched_tags</td>
              <td>string[]</td>
              <td>Skill tags that contributed to the match.</td>
            </tr>
          </tbody>
        </table>

        <dl>
          <dt>Error responses</dt>
          <dd>
            INVALID_REQUEST (6) if the query is malformed.
          </dd>
        </dl>
        <t>
          Any agent <bcp14>MAY</bcp14> respond to adp.discover
          queries by searching its local knowledge of peer Agent
          Cards.  A dedicated directory agent <bcp14>MAY</bcp14>
          aggregate Agent Cards from adp.advertise calls and serve
          richer discovery results.
        </t>
      </section>

      <section anchor="method-summary">
        <name>Method Summary</name>

        <table anchor="tbl-methods">
          <name>ADP AITP Methods</name>
          <thead>
            <tr>
              <th>Method</th>
              <th>Direction</th>
              <th>Purpose</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td>adp.describe</td>
              <td>Caller → Agent</td>
              <td>Retrieve the agent's Agent Card</td>
            </tr>
            <tr>
              <td>adp.advertise</td>
              <td>Agent → Directory/Peer</td>
              <td>Push the agent's Agent Card</td>
            </tr>
            <tr>
              <td>adp.discover</td>
              <td>Caller → Directory/Peer</td>
              <td>Query for agents by criteria</td>
            </tr>
          </tbody>
        </table>
      </section>
    </section>

    <!-- ============================================================ -->
    <!--  SECTION 5 — DISCOVERY                                        -->
    <!-- ============================================================ -->

    <section anchor="discovery">
      <name>Baseline Discovery Profile</name>

      <t>
        This section describes a recommended baseline scoring
        profile for ranking agents against a discovery query.
        It provides one interoperable starting point, not the
        only valid ranking strategy.  This profile is intended
        to improve comparability across implementations, not to
        constrain local ranking policy.
        Implementations that respond to adp.discover
        <bcp14>SHOULD</bcp14> use this profile or a compatible
        variant to promote consistent cross-implementation
        ranking.
      </t>
      <t>
        The scoring factors described here are intentionally
        abstract: they identify what signals matter for
        discovery, while leaving the concrete computation of
        each signal (reputation model, availability probe
        mechanism, rating aggregation) to the deployment
        context.
      </t>

      <section anchor="scoring">
        <name>Recommended Scoring Algorithm</name>
        <t>
          The baseline composite score for a candidate agent is:
        </t>
        <artwork type="ascii-art"><![CDATA[
score = W_tag * tagScore
      + W_sem * semanticScore
      + W_rep * reputationScore
      + W_avl * availabilityScore
      + W_rat * ratingScore
]]></artwork>
        <t>
          The recommended default weights are:
        </t>

        <table anchor="tbl-weights">
          <name>Default Discovery Weights</name>
          <thead>
            <tr>
              <th>Factor</th>
              <th>Symbol</th>
              <th>Default</th>
              <th>Computation</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td>Tag match</td>
              <td>W_tag</td>
              <td>0.30</td>
              <td>|matched_tags| / |query_tags| (Jaccard-style
                  overlap between query tags and agent skills)</td>
            </tr>
            <tr>
              <td>Semantic overlap</td>
              <td>W_sem</td>
              <td>0.25</td>
              <td>Word overlap or BM25 score between the query
                  text and the agent's description + skill labels</td>
            </tr>
            <tr>
              <td>Reputation</td>
              <td>W_rep</td>
              <td>0.20</td>
              <td>Deployment-specific reputation score, normalized
                  to [0.0, 1.0]</td>
            </tr>
            <tr>
              <td>Availability</td>
              <td>W_avl</td>
              <td>0.15</td>
              <td>1.0 if the agent is online and below its
                  max_concurrent_tasks; 0.0 otherwise</td>
            </tr>
            <tr>
              <td>Rating</td>
              <td>W_rat</td>
              <td>0.10</td>
              <td>Deployment-specific average rating, normalized
                  to [0.0, 1.0]</td>
            </tr>
          </tbody>
        </table>

        <t>
          Implementations <bcp14>MAY</bcp14> adjust weights based
          on deployment requirements.  The five factors and their
          semantics are the normative core of this baseline profile;
          the default numeric weights are <bcp14>RECOMMENDED</bcp14>
          starting values.  Note that reputation, rating, and
          availability are inherently deployment-specific signals
          normalized into interoperable [0.0, 1.0] score fields;
          this specification does not prescribe how those signals
          are computed.  Implementations that diverge from
          these factors <bcp14>SHOULD</bcp14> document their
          scoring approach to enable cross-implementation
          comparison.
        </t>
      </section>

      <section anchor="cold-start">
        <name>Cold Start (Recommended Practice)</name>
        <t>
          New agents with fewer than 5 completed tasks lack
          sufficient reputation and rating signals.
          Implementations <bcp14>SHOULD</bcp14> apply a cold-start
          boost (e.g., adding a fixed reputation bonus) to avoid
          penalizing new entrants.  The boost amount and task
          threshold are deployment-specific.
        </t>
      </section>

      <section anchor="load-filtering">
        <name>Load Filtering (Recommended Practice)</name>
        <t>
          Implementations <bcp14>SHOULD</bcp14> exclude agents
          whose active task count meets or exceeds their
          max_concurrent_tasks constraint from discovery results.
          This prevents routing work to overloaded agents.
        </t>
      </section>
    </section>

    <!-- ============================================================ -->
    <!--  SECTION 6 — AGENT CARD LIFECYCLE                             -->
    <!-- ============================================================ -->

    <section anchor="lifecycle">
      <name>Agent Card Lifecycle</name>

      <section anchor="lc-creation">
        <name>Creation</name>
        <t>
          An agent creates its Agent Card by populating at least
          the "id" and "name" fields.  The "metadata.created_at"
          field <bcp14>SHOULD</bcp14> be set to the current UTC
          timestamp.
        </t>
      </section>

      <section anchor="lc-publication">
        <name>Publication</name>
        <t>
          An agent publishes its Agent Card by:
        </t>
        <ol>
          <li>Responding to incoming adp.describe requests.</li>
          <li>Proactively sending adp.advertise to known directory
              agents or peers.</li>
          <li>Using deployment-specific dissemination mechanisms
              (DHT, GossipSub, HTTP well-known endpoints) as
              defined by implementation profiles.</li>
        </ol>
        <t>
          The minimal publication requirement is (1): agents
          implementing ADP <bcp14>MUST</bcp14> respond to
          adp.describe.  Proactive advertisement is
          <bcp14>OPTIONAL</bcp14> and depends on deployment needs.
        </t>
      </section>

      <section anchor="lc-freshness">
        <name>Freshness and TTL</name>
        <t>
          The "metadata.ttl" field indicates the number of seconds
          the Agent Card is considered fresh after retrieval.
          Consumers <bcp14>SHOULD</bcp14> re-fetch the Agent Card
          after the TTL expires.  If no TTL is present,
          implementations <bcp14>SHOULD</bcp14> apply a
          deployment-specific default.
        </t>
        <t>
          Each update to the Agent Card <bcp14>SHOULD</bcp14>
          increment "metadata.updated_at".  When the "seq" field
          (<xref target="card-signature"/>) is present, consumers
          <bcp14>MUST</bcp14> use "seq" as the authoritative
          ordering key; "metadata.updated_at" serves as a
          supplementary human-readable freshness hint.  Consumers
          <bcp14>SHOULD</bcp14> prefer the Agent Card with the
          higher "seq" (or, if "seq" is absent, the most recent
          updated_at timestamp) when multiple copies are obtained
          from different sources.
        </t>
      </section>

      <section anchor="lc-revocation">
        <name>Revocation</name>
        <t>
          An agent that is no longer available <bcp14>SHOULD</bcp14>
          publish an Agent Card with an empty "tools" array and
          an empty "endpoints" array, signaling that it has no
          callable methods.  Consumers <bcp14>SHOULD</bcp14> treat
          such an Agent Card as a revocation.
        </t>
        <t>
          Deployment-specific mechanisms (e.g., DHT record
          expiration, GossipSub tombstone messages) provide
          additional revocation signals but are outside the scope
          of this document.
        </t>
      </section>
    </section>

    <!-- ============================================================ -->
    <!--  SECTION 7 — SECURITY CONSIDERATIONS                         -->
    <!-- ============================================================ -->

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

      <section anchor="sec-authentication">
        <name>Agent Card Authentication</name>
        <t>
          An Agent Card can be spoofed if not authenticated.
          Implementations <bcp14>SHOULD</bcp14> deliver Agent Cards
          over AITP associations where the remote agent's identity
          has been verified (via AIP signature or lower-layer peer
          authentication).
        </t>
        <t>
          When Agent Cards are disseminated through intermediaries
          (directory agents, DHT, gossip), the intermediary
          <bcp14>MUST</bcp14> verify the Agent Card's authorship
          before storing and serving it.  Verification methods
          include checking that the "id" field matches the AITP
          source URI of the adp.advertise call, or — preferably —
          verifying the Ed25519 "signature" field defined in
          <xref target="card-signature"/>.  Implementations
          <bcp14>SHOULD</bcp14> include "seq" and "signature" in
          Agent Cards that will be disseminated beyond direct AITP
          associations.
        </t>
      </section>

      <section anchor="sec-capability-enumeration">
        <name>Capability Enumeration</name>
        <t>
          The tools array and skill tags reveal the methods an agent
          supports.  An adversary can invoke adp.describe to
          enumerate capabilities and then probe for vulnerabilities
          in specific methods.
        </t>
        <t>
          Agents concerned with capability enumeration
          <bcp14>MAY</bcp14> return a partial Agent Card in
          response to adp.describe from unrecognized or
          unauthenticated callers, omitting sensitive tools while
          preserving the required fields (id, name).
        </t>
      </section>

      <section anchor="sec-stale">
        <name>Stale Description Attacks</name>
        <t>
          An adversary who has obtained an old Agent Card can
          replay it to make consumers believe the agent still
          offers capabilities it has since revoked.  The
          "seq" field (<xref target="card-signature"/>),
          "metadata.updated_at" timestamp, and "metadata.ttl"
          fields provide freshness signals.  When "seq" and
          "signature" are present, consumers can
          cryptographically reject stale cards: a card with a
          lower "seq" <bcp14>MUST NOT</bcp14> supersede one with
          a higher "seq" carrying a valid signature.  Consumers
          <bcp14>SHOULD</bcp14> prefer the most recently retrieved
          Agent Card and <bcp14>SHOULD</bcp14> re-fetch after TTL
          expiration.
        </t>
      </section>

      <section anchor="sec-overcommitment">
        <name>Overcommitment</name>
        <t>
          An agent may advertise capabilities it cannot deliver
          (false advertising).  ADP does not prevent this; companion
          reputation protocols provide post-hoc accountability.
          Callers <bcp14>SHOULD</bcp14> verify critical capabilities
          at invocation time rather than relying solely on the
          Agent Card.
        </t>
      </section>

      <section anchor="sec-privacy">
        <name>Privacy</name>
        <t>
          Agent Cards may reveal information about an agent's
          operational capacity, supported languages, and method
          inventory.  Agents that require privacy
          <bcp14>SHOULD</bcp14> limit the fields they include in
          their Agent Card and <bcp14>MAY</bcp14> return different
          Agent Card subsets to different callers based on
          authorization level.
        </t>
      </section>

      <section anchor="sec-size">
        <name>Document Size</name>
        <t>
          Agent Cards are carried as AITP request/response bodies,
          constrained by AIP's maximum message size (65535 octets).
          Implementations <bcp14>MUST NOT</bcp14> generate Agent
          Cards larger than 65535 octets.  Implementations
          <bcp14>SHOULD</bcp14> keep Agent Cards compact by
          omitting unused optional fields rather than including
          them with empty values.
        </t>
        <t>
          If an Agent Card with all optional fields populated exceeds
          the AIP maximum message size, implementations
          <bcp14>SHOULD</bcp14> use one of the mitigation strategies
          defined in AITP <xref target="I-D.song-anp-aitp"/>:
          (1) deliver the Agent Card via an AITP STREAM exchange, or
          (2) use the adp.describe "fields" parameter to request a
          subset of the Agent Card across multiple REQUEST/RESPONSE
          round trips.  For adp.discover, implementations
          <bcp14>SHOULD</bcp14> use the "limit" parameter to bound
          result set size per response.
        </t>
      </section>
    </section>

    <!-- ============================================================ -->
    <!--  SECTION 8 — IANA CONSIDERATIONS                              -->
    <!-- ============================================================ -->

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

      <t>
        This document has no IANA actions.
      </t>
      <t>
        The AITP method names (adp.describe, adp.advertise,
        adp.discover) and endpoint protocol identifiers (aitp,
        http+json, grpc, ws) are conventions within the ANP
        protocol suite and are not drawn from IANA-managed
        registries.  Should a formal AITP method name registry be
        established by a future document, the method names defined
        here are candidates for registration in that registry.
      </t>
    </section>

    <!-- ============================================================ -->
    <!--  SECTION 9 — IMPLEMENTATION STATUS                            -->
    <!-- ============================================================ -->

    <section anchor="impl-status">
      <name>Implementation Status</name>

      <t>
        Per <xref target="RFC7942"/>, this section records known
        implementations.
      </t>

      <section anchor="impl-clawnet">
        <name>ClawNet</name>
        <dl>
          <dt>Organization</dt><dd>ChatChatTech</dd>
          <dt>URL</dt>
          <dd><eref target="https://github.com/ChatChatTech/ClawNet"/></dd>
          <dt>Description</dt>
          <dd>
            Go implementation of the full ANP suite.  Agent
            descriptions are currently stored as two structures
            (config.Profile and store.AgentResume) that map to
            the Agent Card fields defined in this document.
            Dissemination uses DHT (clawnet-profile namespace)
            with Ed25519-signed records and GossipSub
            (/clawnet/resumes topic) with periodic re-broadcast.
            Discovery uses a five-factor weighted scoring algorithm
            (tag match, semantic overlap, reputation, availability,
            rating) matching <xref target="scoring"/>.  The
            reference implementation is being updated to unify
            Profile and Resume into a single Agent Card structure
            and to register the three ADP methods on AITP.
          </dd>
          <dt>Maturity</dt><dd>Alpha</dd>
          <dt>Coverage</dt>
          <dd>
            <t>Implemented:</t>
            <ul>
              <li>Profile and Resume data structures covering all
                  core Agent Card fields</li>
              <li>DHT publication with Ed25519 signature
                  verification</li>
              <li>GossipSub resume broadcast (5-minute interval)</li>
              <li>REST API for profile CRUD
                  (GET/PUT /api/profile)</li>
              <li>Five-factor discovery scoring algorithm</li>
              <li>60+ standard skill tags with alias
                  normalization</li>
              <li>MCP tool exposure (17 tools)</li>
            </ul>
            <t>Under integration:</t>
            <ul>
              <li>Unified Agent Card struct (merge Profile +
                  Resume)</li>
              <li>adp.describe, adp.advertise, adp.discover AITP
                  method handlers</li>
              <li>Agent Card signing via metadata proof</li>
              <li>HTTP well-known endpoint
                  (/.well-known/agent-card.json)</li>
            </ul>
          </dd>
          <dt>Language</dt><dd>Go</dd>
          <dt>License</dt><dd>Open source</dd>
          <dt>Contact</dt><dd>ink@chatchat.space</dd>
        </dl>
      </section>
    </section>

  </middle>

  <back>

    <references>
      <name>References</name>

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

        <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 year="1997" month="March"/>
          </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 year="2017" month="May"/>
          </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"/>
            <date year="2017" month="December"/>
          </front>
          <seriesInfo name="STD" value="90"/>
          <seriesInfo name="RFC" value="8259"/>
          <seriesInfo name="DOI" value="10.17487/RFC8259"/>
        </reference>

        <reference anchor="I-D.song-anp-aip">
          <front>
            <title>Agent Internet Protocol (AIP)</title>
            <author fullname="Jinke Song" initials="J."
                    surname="Song">
              <organization>Department of CSE, HKUST</organization>
            </author>
            <date year="2026" month="March"/>
          </front>
          <seriesInfo name="Internet-Draft"
                      value="draft-song-anp-aip-01"/>
        </reference>

        <reference anchor="I-D.song-anp-aitp">
          <front>
            <title>Agent Invocation Transport Protocol (AITP)</title>
            <author fullname="Jinke Song" initials="J."
                    surname="Song">
              <organization>Department of CSE, HKUST</organization>
            </author>
            <date year="2026" month="March"/>
          </front>
          <seriesInfo name="Internet-Draft"
                      value="draft-song-anp-aitp-00"/>
        </reference>

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

      </references>

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

        <reference anchor="RFC7942"
                   target="https://www.rfc-editor.org/info/rfc7942">
          <front>
            <title>Improving Awareness of Running Code: The
                   Implementation Status Section</title>
            <author fullname="Y. Sheffer" initials="Y."
                    surname="Sheffer"/>
            <author fullname="A. Farrel" initials="A."
                    surname="Farrel"/>
            <date year="2016" month="July"/>
          </front>
          <seriesInfo name="BCP" value="205"/>
          <seriesInfo name="RFC" value="7942"/>
          <seriesInfo name="DOI" value="10.17487/RFC7942"/>
        </reference>

        <reference anchor="RFC8949"
                   target="https://www.rfc-editor.org/info/rfc8949">
          <front>
            <title>Concise Binary Object Representation (CBOR)</title>
            <author fullname="C. Bormann" initials="C."
                    surname="Bormann"/>
            <author fullname="P. Hoffman" initials="P."
                    surname="Hoffman"/>
            <date year="2020" month="December"/>
          </front>
          <seriesInfo name="STD" value="94"/>
          <seriesInfo name="RFC" value="8949"/>
          <seriesInfo name="DOI" value="10.17487/RFC8949"/>
        </reference>

        <reference anchor="I-D.song-anp-ans">
          <front>
            <title>Agent Name System (ANS)</title>
            <author fullname="Jinke Song" initials="J."
                    surname="Song">
              <organization>Department of CSE, HKUST</organization>
            </author>
            <date year="2026" month="March"/>
          </front>
          <seriesInfo name="Internet-Draft"
                      value="draft-song-anp-ans-00"/>
        </reference>

      </references>
    </references>

    <!-- ============================================================ -->
    <!--  APPENDIX A — ECOSYSTEM MAPPINGS (INFORMATIVE)                -->
    <!-- ============================================================ -->

    <section anchor="appendix-ecosystem" numbered="true">
      <name>Ecosystem Mappings (Informative)</name>

      <t>
        This appendix documents how Agent Card fields map to three
        external agent description formats.  These mappings are
        informative; external formats evolve independently.
      </t>

      <section anchor="appendix-a2a">
        <name>Google A2A AgentCard</name>

        <table anchor="tbl-a2a-mapping">
          <name>Agent Card to A2A AgentCard Mapping</name>
          <thead>
            <tr>
              <th>Agent Card</th>
              <th>A2A Field</th>
              <th>Rule</th>
            </tr>
          </thead>
          <tbody>
            <tr><td>name</td><td>name</td><td>Direct</td></tr>
            <tr><td>description</td><td>description</td><td>Direct</td></tr>
            <tr><td>endpoints[0].uri</td><td>url</td><td>First endpoint URI</td></tr>
            <tr><td>version</td><td>version</td><td>Direct</td></tr>
            <tr><td>tools[].name</td><td>skills[].id</td><td>Direct</td></tr>
            <tr><td>tools[].description</td><td>skills[].description</td><td>Direct</td></tr>
            <tr><td>tools[].streaming</td><td>capabilities.streaming</td><td>any(tools[].streaming)</td></tr>
          </tbody>
        </table>
      </section>

      <section anchor="appendix-mcp">
        <name>MCP Server Description</name>

        <table anchor="tbl-mcp-mapping">
          <name>Agent Card to MCP Tool List Mapping</name>
          <thead>
            <tr>
              <th>Agent Card</th>
              <th>MCP Field</th>
              <th>Rule</th>
            </tr>
          </thead>
          <tbody>
            <tr><td>tools[].name</td><td>tools[].name</td><td>Direct</td></tr>
            <tr><td>tools[].description</td><td>tools[].description</td><td>Direct</td></tr>
            <tr><td>tools[].input_schema</td><td>tools[].inputSchema</td><td>Direct (camelCase key)</td></tr>
          </tbody>
        </table>

        <t>
          MCP defines no output_schema, streaming, or idempotent
          fields; these are omitted in the MCP projection.
        </t>
      </section>

      <section anchor="appendix-oasf">
        <name>OASF AgentDescriptor</name>

        <table anchor="tbl-oasf-mapping">
          <name>Agent Card to OASF AgentDescriptor Mapping</name>
          <thead>
            <tr>
              <th>Agent Card</th>
              <th>OASF Field</th>
              <th>Rule</th>
            </tr>
          </thead>
          <tbody>
            <tr><td>name</td><td>metadata.name</td><td>Direct</td></tr>
            <tr><td>description</td><td>spec.description</td><td>Direct</td></tr>
            <tr><td>skills</td><td>metadata.labels.skills</td><td>Join with ","</td></tr>
            <tr><td>tools[].name</td><td>spec.capabilities[].name</td><td>Direct</td></tr>
            <tr><td>tools[].input_schema</td><td>spec.capabilities[].inputSchema</td><td>Direct</td></tr>
            <tr><td>endpoints[].uri</td><td>spec.endpoints[].url</td><td>Rename key</td></tr>
            <tr><td>version</td><td>metadata.labels.version</td><td>Direct</td></tr>
          </tbody>
        </table>

        <t>
          OASF has no reputation, credentials, or streaming fields;
          these are omitted in the OASF projection.  Reverse import
          from OASF loses only ClawNet-specific extension fields.
        </t>
      </section>
    </section>

    <!-- ============================================================ -->
    <!--  APPENDIX B — IMPLEMENTATION ALIGNMENT NOTES                  -->
    <!-- ============================================================ -->

    <section anchor="appendix-alignment" numbered="true">
      <name>Implementation Alignment Notes</name>

      <t>
        This appendix documents the relationship between this
        specification and the reference implementation in the
        ClawNet codebase.
      </t>

      <table anchor="tbl-impl-alignment">
        <name>Spec-Implementation Mapping</name>
        <thead>
          <tr>
            <th>Spec Concept</th>
            <th>Go Symbol / Location</th>
            <th>Notes</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td>Agent Card (core)</td>
            <td>config.Profile + store.AgentResume</td>
            <td>To be unified into single AgentCard struct</td>
          </tr>
          <tr>
            <td>Agent Card (DHT)</td>
            <td>p2p.ProfileRecord, p2p.ProfileRecordWire</td>
            <td>Ed25519-signed envelope</td>
          </tr>
          <tr>
            <td>Tool Descriptor</td>
            <td>mcp.ToolDefinition (17 tools)</td>
            <td>MCP tool definitions map directly</td>
          </tr>
          <tr>
            <td>Skill Tags</td>
            <td>discovery.StandardTags, discovery.TagAliases</td>
            <td>60+ tags, 20+ alias mappings</td>
          </tr>
          <tr>
            <td>Tag Matching</td>
            <td>discovery.TagOverlap()</td>
            <td>Jaccard-style overlap</td>
          </tr>
          <tr>
            <td>Discovery Scoring</td>
            <td>discovery.RankCandidates(), lob.Discover()</td>
            <td>Five-factor weighted algorithm</td>
          </tr>
          <tr>
            <td>DHT Publication</td>
            <td>p2p.Node.PublishProfile()</td>
            <td>DHT namespace: /clawnet-profile/</td>
          </tr>
          <tr>
            <td>GossipSub Broadcast</td>
            <td>daemon.publishResume()</td>
            <td>Topic: /clawnet/resumes, 5-min interval</td>
          </tr>
          <tr>
            <td>REST API</td>
            <td>daemon.handleGetProfile, handleUpdateProfile</td>
            <td>GET/PUT /api/profile</td>
          </tr>
          <tr>
            <td>Endpoint Descriptor</td>
            <td>ANS agent:// URI bindings</td>
            <td>Protocol = "aitp" equivalent</td>
          </tr>
          <tr>
            <td>Cold Start</td>
            <td>discovery.RankCandidates()</td>
            <td>+10 reputation bonus if tasks &lt; 5</td>
          </tr>
        </tbody>
      </table>
    </section>

  </back>

</rfc>
