OHAN-00: the documents of the protocol
status: draft for v1, mon 26 oct 2026, revised tue 3 nov 2026. how the protocol is named, numbered, versioned and published.
a v1 draft. it describes what runs today on a network that is invite only, and it will change. every change is recorded, and a breaking one bumps the wire id (OHAN-00 §5).
1. one protocol, one name
there is one protocol: OHAN, the open human and agent network. it has no sub brands. the earlier names stay only as what they always were: intent is the envelope's family name (an envelope carries an intent) and the hiring application; openDM, openproof, openprofile and solo ops are applications on the network.
the way nostr has NIPs and the ietf has rfcs, OHAN has numbered documents. a document is cited as OHAN-nn and a rule inside it by its letter and number (security v1's g5, for example). a document has a status (draft, final, deprecated) and a version. the wire carries protocol ids, not document numbers, so documents can be reorganised without touching a byte on the wire.
2. the wire ids, renamed once, now, while there are zero cards
| today | from v1 | why |
|---|---|---|
card.v0 | ohan.card.1 | the card is OHAN's; the number is the schema version |
intent.v0.1 | ohan.envelope.1 | the envelope is now the network's, not openDM's. intent.v0 and intent.v0.1 stay accepted on inbound for openDM's gateway until it migrates |
| the sealed relay event (no id) | ohan.event.1 | the thing a relay holds gets a name |
relay.v0 | ohan.relay.1 | the relay api version, in /.well-known/ohan.json |
presence.v0 | none | withdrawn: presence is a product's own service, never the network's or the box's |
| grant (none) | ohan.grant.1 | reserved |
| claim (none) | ohan.claim.1 | reserved |
| receipt (none) | ohan.receipt.1 | reserved |
the sealed event carries a seal field naming its seal format (x25519-sha256-aesgcm-1 in v1; a later seal gets its own name), so two formats can overlap for the thirty day queue life. the relay api adds delivered and allow as signed calls (OHAN-04).
the rule: ohan.<object>.<schema version>. a breaking change bumps the number; a receiver names the ids it accepts. the intent names inside an envelope (message, ack, offer-share) are a registry (OHAN-14), not ids.
3. the documents
| number | document | what it fixes | version it ships | published |
|---|---|---|---|---|
| OHAN-00 | the documents (this one) | naming, numbering, versioning, publication | v1 | tue 27 oct |
| OHAN-01 | protocol overview (spec/protocol-v1.md) | objects, lifecycle, the handshake, exchange, how an agent understands it, context, the neighbours | v1 | tue 27 oct |
| OHAN-02 | card (spec/02-card.md) | the signed record of a handle: Multikey keys, relays, listed, profile, the data integrity proof set, the agent's delegation proof, the opt in nostr binding, the stamp | v1 | tue 27 oct |
| OHAN-03 | envelope (spec/03-envelope.md) | id, from, to, sender (key, card hash, via), intent, urgency, content, proofs, thread, policy, signature | v1 (message, ack) | tue 27 oct |
| OHAN-04 | relay (spec/04-relay.md) | sealed events addressed by the signing key, publish with two lanes and byte caps, signed fetch, signed delivered, the allow list, stamps, padding | v1 | tue 27 oct |
| OHAN-05 | gate (spec/05-gate.md) | the recipient's MUSTs | v1 | tue 27 oct |
| OHAN-06 | security (spec/security-v1.md) | principles, who sees what, keys, threat model, operations, limits, conformance | v1 | tue 27 oct |
| OHAN-07 | join and handles (spec/07-join.md) | the join flow, the handle rule, reserved names, the stamp, the lapse rule, export and import, rotation; did:web mapping; invite codes (ohan.live is invite only for now) | v1 | tue 27 oct |
| OHAN-14 | registry (spec/14-registry.md) | intent names, context item types, proof types, service types, with meaning and version; x-<name>:<kind> for applications | v1 (seeded), grows | tue 27 oct |
| OHAN-08 on | the documents for later versions | numbered in private, so their numbers stay stable and the architecture holds them | the version whose code implements each one | with its code |
twelve pages are public (00 to 07, 14 seeded, and the three unnumbered pages limits.md, terms.md and stewardship.md), because they describe what runs. the documents from 08 on are numbered in private; each publishes with the version that implements it. a document is never published before its code runs, and the v1 drafts will change: every change is recorded, and a breaking one bumps the wire id (§5).
4. where it came from
OHAN grew out of openDM's directory, whose envelope (intent.v0.1) is still accepted on inbound (OHAN-14 §1), and out of earlier intent protocol work by the same author. the earlier names survive only as the envelope's family name and as applications. nothing from earlier work is a dependency of OHAN.
5. versioning
- documents carry a status and a date. a change log (
CHANGELOG.mdat the repo root) records every change to any document or rule with the date and the reason. - wire ids carry the schema number (§2). the box lists the ids it speaks in
/.well-known/ohan.json. - the protocol version (v1, v1.1, v2, v3) is the set of documents and ids in force together, named in OHAN-00's table. a client says which protocol version it implements in its tool list hash file.
- deprecation: an id or an intent is marked deprecated in OHAN-14 for one protocol version before it is removed; receivers keep accepting it for that version.
6. publication rules
- publish only what runs. tuesday: 00 to 07, the seed of 14, the vectors, the box, the client. nothing from 08 onward appears on ohan.live until its code ships; the documents exist in the private repo so the architecture is built for them.
- the standards adoption (did core, controlled identifiers, vc 2.0, data integrity, jcs, mcp, a2a) is named on the site only after OHAN-01 and OHAN-06 are live, which is tuesday.
- every document has a "how to say it" line for the site, so the pages and the spec never disagree.
- the public repository holds only the published set, copied from an allowlist; the working repository stays private. a later document joins the public set when its code ships.