executions.protocol
Where the WebSocket is, how a subscription and a reconnect are expressed, what the server writes, and the JSON Schema of every message — derived from the Rust types that implement it, so a client validating against this is validating against the implementation. OpenAPI cannot describe a socket; this is where that contract lives.
Where the WebSocket is, how a subscription and a reconnect are expressed, what the server writes, and the JSON Schema of every message — derived from the Rust types that implement it, so a client validating against this is validating against the implementation. OpenAPI cannot describe a socket; this is where that contract lives.
- query
- behaviorally_verified
- module executions
- #executions
- #control-plane
- #protocol
Exposure
Where this one definition is reachable. Absence is explicit: a surface not listed does not carry it.
| surface | as |
|---|---|
| MCP | tool majordomus_execution_protocol resource majordomus://executions/protocol |
| HTTP | GET /api/v1/executions/protocol operationId executions.protocol |
| command line | majordomus executions protocol |
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 · Empty
No input.
No properties: the capability takes no input.
JSON Schema
{
"additionalProperties": false,
"description": "No input.",
"title": "Empty",
"type": "object"
}output · ProtocolReport
The answer of `executions.protocol`: the live channel's whole contract, derived from the types that implement it.
| property | type | required | description |
|---|---|---|---|
| event_schema | object | yes | The JSON Schema of an event, derived from the Rust type. |
| event_types | array | yes | The event types a client may receive, from the one enum that defines them. |
| heartbeat_seconds | integer | yes | How many seconds of quiet before the server pings. |
| limits | reference | yes | What the store keeps, so a client knows what it may ask for. |
| max_connections | integer | yes | How many live channels this process serves at once. |
| max_replay | integer | yes | How many retained events a scoped connection replays before going live. |
| protocol_version | string | yes | The version of the event protocol this server speaks. |
| stream_schema | object | yes | The JSON Schema of a control message, derived from the Rust type. |
| stream_types | array | yes | The stream's own control messages. |
| subscription | array | yes | How the subscription is expressed, and what a reconnect sends. |
| websocket | string | yes | Where the live channel is: a path on this same server, not a second daemon. |
JSON Schema
{
"$defs": {
"LimitsView": {
"description": "What this process's execution store keeps.",
"properties": {
"max_events": {
"description": "How many events are retained per execution.",
"format": "uint",
"minimum": 0,
"type": "integer"
},
"max_executions": {
"description": "How many executions are remembered.",
"format": "uint",
"minimum": 0,
"type": "integer"
},
"max_log_chars": {
"description": "The longest a single log line may be.",
"format": "uint",
"minimum": 0,
"type": "integer"
},
"max_running": {
"description": "How many executions run at once.",
"format": "uint",
"minimum": 0,
"type": "integer"
},
"max_subscriber_queue": {
"description": "How far a live channel may fall behind before it is told to resynchronise.",
"format": "uint",
"minimum": 0,
"type": "integer"
}
},
"required": [
"max_executions",
"max_events",
"max_log_chars",
"max_running",
"max_subscriber_queue"
],
"type": "object"
},
"ParameterView": {
"description": "One query parameter of the live channel.",
"properties": {
"description": {
"description": "What it does.",
"type": "string"
},
"name": {
"description": "Its name.",
"type": "string"
},
"required": {
"description": "Whether it must be given.",
"type": "boolean"
}
},
"required": [
"name",
"description",
"required"
],
"type": "object"
}
},
"description": "The answer of `executions.protocol`: the live channel's whole contract, derived from\nthe types that implement it.",
"properties": {
"event_schema": {
"description": "The JSON Schema of an event, derived from the Rust type."
},
"event_types": {
"description": "The event types a client may receive, from the one enum that defines them.",
"items": {
"type": "string"
},
"type": "array"
},
"heartbeat_seconds": {
"description": "How many seconds of quiet before the server pings.",
"format": "uint64",
"minimum": 0,
"type": "integer"
},
"limits": {
"$ref": "#/$defs/LimitsView",
"description": "What the store keeps, so a client knows what it may ask for."
},
"max_connections": {
"description": "How many live channels this process serves at once.",
"format": "uint",
"minimum": 0,
"type": "integer"
},
"max_replay": {
"description": "How many retained events a scoped connection replays before going live.",
"format": "uint",
"minimum": 0,
"type": "integer"
},
"protocol_version": {
"description": "The version of the event protocol this server speaks.",
"type": "string"
},
"stream_schema": {
"description": "The JSON Schema of a control message, derived from the Rust type."
},
"stream_types": {
"description": "The stream's own control messages.",
"items": {
"type": "string"
},
"type": "array"
},
"subscription": {
"description": "How the subscription is expressed, and what a reconnect sends.",
"items": {
"$ref": "#/$defs/ParameterView"
},
"type": "array"
},
"websocket": {
"description": "Where the live channel is: a path on this same server, not a second daemon.",
"type": "string"
}
},
"required": [
"protocol_version",
"websocket",
"subscription",
"heartbeat_seconds",
"max_connections",
"max_replay",
"event_types",
"stream_types",
"event_schema",
"stream_schema",
"limits"
],
"title": "ProtocolReport",
"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.