Wire Types
INK uses two distinct identifier formats for message types. Implementations MUST distinguish between them.
Convention
| Purpose | Format | Example |
|---|---|---|
| AT Protocol Lexicon ID | camelCase, includes ink segment | network.tulpa.ink.auditQuery |
Wire type field | snake_case, omits ink segment | network.tulpa.audit_query |
The lexicon ID follows AT Protocol conventions (camelCase NSID with hierarchical namespacing). The wire type is the value in the "type" field of every INK message — it is what implementations match on when routing messages.
Implementations MUST key off the wire type field, not the lexicon ID.
Complete Mapping
Wire Type (type field) | Lexicon ID | Description |
|---|---|---|
network.tulpa.intent | network.tulpa.ink.intent | Intent message |
network.tulpa.challenge | network.tulpa.ink.challenge | Context challenge |
network.tulpa.rejection | network.tulpa.ink.rejection | Rejection response |
network.tulpa.resolution | network.tulpa.ink.resolution | Resolution outcome |
network.tulpa.encrypted | network.tulpa.ink.encrypted | ECIES encrypted envelope |
network.tulpa.receipt | network.tulpa.ink.receipt | Delivery receipt |
network.tulpa.audit_query | network.tulpa.ink.auditQuery | Audit exchange request |
network.tulpa.audit_response | network.tulpa.ink.auditResponse | Audit exchange response |
network.tulpa.audit_submit | network.tulpa.ink.auditSubmit | Third-party audit submission |
network.tulpa.audit_inclusion | network.tulpa.ink.auditInclusion | Audit inclusion receipt |
Why Two Formats
For single-word types, the distinction is invisible: network.tulpa.intent maps to network.tulpa.ink.intent.
For multi-word types, it matters: network.tulpa.audit_query (wire) vs. network.tulpa.ink.auditQuery (lexicon).
The wire format uses snake_case for consistency with the JSON body convention. The lexicon format uses camelCase to match AT Protocol’s NSID registry convention.