@agenticprimitives/agent-naming 1.0.0-alpha.4 → 1.0.0-alpha.41

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/AUDIT.md +15 -4
  2. package/CLAUDE.md +40 -53
  3. package/README.md +57 -54
  4. package/dist/abis.d.ts +641 -0
  5. package/dist/abis.d.ts.map +1 -1
  6. package/dist/abis.js +96 -0
  7. package/dist/abis.js.map +1 -1
  8. package/dist/claim.d.ts +71 -0
  9. package/dist/claim.d.ts.map +1 -0
  10. package/dist/claim.js +73 -0
  11. package/dist/claim.js.map +1 -0
  12. package/dist/client.d.ts +36 -1
  13. package/dist/client.d.ts.map +1 -1
  14. package/dist/client.js +197 -10
  15. package/dist/client.js.map +1 -1
  16. package/dist/constants.d.ts +55 -5
  17. package/dist/constants.d.ts.map +1 -1
  18. package/dist/constants.js +128 -4
  19. package/dist/constants.js.map +1 -1
  20. package/dist/custody.d.ts +54 -2
  21. package/dist/custody.d.ts.map +1 -1
  22. package/dist/custody.js +140 -4
  23. package/dist/custody.js.map +1 -1
  24. package/dist/dns.d.ts +91 -0
  25. package/dist/dns.d.ts.map +1 -0
  26. package/dist/dns.js +196 -0
  27. package/dist/dns.js.map +1 -0
  28. package/dist/federated.d.ts +31 -0
  29. package/dist/federated.d.ts.map +1 -0
  30. package/dist/federated.js +54 -0
  31. package/dist/federated.js.map +1 -0
  32. package/dist/grammar.d.ts +62 -0
  33. package/dist/grammar.d.ts.map +1 -0
  34. package/dist/grammar.js +165 -0
  35. package/dist/grammar.js.map +1 -0
  36. package/dist/hash.d.ts +14 -0
  37. package/dist/hash.d.ts.map +1 -0
  38. package/dist/hash.js +22 -0
  39. package/dist/hash.js.map +1 -0
  40. package/dist/index.d.ts +17 -9
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +21 -8
  43. package/dist/index.js.map +1 -1
  44. package/dist/issuance.d.ts +70 -0
  45. package/dist/issuance.d.ts.map +1 -0
  46. package/dist/issuance.js +65 -0
  47. package/dist/issuance.js.map +1 -0
  48. package/dist/label.d.ts +10 -0
  49. package/dist/label.d.ts.map +1 -0
  50. package/dist/label.js +39 -0
  51. package/dist/label.js.map +1 -0
  52. package/dist/namehash.d.ts +12 -24
  53. package/dist/namehash.d.ts.map +1 -1
  54. package/dist/namehash.js +13 -36
  55. package/dist/namehash.js.map +1 -1
  56. package/dist/normalize.d.ts +9 -17
  57. package/dist/normalize.d.ts.map +1 -1
  58. package/dist/normalize.js +11 -48
  59. package/dist/normalize.js.map +1 -1
  60. package/dist/price.d.ts +74 -0
  61. package/dist/price.d.ts.map +1 -0
  62. package/dist/price.js +58 -0
  63. package/dist/price.js.map +1 -0
  64. package/dist/records.d.ts +44 -3
  65. package/dist/records.d.ts.map +1 -1
  66. package/dist/records.js +203 -4
  67. package/dist/records.js.map +1 -1
  68. package/dist/types.d.ts +108 -3
  69. package/dist/types.d.ts.map +1 -1
  70. package/dist/vertical.d.ts +43 -0
  71. package/dist/vertical.d.ts.map +1 -0
  72. package/dist/vertical.js +40 -0
  73. package/dist/vertical.js.map +1 -0
  74. package/docs/api.md +15 -3
  75. package/docs/concepts.md +1 -1
  76. package/docs/migration.md +1 -1
  77. package/package.json +24 -15
package/AUDIT.md CHANGED
@@ -1,7 +1,8 @@
1
1
  # @agenticprimitives/agent-naming — package audit
2
2
 
3
3
  **Status:** Phase 1 (SDK skeleton + spec + pure helpers).
