capabilities.projections
A row per capability with the command line, HTTP route, MCP tool and MCP resource it reaches, whether every exposure it declares is answered by that surface, and the runnable commands no capability claims. Derived from the registry and the clap declaration; nothing is written down.
A row per capability with the command line, HTTP route, MCP tool and MCP resource it reaches, whether every exposure it declares is answered by that surface, and the runnable commands no capability claims. Derived from the registry and the clap declaration; nothing is written down.
- query
- behaviorally_verified
- module capabilities
- #introspection
- #projections
Exposure
Where this one definition is reachable. Absence is explicit: a surface not listed does not carry it.
| surface | as |
|---|---|
| MCP | tool majordomus_projections |
| HTTP | GET /api/v1/capabilities/projections operationId capabilities.projections |
| command line | majordomus capabilities projections |
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 · ProjectionsInput
capabilities.projections: which rows, and whether only the unmet claims.| property | type | required | description |
|---|---|---|---|
| module | string | null | no | Only capabilities composed in this module. default null |
| unmet | boolean | no | Only the capabilities whose declared exposures are not all answered by their surface. Empty is the closure the rule asks for. default false |
JSON Schema
{
"additionalProperties": false,
"description": "The input of `capabilities.projections`: which rows, and whether only the unmet claims.",
"properties": {
"module": {
"default": null,
"description": "Only capabilities composed in this module.",
"type": [
"string",
"null"
]
},
"unmet": {
"default": false,
"description": "Only the capabilities whose declared exposures are not all answered by their\nsurface. Empty is the closure the rule asks for.",
"type": "boolean"
}
},
"title": "ProjectionsInput",
"type": "object"
}output · ClosureMatrix
| property | type | required | description |
|---|---|---|---|
| rows | array | yes | One row per capability, in id order. |
| unbacked | array | yes | Runnable commands of the command line that no capability claims, in command order. |
| unclassified | array | yes | Of those, the ones crate::cli::local::LOCAL does not explain either: a command
that is neither the projection of a capability nor declared command-line-only with
a reason. Empty is the closure the rule asks for; anything here is an operation
that left the API by accident rather than by decision. |
JSON Schema
{
"$defs": {
"ExecutionEffect": {
"description": "What running a capability changes outside the caller.\n\nClassified, never declared: it follows from the kind, which is the field a declaration\nalready carries. A projection reads this to decide whether to ask before running\nsomething — the Cockpit's confirmation is derived from it — instead of naming\ncapabilities it must treat carefully, which is a list that goes stale the day after it\nis written.",
"oneOf": [
{
"const": "read",
"description": "Nothing changes. Every query and every resource of this executable.",
"type": "string"
},
{
"const": "process_state",
"description": "This process's own memory changes, and nothing outside it.",
"type": "string"
},
{
"const": "repository_mutation",
"description": "The repository changes.\n\nFor most of this executable's life nothing classified to this, because no capability\nof any kind wrote to the repository. That day arrived with [ADR 0040]: development\nsemantics are capabilities of this runtime, and the first of them — `plan.transition`\n— stamps a field into an issue's own tracked record. The variant was put on the model\nin advance so that when one did, it would say so *here*, where a projection already\nreads it and a client already asks before running it, rather than in whichever page\nhappens to render its button.\n\nIt is not classified from the kind, because the kind cannot know it: a command that\nannounces a peer and a command that writes a tracked file are the same kind. A\nhandler that writes the repository says so with\n`ExecutionPolicy::writes_repository`, the way one that stops says so with\n`ExecutionPolicy::stoppable`.\n\n[ADR 0040]: https://github.com/korczis/prismatic-majordomus/blob/master/.ai/repo/adrs/0040-development-semantics-are-capabilities-of-one-runtime.md",
"type": "string"
}
]
},
"Row": {
"description": "Where one capability is projected, and where it is not.\n\nThis is the coverage matrix of the rule: a row per capability, a column per interface.\nIt is derived, never written down — a capability that reaches nothing shows as a row of\n`false`, which is exactly the \"exists but is invisible\" case worth seeing.",
"properties": {
"cli": {
"description": "The command line, when it declares one and clap has it.",
"type": [
"string",
"null"
]
},
"closed": {
"description": "Whether every exposure this row declares is answered by its surface.",
"type": "boolean"
},
"effect": {
"$ref": "#/$defs/ExecutionEffect",
"description": "What a call changes: nothing, this process's memory, or the repository. The same\nclassification every projection reads, so the matrix answers \"where is it reachable\"\nand \"what does reaching it risk\" in one row."
},
"http": {
"description": "The HTTP route, when it declares one.",
"type": [
"string",
"null"
]
},
"id": {
"description": "The canonical id.",
"type": "string"
},
"kind": {
"description": "Query, command or resource.",
"type": "string"
},
"mcp_resource": {
"description": "The MCP resource URI, when it declares one.",
"type": [
"string",
"null"
]
},
"mcp_tool": {
"description": "The MCP tool name, when it declares one.",
"type": [
"string",
"null"
]
},
"module": {
"description": "The module that composes it.",
"type": "string"
},
"source": {
"description": "Where the capability is declared; repository-relative.",
"type": "string"
},
"stability": {
"description": "Where it stands.",
"type": "string"
}
},
"required": [
"id",
"module",
"kind",
"stability",
"effect",
"closed",
"source"
],
"type": "object"
}
},
"description": "The whole matrix, with the findings and the debt beside it: one value that answers\n\"where does each capability appear, and is any claim unmet\".",
"properties": {
"rows": {
"description": "One row per capability, in id order.",
"items": {
"$ref": "#/$defs/Row"
},
"type": "array"
},
"unbacked": {
"description": "Runnable commands of the command line that no capability claims, in command order.",
"items": {
"type": "string"
},
"type": "array"
},
"unclassified": {
"description": "Of those, the ones `crate::cli::local::LOCAL` does not explain either: a command\nthat is neither the projection of a capability nor declared command-line-only with\na reason. Empty is the closure the rule asks for; anything here is an operation\nthat left the API by accident rather than by decision.",
"items": {
"type": "string"
},
"type": "array"
}
},
"required": [
"rows",
"unbacked",
"unclassified"
],
"title": "ClosureMatrix",
"type": "object"
}Policies
- benchmark
- required — a target on every transport the exposure declares; the cases are the input type's
- cache
- process — up to 8 entries in the process, scoped by the registry fingerprint
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.