| Internet-Draft | ANS | March 2026 |
| Song & Yuan | Expires 26 September 2026 | [Page] |
This document defines the Agent Name System (ANS), a name registration and resolution protocol for autonomous AI agents in the Agent Network Protocol (ANP) suite. ANS maps agent:// URIs to network-layer peer identifiers, providing the binding between human-readable agent names and the cryptographic peer identities used by the Agent Internet Protocol (AIP) for datagram delivery.¶
ANS defines a Name Record format, four AITP method names for name operations (ans.register, ans.resolve, ans.unregister, ans.lookup), a multi-layer resolution algorithm, and two dissemination mechanisms (GossipSub announcements and DHT storage). ANS supports three addressing modes — unicast, anycast, and channel — over a single URI syntax.¶
ANS is intentionally a narrow name-binding layer: it maps names to peers and tags, but defers capability description to the Agent Description Protocol (ADP), reputation and ranking to companion protocols, and economic anti-spam mechanisms to deployment profiles.¶
This Internet-Draft is submitted in full conformance with the provisions of BCP 78 and BCP 79.¶
Internet-Drafts are working documents of the Internet Engineering Task Force (IETF). Note that other groups may also distribute working documents as Internet-Drafts. The list of current Internet-Drafts is at https://datatracker.ietf.org/drafts/current/.¶
Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use Internet-Drafts as reference material or to cite them other than as "work in progress."¶
This Internet-Draft will expire on 26 September 2026.¶
Copyright (c) 2026 IETF Trust and the persons identified as the document authors. All rights reserved.¶
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document.¶
Agents in a decentralized network need stable, human-readable names that can be resolved to the cryptographic peer identifiers used for datagram delivery. The Agent Internet Protocol (AIP) [I-D.song-anp-aip] defines agent:// URIs as the addressing scheme for datagrams, but AIP itself does not specify how a name such as "agent://translator-zh-en" is bound to a particular peer or how that binding is disseminated across the network.¶
Without a name system, agents must exchange raw cryptographic peer identifiers — opaque strings that are neither memorable nor semantic. A name system provides the indirection layer that allows agent names to persist across peer-identity rotations, enables human operators to refer to agents by meaningful labels, and supports anycast routing where a single name resolves to the best available instance.¶
This document is one of four core Internet-Drafts in the Agent Network Protocol (ANP) suite: AIP [I-D.song-anp-aip] (datagram delivery), AITP [I-D.song-anp-aitp] (invocation transport), ANS (this document, name system), and ADP [I-D.song-anp-adp] (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 MAY 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.¶
ANS is a name-layer protocol within the ANP suite. It sits between the human-facing name space and the peer-identity layer used by AIP.¶
This document specifies:¶
This document does not cover:¶
ANS is to agent:// URIs what DNS is to domain names: a name-to-address resolution service. ANS differs from DNS in three respects: (1) registrations are self-certified via Ed25519 signatures rather than delegated to registrars; (2) resolution is peer-to-peer (DHT + gossip) rather than hierarchical; (3) the name space supports anycast and channel addressing modes natively. Of these three modes, only unicast and anycast names are registered; channel names are derived from the URI syntax and map deterministically to GossipSub topics without creating a Name Record (see Section 7.4).¶
Unlike ADP's adp.discover, which ranks agents by a multi-factor scoring algorithm, ANS's ans.lookup performs tag-based filtering without scoring — a narrow-waist lookup analogous to DNS SRV queries. The two protocols are complementary: ANS provides name→peer binding; ADP provides capability→ranking.¶
ANS is justified when the following conditions hold:¶
Agents need stable, human-readable identifiers.¶
Cryptographic peer IDs (e.g., 12D3KooW...) are unsuitable for human reference, configuration files, and documentation. A name layer provides stability across peer-ID rotation.¶
Multiple resolution paths improve availability.¶
A single DHT lookup may fail due to network partition. A layered resolution stack (local cache → persistent store → DHT → peer-assisted RPC) maximizes the probability of successful resolution.¶
Anycast requires a name-to-set mapping.¶
When multiple instances serve the same logical service, the name system must resolve a single name to a set of candidates. Instance selection is then delegated to the caller or to a companion ranking protocol (ADP).¶
ANS assumes:¶
ANS occupies a narrow role in the ANP suite. This section clarifies the boundary between ANS and its sibling protocols to prevent misattribution of responsibilities.¶
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 [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here.¶
The agent:// URI scheme identifies agents in the ANP network. AIP [I-D.song-anp-aip] defines the base agent:// scheme and its core parsing rules. This section defines the ANS-specific naming interpretation and constraints used for registration and resolution. AIP [I-D.song-anp-aip] is the scheme authority and defines the base agent:// syntax and wire encoding; the grammar below is a compatible profile that adds namespace, instance, version, and addressing-mode semantics on top of the AIP base grammar.¶
The following ABNF ([RFC5234]) defines the syntax of agent:// URIs. The grammar uses the core rules from [RFC5234] Appendix B and the generic URI components from [RFC3986].¶
agent-uri = "agent://" agent-path [ "@" version ] agent-path = service-path / channel-path ; Service addressing (unicast or anycast) service-path = [ namespace "/" ] name [ "/" instance ] ; Channel addressing (trailing "/" required) channel-path = [ namespace "/" ] name "/" namespace = identifier name = identifier instance = identifier version = 1*( ALPHA / DIGIT / "." / "-" ) identifier = lo-alpha-digit *( lo-alpha-digit / "-" ) lo-alpha-digit = %x61-7A / DIGIT ; a-z / 0-9¶
Constraints:¶
An agent:// URI carries one of three addressing modes, determined by syntactic inspection of the path:¶
| Mode | URI Pattern | Resolution Semantics |
|---|---|---|
| Unicast | agent://[ns/]name/instance | Resolve to exactly one peer: the named instance. |
| Anycast | agent://[ns/]name | Resolve to one or more peers registered under the service name; the caller or a companion protocol selects among candidates. |
| Channel | agent://[ns/]name/ | Map to a GossipSub topic; datagrams are delivered to all subscribers. Channel names are derived, not registered — no Name Record is stored. See Section 7.4. |
Implementations MUST detect the addressing mode using the following algorithm:¶
if path ends with "/" → Channel else if path contains instance → Unicast else → Anycast¶
An agent:// URI with no namespace and no instance (e.g., "agent://translator-zh-en") is Anycast. This preserves backward compatibility with the flat names used by existing implementations.¶
# Anycast — route to any available translator agent://translator-zh-en # Anycast — namespace-scoped agent://nlp/translator # Unicast — specific instance agent://nlp/translator/zh-en-01 # Unicast — versioned agent://nlp/translator/zh-en-01@1.2.0 # Channel — multicast to all subscribers agent://finance/market-updates/¶
Implementations MUST normalize agent:// URIs before registration, resolution, and comparison by:¶
The normalized form retains the "agent://" prefix. Implementations that need a prefix-stripped key for DHT or database storage MAY derive it internally, but the canonical wire-format value is always the full URI.¶
Two URIs are considered equal if their normalized forms are byte-identical.¶
A Name Record is a JSON object ([RFC8259]) that binds an agent:// name to a network peer and its metadata. Name Records are the unit of registration, dissemination, and resolution in ANS.¶
The following structural rules apply to every Name Record:¶
| Field | Type | Req | Description |
|---|---|---|---|
| name | string | MUST | The complete agent:// URI, including the scheme prefix. E.g., "agent://nlp/translator" or "agent://translator-zh-en". Implementations that need a prefix-stripped key for storage or DHT lookups SHOULD derive it internally; the wire-format and object-model value is always the full URI. |
| peer_id | string | MUST | The registrant's cryptographic peer identifier, as used by AIP for datagram routing. |
| namespace | string | MAY | The namespace segment extracted from the name (e.g., "nlp"). Redundant with "name" but enables efficient namespace-scoped queries. |
| skills | array | MAY | A JSON array of strings, each a lowercase skill tag (e.g., ["translation","nlp"]). Duplicate entries SHOULD be removed on input. Used for tag-based lookup (ans.lookup). |
| description | string | MAY | Free-text description of the agent's purpose. Used for full-text search. |
| version | string | MAY | Semantic version string of the agent's capability set (e.g., "1.2.0"). |
| ttl | integer | MAY | Time-to-live in seconds. Default: 3600. Consumers SHOULD consider the record stale after this duration. |
| registered_at | string | MUST | Registration timestamp in RFC 3339 format ([RFC3339]). |
| expires_at | string | MUST | Expiration timestamp in RFC 3339 format. Records past this time MUST be treated as expired and SHOULD be removed from caches. |
| owner_id | string | MUST | The peer_id of the first registrant. Immutable after initial registration. Only the Owner may update or transfer the record. |
| seq | integer | MUST | Monotonically increasing sequence number. Receivers MUST reject records with a seq value less than or equal to the locally stored seq for the same name. See Section 4.3. |
| signature | string | MUST | Ed25519 signature ([RFC8032]) over the canonical record bytes. See Section 4.2. Encoded as unpadded Base64url ([RFC4648] §5). |
| extensions | object | MAY | A JSON object carrying deployment-specific extension data. See Section 4.4. |
The signature field authenticates the Name Record and binds it to the registrant's Ed25519 key pair. The signature is computed as follows:¶
Receivers MUST verify the signature before accepting a Name Record. Verification requires the Ed25519 public key corresponding to the peer_id. Implementations MUST reject records whose signature does not verify, whose peer_id does not correspond to the signing key, or whose owner_id does not match the peer_id (for initial registrations) or the stored owner_id (for updates).¶
The seq field provides replay protection and consistent ordering of Name Record updates.¶
The "extensions" field provides a stable mounting point for deployment-specific data that does not belong in the core Name Record. Examples include anti-spam proof tokens, pricing metadata, transfer receipts, and deployment-policy hints.¶
The "extensions" object is excluded from the signature computation (Section 4.2). This is an intentional design trade-off: the core name-binding fields (name, peer_id, owner_id, seq, timestamps) are signed and tamper-evident — these fields fully cover the name-to-identity binding and temporal validity, so core record integrity does not depend on extensions. Extensions are left unsigned to allow deployment-local annotations and relay-added metadata (e.g., hop count, ingestion timestamp) that the originator cannot predict at signing time.¶
Consequently, any peer on the relay path may add, modify, or remove extension entries. Deployment profiles that require stronger integrity for specific extensions SHOULD define an inner signature field within their own extension namespace.¶
Implementations MUST validate Name Records on receipt, whether from ans.register requests, GossipSub messages, or DHT retrieval. The following rules apply:¶
| ID | Rule | Level |
|---|---|---|
| VAL-01 | "name" conforms to the agent:// ABNF (Section 3.1). | MUST |
| VAL-02 | "peer_id" is non-empty and is a syntactically valid peer identifier. | MUST |
| VAL-03 | "owner_id" is non-empty. For initial registrations, owner_id = peer_id. For updates, owner_id matches the stored value. | MUST |
| VAL-04 | "expires_at" is strictly after "registered_at", and "expires_at" is in the future at time of receipt. | MUST |
| VAL-05 | "ttl" is a positive integer (> 0). Default 3600 if absent. | MUST |
| VAL-06 | "seq" is an integer >= 1. For updates, seq is strictly greater than the stored seq. | MUST |
| VAL-07 | "skills" entries are unique, lowercase strings. Duplicates are removed silently. | SHOULD |
| VAL-08 | "namespace", if present, matches the namespace segment extracted from "name". | MUST |
| VAL-09 | "signature" verifies per Section 4.2. | MUST |
| VAL-10 | The addressing mode implied by "name" is consistent with the operation context. Channel names (trailing "/") are derived, not registered, and MUST NOT be submitted to ans.register (see Section 7.4). | MUST |
Records that fail any MUST-level rule MUST be rejected. Records that fail a SHOULD-level rule SHOULD be accepted after corrective normalization (e.g., deduplicating skills).¶
ANS defines four AITP method names for name operations. Each method uses an AITP REQUEST/RESPONSE exchange; the request and response bodies are JSON objects.¶
An agent sends a REQUEST with Method = "ans.register" to bind an agent:// name to its peer identity. Only Unicast and Anycast names may be registered; Channel names are derived from the URI syntax and MUST NOT be submitted to ans.register (see Section 7.4).¶
A JSON object with the following fields:¶
The receiver MUST perform the following validation before accepting a registration:¶
Registration MAY additionally require a deployment-specific anti-spam mechanism such as proof-of-work, token expenditure, or rate limiting. Such mechanisms are outside the scope of this specification.¶
A caller sends a REQUEST with Method = "ans.resolve" to look up the Name Record(s) bound to an agent:// name.¶
A JSON object with the following fields:¶
A JSON object with a uniform envelope containing three fields:¶
If the receiver does not have the requested record in its local store, it MAY attempt resolution via the DHT or peer-assisted query before returning an empty records array.¶
An agent sends a REQUEST with Method = "ans.unregister" to remove its Name Record.¶
A JSON object with the following fields:¶
The receiver MUST verify that the signature is valid and that the sender's peer_id matches the stored owner_id before removing the record. Upon successful unregistration, the receiver SHOULD propagate the removal via GossipSub (see Section 8.1).¶
A caller sends a REQUEST with Method = "ans.lookup" to find agents by skill tags. Unlike ADP's adp.discover, ans.lookup is a narrow-waist filter: it returns all matching records without scoring or ranking.¶
A JSON object with the following fields:¶
| Field | Type | Description |
|---|---|---|
| tags | string[] | Skill tags to match (at least one SHOULD be provided). |
| namespace | string | Optional namespace filter. |
| limit | integer | Maximum results. Default: 10. |
A JSON object with a "results" array. Each element contains:¶
A Name Record matches if at least one of the query tags appears in the record's skills array (after normalization). Implementations SHOULD normalize tags to lowercase and apply alias resolution (e.g., "py" → "python") before matching.¶
When the total number of matching records exceeds the AIP maximum message size (65535 octets), implementations SHOULD truncate the result set to "limit" entries and return only complete records that fit within a single response datagram. Callers that need additional results MAY issue subsequent queries with an "offset" parameter (application-level pagination) or use an AITP STREAM exchange for large result sets, as discussed in AITP [I-D.song-anp-aitp].¶
| Method | Direction | Purpose |
|---|---|---|
| ans.register | Agent → Peer/Directory | Bind a name to a peer identity |
| ans.resolve | Caller → Peer/Directory | Look up name → peer binding |
| ans.unregister | Agent → Peer/Directory | Remove a name binding |
| ans.lookup | Caller → Peer/Directory | Tag-based name filter (no ranking) |
ANS methods reuse AITP status codes for transport-level outcome (e.g., OK, INVALID_REQUEST, UNAUTHORIZED). In addition, ANS defines a structured error detail body that provides protocol-specific reason codes.¶
When an ANS method returns an AITP error status, the response body SHOULD include the following JSON object:¶
{
"code": "ANS-1002",
"title": "invalid-signature",
"detail": "Ed25519 signature verification failed for
name 'agent://nlp/translator'.",
"name": "agent://nlp/translator"
}
¶
Fields:¶
| Code | Title | AITP Status | Meaning |
|---|---|---|---|
| ANS-1001 | invalid-name | INVALID_REQUEST | Name does not conform to agent:// ABNF. |
| ANS-1002 | invalid-signature | INVALID_REQUEST | Ed25519 signature verification failed. |
| ANS-1003 | owner-mismatch | UNAUTHORIZED | Sender's peer_id does not match the stored owner_id. |
| ANS-1004 | stale-seq | INVALID_REQUEST | Record seq is less than or equal to the stored seq. |
| ANS-1005 | expired-record | INVALID_REQUEST | Record's expires_at is in the past. |
| ANS-1006 | malformed-record | INVALID_REQUEST | Record violates structural or validation rules (Section 4.5). |
| ANS-1007 | unsupported-mode | INVALID_REQUEST | Addressing mode not supported by this operation (e.g., channel name in ans.register). |
| ANS-1008 | capacity-exceeded | BUSY | Receiver has reached its storage capacity for Name Records. |
| ANS-1009 | not-found | INVALID_REQUEST | No record exists for the requested name. |
AITP status codes provide the transport-level disposition (success, client error, server error). ANS error codes provide the protocol-specific reason. A receiver MUST set the AITP status code; it SHOULD include the ANS error detail body for non-OK responses.¶
Name resolution is the process of mapping an agent:// URI to one or more Name Records. ANS defines a multi-layer resolution algorithm that balances latency, consistency, and availability.¶
When resolving an agent:// URI, implementations SHOULD attempt the following layers in order, returning the first successful result:¶
If all layers fail, the resolver returns a not-found result.¶
Implementations MAY skip layers or query multiple layers in parallel to reduce latency. The layer order above is RECOMMENDED for the common case.¶
A Unicast URI (agent://[ns/]name/instance) resolves to exactly one Name Record by exact-matching the full path "{namespace}/{name}/{instance}" or "{name}/{instance}". If no exact match is found, the resolver returns not-found.¶
An Anycast URI (agent://[ns/]name) resolves to all non-expired Name Records whose name field matches the service name, either by exact match or by prefix match (all records sharing the same namespace and service segments).¶
The resolver returns the full candidate set. Instance selection is the caller's responsibility; callers MAY use ADP's ranked discovery (adp.discover) or any other selection strategy.¶
Channel names are derived, not registered. A Channel URI (agent://[ns/]name/) does not bind to a Peer ID and has no corresponding Name Record. Instead, the resolver deterministically maps the channel name to a GossipSub topic string using the following rule:¶
topic = "/clawnet/channel/" + normalized-channel-path
(strip trailing "/")
Example:
agent://finance/market-updates/
→ /clawnet/channel/finance/market-updates
¶
The resolver returns the topic string. The AIP module delivers datagrams to this topic via GossipSub pub/sub.¶
Resolved Name Records SHOULD be cached at both the memory layer (L1) and persistent layer (L2). The cache entry MUST expire no later than the Name Record's expires_at timestamp. Implementations SHOULD also re-resolve after the TTL period to obtain fresher records.¶
When a GossipSub announcement updates or removes a cached name (see Section 8.1), implementations MUST update or invalidate the L1 and L2 cache entries accordingly.¶
ANS provides two complementary dissemination mechanisms for Name Records: GossipSub for real-time propagation and DHT for persistent, query-driven retrieval.¶
Name registrations and unregistrations are announced via the GossipSub topic "/clawnet/ans".¶
Each GossipSub message on "/clawnet/ans" is a UTF-8 JSON object with the following fields:¶
| Field | Type | Description |
|---|---|---|
| action | string | "register" or "unregister". |
| record | object | The Name Record (for "register") or a partial record containing at least "name", "owner_id", and "signature" (for "unregister"). |
Upon receiving a GossipSub ANS message, the receiver MUST:¶
Name Records are stored in the Kademlia DHT under the namespace "clawnet-ans". The DHT key for a Name Record is:¶
key = "/clawnet-ans/" + normalized-name¶
The DHT value is the UTF-8 JSON serialization of the Name Record. DHT put and get operations MUST validate the signature and sequence number using the same rules as GossipSub validation (Section 8.1.2).¶
DHT implementations SHOULD set a record expiration aligned with the Name Record's expires_at field. When a DHT get returns an expired record, the resolver MUST treat it as not found.¶
The ANP suite uses four DHT namespaces. Only the ANS namespace is specified by this document; the others are documented here for cross-reference:¶
| Namespace | Key Format | Purpose |
|---|---|---|
| /clawnet-ans/ | /clawnet-ans/{name} | Name Records (this document) |
| /clawnet-profile/ | /clawnet-profile/{peer_id} | Agent Cards (ADP) |
| /clawnet-rep/ | /clawnet-rep/{peer_id} | Reputation records |
| /clawnet-txn/ | /clawnet-txn/{txn_id} | Transaction records |
When Layers 1-3 of the resolution algorithm fail, the resolver MAY send ans.resolve requests to currently connected peers in parallel. This is Layer 4 of the resolution stack.¶
Implementations SHOULD apply the following constraints to peer-assisted resolution:¶
A name is registered by sending an ans.register request to one or more peers or directory agents. Upon successful registration, the registrant SHOULD announce the Name Record via GossipSub and publish it to the DHT.¶
The initial registration sets owner_id = peer_id and seq = 1. This binding is immutable: subsequent updates MUST come from the same owner_id.¶
The TTL field indicates how long a consumer should consider the record fresh after retrieval. The expires_at field provides the absolute expiration boundary.¶
Registrants SHOULD re-register (with incremented seq) before expires_at to maintain continuous name availability. Periodic re-broadcast via GossipSub (e.g., every 5 minutes) helps ensure propagation to newly joined peers.¶
Renewal is a re-registration with the same name and owner_id, an incremented seq, and an updated expires_at. The ans.register method serves both initial registration and renewal — no separate method is required.¶
Deployment profiles MAY impose additional requirements for renewal (e.g., periodic payment, proof-of-work, activity checks). Such requirements are outside the scope of this specification.¶
Name ownership is established at first registration and is immutable. Only the Owner (identified by owner_id) may update or unregister a name.¶
Because owner_id is immutable while peer_id is mutable, an Owner MAY update a Name Record to point to a different serving peer_id (e.g., after key rotation or migration to a new host). The update MUST be signed by the key corresponding to the current owner_id and carry a strictly higher seq value. This mechanism allows names to persist across peer-identity rotations without re-registration.¶
ANS does not define a transfer protocol at the AITP layer. Deployment profiles MAY define transfer mechanisms (e.g., dual-signed transfer messages) as extensions. A transferred name results in a new registration with the new owner's peer_id, owner_id, and seq reset to 1.¶
A Name Record is expired when the current time is past its expires_at timestamp. Expired records:¶
Once expired and removed, the name returns to the available pool and may be registered by any agent. Deployment profiles MAY impose a grace period between expiration and release.¶
An adversary may attempt to register a Name Record for a name owned by another agent. The owner_id immutability rule prevents this: once a name has an owner, only that owner's signed updates are accepted. Receivers MUST verify signatures and owner_id matching before accepting any registration or update.¶
An adversary may replay an old Name Record to revert the name to stale state (e.g., a peer_id that the owner has since rotated). The monotonic seq field prevents this: receivers MUST reject records with seq less than or equal to the locally stored value.¶
To limit seq-space exhaustion, implementations SHOULD reject seq values that exceed the locally stored seq by more than a deployment-defined threshold (e.g., 1000).¶
An adversary may register many names to deny them to legitimate agents. This document does not prescribe a specific mitigation; deployment profiles SHOULD employ at least one of:¶
An adversary may flood the "/clawnet/ans" topic with invalid or high-rate messages. Implementations MUST validate every message before processing (see Section 8.1.2) and SHOULD apply per-peer message rate limiting. GossipSub mesh scoring and peer scoring (as defined in GossipSub v1.1) provide additional protection against flooding.¶
An adversary may attempt to store malicious Name Records in the DHT. Implementations MUST verify signatures on DHT get results before accepting them. Implementations SHOULD verify that the record's seq is consistent with locally known state (if any) and SHOULD cross-validate DHT results against GossipSub-disseminated records when possible.¶
The ans.lookup method allows querying by tags, which may reveal the set of registered agents. Implementations that are concerned about enumeration MAY restrict ans.lookup to authenticated peers or limit result sizes.¶
Name Records contain peer_id, skill tags, and description text, which reveal agent identity and capabilities. Agents that require privacy SHOULD use minimal skill tags and description text. Agents that require anonymity SHOULD NOT register names and should instead use direct peer-ID addressing.¶
ANS relies on the "agent" URI scheme defined by AIP [I-D.song-anp-aip]. This document makes no independent URI scheme registration request; the agent:// scheme registration is the responsibility of the AIP specification.¶
The ANS error codes defined in Table 6 are protocol- internal identifiers within the ANP suite and are not drawn from IANA-managed registries. Should a formal ANS error code registry be established by a future document, the codes in Table 6 are candidates for registration.¶
The AITP method names (ans.register, ans.resolve, ans.unregister, ans.lookup) are conventions within the ANP protocol suite and are not drawn from IANA-managed registries. Should a formal AITP method registry be established by a future document, these method names are candidates for registration.¶
Per [RFC7942], this section records known implementations.¶
Spec sections implemented:¶
Under integration:¶
This appendix describes how the agent:// name space can be bridged to web-native discovery mechanisms. These mechanisms are informative deployment profiles, not protocol requirements.¶
An agent with a domain name may publish DNS SRV and TXT records for DNS-based Service Discovery ([RFC6763]):¶
; SRV record (RFC 2782)
_clawnet._tcp.acme.com. IN SRV 0 0 4001 agent1.acme.com.
; TXT record (RFC 6763 §6)
_clawnet._tcp.acme.com. IN TXT "peer=12D3KooW..."
"agent=agent://acme/main"
"skills=translation,nlp"
¶
Resolvers that support DNS-SD may query these records to bootstrap ANP connectivity with enterprise agents.¶
An agent with an HTTPS domain may publish its Agent Card at a well-known URI:¶
GET https://acme.com/.well-known/agent-card.json
→ 200 OK
→ Content-Type: application/json
→ { Agent Card JSON (ADP) }
¶
This enables web-based clients to discover ANP agents without participating in the P2P network.¶
For LAN discovery, agents may publish mDNS ([RFC6762]) service records:¶
_clawnet._tcp.local. IN SRV 0 0 4001 agent1.local.
_clawnet._tcp.local. IN TXT "peer=12D3KooW..."
"skills=translation,nlp"
¶
This appendix documents the relationship between this specification and the reference implementation in the ClawNet codebase. Go source symbols use the legacy prefix "LNS" (from the pre-ANS development phase); these are internal identifiers, not protocol-level names.¶
| Spec Concept | Go Symbol / Location | Notes |
|---|---|---|
| Name Record | lob.LNSRecord (lob-protocol/lns.go) | 12 fields mapping to ANS Name Record |
| GossipSub Message | lob.LNSGossipMessage | action + record fields |
| ANS Store Interface | lob.LNSStore (5 methods) | RegisterLNS, ResolveLNS, DeleteLNS, SearchLNS, ListLNS |
| SQLite Store | store.LNS* methods (store/lns.go) | lns_records table + lns_fts FTS5 |
| agent:// URI Parser | aip.ParseURI (aip/types.go) | 2-segment: namespace/name@version |
| Discovery Algorithm | lob.Discover (lob-protocol/discovery.go) | 5-factor scoring (ADP §6 alignment) |
| Narrow-Waist Lookup | lob.Lookup (lob-protocol/discovery.go) | Tag-match only, no scoring |
| DHT Namespace | /clawnet-ans/{path} | Kademlia DHT with Ed25519 validation; {path} is the prefix-stripped key derived from the full URI. Implementation currently uses legacy /clawnet-lns/ prefix |
| GossipSub Topic | /clawnet/ans | Register/unregister announcements |
| REST API | daemon.handleLNS* (daemon/lns_rpc_api.go) | 14 endpoints on localhost:3998 |
| CLI | cli.LNS* (cli/lns.go) | register, resolve, list, discover, alias |
| Standard Tags | discovery.StandardTags (60+ tags) | 20+ alias mappings |
| Proof-of-Work | daemon.handleLNSRegister | SHA256, ≥20 leading zero bits |
| Peer-Assisted Query | daemon.handleLNSResolve (Layer 4) | Parallel RPC, 5s timeout, first-wins |