4
- **Last refreshed:** 2026-05-23.
4
+ **Last refreshed:** 2026-06-01 (R9 substrate coverage references + R11.1 fail-hard audit + R11.3 public-surface cleanup)
5
+ **Prior refresh:** 2026-05-23
5
6
  **Owner:** [security-auditor](../../docs/agents/security-auditor.md) +
6
7
  [technical-architect-auditor](../../docs/agents/technical-architect-auditor.md).
7
8
  **System audit cross-ref:** see
@@ -14,7 +15,7 @@ on-chain authority paths, and demo integration land in Phase 3+.
14
15
  ## Charter (what's audit-relevant in this package)
15
16
 
16
17
  - Pure helpers (`normalizeAgentName`, `labelhash`, `namehash`): MUST
17
- be deterministic + match the reference ENS algorithm + reject
18
+ be deterministic + match the standard recursive-namehash algorithm + reject
18
19
  malformed input.
19
20
  - Record schema (`AgentNameRecords` + `records` subpath): MUST
20
21
  refuse unknown keys on encode (fail-loud write) AND drop unknown
@@ -39,9 +40,9 @@ on-chain authority paths, and demo integration land in Phase 3+.
39
40
  non-ASCII / oversize labels. Throws `InvalidNameError`. Covered in
40
41
  `test/normalize.test.ts`.
41
42
  - ✅ `normalize` is idempotent: `normalize(normalize(x)) === normalize(x)`.
42
- - ✅ `namehash('')` = `ZERO_NODE` (`0x00…00`) per the ENS sentinel
43
+ - ✅ `namehash('')` = `ZERO_NODE` (`0x00…00`) per the root-sentinel
43
44
  convention.
44
- - ✅ `namehash` matches the ENS reference algorithm under an
45
+ - ✅ `namehash` matches the standard recursive-namehash algorithm under an
45
46
  in-band independent reimplementation (`test/namehash.test.ts`
46
47
  golden-vector table).
47
48
  - ✅ `namehash` rejects malformed input by delegating to `normalize`.
@@ -84,3 +85,13 @@ client doesn't yet take an `auditSink`; Phase 2 will add the optional
84
85
  | Date | Wave | What changed |
85
86
  | --- | --- | --- |
86
87
  | 2026-05-23 | NS Phase 1 | Initial audit. AN-1/2/3 open; security invariants verified by unit tests. |
