You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
-**`AllowedDomains` type** in `types::discovery` — typed wrapper over the list of domains an agent is permitted to interact with. Extracted from `Constraints::allowed_domains` via the new `Constraints::allowed_domains_typed()` helper. Empty list = no restriction (all domains trusted) per the established cross-protocol convention. Includes `intersect()` for composing with cross-protocol callers (most importantly SchemaPin v1.4's `A2aVerificationContext`, which scopes tool verification to the intersection of caller and provider domains).
15
+
-**`A2aAgentCard` + supporting types** in `types::a2a` — minimal A2A AgentCard subset (`A2aAgentCard`, `A2aAgentCapabilities`, `A2aAgentSkill`) plus the AgentPin-specific `AgentpinExtension` payload (`agentpin_endpoint`, `public_key_jwk`, `signature`). Inline definition rather than depending on the upstream `a2a-types` crate while the A2A spec is still draft — the public surface lets us re-export from upstream once it stabilises without breaking callers.
16
+
-**`A2aAgentCardBuilder`** in new `a2a` module — turns an `AgentDeclaration` into a signed `A2aAgentCard`. Maps capabilities to skills via `capability_to_skill`, propagates `Constraints::allowed_domains` into `A2aAgentCapabilities::allowed_domains`. Detached ECDSA P-256 signature covers the canonical bytes of the AgentCard with the extension cleared.
17
+
-**`verify_agentpin_extension(card)`** — verifies the AgentPin extension signature against the JWK embedded in the extension. Sorted-key canonical JSON; matches the canonicalisation pattern used by SchemaPin.
18
+
-**`LocalAgentCardStore`** in new `resolver_local` module — in-memory store of pre-registered AgentCards keyed by their AgentPin discovery domain. Implements `DiscoveryResolver` (always available, no `fetch` feature). Verifies the AgentPin extension signature at registration time and pre-derives a `DiscoveryDocument` so the rest of the AgentPin verification stack runs unchanged. Supports Symbiont v1.7.0's push-based external-agent registration where the coordinator receives AgentCard JSON inline rather than fetching it from a `.well-known` endpoint.
19
+
-**`A2aAgentCardResolver`** in new `resolver_a2a` module (gated on `fetch`) — fetches `https://{domain}/.well-known/agent-card.json`, verifies the AgentPin extension, cross-checks that the embedded `agentpin_endpoint` host matches the fetched domain, and derives a `DiscoveryDocument`. `last_card()` exposes the original A2A representation alongside the derived doc for callers that want both.
20
+
-**`a2a_endpoint` field** on `DiscoveryDocument` — optional URL of the entity's A2A AgentCard endpoint, enabling cross-protocol discovery.
21
+
22
+
#### DNS TXT Cross-Verification at `_agentpin.{domain}` (Rust)
23
+
24
+
-**New `dns` module** with `DnsTxtRecord`, `parse_txt_record`, `verify_dns_match`, and `txt_record_name`. Always available; the parser/matcher have no DNS dependencies.
25
+
-**`fetch_dns_txt(domain)`**: async lookup behind the new `dns` Cargo feature. Brings in `hickory-resolver`, `tokio`, and `async-trait`.
26
+
-**TXT record format**: `_agentpin.{domain}` IN TXT `"v=agentpin1; kid=...; fp=sha256:<hex>"` — whitespace-tolerant parser, case-insensitive on `fp`, ignores unknown fields for forward compatibility. Mirrors SchemaPin's `_schemapin.{domain}` shape exactly with the version tag changed.
27
+
-**Multi-key match semantics**: AgentPin discovery docs may carry several keys for rotation; a published TXT record need only match one of them. When the TXT carries an explicit `kid`, the matching key MUST also carry the same `kid`.
28
+
-**Fail-closed on mismatch**: a publisher who *intentionally* publishes a TXT record has signaled that DNS is part of their trust chain — divergence between DNS and `.well-known` indicates compromise of one channel and is treated as a hard failure.
29
+
30
+
#### Go SDK (Fourth Language Port)
31
+
32
+
-**New `go/` SDK** — wire-compatible with Rust, JavaScript, and Python at the v0.2.0 surface. Mirrors the package layout of the SchemaPin Go SDK. Closes the long-standing four-language-parity gap.
-**CLI**: `cmd/agentpin` with `keygen`, `issue`, `verify`, `bundle` subcommands matching the Rust binary
36
+
-**ES256-only** enforcement is implemented inline using `crypto/ecdsa`. The JWT verifier rejects `none`, `HS256`, `RS256`, `ES384`, and any other algorithm before any signature work. No third-party JWT dependency.
37
+
-**Cross-language interop tests** under `go/pkg/verification/cross_language_test.go` validate that Rust-generated PEM keypairs, JWKs, discovery documents, and JWTs round-trip correctly through the Go SDK.
38
+
-**CI**: new `.github/workflows/go.yml` runs `go test`, `go vet`, and `gofmt -l` on every PR touching `go/**`. Version-consistency check extended to also validate the Go SDK's declared version.
39
+
-**Note**: this initial Go port covers the v0.2.0 stable surface only. The two v0.3.0-alpha.1 features above (A2A AgentCard types and DNS TXT cross-verification) follow in a Go-side `0.3.0-alpha.2` PR.
40
+
41
+
### Notes
42
+
43
+
- This is the first v0.3.0 alpha — the unblock for **Symbiont v1.8.0 Phase 3** (AgentPin-verified AgentCards, A2A auth middleware) and **SchemaPin v1.4.0 `A2aVerificationContext`** (which consumes `AllowedDomains` for tool-verification scoping). Both downstream releases were waiting on this surface.
44
+
- DNS TXT defends against HTTPS-origin compromise (compromised hosting account, expired domain not removed from CDN, ACME ownership-validation bypass) and TLS cert mis-issuance — the DNS credential chain (registrar, DNS provider, optionally DNSSEC) is independent of the HTTPS hosting chain. Spec § 4.8.3 reserved this slot in v0.1; this PR ships the implementation.
45
+
- All additions are purely additive — v0.2.0 callers are unaffected. Discovery documents without `a2a_endpoint`, AgentCards without an `agentpin` extension, and absent `_agentpin` TXT records all behave exactly as before.
46
+
- JavaScript and Python SDK ports of the new A2A + DNS surface follow in `0.3.0-alpha.2`.
AgentPin becomes the cryptographic identity layer for A2A (Agent-to-Agent) networks. This release defines extension types for A2A AgentCards and a resolver that discovers AgentPin identity from A2A endpoints.
34
35
@@ -124,4 +125,4 @@ We welcome input on roadmap priorities:
124
125
125
126
---
126
127
127
-
*Last updated: 2026-03-01 (cross-repo alignment with Symbiont v1.7.0/v1.8.0 and SchemaPin v1.4.0)*
Copy file name to clipboardExpand all lines: SKILL.md
+46-11Lines changed: 46 additions & 11 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,8 +1,9 @@
1
1
---
2
2
name: agentpin
3
3
title: AgentPin
4
-
description: Domain-anchored cryptographic identity protocol for AI agents — ES256 JWT credentials, 12-step verification, TOFU key pinning, revocation, delegation chains, and mutual authentication
5
-
version: 0.2.0
4
+
description: Domain-anchored cryptographic identity protocol for AI agents — ES256 JWT credentials, 12-step verification, TOFU key pinning, revocation, delegation chains, mutual authentication, and (v0.3.0-alpha, Rust) A2A AgentCard extension types + signed AgentCard builder + LocalAgentCardStore + A2aAgentCardResolver + AllowedDomains type for cross-protocol use with SchemaPin v1.4, plus DNS TXT cross-verification at _agentpin.{domain} for second-channel trust independent of HTTPS hosting
5
+
version: 0.3.0-alpha.1
6
+
stable_version: 0.2.0
6
7
---
7
8
8
9
# AgentPin Development Skills Guide
@@ -157,6 +158,40 @@ pin_store = KeyPinStore()
157
158
result = verify_credential(credential, discovery_doc, pin_store)
158
159
```
159
160
161
+
### Go
162
+
163
+
```bash
164
+
go get github.com/ThirdKeyAi/agentpin/go
165
+
go install github.com/ThirdKeyAi/agentpin/go/cmd/agentpin@latest
"description": "Domain-anchored cryptographic identity protocol for AI agents — ES256 JWT credentials, 12-step verification, TOFU key pinning, revocation checking, delegation chains, and mutual authentication. Implementations in Rust, JavaScript, and Python. Part of the ThirdKey trust stack.",
6
+
"description": "Domain-anchored cryptographic identity protocol for AI agents — ES256 JWT credentials, 12-step verification, TOFU key pinning, revocation checking, delegation chains, mutual authentication, and (v0.3.0-alpha, Rust) A2A AgentCard extension types + signed AgentCard builder + LocalAgentCardStore + A2aAgentCardResolver + AllowedDomains type for cross-protocol use, plus DNS TXT cross-verification at _agentpin.{domain} (`v=agentpin1; kid=...; fp=sha256:...`) for second-channel trust independent of HTTPS hosting. Implementations in Rust, JavaScript, Python, and Go (Go is at v0.2.0 surface parity; A2A + DNS in Go follow in alpha.2). Part of the ThirdKey trust stack: SchemaPin (tool integrity) → AgentPin (agent identity) → Symbiont (runtime).",
0 commit comments