mesh.register
Present one signed envelope; it is verified exactly as a datagram — bounds, staleness, signature, trust policy — and recorded as a rendezvous observation when it holds. The answer carries this node's own envelope and the candidates its registry holds, each verifiable end to end on its own signature. Registration grants nothing: the caller becomes a record, never an authorization. Changes this process's memory only.
Present one signed envelope; it is verified exactly as a datagram — bounds, staleness, signature, trust policy — and recorded as a rendezvous observation when it holds. The answer carries this node's own envelope and the candidates its registry holds, each verifiable end to end on its own signature. Registration grants nothing: the caller becomes a record, never an authorization. Changes this process's memory only.
- command
- experimental
- module mesh
- #mesh
- #coordination
- #discovery
Exposure
Where this one definition is reachable. Absence is explicit: a surface not listed does not carry it.
| surface | as |
|---|---|
| MCP | tool majordomus_mesh_register |
| HTTP | POST /api/v1/mesh/register operationId mesh.register |
| command line | — |
Schemas
The canonical input and output, from the Rust types; the MCP tool schema and the OpenAPI parameters and responses are derived from these.
input · RegisterInput
mesh.register: one signed envelope, exactly as the wire carries it.| property | type | required | description |
|---|---|---|---|
| envelope | object | yes | The envelope. Verified here exactly as a datagram would be — bounds, staleness, signature — before anything is recorded. |
JSON Schema
{
"additionalProperties": false,
"description": "The input of `mesh.register`: one signed envelope, exactly as the wire carries it.",
"properties": {
"envelope": {
"description": "The envelope. Verified here exactly as a datagram would be — bounds, staleness,\nsignature — before anything is recorded."
}
},
"required": [
"envelope"
],
"title": "RegisterInput",
"type": "object"
}output · RegisterAnswer
| property | type | required | description |
|---|---|---|---|
| accepted | boolean | yes | Whether the presented envelope was accepted into the local registry. |
| candidates | array | yes | The signed envelopes of the nodes this rendezvous currently holds, the answering node's own included. Each verifies on its own signature; the rendezvous vouches for nothing. |
| refusal | string | null | no | Why not, when it was not. |
JSON Schema
{
"$defs": {
"Envelope": {
"description": "The wire envelope: the advertisement plus its signature.",
"properties": {
"caps": {
"default": [],
"description": "The transports the node serves: `http`, `mcp`, `ws`. Sanitized capability\nawareness, never an authorization.",
"items": {
"type": "string"
},
"type": "array"
},
"ep": {
"default": [],
"description": "Where this node answers HTTP, as `host:port` authorities, at most\n`MAX_ENDPOINTS`. Advisory: an endpoint is where to *try*, identity is the key.",
"items": {
"type": "string"
},
"type": "array"
},
"inst": {
"$ref": "#/$defs/InstanceId",
"description": "This run of the node."
},
"name": {
"default": "",
"description": "A human name for the node. Presentation only.",
"type": "string"
},
"pk": {
"description": "The Ed25519 public key, hex. The node id is derived from it, never carried:\na field that could disagree with the key is a field somebody will forge.",
"type": "string"
},
"repos": {
"default": [],
"description": "The repositories this node serves, as mesh repository ids (32 hex, see\n`super::repository`): derived from the repository's root commits or its declared\nidentity, never from a path, so that one repository cloned on two machines is\nrecognised as one. A digest discloses nothing; a reader that serves the same\nrepository recognises it, anyone else learns only \"some repo\".",
"items": {
"type": "string"
},
"type": "array"
},
"rt": {
"description": "The runtime slot (16 hex): which server of this node — one per checkout. Empty in\nversion 1. Omitted from the signed bytes when empty, so a version-1 signature\nverifies unchanged.",
"type": "string"
},
"seq": {
"description": "Monotonic per instance: a replayed datagram carries a counter the reader has\nalready seen and is dropped.",
"format": "uint64",
"minimum": 0,
"type": "integer"
},
"sig": {
"description": "Ed25519 over `Advertisement::signing_bytes`, hex.",
"type": "string"
},
"ts": {
"description": "Seconds since the Unix epoch at signing time.",
"format": "uint64",
"minimum": 0,
"type": "integer"
},
"v": {
"description": "Protocol version.",
"format": "uint32",
"minimum": 0,
"type": "integer"
},
"ver": {
"default": "",
"description": "The executable version, informational.",
"type": "string"
}
},
"required": [
"v",
"pk",
"inst",
"seq",
"ts",
"sig"
],
"type": "object"
},
"InstanceId": {
"description": "One run of a node: 16 hex characters of OS entropy, new at every process start. A\nrestart keeps the node id and changes this, which is how a reader tells \"the same\nnode came back\" from \"the same process is still there\".",
"type": "string"
}
},
"description": "What a registration answers: whether the envelope was accepted, and the candidates\nthe rendezvous holds. Defined here beside the client; the capability re-exports it.",
"properties": {
"accepted": {
"description": "Whether the presented envelope was accepted into the local registry.",
"type": "boolean"
},
"candidates": {
"description": "The signed envelopes of the nodes this rendezvous currently holds, the answering\nnode's own included. Each verifies on its own signature; the rendezvous vouches\nfor nothing.",
"items": {
"$ref": "#/$defs/Envelope"
},
"type": "array"
},
"refusal": {
"description": "Why not, when it was not.",
"type": [
"string",
"null"
]
}
},
"required": [
"accepted",
"candidates"
],
"title": "RegisterAnswer",
"type": "object"
}Policies
- benchmark
- required — a target on every transport the exposure declares; the cases are the input type's
- cache
- disabled — every call runs the handler
Benchmark targets
Derived from the registry for this repository: one requirement per transport, and the cases the input type provides. The whole matrix is on the benchmarks page.