88
+
89
+ ## R9 substrate coverage (2026-06-01)
90
+
91
+ - Locked by R6.2 + R6.8 contract-side hardening:
92
+ - `AgentNameRegistry.initializeRoot` cannot be frontrun (immutable initializer + same-tx deploy) — H7-C.4 / CON-NAMING-001.
93
+ - `PermissionlessSubregistry.register` is `nonReentrant` — R6.2 / CON-SUBREGISTRY-003.
94
+ - Pause coverage: 7 mutating functions (register, backfillLabel, setOwner, setResolver, setSubregistry, renew, setPrimaryName) are `whenNotPaused` — R6.8.
95
+ - ADR-0012 / ADR-0013: NO `eth_getLogs` in product read paths; `reverseResolveString` is the canonical single-call.
96
+ - See [`packages/contracts/AUDIT.md` § 3.8](../contracts/AUDIT.md).
97
+
package/CLAUDE.md CHANGED
@@ -5,11 +5,24 @@ Names are a **facet registration** pointing AT the canonical Smart Agent ([ADR-0
5
5
 
6
6
  ## What this package owns
7
7
 
8
- - The `.agent` TLD constant (`AGENT_TLD`).
9
- - Name normalization (`normalizeAgentName`) — NFC + lowercase + label
10
- validation. Rejects empty / hyphen-prefixed / non-ASCII labels in v0.
11
- - `labelhash` + `namehash` — ENS-compatible keccak256 hashes for
12
- identifier nodes.
8
+ - The **typed TLD registry** (`AGENT_TLDS` = `me org team svc workspace treasury registry church circle`, alias `ws`,
9
+ legacy `impact`/`agent`) — a suffix names the DERIVED agent type, never a root, a role or the
10
+ hierarchy ([ADR-0061](../../docs/architecture/decisions/0061-derived-agent-types-and-typed-name-suffixes.md),
11
+ [spec 346](../../specs/346-typed-agent-naming-and-registry.md)). `derivedTypeForTld` / `rootClassForTld`.
12
+ - The name **grammar** (`parseAgentName`): `x.t` canonical, `x.t@c.u` context-issued (path form
13
+ `c.u/x.t`, on-chain form `x.t.c.u`), type-nodes, roots, legacy. One context level in v1.
14
+ - Name normalization (`normalizeAgentName`) — NFC + lowercase + label validation + alias rewrite;
15
+ returns the canonical display form.
16
+ - The **federated reference** (`federatedAgentName` → `FederatedAgentNameV1 { name, chain }`, `displayAgentName` —
17
+ bare only inside the home chain, qualified everywhere else; spec 346 §3.7, ap-federation spec 440 §C). The chain is
18
+ a record beside the name, never a name component: `alice.me@faithchain` is refused by the grammar.
19
+ - The **DNS/A2A projection** (`dnsHostForHandle`, zone caller-supplied — ADR-0021) and the two
20
+ protocol paths (`/api/a2a`, `/.well-known/agent-card.json`).
21
+ - **Claim-time validation** (`validateTypedClaim`, `findUniqueLabel`, `buildDeclareAgentTypeCalls`,
22
+ `buildTypedClaimCalls`): the suffix is a CLAIM, the SA-keyed on-chain `atl:agentType` record is
23
+ the authority; a mismatch fails closed (`resolveTyped` → `null`, `checkTypedName` → reason).
24
+ - `labelhash` + `namehash` — recursive keccak256 hashes
25
+ (`keccak256(parentNode || labelhash)`) for identifier nodes.
13
26
  - Record schemas (`AgentNameRecords`) and predicate constants
14
27
  (subpath `/records`).
15
28
  - `AgentNamingClient` — read API (resolve / reverse-resolve / get
@@ -19,25 +32,19 @@ Names are a **facet registration** pointing AT the canonical Smart Agent ([ADR-0
19
32
 
20
33
  ## What this package does NOT own
21
34
 
22
- - Smart-account internals → [`agent-account`](../agent-account)
23
- (we consume `AgentAccountClient` for ERC-1271 verification +
24
- counterfactual address derivation).
25
- - Custody policy, scheduling, quorum → [`custody`](../account-custody).
26
- We expose call builders only — never import.
27
- - Delegation / caveat / mint → [`delegation`](../delegation).
28
- - Passkey ceremonies → [`connect-auth`](../connect-auth).
29
- - MCP / A2A transport → demo apps + future `a2a-runtime`.
30
- - Contract source — that lives in `packages/contracts/src/naming/`
31
- (Phase 3+); this package ships ABIs + client only.
35
+ Smart-account internals → `agent-account`; custody policy → `account-custody` (call builders only,
36
+ never imported); delegation → `delegation`; passkeys → `connect-auth`; MCP/A2A transport → apps;
37
+ contract source → `packages/contracts/src/naming/` (ABIs + client only here); the composed typed
38
+ resolver / invitation flows → `registry-resolution` (spec 346 §6.3).
32
39
 
33
40
  ## Vocabulary
34
41
 
35
42
  **Owns:** `AgentName`, `Label`, `Node` (namehash), `NameRecord`,
36
43
  `AgentNamingClient`, `Subregistry`, `Resolver`, `PrimaryName`,
37
- `AGENT_TLD`.
44
+ `AgentTld`, `ParsedAgentName`, `TypedNameRecord`.
38
45
  **Disambiguation:**
39
46
 
40
- - **"resolver"** here = on-chain ENS-v2 resolver. Distinct from
47
+ - **"resolver"** here = our on-chain registry + resolver. Distinct from
41
48
  any other package.
42
49
  - **"registry"** here = `AgentNameRegistry` contract. Distinct from
43
50
  the factory deploy-registry in `agent-account`.
@@ -51,14 +58,15 @@ Names are a **facet registration** pointing AT the canonical Smart Agent ([ADR-0
51
58
 
52
59
  1. `capability.manifest.json` — boundary.
53
60
  2. `src/index.ts` — public API.
54
- 3. `../../specs/215-agent-naming.md` — the spec.
61
+ 3. `../../specs/346-typed-agent-naming-and-registry.md` §2–§5 — the typed model (spec 215 = records/contracts prior art).
55
62
  4. `src/namehash.ts` + `src/normalize.ts` — the pure substrate.
56
63
  5. `src/client.ts` — the client skeleton.
57
64
 
58
65
  ## Stable public exports
59
66
 
60
- **Constants + helpers:** `AGENT_TLD`, `normalizeAgentName`,
61
- `labelhash`, `namehash`.
67
+ **Constants + helpers:** `AGENT_TLDS`, `derivedTypeForTld`, `rootKindForTld`, `parseAgentName`,
68
+ `formatAgentName`, `normalizeAgentName`, `labelhash`, `namehash`, `dnsHostForHandle`,
69
+ `findUniqueLabel`, `validateTypedClaim`, `federatedAgentName`, `displayAgentName`.
62
70
  **Types:** `AgentNameRecords`, `RegisterSubnameInput`,
63
71
  `SetPrimaryNameInput`, `SetAgentRecordsInput`,
64
72
  `SetSubregistryInput`.
@@ -68,6 +76,8 @@ Names are a **facet registration** pointing AT the canonical Smart Agent ([ADR-0
68
76
  **Subpaths:**
69
77
 
70
78
  - `/records` — predicate constants + encoders/decoders.
79
+ Includes `cardDigest` (bytes32 sha256 of the RELEASED A2A Agent Card) + `cardUri` — spec 347 §8.3; the AP Naming
80
+ projection writes them, `resolve()` reads them, `registry-resolution` surfaces `bindings.cardDigest`. Evidence, never authority.
71
81
  - `/custody` — pure encoded call builders for custody-gated name
72
82
  rotation (no `@agenticprimitives/account-custody` import).
73
83
 
@@ -103,30 +113,13 @@ Names are a **facet registration** pointing AT the canonical Smart Agent ([ADR-0
103
113
  - "Reach for an MCP transport" — **STOP.** Out of scope.
104
114
  - "Auto-resolve name via a system-wide hook in the worker" — **STOP.**
105
115
  Demo-app integration only; the package itself is transport-agnostic.
106
-
107
- ## Decision Tree
108
-
109
- - Adding a new record field? Start in `src/types.ts` and
110
- `src/records.ts`; update tests and `docs/api.md`.
111
- - Adding resolver reads? Start in `src/client.ts`.
112
- - Adding name rotation calls? Start in `src/custody.ts`; do not import
113
- `@agenticprimitives/account-custody`.
114
- - Adding passkey behavior? Stop. Route to `connect-auth`.
115
- - Adding delegation or caveat behavior? Stop. Route to `delegation`.
116
- - Adding MCP/A2A transport? Stop. Route to app/runtime packages.
117
-
118
- ## Before you write code
119
-
120
- - [ ] Is the change in the resolver-records / namehash / normalize /
121
- client surface?
122
- - [ ] Did I avoid importing from `delegation`, `account-custody`,
123
- `mcp-runtime`, `tool-policy`, `key-custody`, `audit`?
124
- - [ ] Did I keep `normalize` deterministic (NFC + lowercase + label
125
- validation)?
126
- - [ ] Did I write golden-vector tests for any namehash / labelhash
127
- change?
128
- - [ ] Did I update `specs/215-agent-naming.md` if the public API or
129
- records schema changed?
116
+ - "Infer the agent type from the suffix / the DNS label" or "let the suffix
117
+ override `atl:agentType`" — **STOP.** ADR-0061 §5: the record is the
118
+ authority; `checkTypedName` fails closed on a mismatch.
119
+ - "Bake a zone / hostname into `dns.ts`" — **STOP.** ADR-0021: the zone is
120
+ caller-supplied; `check:no-domain-in-packages` enforces it.
121
+ - "Add `'team'`/`'treasury'` to `AgentKind`" — **STOP.** Roots are closed;
122
+ the derived type is `DerivedAgentType` on the SA subject.
130
123
 
131
124
  ## Security invariants (DO NOT BREAK)
132
125
 
@@ -161,15 +154,9 @@ pnpm check:forbidden-terms
161
154
 
162
155
  ## Capabilities this package participates in
163
156
 
164
- - **Agent identity + service discovery** — the naming graph IS the
165
- on-chain authority for "which Smart Agent answers to which
166
- human-readable name." Demos use it to resolve service endpoints
167
- (`a2a-endpoint`, `mcp-endpoint`) without hardcoded URLs.
168
- - **Audit / forensics trail** — emits (via consumer-supplied
169
- `AuditSink`): `agent-naming.{resolve,register,records.update,
170
- primary-name.update,subregistry.update}`.
171
- - Index of cross-cutting capabilities:
172
- [`docs/architecture/cross-cutting-capabilities.md`](../../docs/architecture/cross-cutting-capabilities.md).
157
+ - **Agent identity + service discovery** — which Smart Agent answers to which typed name, and the
158
+ DNS/A2A binding projected from it. Index: [`cross-cutting-capabilities.md`](../../docs/architecture/cross-cutting-capabilities.md).
159
+ - **Audit trail** — emits `agent-naming.{resolve,register,records.update,primary-name.update,subregistry.update}` via a consumer-supplied `AuditSink`.
173
160
 
174
161
  ## Documentation map
175
162
 
package/README.md CHANGED
@@ -1,44 +1,40 @@
1
1
  # @agenticprimitives/agent-naming
2
2
 
3
- Human-readable `.agent` **naming facets** for Smart Agents.
3
+ > Part of **[Agentic Primitives](https://agenticprimitives.dev)** — the open-source trust substrate for agentic applications: identity that can sign, authority checked at act time, evidence the owner carries. [Developer kit](https://github.com/agentictrustlabs/agentic-primitives) · [All packages](https://agenticprimitives.dev/developers)
4
4
 
5
- The canonical identifier is the Smart Agent address
6
- (`@agenticprimitives/agent-account`). This package registers names and records
7
- that point **at** that address — it does not create or own identity.
5
+ **The name is a facet. The address is the identity.** Agent naming is being settled right now — GoDaddy launched an Agent Naming Service, ERC-8004 put agent registries on mainnet, and every discovery stack needs an answer to "which agent answers to this name?" Most naming systems get the dependency backwards: the name becomes the identity, and losing the name (or the registrar) means losing everything attached to it. Here, every person, org, service agent, and treasury is a canonical ERC-4337 Smart Agent address — and a `.agent` name is a replaceable record pointing *at* that address ([ADR-0010](../../docs/architecture/decisions/0010-smart-agent-canonical-identifier.md)). Rotate the name, keep the identity. Rotate your credentials, keep the name. Nothing downstream breaks.
6
+
7
+ Part of [agenticprimitives](../../README.md) — the trust substrate for the agent economy: one canonical Smart Agent identity with custody, delegation, naming, credentials, and audit evidence designed as one system.
8
+
9
+ Use this package to resolve names like `alice.agent` and `treasury.acme.agent` to Smart Agent addresses, read typed service-discovery records (A2A endpoint, MCP endpoint, CAIP-10 `nativeId`), and build encoded calls for name-management transactions. Names are hierarchical — orgs hand out subnames under their own subregistry — and normalization is deterministic and on-chain-verifiable.
8
10
 
9
11
  > **Layer:** Discover — a naming **facet** (not canonical identity — that is `agent-account`).
10
12
  > **Canonical key:** the Smart Agent address the name resolves to.
11
13
 
12
- Use this package to resolve names like `alice.agent`, `acme.agent`, and
13
- `treasury.acme.agent` to Smart Agent addresses, read typed service-discovery
14
- records, and build encoded calls for name-management transactions.
15
-
16
- ## Use This When
14
+ ## Use this when
17
15
 
18
- - You need forward resolution: `alice.agent -> 0x...`.
19
- - You need reverse resolution from a Smart Agent address to its primary name.
20
- - You need typed records such as `displayName`, `a2aEndpoint`, `mcpEndpoint`,
21
- `nativeId`, or `metadataUri`.
22
- - You need pure call builders for name registration, resolver updates, primary
23
- name updates, or owner rotation.
16
+ - You need forward resolution: `alice.agent → 0x…`.
17
+ - You need reverse resolution from a Smart Agent address to its primary name — with a round-trip check, so a name is only trusted when it resolves back to the same address.
18
+ - You need typed records such as `displayName`, `a2aEndpoint`, `mcpEndpoint`, `nativeId`, or `metadataUri` — service discovery without hardcoded URLs.
19
+ - You need pure call builders for name registration, resolver updates, primary-name updates, or owner rotation that compose into custody-policy ceremonies.
24
20
 
25
- ## Do Not Use This For
21
+ ## Do not use this for
26
22
 
27
- - Passkey ceremonies or auth flows. Use `@agenticprimitives/connect-auth`.
28
- - Smart-account deployment or UserOps. Use `@agenticprimitives/agent-account`.
29
- - Account safety policy and approval scheduling. Use `@agenticprimitives/account-custody`.
30
- - Permission-token minting or attenuation. Use `@agenticprimitives/delegation`.
31
- - MCP/A2A transport wiring. Use demo apps or runtime packages.
23
+ - Passkey ceremonies or auth flows — `@agenticprimitives/connect-auth`.
24
+ - Smart-account deployment or UserOps — `@agenticprimitives/agent-account`.
25
+ - Account safety policy and approval scheduling — `@agenticprimitives/account-custody`.
26
+ - Permission-token minting or attenuation — `@agenticprimitives/delegation`.
27
+ - MCP/A2A transport wiring — demo apps or runtime packages.
32
28
 
33
29
  ## Install
34
30
 
35
- This package is workspace-internal and not yet published.
31
+ Workspace-internal; not yet published.
36
32
 
37
33
  ```bash
38
34
  pnpm add @agenticprimitives/agent-naming
39
35
  ```
40
36
 
41
- ## 60-Second Quickstart
37
+ ## 60-second quickstart
42
38
 
43
39
  ```ts
44
40
  import {
@@ -64,22 +60,28 @@ const primaryName = await naming.reverseResolve('0x00000000000000000000000000000
64
60
  const records = await naming.getRecords('treasury.acme.agent');
65
61
  ```
66
62
 
67
- ## Main Concepts
63
+ ## How it's different
64
+
65
+ The reference points are **ENS and Unstoppable Domains** — both excellent at what they do, both built around a different center of gravity:
66
+
67
+ - **Name-as-asset vs. name-as-facet.** ENS and Unstoppable treat the name as the prized object; identity accretes around it. Here the Smart Agent address is canonical and forced-unique names are assigned at identity bootstrap ([spec 220 §5](../../specs/220-agent-identity-bootstrap.md)) — the name is a pointer, replaceable without identity loss, and `addr` + `nativeId` must reference the same Smart Agent.
68
+ - **Agent-native records.** Typed predicates for `a2aEndpoint`, `mcpEndpoint`, CAIP-10 `nativeId`, and a public-safe passkey credential digest — the records an agent economy actually resolves, not a TXT free-for-all. Unknown predicates are ignored on decode and rejected by typed encoders.
69
+ - **Custody-governed rotation.** Name-owner rotation ships as pure encoded call builders (`/custody` subpath) that compose into the owner Smart Agent's custody-policy ceremonies — quorums and trustees, not a private key that can be phished once.
70
+ - **Disciplined reads.** Product reads use `readContract` only — no `eth_getLogs` walks, no silent fallbacks ([ADR-0012](../../docs/architecture/decisions/0012-no-eth-getlogs-in-product-read-paths.md), [ADR-0013](../../docs/architecture/decisions/0013-no-silent-fallbacks.md)). Reverse resolution is a single on-chain `reverseResolveString` read, then a forward round-trip before it is trusted.
68
71
 
69
- - **Canonical SA**: the ERC-4337 address every name must reference (`addr`,
70
- `nativeId`). Owned by `agent-account`, not this package.
72
+ The `.agent` TLD is the naming protocol; which names a given deployment registers is app-layer configuration — this package stays generic.
73
+
74
+ ## Main concepts
75
+
76
+ - **Canonical SA**: the ERC-4337 address every name must reference (`addr`, `nativeId`). Owned by `agent-account`, not this package.
71
77
  - **AgentName**: a normalized dotted name under `.agent` (a facet label).
72
- - **Label**: one segment of a name, such as `treasury`.
73
- - **Node**: ENS-compatible `namehash(name)`.
74
- - **Registry**: owns name records: owner, resolver, parent, subregistry.
75
- - **Resolver**: stores typed records for a node.
76
- - **Primary name**: reverse record for a Smart Agent address.
77
- - **Records**: typed data such as endpoints, display name, CAIP-10 `nativeId`,
78
- and public-safe passkey credential digest.
78
+ - **Label / Node**: one segment (`treasury`); the recursive `namehash(name)`.
79
+ - **Registry / Resolver**: name records (owner, resolver, parent, subregistry); typed records for a node.
80
+ - **Primary name**: the reverse record for a Smart Agent address.
79
81
 
80
82
  See [`docs/concepts.md`](docs/concepts.md).
81
83
 
82
- ## Common Recipes
84
+ ## Common recipes
83
85
 
84
86
  ```ts
85
87
  import {
@@ -102,40 +104,37 @@ const decoded = decodeRecords({
102
104
  });
103
105
  ```
104
106
 
105
- More examples:
107
+ More examples: [`examples/basic.ts`](examples/basic.ts) · [`examples/records.ts`](examples/records.ts) · [`examples/custody-rotation.ts`](examples/custody-rotation.ts)
108
+
109
+ ## Released A2A card records (spec 347 §8.3)
106
110
 
107
- - [`examples/basic.ts`](examples/basic.ts)
108
- - [`examples/records.ts`](examples/records.ts)
109
- - [`examples/custody-rotation.ts`](examples/custody-rotation.ts)
111
+ `atl:cardDigest` (bytes32 = sha256 of the released A2A Agent Card's RFC 8785 bytes) and `atl:cardUri` (only when the
112
+ card is not at the a2a host's `/.well-known/agent-card.json`) are ordinary name-node records: `encodeRecords({ cardDigest,
113
+ cardUri })`, read back by `resolve()`. A verifier fetches the card and compares digests; the record proves nothing by
114
+ itself. Existing deployments register the terms with `contracts/script/AddCardPredicates.s.sol`.
110
115
 
111
- ## Runtime Support
116
+ ## Runtime support
112
117
 
113
- Pure helpers and record encoders work in browser, Node, and Workers. The client
114
- uses `viem` public and wallet clients and requires an RPC URL for chain reads or
115
- transaction submission.
118
+ Pure helpers and record encoders work in browser, Node, and Workers. The client uses `viem` public and wallet clients and requires an RPC URL for chain reads or transaction submission.
116
119
 
117
- ## Subpath Exports
120
+ ## Subpath exports
118
121
 
119
122
  - `@agenticprimitives/agent-naming` — public helpers, client, ABIs, and types.
120
- - `@agenticprimitives/agent-naming/records` — predicate ids and typed
121
- record encode/decode helpers.
122
- - `@agenticprimitives/agent-naming/custody` — pure encoded call builders for
123
- name-management transactions.
123
+ - `@agenticprimitives/agent-naming/records` — predicate ids and typed record encode/decode helpers.
124
+ - `@agenticprimitives/agent-naming/custody` — pure encoded call builders for name-management transactions.
124
125
 
125
- ## Security Invariants
126
+ ## Security invariants
126
127
 
127
- - Product reads use `readContract`; no `eth_getLogs` in hot paths
128
- ([ADR-0012](../../docs/architecture/decisions/0012-no-eth-getlogs-in-product-read-paths.md)).
129
- `reverseResolve` string reconstruction is transitional log debt — do not copy.
130
- - Name normalization is deterministic.
128
+ - Name normalization is deterministic — equal normalizations produce equal namehashes.
131
129
  - Reverse resolution must round-trip before it is trusted.
132
130
  - Unknown predicates are ignored on decode and rejected by typed encoders.
133
- - Raw passkey credential IDs are never stored.
131
+ - Raw passkey credential IDs are never stored — only a digest.
134
132
  - Endpoint records are discovery hints, not proof of endpoint control.
133
+ - Product reads use `readContract`; no `eth_getLogs` in hot paths ([ADR-0012](../../docs/architecture/decisions/0012-no-eth-getlogs-in-product-read-paths.md)).
135
134
 
136
135
  See [`docs/security.md`](docs/security.md) and [`AUDIT.md`](AUDIT.md).
137
136
 
138
- ## Documentation Map
137
+ ## Documentation map
139
138
 
140
139
  - [`docs/concepts.md`](docs/concepts.md) — naming model and vocabulary.
141
140
  - [`docs/api.md`](docs/api.md) — human-readable public API guide.
@@ -153,6 +152,10 @@ pnpm check:public-exports
153
152
  pnpm check:forbidden-terms
154
153
  ```
155
154
 
155
+ ## Status
156
+
157
+ Testnet/pilot-ready. Production launch is gated on the public checklist in the root [`README.md`](../../README.md#status--honest-version) — including third-party contract audit and governance key rotation. Track every security finding live in [`docs/audits/findings.yaml`](../../docs/audits/findings.yaml).
158
+
156
159
  ## License
157
160
 
158
161
  UNLICENSED.