agent-id
Self-certifying cryptographic identity for agents, humans, and services.
fg-agent-id is an identity standard with no registry, no CA, and no central authority.
An identity is its Ed25519 public key: the address encodes the key, so any artifact the
identity signs — a card, a delegation, a revocation — verifies from the identity alone.
Nothing to look up, nothing to trust but the math.
The self-certifying thesis
Traditional identity systems bind a name to a key through a third party you must trust. agent-id inverts this: the name is derived from the key.
- Address:
amp:key:<base58(ed25519_pub)>— decode the address and you hold the verification key. - DID:
did:amp:<base58>— the same key in DID clothing, registry-free likedid:key. - Card: a signed self-description.
card.verify()needs no network — the card's signing key must match its address, and the signature must check against that key.
Authority layers on top through delegation chains: a cold owner key signs a grant to an agent key, scopes only narrow down the chain, and the whole chain verifies offline. Revocation, key rotation with pre-commitment, audience-bound proof of possession, and spend caps all build on the same signed-artifact machinery.
What it standardizes
| Fixed core | Deliberately out of scope |
|---|---|
| Address & DID formats | Registries or enrollment of any kind |
| Canonical JSON & timestamp spelling | Ledgers / settlement (spend scopes are authority math only) |
| Domain-separated signing construction | Device registries & sync protocols |
| Card, delegation, revocation, rotation, proof wire formats | Key custody (encrypted key files are a recommendation, not wire) |
Golden vectors (spec/vectors.json) |
Transport — any protocol can carry these artifacts |
Cryptography is deliberately boring: Ed25519, X25519, SHA-256 — nothing else, nothing invented. Crypto agility is reserved through the signing-domain tag; v1 hardcodes the suite.
Position in the stack
agent-id is the identity layer — the foundation everything else stands on:
- agent-id — who an agent is (this library; no Fareground dependencies)
- amp — how agents talk (agent-id was extracted from AMP; the
amp:key:prefix anddid:ampmethod are retained for wire compatibility) - agent-knowledge — what a group of agents knows (agent-id is its only runtime dependency)
- agent-memory — what a single agent remembers
Two implementations, one wire format
- Python reference —
fg-agent-id(src/fg_agent_id/), Python ≥ 3.11, sole runtime dependencycryptography>=42.0. - TypeScript twin —
@fg/agent-id(js/), Node ≥ 20, zero runtime dependencies (WebCrypto).
The two interoperate byte-for-byte — agreement is pinned by golden vectors in
spec/vectors.json, and both run a conformance suite against them. The TS twin skips two
Python-only conveniences (passphrase-sealed key files, registry snapshots); neither
touches the wire. See API → Python vs TypeScript.
Status
Alpha · wire spec amp/0.2 (draft, normative in spec/SPEC.md) · Python package
fg-agent-id 0.1.0 · licensing TBD (proprietary). The amp/0.2 format is a breaking
change from 0.1 (domain-separated signing input, pinned timestamp spelling) — artifacts
signed under 0.1 do not verify under 0.2. Treat the wire format as not yet frozen.
→ Start with Getting started · Concepts · API reference · Examples