Skip to content

HTTP API

The read-only projection of a repository's AI layer: every rule, prompt, session and project record under .ai/, and the capabilities that read them, served over MCP, HTTP and the command line from one registry.

Rendered from docs/generated/openapi.json, which the executable generates from its capability registry and CI refuses stale. The raw document is at /openapi.json; a running server serves the same document at its own /openapi.json and Swagger UI at /swagger.

Majordomus

v0.4.0 OpenAPI 3.1.0MIT

The read-only projection of a repository's AI layer: every rule, prompt, session and project record under .ai/, and the capabilities that read them, served over MCP, HTTP and the command line from one registry.

One registry, every interface a projection. Every operation here is a capability of the registry and nothing is declared for HTTP alone. operationId is the capability's canonical id; the same capability answers as the MCP tool x-majordomus-mcp names and as the command x-majordomus-cli names, where its exposure says so, through one executor with one cache. A change to a capability's description or input type reaches this document, the MCP schema, the command line and the generated reference on the next start; nothing is edited by hand.

Loopback, unauthenticated, read-only. The first majordomus mcp in a repository binds this server beside its stdio session and logs the URL; majordomus serve binds it alone. It listens on 127.0.0.1, asks for no credentials, and never writes to the repository: whoever can reach the socket can read the layer, and nobody can change it through it. GET / is the home page and lists every surface; /swagger is Swagger UI over this document; /docs/ is this repository's own documentation; /mcp is MCP over HTTP for a second client.

Binding. GET binds every top-level property of the capability's input as a query parameter, coerced by the schema's type (integers, numbers and booleans are parsed, everything else is text); POST binds the input as the JSON body. An unknown parameter is an invalid input, not ignored. Every failure is one JSON body, { "error": { "code", "message" } }: 400 invalid_input, 404 not_found, 422 refused (a command's alone), 500 internal; 405 method_not_allowed names a path that exists under another method.

Examples are benchmark cases. Every example in this document is one of the capability's own benchmark cases, the inputs the benchmarks time and the tests replay against a real socket: an operation without an example is an operation without a case, and the executable does not compile in that state. x-majordomus-benchmark and x-majordomus-cache carry the policies; x-majordomus-stability and x-majordomus-provenance say how far a capability is proved and where it was declared.

Generated, committed, checked. This document is rendered from the registry at every request and committed as docs/generated/openapi.json; majordomus generate --check derives it again and refuses a stale copy, and CI runs that check on every push, so the committed document, the served one and the reference on the site are the same document.

server
/ — The shared server `majordomus mcp` binds, or `majordomus serve`; loopback, the port in its log.
binding
GET binds every top-level input property as a query parameter; POST binds the input as the JSON body
generated by
majordomus-cli 0.4.0 · dialect https://spec.openapis.org/oas/3.1/dialect/base

Errors

Every failure is one JSON body, {"error": {"code", "message"}} (ErrorBody). The status names the class; the message is for a person.

statuscodewhen
400invalid_inputThe input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404not_foundThe input names something the repository does not hold.
422refusedThe command was understood and turned down for the reason the message gives.
500internalThe capability failed for a reason of its own; the message names it.

Server routes

Not capabilities: the HTTP projection's own routes, the same on every server. This page is a publication and has no server behind it, so a route only a running process answers is named here rather than linked — which of the two it is comes from the surface's own declared availability.

  • GET/while a server runsThis process, and everything it serves
  • GET/api/v1while a server runsThe capability registry over HTTP
  • GET/openapi.jsonThe OpenAPI document of the capability registry
  • GET/swaggerwhile a server runsSwagger UI over the OpenAPI document
  • GET/mcpwhile a server runsMCP over HTTP for attached clients
  • GET/eventswhile a server runsThe live channel: what this process's executions are doing
  • GET/cockpitwhile a server runsThe registry, rendered for a person

artifacts

What `majordomus generate` writes: every document with the encodings it is committed in — JSON for a program, YAML beside it, Markdown for a reader — each with its schema, its source and its hash, reconciled with the working tree. The declaration is the generator's own manifest; nothing here keeps a list.

GET /api/v1/artifacts artifacts.list

List the generated artifacts

The manifest `majordomus generate` commits as docs/generated/artifacts.json, reconciled with the working tree: every document with the encodings it is written in, and every file with its format, schema, source, size, hash and whether the file on disk still matches. Optionally narrowed to one document or one encoding. Reads only; `majordomus generate` writes and `majordomus generate --check` is the byte-for-byte verdict.

  • query
  • behaviorally_verified
  • benchmark required
  • cache process (max_entries=8, ttl_seconds=5)
  • MCP tool majordomus_artifacts
  • MCP resource {"name": "artifacts", "uri": "majordomus://artifacts"}

Query parameters

nametyperequireddescriptionexamples
document string no Only the artifacts of this document (`registry`, `cli`, `openapi`, ...).
format ArtifactFormat | null no Only the artifacts written in this encoding. one-encoding: "yaml"

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/artifacts?format=yaml"

Responses

statusbodymeaning
200 ArtifactReport List the generated artifacts: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.

capabilities

The registry seen through itself: every capability with its kind, stability, provenance, exposures, benchmark and cache policy, and one capability in full.

GET /api/v1/capabilities capabilities.list

List capabilities

Every capability of this executable and this repository, summarised: kind, module, stability, provenance, the projections it declares, its benchmark and cache policy; the schemas are answered by capabilities.describe.

  • query
  • behaviorally_verified
  • benchmark required
  • cache process (max_entries=16)
  • MCP tool majordomus_capabilities
  • $ capabilities list

Query parameters

nametyperequireddescriptionexamples
kind string no Only capabilities of this kind: `query`, `command` or `resource`. queries: "query"
exposure string no Only capabilities exposed through this projection: `mcp`, `http` or `cli`.

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/capabilities?kind=query"

Responses

statusbodymeaning
200 CapabilityList List capabilities: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.
GET /api/v1/capabilities/projections capabilities.projections

Where each capability is projected

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
  • benchmark required
  • cache process (max_entries=8)
  • MCP tool majordomus_projections
  • $ capabilities projections

Query parameters

nametyperequireddescriptionexamples
module string no Only capabilities composed in this module.
unmet boolean no Only the capabilities whose declared exposures are not all answered by their surface. Empty is the closure the rule asks for. all: falseunmet: true

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/capabilities/projections?unmet=false"

Responses

statusbodymeaning
200 ClosureMatrix Where each capability is projected: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.
GET /api/v1/capability capabilities.describe

Describe one capability

One capability by canonical id: its kind, schemas, provenance, stability, exposures, benchmark and cache policy.

  • query
  • behaviorally_verified
  • benchmark required
  • cache disabled
  • MCP tool majordomus_capability
  • $ capabilities describe

Query parameters

nametyperequireddescriptionexamples
id string yes The canonical id, e.g. `repository.info` or `rule.majordomus.scope-integrity@1`. repository-info: "repository.info"

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/capability?id=repository.info"

Responses

statusbodymeaning
200 Capability Describe one capability: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.

commands

Every command this repository offers, from whichever program offers it: the Rust executable, the shell tool that carries the task lifecycle, and the workflows the repository declares for a person to run. Composed from the three declarations that already exist — the clap tree, the shipped command registry and the workflow runner's own dump — never from a list. Each command carries what running it changes, what it needs, where its argument values come from, and every surface that carries it, with the reason when one does not.

GET /api/v1/command commands.get

One command in full

One command by its canonical identity: its arguments with the source of each one's values, what running it changes, what it needs, where it came from, and every surface that carries it — with the reason a machine surface withholds it when one does.

  • query
  • implemented
  • benchmark required
  • cache disabled
  • MCP tool majordomus_command

Query parameters

nametyperequireddescriptionexamples
id string yes The identity, `executable.worktree.status`. worktree-status: "executable.worktree.status"

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/command?id=executable.worktree.status"

Responses

statusbodymeaning
200 CommandNode One command in full: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.
GET /api/v1/commands commands.list

Every command, one line each

The commands this repository offers, filtered by the program that runs them, by what running them changes, or by text. A summary rather than the whole graph: enough to choose a command, and never so much that a client has to read every argument of every command to find one.

  • query
  • implemented
  • benchmark required
  • cache disabled
  • MCP tool majordomus_commands
  • MCP resource {"name": "commands", "uri": "majordomus://commands"}

Query parameters

nametyperequireddescriptionexamples
origin string no Only the commands of one program: `executable`, `tool` or `workflow`. one-program: "executable"
effect string no Only the commands whose effect is at most this one: `read_only`, `local_mutation`, `repository_mutation`, `network_mutation`, `destructive`. read-only: "read_only"
search string no Only the commands matching this text in their invocation, summary, tags or identity.

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/commands?origin=executable&effect=read_only"

Responses

statusbodymeaning
200 CommandIndex Every command, one line each: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.
GET /api/v1/commands/graph commands.graph

The whole command graph

The graph as one document, with its fingerprint and every diagnostic its build found: a duplicate identity, a recipe name two commands would take, an annotation that names a command which no longer exists. Deterministic — two builds over one tree produce the same document — so a client may cache against the fingerprint.

  • query
  • implemented
  • benchmark required
  • cache disabled
  • MCP tool majordomus_command_graph

No parameters.

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/commands/graph"

Responses

statusbodymeaning
200 CommandGraphReport The whole command graph: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.

continuity

What this checkout's lifecycle is holding: the open episode, the record the next worker would resume from with the label that says how far to trust it, the newest progress note, and what is blocking acceptance. Read from the local half of the layer, which this process serves to the worker in front of it and never publishes.

GET /api/v1/continuity continuity.state

What the lifecycle is holding

The open episode, the active task, the handover and checkpoint that resolve for this worktree and branch, each with its divergence label, the unresolved questions that refuse completion, and the record tallies. Selection is two-tiered and never repository-wide: a record from an unrelated worktree or branch is not offered, because a briefing that is quietly about somebody else is worse than none. Absence is reported as absence.

  • query
  • behaviorally_verified
  • benchmark required
  • cache process (max_entries=2, ttl_seconds=2)
  • MCP tool majordomus_continuity
  • MCP resource {"name": "continuity", "uri": "majordomus://continuity"}

No parameters.

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/continuity"

Responses

statusbodymeaning
200 Continuity What the lifecycle is holding: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.

deploy

The deployments this repository declares, read from the canonical objects the index holds, and whether they would work — decided against the capability registry this process built and the workspace it sits in. Every operation is a read: a deployment is changed by the trusted command line and by CI, never over HTTP and never by an MCP client.

GET /api/v1/deployment deploy.get

One deployment

One deployment by its identity, typed, with the repository-relative file it was read from.

  • query
  • behaviorally_verified
  • benchmark required
  • cache disabled
  • MCP tool majordomus_deployment

Query parameters

nametyperequireddescriptionexamples
id string yes The deployment's `id`. first-deployment: "majordomus"

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/deployment?id=majordomus"

Responses

statusbodymeaning
200 DeploymentView One deployment: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.
GET /api/v1/deployments deploy.list

Deployments

Every deployment the layer declares, typed: the application, the package and binary shipped, the address the process listens on, the routes a platform polls, the resources, the machine count, the region, the build inputs, the measured budgets and the provider's own facts. An object of the kind this executable cannot read is reported with the reason rather than skipped.

  • query
  • behaviorally_verified
  • benchmark required
  • cache disabled
  • MCP tool majordomus_deployments
  • MCP resource {"name": "deployments", "uri": "majordomus://deployments"}

No parameters.

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/deployments"

Responses

statusbodymeaning
200 DeploymentList Deployments: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.
GET /api/v1/deployments/check deploy.check

Would these deployments work

Every refusal the declared deployments earn locally: a health route no capability registers, a package or binary the workspace does not produce, a build input that does not resolve, more machines running than exist, a hosted process that would bind loopback. Each names the file, the key, the value observed and the correction. Nothing here contacts the provider.

  • query
  • behaviorally_verified
  • benchmark required
  • cache process (max_entries=2, ttl_seconds=5)
  • MCP tool majordomus_deploy_check

No parameters.

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/deployments/check"

Responses

statusbodymeaning
200 DeploymentCheck Would these deployments work: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.

directories

The layer's directories as a hierarchy: the contract each one declares, what it owes and which contract said so, and the chain that applies to it once inheritance is resolved.

GET /api/v1/directories directories.list

The layer's directory contracts

Every directory of the layer the index knows, with the contract it declares, whether it owes one and which contract decided, and — for a named path, or when asked for everywhere — the effective chain composed from the root down, least specific first.

  • query
  • behaviorally_verified
  • benchmark required
  • cache process (max_entries=8, ttl_seconds=5)
  • MCP tool majordomus_directories
  • MCP resource {"name": "directories", "uri": "majordomus://directories"}

Query parameters

nametyperequireddescriptionexamples
path string no One directory, repository-relative and inside the layer. Its effective chain is always resolved. Absent means every directory of the layer. one-directory: ".ai/repo/rules"
effective boolean no Resolve the effective chain for every directory, not only for a named one. effective-everywhere: true
state DirectoryState | null no Only directories in this state: `documented`, `exempt` or `owed`. owed: "owed"

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/directories?path=.ai%2Frepo%2Frules&effective=true&state=owed"

Responses

statusbodymeaning
200 DirectoryReport The layer's directory contracts: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.

distribution

How this project is packaged, published and installed: the platforms a release builds, the artifact names the one naming function derives, the installer's canonical command, the releases that were published, and what this build itself is. Every answer comes from share/distribution.yaml and the release records; no surface here states a fact of its own.

GET /api/v1/distribution distribution.model

The distribution model

The one-line install command, where an installation goes, and every declared target with the artifact name it derives. This is what the installation page, the landing page's install block and the cockpit's install card render; none of them holds a platform list of its own.

  • query
  • behaviorally_verified
  • benchmark required
  • cache disabled
  • MCP tool majordomus_distribution
  • $ distribution show

No parameters.

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/distribution"

Responses

statusbodymeaning
200 DistributionReport The distribution model: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.
GET /api/v1/distribution/artifact distribution.artifact

The artifact of a target

The archive name a target and a tag derive, the directory it unpacks into, and where a release publishes it. The one naming function answers; the release pipeline asks it rather than composing a name in a workflow file.

  • query
  • behaviorally_verified
  • benchmark required
  • cache disabled
  • MCP tool majordomus_artifact
  • $ distribution artifact

Query parameters

nametyperequireddescriptionexamples
target string yes A target's id or its Rust target triple. first-published-target: "aarch64-apple-darwin"
tag string yes The tag, `v` and a version. `{tag}` asks for the name with the placeholder left in. first-published-target: "v0.0.0"

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/distribution/artifact?target=aarch64-apple-darwin&tag=v0.0.0"

Responses

statusbodymeaning
200 ReleaseArtifactView The artifact of a target: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.
GET /api/v1/distribution/build distribution.build

This build

What this executable is: the version of the crate it was built from, the Rust target triple, the profile, and the commit — all compiled in at build time, so an installed binary answers without a repository, a toolchain or git.

  • query
  • behaviorally_verified
  • benchmark required
  • cache disabled
  • MCP tool majordomus_build
  • $ distribution build

No parameters.

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/distribution/build"

Responses

statusbodymeaning
200 BuildReport This build: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.
GET /api/v1/distribution/releases distribution.releases

Published releases

Every release this repository recorded, newest first, and the one an unpinned installation resolves to: the highest version among the stable, unwithdrawn records. The pointer is derived here and never authored anywhere.

  • query
  • behaviorally_verified
  • benchmark required
  • cache disabled
  • MCP tool majordomus_releases
  • $ distribution releases

No parameters.

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/distribution/releases"

Responses

statusbodymeaning
200 ReleasesReport Published releases: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.
GET /api/v1/distribution/status distribution.status

Whether the published installation works

Whether a machine that has never seen this project can install it right now with the advertised one-line command, and when it cannot, which link in the chain is missing and what changes it. Derived from the distribution model and the release records alone: it reaches no network, so it is as fast as any other local query and answers offline. The served bytes are proved by the release pipeline's smoke phase, not guessed at here.

  • query
  • behaviorally_verified
  • benchmark required
  • cache disabled
  • MCP tool majordomus_install_status
  • $ distribution status

No parameters.

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/distribution/status"

Responses

statusbodymeaning
200 InstallabilityReport Whether the published installation works: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.

environment

What this checkout is right now: the project and its version, the repository and its layer, version control, the toolchains it declares, what the layer holds, the workflows a person can run, the provider projections and the local services — one typed snapshot, with a provenance entry for every value in it. The direnv banner, the Cockpit's overview and this route are renderings of the same value.

GET /api/v1/environment environment.status

The repository environment

One snapshot of this checkout: project identity, repository identity, version control, declared toolchains, what the layer holds counted per kind, the workflows the runner describes, the provider projections against the policy that renders them, and the local services with the address a running server published. Every value carries where it came from.

  • query
  • behaviorally_verified
  • benchmark required
  • cache process (max_entries=4, ttl_seconds=3)
  • MCP tool majordomus_environment
  • MCP resource {"name": "environment", "uri": "majordomus://environment"}

Query parameters

nametyperequireddescriptionexamples
probe_services boolean no Contact the local address a running server published, to say whether it answers. Off by default: a served request should not open a socket to another server on behalf of its caller, and the caller usually is that server. default: false

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/environment?probe_services=false"

Responses

statusbodymeaning
200 RepositoryEnvironment The repository environment: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.
GET /api/v1/environment/explain environment.explain

Where an environment value came from

The provenance of the snapshot: for each field, what decided it — a compile-time constant, a file, a command, or the cache — which resolver read it, and how far it can be trusted. Narrow it to one field, or to a prefix, by name.

  • query
  • behaviorally_verified
  • benchmark required
  • cache disabled
  • MCP tool majordomus_environment_explain

Query parameters

nametyperequireddescriptionexamples
field string no The field in dotted form (`services.url`, `capabilities.objects`); every field when absent. one-field: "project.version"

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/environment/explain?field=project.version"

Responses

statusbodymeaning
200 EnvironmentProvenance Where an environment value came from: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.

executions

Running a capability of this registry as work that can be watched: started, followed event by event over the live channel, read back afterwards, and asked to stop. In memory; an execution does not outlive the process that accepted it.

GET /api/v1/executions executions.list

List executions

Every execution this process remembers, newest first, narrowed by state or by capability. The counts beside them — remembered, active, queued, live channels — are what a control plane shows without asking a second question.

  • query
  • behaviorally_verified
  • benchmark required
  • cache disabled
  • MCP tool majordomus_executions
  • MCP resource {"name": "executions", "uri": "majordomus://executions"}
  • $ executions list

Query parameters

nametyperequireddescriptionexamples
state ExecutionState | null no Only executions in this state.
capability string no Only executions of this capability.
limit integer (uint) no How many, newest first; the default and the bound are both `200`. recent: 50

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/executions?limit=50"

Responses

statusbodymeaning
200 ExecutionList List executions: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.
POST /api/v1/executions/cancel executions.cancel

Ask an execution to stop

Set the execution's cancellation flag and say so on its stream. Cancellation is cooperative: a task looks at its flag and stops, and a capability whose policy says it is not cancellable runs to completion — which the answer says rather than pretending otherwise.

  • command
  • behaviorally_verified
  • benchmark waived: transient_state
  • cache disabled
  • MCP tool majordomus_execution_cancel
  • $ executions cancel

Request body CancelInput, JSON

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s -X POST "http://127.0.0.1:8741/api/v1/executions/cancel" -H "content-type: application/json" -d '{}'

Responses

statusbodymeaning
200 CancelReport Ask an execution to stop: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
422 ErrorBody refused: The command was understood and turned down for the reason the message gives.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.
GET /api/v1/executions/demonstrate executions.demonstrate

Demonstrate an execution

Walk a given number of steps, reporting each one, logging a line and advancing progress, then finish — or fail at a step you name. It exists so that an operator, a probe and an end-to-end test can prove the whole path works without waiting for real work: it reads nothing, writes nothing, and its only effect is the events it produces. It looks at its cancellation flag between steps and while it waits, so cancelling it stops it.

  • query
  • behaviorally_verified
  • benchmark required
  • cache disabled
  • MCP tool majordomus_demonstrate_execution

Query parameters

nametyperequireddescriptionexamples
steps integer (uint64) no How many steps to walk through. immediate: 1
delay_ms integer (uint64) no How long each step takes, in milliseconds. Bounded at ten seconds a step, so this cannot be used to hold a worker. immediate: 0
fail_at integer (uint64) no Fail on this step instead of completing, to show what a failure looks like.

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/executions/demonstrate?steps=1&delay_ms=0"

Responses

statusbodymeaning
200 DemonstrateReport Demonstrate an execution: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.
GET /api/v1/executions/events executions.events

An execution's event history

The retained events of one execution, oldest first, after a sequence number. This is what a browser reads after a reload and what a client reads after a reconnect: the page carries the cursor to open the live channel with, so nothing is missed between the history and the stream.

  • query
  • behaviorally_verified
  • benchmark waived: transient_state
  • cache disabled
  • MCP tool majordomus_execution_events
  • $ executions events

Query parameters

nametyperequireddescriptionexamples
id string yes The execution's id.
after integer (uint64) no Only events after this sequence number: the cursor a reconnecting client holds.
limit integer (uint) no How many, oldest first; the default and the bound are both `500`.

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/executions/events"

Responses

statusbodymeaning
200 EventHistory An execution's event history: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.
GET /api/v1/executions/get executions.get

One execution

The whole of what is known about one execution: its state, its input as it was stored, its steps, its progress, its diagnostics, and its output or its error. Taken under one lock, so a snapshot that says it succeeded carries what it produced.

  • query
  • behaviorally_verified
  • benchmark waived: transient_state
  • cache disabled
  • MCP tool majordomus_execution
  • $ executions show

Query parameters

nametyperequireddescriptionexamples
id string yes The execution's id.

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/executions/get"

Responses

statusbodymeaning
200 ExecutionView One execution: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.
GET /api/v1/executions/protocol executions.protocol

The live channel's contract

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
  • benchmark required
  • cache disabled
  • MCP tool majordomus_execution_protocol
  • MCP resource {"name": "execution-protocol", "uri": "majordomus://executions/protocol"}
  • $ executions protocol

No parameters.

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/executions/protocol"

Responses

statusbodymeaning
200 ProtocolReport The live channel's contract: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.
POST /api/v1/executions/start executions.start

Start a capability as an execution

Run any executable capability of this registry as an execution: the input is checked against that capability's own input schema, the work is queued, and this answers at once with the execution's id and the links to follow it. Nothing waits for the handler. The capability runs through the same executor every other interface calls, so there is no second implementation of anything.

  • command
  • behaviorally_verified
  • benchmark required
  • cache disabled
  • MCP tool majordomus_execution_start
  • $ run

Request body StartInput, JSON

example demonstrate

{"capability":"executions.demonstrate","input":{"steps":1,"delay_ms":0}}

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s -X POST "http://127.0.0.1:8741/api/v1/executions/start" -H "content-type: application/json" -d '{"capability":"executions.demonstrate","input":{"steps":1,"delay_ms":0}}'

Responses

statusbodymeaning
200 ExecutionView Start a capability as an execution: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
422 ErrorBody refused: The command was understood and turned down for the reason the message gives.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.

graph

The graphs derived from the registry and the index: the executable's own capability registry, the shape of the layer, the rule dependencies, the decisions and what they put in force, and the use cases and what they exercise. Canonical nodes and edges; a rendering library is a consumer, never the shape.

GET /api/v1/graph graph.get

Derive one graph

One graph by id: its nodes and edges with the vocabularies that say what each kind means, the file every node was derived from, and whether the result is acyclic. Deterministic for a given tree and executable.

  • query
  • behaviorally_verified
  • benchmark required
  • cache process (max_entries=16)
  • MCP tool majordomus_graph

Query parameters

nametyperequireddescriptionexamples
id string yes The graph's id, as `graph.list` gives it (`registry`, `layer`, `rules`, `adrs`, `use-cases`). adrs: "adrs"composed: "composed"layer: "layer"product: "product"registry: "registry"rules: "rules"use-cases: "use-cases"why: "why"

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/graph?id=adrs"

Responses

statusbodymeaning
200 Graph Derive one graph: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.
GET /api/v1/graphs graph.list

List graphs

Every graph this executable derives: its id, what it shows, and what it is derived from.

  • query
  • behaviorally_verified
  • benchmark required
  • cache disabled
  • MCP tool majordomus_graphs
  • MCP resource {"name": "graphs", "uri": "majordomus://graphs"}

No parameters.

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/graphs"

Responses

statusbodymeaning
200 GraphList List graphs: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.

health

Whether what this process serves is healthy, decided by the engines that already decide it: the index's diagnostics, the registry builder, the benchmark projection's coverage and the comparison `generate --check` makes. No check here has an opinion of its own.

GET /api/v1/health health.report

Health of this process

Every dimension of what this process serves — the layer as it was read, the registry, the scope, version control, benchmark coverage, the committed registry manifest and the attached peers — each decided by the engine that owns it, with the command that reproduces the verdict.

  • query
  • behaviorally_verified
  • benchmark required
  • cache process (max_entries=4, ttl_seconds=5)
  • MCP tool majordomus_health
  • MCP resource {"name": "health", "uri": "majordomus://health"}

No parameters.

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/health"

Responses

statusbodymeaning
200 Health Health of this process: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.
GET /api/v1/live health.live

Liveness

Is this process alive: the cheapest true statement this executable can make about itself, with the version that answered. No filesystem traversal, no index build, no network — this is what a hosting platform polls, and it must cost nothing to say.

  • query
  • behaviorally_verified
  • benchmark required
  • cache disabled

No parameters.

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/live"

Responses

statusbodymeaning
200 Liveness Liveness: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.
GET /api/v1/ready health.ready

Readiness

Can this process serve traffic: the registry and the index it built at start-up, already resident, and how the layer read. Only local initialisation — never an external provider, a database or another service, because a readiness check that probes a dependency fails a deployment for something that is not this process.

  • query
  • behaviorally_verified
  • benchmark required
  • cache disabled

No parameters.

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/ready"

Responses

statusbodymeaning
200 Readiness Readiness: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.

objects

The declarative objects of the repository's AI layer: rules, prompts, profiles, policy, documents, milestones, issues, claims, and whatever kinds the repository adds; listed, read by URI, and searched.

GET /api/v1/object objects.get

Get one object

One object by URI (majordomus://<kind>/<identity>): metadata, provenance and content; a URI a query projects (majordomus://repository) answers that query as a JSON document. The same resolution serves the MCP resource read.

  • query
  • behaviorally_verified
  • benchmark required
  • cache disabled
  • MCP tool majordomus_get

Query parameters

nametyperequireddescriptionexamples
uri string yes `majordomus://<kind>/<identity>`, or a URI a query projects (`majordomus://repository`). first-object: "majordomus://adr/adr-0001"repository: "majordomus://repository"

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/object?uri=majordomus%3A%2F%2Fadr%2Fadr-0001"

Responses

statusbodymeaning
200 ResourceView Get one object: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.
GET /api/v1/objects objects.list

List objects

List the declarative objects of the repository's AI layer, optionally by kind or tag.

  • query
  • behaviorally_verified
  • benchmark required
  • cache disabled
  • MCP tool majordomus_list

Query parameters

nametyperequireddescriptionexamples
kind string no Only objects of this kind; the kinds present are listed by `repository.info`. A kind the repository does not have is an invalid input, not an empty answer. first-kind: "adr"
tag string no Only objects whose metadata tags include this tag.

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/objects?kind=adr"

Responses

statusbodymeaning
200 ObjectList List objects: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.
GET /api/v1/objects/verify objects.verify

Verify the index against the working tree

Read every file the layer was built from and compare it with what this process is serving. The index is built once at start-up and kept, which is what makes every other request cost nothing and what makes a file edited afterwards be served as it was; this is how a running server says whether that has happened, without being restarted to find out. A file that is one object is compared byte for byte; a collection file, whose objects the index keeps as members rather than as text, is compared by size, and every finding says which comparison was made. It reads every file of the layer, so it reports its progress file by file and stops when it is asked to.

  • query
  • behaviorally_verified
  • benchmark required
  • cache disabled
  • MCP tool majordomus_verify_objects

Query parameters

nametyperequireddescriptionexamples
kind string no Only objects of this kind.
limit integer (uint) no How many objects to read at most; every one of them when absent. bounded: 25

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/objects/verify?limit=25"

Responses

statusbodymeaning
200 VerifyReport Verify the index against the working tree: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.

obligations

What a task owes before it may be called completed, and whether the evidence that discharged each obligation still describes this tree. The vocabulary is data the distribution ships and answers in any clone; the closure is read from the local half of the layer, which this process serves to the worker in front of it and never publishes. Read, never written: `majordomus evidence` records, and a second writer for one ledger would be a second account of the same events.

GET /api/v1/obligations obligations.vocabulary

Every obligation there is

The tokens a task may declare in `requires`: what each one asks of a worker, the command that discharges it, the pathspecs its evidence is hashed over, and whether its fact is remote and therefore bound to a commit rather than to a tree. Shipped data, identical in every clone, so this answers in a checkout that has never run the lifecycle.

  • query
  • behaviorally_verified
  • benchmark required
  • cache process (max_entries=2)
  • MCP tool majordomus_obligations
  • MCP resource {"name": "obligations", "uri": "majordomus://obligations"}

No parameters.

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/obligations"

Responses

statusbodymeaning
200 Vocabulary Every obligation there is: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.
GET /api/v1/obligations/closure obligations.closure

What this task still owes

Every obligation the active task declared, joined with what the vocabulary says about it and with the evidence that does or does not discharge it: what is owed, what is discharged, and what has gone stale — with the recorded input hash and the tree's current one, or the recorded commit and its label, so a reader can see against what. The judgement is the one `finish` applies, reproduced rather than re-decided, and the staleness words are the repository's only four. A checkout with no task reports that, rather than reporting nothing owed.

  • query
  • behaviorally_verified
  • benchmark required
  • cache process (max_entries=2, ttl_seconds=2)
  • MCP tool majordomus_obligation_closure
  • MCP resource {"name": "obligation-closure", "uri": "majordomus://obligations/closure"}

No parameters.

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/obligations/closure"

Responses

statusbodymeaning
200 Closure What this task still owes: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.

peers

The clients attached to this repository's shared server, named by their own initialize, and what each announced it is working on. In memory; gone with the process.

GET /api/v1/peers peers.list

List peers

Every client attached to this shared server: id, the client's own name and version from its initialize, transport, when it attached, when it was last seen, and what it announced. In-memory, gone with the process.

  • query
  • behaviorally_verified
  • benchmark required
  • cache disabled
  • MCP tool majordomus_peers

No parameters.

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/peers"

Responses

statusbodymeaning
200 PeerList List peers: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.
POST /api/v1/peers/announce peers.announce

Announce what this peer is working on

Tell the other peers of this shared server what the calling session is doing and which paths it expects to touch. Changes this process's memory only; the repository is never written. Needs an MCP session: over plain HTTP there is no caller.

  • command
  • behaviorally_verified
  • benchmark required
  • cache disabled
  • MCP tool majordomus_announce

Request body AnnounceInput, JSON

example default

{"intent":"benchmark: announcing","scope":["apps/majordomus-cli"]}

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s -X POST "http://127.0.0.1:8741/api/v1/peers/announce" -H "content-type: application/json" -d '{"intent":"benchmark: announcing","scope":["apps/majordomus-cli"]}'

Responses

statusbodymeaning
200 Announced Announce what this peer is working on: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
422 ErrorBody refused: The command was understood and turned down for the reason the message gives.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.

perf

This process's work counters and phase timings: what happened once at startup and what happens per call, for the structural tests and the benchmark evidence.

GET /api/v1/perf perf.counters

Performance counters

The counters of this process: repository scans, index and registry builds, schema generations, projection builds, executions, handler invocations, cache hits, misses and evictions, and the phase timings, as they stand now.

  • query
  • behaviorally_verified
  • benchmark required
  • cache disabled
  • MCP tool majordomus_perf

No parameters.

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/perf"

Responses

statusbodymeaning
200 CounterSnapshot Performance counters: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.

plan

The milestone and issue model of this repository, and everything derived from it that nobody authored: the status of each record, the dependency graphs above and below the milestone boundary, the topological execution waves, the roadmap order, the milestone being executed and the one issue to take next. Status is never stored — a record says what happened to it and the status follows from that and from the state of its dependencies — so no file can contradict the graph. The four operations that write a lifecycle marker into a record stay on the command line: a capability of this registry never writes to the repository.

GET /api/v1/plan plan.model

The whole derived plan

Every milestone and issue with its derived status, wave, rank, both directions of its graph and its counts; the execution waves; both dependency graphs as edges; every validation finding; and the plan's header with the active milestone derived. The one value every other capability of this module answers out of. Derived on every call: a transition writes a lifecycle marker into a record between two calls, and a plan answered from a snapshot would send two workers to one issue.

  • query
  • behaviorally_verified
  • benchmark required
  • cache disabled
  • MCP tool majordomus_plan
  • MCP resource {"name": "plan", "uri": "majordomus://plan"}

No parameters.

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/plan"

Responses

statusbodymeaning
200 Plan The whole derived plan: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.
GET /api/v1/plan/issues plan.issues

The issues, filtered by what the graph derived

One record per issue with its derived status, its wave, the dependencies it declares, the ones that are not DONE (plus `milestone:<id>` when the gate holds the whole outcome back), the issues that depend on it, the paths it touches and its evidence tally. Filtering by `status: READY` is the ready set and by `status: BLOCKED` the blocked set; nothing here is a separate derivation.

  • query
  • behaviorally_verified
  • benchmark required
  • cache disabled
  • MCP tool majordomus_plan_issues

Query parameters

nametyperequireddescriptionexamples
milestone string no Only issues of this milestone. Default: every issue of the plan. one-milestone: "M000"
status string no Only issues in this derived status — `READY` for the ready set, `BLOCKED` for the blocked set. The vocabulary travels with every answer, so a caller never has to know which statuses exist. ready: "READY"
wave integer (uint32) no Only issues in this execution wave.

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/plan/issues?milestone=M000&status=READY"

Responses

statusbodymeaning
200 PlanIssueList The issues, filtered by what the graph derived: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.
GET /api/v1/plan/next plan.next

The one issue to take now

The lowest-wave READY issue of the active milestone, highest priority first, then id. The active milestone can have nothing ready while another one does — one waiting on its own acceptance evidence, for instance — so the search widens to the whole plan rather than answering `none` and sending a worker away from work that is genuinely executable. This is what an agent asks before it starts.

  • query
  • behaviorally_verified
  • benchmark required
  • cache disabled
  • MCP tool majordomus_plan_next

Query parameters

nametyperequireddescriptionexamples
milestone string no Restrict the answer to one milestone. Default: the whole plan, and for `next` the active milestone with the rest of the plan as the fallback. one-milestone: "M000"

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/plan/next?milestone=M000"

Responses

statusbodymeaning
200 PlanNextIssue The one issue to take now: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.
GET /api/v1/plan/record plan.record

One milestone or issue, with everything derived about it

A milestone with its issues in full, or an issue with the issues it waits on in full. The record's own prose stays where it has always been — `majordomus://issue/<id>` returns the file — and this answers what the file cannot say about itself: what its status is, where it sits in the graph, and what is between it and being executable.

  • query
  • behaviorally_verified
  • benchmark required
  • cache disabled
  • MCP tool majordomus_plan_record

Query parameters

nametyperequireddescriptionexamples
id string yes The id of a milestone or an issue, as its file is named (`I0001`, `work-graph-github`). issue: "I0001"milestone: "M000"

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/plan/record?id=I0001"

Responses

statusbodymeaning
200 PlanRecord One milestone or issue, with everything derived about it: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.
GET /api/v1/plan/roadmap plan.roadmap

The milestones in derived order

The milestone graph laid out by rank, with `order` breaking ties inside a rank only, and the first unblocked unfinished milestone as `now` and the one after it as `next`. Nothing in the sequence is authored: a milestone whose prerequisites are not real cannot be nominated, which is what makes `each step is gated by the previous one being real` an invariant rather than a sentence.

  • query
  • behaviorally_verified
  • benchmark required
  • cache disabled
  • MCP tool majordomus_plan_roadmap

No parameters.

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/plan/roadmap"

Responses

statusbodymeaning
200 PlanRoadmap The milestones in derived order: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.
GET /api/v1/plan/status plan.status

Where the plan stands

Every milestone with its derived status and its issues counted by status, the milestone a worker is executing now, the next ready issue in full, and the plan's own totals. The counts are keyed by the declared vocabulary, which travels with the answer, so a status added to the engine appears here without anything being edited.

  • query
  • behaviorally_verified
  • benchmark required
  • cache disabled
  • MCP tool majordomus_plan_status

Query parameters

nametyperequireddescriptionexamples
milestone string no Restrict the answer to one milestone. Default: the whole plan, and for `next` the active milestone with the rest of the plan as the fallback. one-milestone: "M000"

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/plan/status?milestone=M000"

Responses

statusbodymeaning
200 PlanStatusReport Where the plan stands: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.
GET /api/v1/plan/validate plan.validate

What the model refuses

Every finding the derivation produced, in the order it produced them: a dependency on something that is not an issue, a cycle, an issue executing ahead of its dependencies or of its milestone's gate, an issue with no acceptance criteria, evidence missing under a completion date, a milestone whose graph contradicts itself, two issues of one wave sharing a path. A failure means the model is invalid; a warning means it is legal and worth reading.

  • query
  • behaviorally_verified
  • benchmark required
  • cache disabled
  • MCP tool majordomus_plan_validate

No parameters.

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/plan/validate"

Responses

statusbodymeaning
200 PlanValidation What the model refuses: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.
GET /api/v1/plan/waves plan.waves

What may run at the same time

The topological layering of the issue graph: an issue enters a wave only once every dependency has left it, so its wave is one past the longest path to it. Sharing a wave is a necessary condition for running two issues at once, not a sufficient one — overlapping scope serialises them, and every such overlap is reported beside the waves rather than left for two workers to discover in a merge conflict.

  • query
  • behaviorally_verified
  • benchmark required
  • cache disabled
  • MCP tool majordomus_plan_waves

Query parameters

nametyperequireddescriptionexamples
milestone string no Restrict the answer to one milestone. Default: the whole plan, and for `next` the active milestone with the rest of the plan as the fallback. one-milestone: "M000"

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/plan/waves?milestone=M000"

Responses

statusbodymeaning
200 PlanWaveReport What may run at the same time: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.

product

What this repository's product does for a person, as the features under the layer's features section declare it: each feature made of modules, commands, kinds, rules, documents, decisions, claims, use cases, Cockpit areas and web surfaces it names, with the interfaces it is exposed through, every count, the moments it answers and what is guaranteed derived from those references. The matrix of features against interfaces, the providers the tool has an adapter for, and the model's own validation. The homepage is a reader of this module and holds no inventory of its own.

GET /api/v1/product/feature product.feature

One feature

One product feature in full: the record as its file declares it, and everything derived from what it names — the capabilities of its modules with their tools, routes and command-line paths, the commands with their summaries, the objects of its kinds counted, the rules with their class and whether the tool enforces them, the documents, the decisions, the claims with their status, the use cases, the Cockpit areas and web surfaces with their routes, the moments it answers, and the interfaces all of that adds up to.

  • query
  • behaviorally_verified
  • benchmark required
  • cache process (max_entries=64)
  • MCP tool majordomus_feature
  • $ product show

Query parameters

nametyperequireddescriptionexamples
id string yes The feature's id, as `product.features` gives it. This is also its slug and its route. first-feature: "benchmarks"

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/product/feature?id=benchmarks"

Responses

statusbodymeaning
200 ResolvedRefs One feature: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.
GET /api/v1/product/features product.features

The features

Every product feature this repository declares, narrowed by any of the facets the model derives — featured, area, module, command, surface, text — with the interfaces each is exposed through, the counts behind it and what is guaranteed about it, none of which its file states. The default is the stable set; pass status=any for the drafts too.

  • query
  • behaviorally_verified
  • benchmark required
  • cache process (max_entries=32)
  • MCP tool majordomus_features
  • MCP resource {"name": "product", "uri": "majordomus://product"}
  • $ product list

Query parameters

nametyperequireddescriptionexamples
featured boolean no Only the features the homepage shows. featured: true
status string no Only features of this status. Absent means the stable ones; pass `any` for everything the model holds.
area string no Only features serving this operational area. by-area: "context"
module string no Only features made of this capability module.
command string no Only features made of this shell command.
surface string no Only features exposed through this surface: `cli`, `api`, `mcp`, `cockpit`, `docs`.
q string no Case-insensitive text, matched against the identity, the titles, the headline, the summary, the tags and the body.

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/product/features?featured=true&area=context"

Responses

statusbodymeaning
200 FeatureList The features: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.
GET /api/v1/product/matrix product.matrix

Features against interfaces

Every feature against the command line, the HTTP API, MCP, the Cockpit and the documentation, each mark derived from what the feature names; then every builtin module of the executable, every public command of the shell tool and every kind of the layer with the stable features that name it. A row with no feature is reported as a gap rather than hidden.

  • query
  • behaviorally_verified
  • benchmark required
  • cache process (max_entries=2)
  • MCP tool majordomus_product_matrix
  • MCP resource {"name": "product-matrix", "uri": "majordomus://product/matrix"}
  • $ product matrix

No parameters.

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/product/matrix"

Responses

statusbodymeaning
200 Matrix Features against interfaces: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.
GET /api/v1/product/providers product.providers

The providers

Every provider the tool has an adapter for — one per template the distribution ships — with the bootstraps this repository's policy renders through it, the client configuration it carries for the shared MCP server, and the hooks the policy wires. The set is the templates; nothing here is a list of vendors.

  • query
  • behaviorally_verified
  • benchmark required
  • cache process (max_entries=2)
  • MCP tool majordomus_providers
  • MCP resource {"name": "providers", "uri": "majordomus://product/providers"}
  • $ product providers

No parameters.

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/product/providers"

Responses

statusbodymeaning
200 ProviderList The providers: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.
GET /api/v1/product/validate product.validate

Validate the model

Every finding over the product model: a reference that resolves to nothing, with the nearest candidate; a duplicate identity; a file name that disagrees with its id; a draft that is featured; a stable feature under its floors; and every module, command or kind that no stable feature names. Errors make the model invalid; warnings do not.

  • query
  • behaviorally_verified
  • benchmark required
  • cache process (max_entries=2)
  • MCP tool majordomus_product_validate
  • $ product validate

No parameters.

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/product/validate"

Responses

statusbodymeaning
200 ProductValidationReport Validate the model: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.

quality

What this executable's own public surface is held to, measured from its syntax tree: documentation that says more than the signature, an executable example on everything that carries behaviour, a module boundary something exercises, and every command of the command line accounted for against the capability registry. The rules are project.rust-public-api-quality and project.operation-transport-parity; this is the measurement of them.

GET /api/v1/quality quality.report

Public API quality report

The crate's exported surface measured against the repository's rules: how many items are documented and exampled, how many modules are documented, exampled and behaviourally tested, how the canonical operations stand against the command line, HTTP, OpenAPI and MCP, and one finding per violation carrying a stable code, the rule that requires it, its file and line, why it matters and what to do about it.

  • query
  • behaviorally_verified
  • benchmark required
  • cache process (max_entries=8, ttl_seconds=10)
  • MCP tool majordomus_quality
  • MCP resource {"name": "quality", "uri": "majordomus://quality"}
  • $ quality report

Query parameters

nametyperequireddescriptionexamples
code string no Only findings carrying this code (`RUST_PUBLIC_MISSING_EXAMPLE`). All of them when absent. A code nothing recognises is refused rather than answered with an empty list, so a typo cannot read as a clean report.
path string no Only findings whose file path starts with this, repository-relative (`apps/majordomus-cli/src/web`). All of them when absent.
summary_only boolean no Answer with the counts and leave the findings out. For a caller that wants the state of the crate and not the list of what to do about it. default: false
include_baselined boolean no Include the findings the ratchet already accepts, which are left out by default. The default is what a gate wants: only what is new. This is what a person paying the debt down wants, and it is what `--write-baseline` must ask for — a baseline written from a report that had the baseline applied to it would empty the file, accepting nothing and failing on everything the next time it ran. default: false

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/quality?summary_only=false&include_baselined=false"

Responses

statusbodymeaning
200 QualityAnswer Public API quality report: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.

release

What this project has shipped and what it would ship next, derived rather than maintained: the changelog composes the layer's release records, the decisions dated inside each release's window and the conventional commits in its range; the version report reads the two places the version is stated and says what the commits since the last release imply it should become.

GET /api/v1/changelog release.changelog

The changelog

Every release the layer records, newest first, with the work that has not been released leading. A section's decisions are the ADRs dated inside that release's window, its changes the conventional commits in its range, its artifacts the record's own evidence. Nothing in it is authored, and a section that could not be read says so rather than appearing empty.

  • query
  • implemented
  • benchmark required
  • cache disabled
  • MCP tool majordomus_changelog
  • MCP resource {"name": "changelog", "uri": "majordomus://changelog"}

Query parameters

nametyperequireddescriptionexamples
version string no One version, or `unreleased`; every section when absent. one-version: "0.3.1"

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/changelog?version=0.3.1"

Responses

statusbodymeaning
200 ReleaseChangelog The changelog: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.
GET /api/v1/release/version release.version

The version, and the one the commits imply

The version the crate manifest declares, the version the shell tool prints, and whether they agree — the same question `scripts/release-version --check` gates on. Then the bump the conventional commits since the last release imply, the version it would produce, and the commits themselves as the evidence for it.

  • query
  • implemented
  • benchmark required
  • cache disabled
  • MCP tool majordomus_release_version

No parameters.

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/release/version"

Responses

statusbodymeaning
200 ReleaseVersionReport The version, and the one the commits imply: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.

repository

The repository this process serves: its layer, its git state, the state of the index built from it, and its scope: what a worker reads of it and what it never reads.

GET /api/v1/repository repository.info

Repository and index state

The repository root, layer sections, git state, discovery mode, kinds present, every diagnostic, and the capability registry counted.

  • query
  • behaviorally_verified
  • benchmark required
  • cache disabled
  • MCP tool majordomus_repository
  • MCP resource {"name": "repository", "uri": "majordomus://repository"}

No parameters.

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/repository"

Responses

statusbodymeaning
200 RepositoryReport Repository and index state: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.
GET /api/v1/scope repository.scope

The repository scope

The scope declaration as read, where it came from (the repository's own or the distribution's default), and every tracked file tallied against it: how many are in, how many are out for each reason, and which.

  • query
  • behaviorally_verified
  • benchmark required
  • cache disabled
  • MCP tool majordomus_scope
  • MCP resource {"name": "scope", "uri": "majordomus://scope"}
  • $ scope

No parameters.

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/scope"

Responses

statusbodymeaning
200 ScopeReport The repository scope: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.
GET /api/v1/scope/classify repository.scope_classify

Judge a path against the scope

Whether a repository-relative path is in or out of the scope, the reason when it is out, and the pattern or limit that decided; an existing file is judged by name, then size, then content.

  • query
  • behaviorally_verified
  • benchmark required
  • cache disabled
  • MCP tool majordomus_scope_classify

Query parameters

nametyperequireddescriptionexamples
path string yes Repository-relative, forward slashes; `./` is stripped. An absolute path or a `..` segment is an invalid input. first-object: ".ai/repo/adrs/0001-rust-cli-and-stdio-mcp.md"layer-file: ".ai/manifest.yaml"local-half: ".ai/local/state/current.yaml"secret: "config/.env"undeclared: "node_modules/left-pad/index.js"

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/scope/classify?path=.ai%2Frepo%2Fadrs%2F0001-rust-cli-and-stdio-mcp.md"

Responses

statusbodymeaning
200 Classification Judge a path against the scope: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.

trace

Which branches and commits realised an issue, and which issue and milestone a commit served — derived from git and from the canonical project model on every call, stored nowhere. A branch names an issue when one of its path components is an issue id; a commit belongs to the issue whose branches hold it; a commit no such branch holds is reported as unattributed rather than left out, because work with no execution contract is what a traceability report exists to make visible. Pull requests are a GitHub fact and this executable makes no network call: `scripts/traceability` reads them and joins them to this answer over the branch name.

GET /api/v1/trace trace.report

The whole work graph above the branch

Every issue at least one branch names with its branches and commits, every declared issue no branch names, and the newest stretch of the trunk with each commit attributed to the issue whose branches hold it or reported as unattributed. The tallies count both sides, so the proportion of the trunk that no execution contract accounts for is a number rather than an impression. Read from git on every call: the history changes outside this process.

  • query
  • behaviorally_verified
  • benchmark required
  • cache disabled
  • MCP tool majordomus_traceability
  • MCP resource {"name": "traceability", "uri": "majordomus://traceability"}

Query parameters

nametyperequireddescriptionexamples
limit integer (uint) no How many trunk commits to attribute, newest first. Default: 50. Anything above 2000 is read as 2000 — a traceability report is a reading, not a history export. ten: 10

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/trace?limit=10"

Responses

statusbodymeaning
200 TraceReport The whole work graph above the branch: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.
GET /api/v1/trace/commit trace.commit

What contract this commit served

One commit with the issue and milestone it served, or the fact that none can be found. Attributed when exactly one issue's branches hold it, ambiguous when branches naming two issues do, and unattributed when no branch naming an issue holds it at all — which is either work committed without an execution contract or a branch deleted after its merge, and the answer says so rather than guessing between them.

  • query
  • behaviorally_verified
  • benchmark required
  • cache disabled
  • MCP tool majordomus_trace_commit

Query parameters

nametyperequireddescriptionexamples
commit string yes Anything git resolves to a commit: a full or abbreviated object name, a ref, `HEAD`, `master~3`. head: "HEAD"

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/trace/commit?commit=HEAD"

Responses

statusbodymeaning
200 CommitAttribution What contract this commit served: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.
GET /api/v1/trace/issue trace.issue

What realised this issue

One issue with the branches that name it — local, and remote-tracking where only the remote still has the branch — and, for each, the commits it holds that the trunk did not: measured against the trunk while the branch is open, and against the first parent of the merge commit that brought it in once it is merged. A branch that reached the trunk without a merge commit of its own says so and claims nothing, because its commits cannot be told from the trunk's. The milestone comes from the canonical issue record, which is the one edge here that git does not hold, and `declared` says whether the project model has this id at all — a repository with no plan still gets the branches, and a typo still cannot read as work nobody did.

  • query
  • behaviorally_verified
  • benchmark required
  • cache disabled
  • MCP tool majordomus_trace_issue

Query parameters

nametyperequireddescriptionexamples
issue string yes The issue id, as the project model spells it (`I1305`). An id the model does not declare is answered with `declared: false` rather than refused, and rather than answered with a bare empty trace: a typo that read as "nothing realised this issue" is the one answer this capability must never give. first-issue: "I0001"

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/trace/issue?issue=I0001"

Responses

statusbodymeaning
200 IssueTrace What realised this issue: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.

web

What this repository exposes over HTTP, resolved from the producers that make it rather than from a register anybody maintains: the routes the executable answers itself, the documentation build, and every generated report that declared its own mount. The same resolution serves the router, renders the home page and composes a publication.

GET /api/v1/web/surfaces web.surfaces

Every web surface, resolved

The web topology in route-precedence order, with each surface's mount, category, visibility, kind, producer, artifact, runtime feature and the provenance of every value a reader could be surprised by; and which ids are served, published and offered to a person. Answered from the resolution this process serves from, so it cannot disagree with what the router routes or what the home page lists.

  • query
  • behaviorally_verified
  • benchmark required
  • cache process (max_entries=2, ttl_seconds=5)
  • MCP tool majordomus_web_surfaces
  • MCP resource {"name": "web", "uri": "majordomus://web"}

No parameters.

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/web/surfaces"

Responses

statusbodymeaning
200 SurfaceReport Every web surface, resolved: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.

why

The operational failure modes this tool is a response to: the moments a reader recognises, the audiences that recognise them, the areas they fall under, and what a reader's own symptoms imply. Every entry is a file under the layer's why section; nothing here holds a list, and a moment added there is answered by all of these without a registration anywhere.

GET /api/v1/why why.list

The catalogue

Every operational moment this repository holds, narrowed by any of the facets the catalogue itself reports, with the audiences, the areas, the derived filters and the counts. The default is the public catalogue; pass status=any for the drafts too.

  • query
  • behaviorally_verified
  • benchmark required
  • cache process (max_entries=32)
  • MCP tool majordomus_why
  • MCP resource {"name": "why", "uri": "majordomus://why"}
  • $ why list

Query parameters

nametyperequireddescriptionexamples
audience string no Only moments this audience recognises. by-audience: "agency"
area string no Only moments in this operational area.
tag string no Only moments carrying this tag.
severity string no Only moments of this severity.
frequency string no Only moments of this frequency.
lifecycle string no Only moments at this stage of work.
capability string no Only moments naming this capability of the executable.
command string no Only moments naming this command.
featured boolean no Only moments the homepage features.
status string no Only moments of this status. Absent means the public ones (`stable`); pass `any` for everything the catalogue holds.
q string no Case-insensitive text, matched against the identity, the titles, the hook, the summary, the tags, the aliases, the signals, the examples and the body. search: "context"

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/why?audience=agency&q=context"

Responses

statusbodymeaning
200 CatalogueView The catalogue: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.
GET /api/v1/why/areas why.areas

Operational areas

Every operational area the catalogue declares, each with the public moments that fall under it. Membership is derived from the moments and is never listed in an area's own file.

  • query
  • behaviorally_verified
  • benchmark required
  • cache process (max_entries=4)
  • MCP tool majordomus_why_areas
  • MCP resource {"name": "why-areas", "uri": "majordomus://why/areas"}
  • $ why areas

No parameters.

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/why/areas"

Responses

statusbodymeaning
200 AreaList Operational areas: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.
GET /api/v1/why/audiences why.audiences

Audiences

Every audience the catalogue declares, each with the public moments that name it. Membership is derived from the moments and is never listed in an audience's own file.

  • query
  • behaviorally_verified
  • benchmark required
  • cache process (max_entries=4)
  • MCP tool majordomus_why_audiences
  • MCP resource {"name": "why-audiences", "uri": "majordomus://why/audiences"}
  • $ why audiences

No parameters.

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/why/audiences"

Responses

statusbodymeaning
200 AudienceList Audiences: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.
GET /api/v1/why/diagnose why.diagnose

Diagnose a selection

What a reader's own symptoms imply: the moments the selection resolves to, the operational areas and audiences they weigh towards, and the capabilities, commands, claims, rules and use cases that answer them — each carrying the moments that produced it. Counting, not inference: there is no weighting and no percentage.

  • query
  • behaviorally_verified
  • benchmark required
  • cache process (max_entries=32)
  • MCP tool majordomus_why_diagnose
  • $ why diagnose

Query parameters

nametyperequireddescriptionexamples
signals string no Signal ids or moment ids, separated by commas. Empty selects nothing and is answered with an empty diagnosis rather than an error. three-moments: "abandoned-worktree,api-changed-contract-did-not,code-without-an-issue"

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/why/diagnose?signals=abandoned-worktree%2Capi-changed-contract-did-not%2Ccode-without-an-issue"

Responses

statusbodymeaning
200 Diagnosis Diagnose a selection: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.
GET /api/v1/why/moment why.moment

One moment

One operational moment in full: what it looks like, why it happens, what it costs, what this tool does about it, and every relation derived from its metadata — the responsibilities its claims belong to, the moments that name it, and the moments nearest it by shared area, audience and tag.

  • query
  • behaviorally_verified
  • benchmark required
  • cache process (max_entries=64)
  • MCP tool majordomus_why_moment
  • $ why show

Query parameters

nametyperequireddescriptionexamples
id string yes The moment's id, as `why.list` gives it. This is also its slug and its route. first-moment: "abandoned-worktree"

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/why/moment?id=abandoned-worktree"

Responses

statusbodymeaning
200 MomentDetail One moment: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.
GET /api/v1/why/validate why.validate

Validate the catalogue

Every finding over the catalogue: a reference that resolves to nothing, with the nearest candidate; a duplicate identity; a file name that disagrees with its id; and a public record that does not meet the floor its status promises. Errors make the catalogue invalid; warnings do not.

  • query
  • behaviorally_verified
  • benchmark required
  • cache process (max_entries=2)
  • MCP tool majordomus_why_validate
  • $ why validate

No parameters.

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/why/validate"

Responses

statusbodymeaning
200 ValidationReport Validate the catalogue: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.

worktree

Where every linked git worktree of this repository belongs and where each one is. The container is the primary checkout's sibling named with `-wt`, the path under it is the branch name with its hierarchy kept, and both are derived from git's own identity — the common directory, the registered worktrees, the branches — never from a registry, a configuration or the current directory. A worktree somewhere else is a typed diagnostic with a remedy; the migration that repairs it is a command-line operation of the same service.

GET /api/v1/worktrees worktree.topology

The whole topology

The repository, the container, the trunk and how it was decided, every registered worktree with its standing (primary, canonical, misplaced, detached, missing), its uncommitted work, its upstream distance and the issue its branch provably names, every local branch with or without a worktree and whether it is eligible for cleanup, every diagnostic with its code and remedy, and the tallies. Read from git on every call: the topology changes outside this process.

  • query
  • behaviorally_verified
  • benchmark required
  • cache disabled
  • MCP tool majordomus_worktrees
  • MCP resource {"name": "worktrees", "uri": "majordomus://worktrees"}
  • $ worktree topology

No parameters.

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/worktrees"

Responses

statusbodymeaning
200 RepositoryTopology The whole topology: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.
GET /api/v1/worktrees/inspect worktree.inspect

One branch: where its worktree belongs and what is there

The canonical path of a branch, derived from its name alone, whether the branch exists, whether something occupies that path, the worktree holding the branch when one does, and what stands in the way of creating or migrating it. The answer for a branch that does not exist yet is the path `worktree create` would use.

  • query
  • behaviorally_verified
  • benchmark required
  • cache disabled
  • MCP tool majordomus_worktree_inspect
  • $ worktree inspect

Query parameters

nametyperequireddescriptionexamples
branch string yes The branch, full name (`feature/improve-cli`). It need not exist: the canonical path derives from the name alone. feature-branch: "feature/example"

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/worktrees/inspect?branch=feature%2Fexample"

Responses

statusbodymeaning
200 InspectReport One branch: where its worktree belongs and what is there: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.
GET /api/v1/worktrees/migration worktree.migration_plan

What it would take to bring every worktree home

One step per misplaced worktree with a branch: where it is, where it belongs, how it would move, the uncommitted work that moves with it, and what blocks it; plus the exceptions the migration cannot address by design — detached worktrees, stale registrations, the primary checkout off the trunk — each with what a person does about it. Planning changes nothing; `majordomus worktree migrate` applies it with a fingerprint taken before and after every move.

  • query
  • behaviorally_verified
  • benchmark required
  • cache disabled
  • MCP tool majordomus_worktree_migration_plan
  • $ worktree migrate

No parameters.

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/worktrees/migration"

Responses

statusbodymeaning
200 MigrationPlan What it would take to bring every worktree home: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.
GET /api/v1/worktrees/status worktree.status

Where this is, and whether that is where it belongs

One worktree — the repository's own, or the one holding the directory the caller names — with its standing, its branch, its canonical path, its uncommitted work counted, whether it is where it belongs, and how many errors the whole topology carries. What an agent reads before it starts, and what the guard decides on.

  • query
  • behaviorally_verified
  • benchmark required
  • cache disabled
  • MCP tool majordomus_worktree_status
  • $ worktree status

Query parameters

nametyperequireddescriptionexamples
path string no A directory inside one of this repository's worktrees; the answer is about that worktree. Relative to the primary checkout when relative (`.` is the primary checkout itself). Default: the repository the server was started for. A path in another repository is refused: the topology answers only about its own. primary-checkout: "."

Try it

The port is whatever the server logged; 8741 is the one it asks for first. The values are the operation's first example.

curl -s "http://127.0.0.1:8741/api/v1/worktrees/status?path=."

Responses

statusbodymeaning
200 StatusReport Where this is, and whether that is where it belongs: the result.
400 ErrorBody invalid_input: The input does not fit the schema: a parameter of the wrong type, an unknown one, or a value the capability rejects.
404 ErrorBody not_found: The input names something the repository does not hold.
500 ErrorBody internal: The capability failed for a reason of its own; the message names it.
default ErrorBody Any other failure the transport reports: 405 method_not_allowed for another method on this path, 400 invalid_input for a body that is not a JSON object.

Schemas

Every component of the document, derived from the Rust types the capabilities take and return. Each row of the API's shape is the type's own field, its doc comment the description.

ActiveTask

object

The active task of this checkout, when there is one.

propertytyperequireddescription
id string yes The task id.
task string yes What is being worked on.
profile string yes The execution profile it runs under.
outcome string yes Its typed outcome so far: active, handed_over, or a finished one.
scope array of string no The paths it claims.
requires array of string no The obligations it owes before the outcome completed is available.

Beside scope and not inside it, because the two are different promises: scope is containment — where a worker may write — and this is delivery. A change can sit entirely inside its scope and still be uncommitted on a laptop (ADR 0030). [super::obligations] is what judges each of these against its evidence; here it is reported as declared.

started_at string no When it started.
head string no The commit it started at.

Used by Closure Continuity

Actor

object

Who asked, and which peer they are when this process knows.

propertytyperequireddescription
kind ActorKind ActorKind yes Where the request came from.
peer string | null no The peer id, for a call that arrived through an MCP session.

Used by ExecutionView

ActorKind

"http" | "mcp" | "cli" | "internal"

Who asked for the execution. Not an authorisation decision — this server authenticates nobody — but a fact worth carrying into the audit line and the UI.

  • httpAn HTTP client, which includes the Cockpit.
  • mcpAn MCP client attached to this process.
  • cliThe command line of this process.
  • internalThis executable's own tests and benchmarks.

Used by Actor

AdrRef

object

One architecture decision the feature names.

propertytyperequireddescription
id string yes The declared id.
title string yes The title.
status string yes proposed, accepted, superseded or rejected.
path string yes Repository-relative path.

Used by ResolvedRefs

AnnounceInput

object

The input of peers.announce: what the calling peer is working on.

propertytyperequireddescription
intent string yes One line, in the peer's words: the task, the question, the intent.
scope array of string no Repository-relative paths the peer expects to touch. Informational: other peers read it to avoid a collision; nothing here enforces it.

Used by peers.announce

Announced

object

What announce answers: the peer as recorded, and who else is on that ground.

propertytyperequireddescription
id PeerId PeerId yes p1, p2, ...
client ClientInfo ClientInfo yes The client behind it.
transport Transport Transport yes How it is attached.
connected_at string yes When it attached, RFC 3339, UTC.
last_seen_seconds_ago integer (uint64) yes Seconds since its last message.
attached boolean yes Whether the session is still attached. A peer that announced something and then went away is kept and listed with attached: false: what it said it was working on outlives the connection that said it, because the work does.
announcement Announcement | null Announcement no Its announcement, when it made one.
overlaps array of Overlap Overlap no Every other peer whose claimed scope meets this one. Empty is the ordinary case.

Used by peers.announce

Announcement

object

What a peer said it is working on.

propertytyperequireddescription
intent string yes One line: the task or intent, in the peer's words.
scope array of string yes Repository-relative paths the peer expects to touch; informational, never enforced here.
at string yes When it was announced, RFC 3339, UTC.

Used by Announced Peer

AnswerView

object

A URI a query projects (majordomus://repository), answered: the same fields a client reads on an [ObjectView] where they apply, the answer itself as data, and the text resources/read returns for the URI.

propertytyperequireddescription
uri string yes The URI as given.
id string yes The capability that answered (repository.info).
kind CapabilityKind CapabilityKind yes Its kind: query.
identity string yes The resource name a client lists (repository).
title string yes The capability's title.
description string | null no The capability's description, when it has one.
answer any yes The answer, as the capability's output schema describes it (capabilities.describe carries that schema).
provenance CapabilityProvenance CapabilityProvenance yes Where the capability comes from: the Rust module it is composed in.
media_type string yes application/json.
content string yes The answer as text: byte for byte what resources/read returns for the URI.

Used by ResourceView

Arch

"x86_64" | "aarch64"

A processor architecture.

  • x86_6464-bit x86, detected as `x86_64` or `amd64`.
  • aarch6464-bit ARM, detected as `aarch64` or `arm64`.

Used by TargetView

AreaList

object

Every area.

propertytyperequireddescription
count integer (uint) yes How many.
areas array of AreaView AreaView yes Each, with its derived membership, in presentation order.

Used by why.areas

AreaView

object

One area, with the membership nobody authored.

propertytyperequireddescription
id string yes The identity, the slug and the file name.
title string yes The area.
summary string yes One line: what falls under it.
status string yes stable, draft or deprecated.
weight integer (uint32) no Presentation order.
tags array of string no Free tags.
route string no Derived: /why/areas/<id>/.
source string no Derived: the file it came from.
body string no The Markdown body.
moments array of string yes Derived: the public moments that fall under it, in presentation order.
count integer (uint) yes Derived: how many.

Used by AreaList CatalogueView

ArtifactFormat

"json" | "yaml" | "markdown" | "text"

The encoding one generated artifact is written in.

  • jsonA JSON document: pretty-printed, one trailing newline, provenance as members.
  • yamlThe same document in the layer's YAML, provenance as a comment banner.
  • markdownMarkdown for a reader, provenance as an HTML comment.
  • textLine-oriented text another program reads: the shell tool's allow-lists, provenance as `#` comments.

Used by artifacts.list ArtifactView DocumentView

ArtifactReport

object

The answer of artifacts.list.

propertytyperequireddescription
manifest string yes The manifest this was read from, repository-relative.
present boolean yes Whether the manifest is committed in this repository at all. A repository that has never run majordomus generate has no generated tree, which is a fact about it and not a failure of this call: every list below is then empty and every tally zero.
schema string yes The schema the manifest carries, empty when there is none to read.
documents array of DocumentView DocumentView yes The documents, in the manifest's order.
artifacts array of ArtifactView ArtifactView yes The files, in the manifest's order, after any filter.
tallies ArtifactTallies ArtifactTallies yes The counts.
regenerate string yes The command that rewrites every one of them.
verify string yes The command that decides staleness byte for byte, which is stronger than the hash.

Used by artifacts.list

ArtifactState

"current" | "stale" | "missing" | "present"

Where one generated file stands against the tree it is committed in.

  • currentThe file is there and its bytes hash to what the manifest recorded.
  • staleThe file is there and its bytes differ: it was edited, or the generator moved on.
  • missingThe manifest names it and the tree does not have it.
  • presentThe file is there and the manifest records no hash for it: the manifest's own encodings, which cannot hash themselves. `generate --check` compares them.

Used by ArtifactView

ArtifactTallies

object

How many of each, so a caller needs no arithmetic of its own.

propertytyperequireddescription
documents integer (uint) yes Documents in the manifest.
artifacts integer (uint) yes Files in the manifest, after any filter.
current integer (uint) yes Hashes that match.
stale integer (uint) yes Hashes that do not.
missing integer (uint) yes Files the manifest names and the tree lacks.
present integer (uint) yes Files the manifest records no hash for.

Used by ArtifactReport

ArtifactView

object

One generated file, as the manifest declares it and as the tree has it.

propertytyperequireddescription
path string yes Repository-relative path.
document string yes The document it projects.
format ArtifactFormat ArtifactFormat yes The encoding.
schema string | null no The JSON Schema its content satisfies, when it declares one.
source string yes One line: what it was derived from.
bytes integer | null no The size the manifest recorded.
sha256 string | null no The hash the manifest recorded.
state ArtifactState ArtifactState yes Where the file stands against it.

Used by ArtifactReport

Attribution

"attributed" | "unattributed" | "ambiguous"

What is known about the contract one commit served.

  • attributedExactly one issue's branches contain it.
  • unattributedNo branch naming an issue contains it.
  • ambiguousBranches naming more than one issue contain it.

Used by CommitAttribution

AudienceList

object

Every audience.

propertytyperequireddescription
count integer (uint) yes How many.
audiences array of AudienceView AudienceView yes Each, with its derived membership, in presentation order.

Used by why.audiences

AudienceView

object

One audience, with the membership nobody authored.

propertytyperequireddescription
id string yes The identity, the slug and the file name.
title string yes Who they are.
short_title string | null no Two or three words for a filter chip.
summary string yes One line: the working situation.
workflow string | null no One line: how work flows for them.
status string yes stable, draft or deprecated.
weight integer (uint32) no Presentation order.
tags array of string no Free tags.
route string no Derived: /why/audiences/<id>/.
source string no Derived: the file it came from.
body string no The Markdown body.
moments array of string yes Derived: the public moments that name it, in presentation order.
count integer (uint) yes Derived: how many.

Used by AudienceList CatalogueView

BenchmarkPolicy

one of 2 variants

Whether the capability is a benchmark target. Required is the default and the norm: every executable capability is timed directly and through every transport it is exposed on, with the cases its input type provides.

variant Timed directly and through every exposure; coverage fails without a case.

policy"required"yes

variant Not timed, for the typed reason; coverage reports it as waived, never as covered.

reasonWaiverReason WaiverReasonyesWhy.
policy"waived"yes

Used by Capability CapabilitySummary

BranchState

object

One local branch, with or without a work tree.

propertytyperequireddescription
name string yes The branch, short.
head string yes The commit it points at.
trunk boolean yes This branch is the trunk.
expected_path string | null no Where its work tree belongs.
worktree string | null no Where it is checked out, when it is.
upstream UpstreamState | null UpstreamState no The upstream and its distance.
merged_into_trunk boolean | null no Reachable from the trunk. Absent when the trunk is unknown.
cleanup_eligible boolean yes Merged into the trunk, not the trunk, and either not checked out or checked out in a work tree known to be clean. Derived state, never acted on automatically.
issue string | null no The issue this branch provably names.

Used by RepositoryTopology

BranchTrace

object

One branch that names an issue, with the commits it holds.

propertytyperequireddescription
name string yes The ref, short: feature/I1305-traceability, or origin/feature/I1305-traceability when only the remote still has it.
remote boolean yes True when the ref is a remote-tracking one and no local branch of the same name stands for it.
head string yes The commit the ref points at.
integration Integration Integration yes How it stands to the trunk.
merge_commit string | null no The merge commit that brought it into the trunk, when one did.
note string | null no Why the commit list is what it is, when it is worth a sentence.
commits array of CommitRef CommitRef yes The commits this branch holds and the trunk did not, newest first, merges excluded.

Used by IssueTrace

Budgets

object

The measured figures this deployment is held to. Each is written by the run that measured it; an absent one has not been measured yet and is not a licence.

propertytyperequireddescription
image_bytes Positive | null Positive no Largest accepted compressed image size.
binary_bytes Positive | null Positive no Largest accepted stripped binary size.
build_context_bytes Positive | null Positive no Largest accepted build context.
cold_start_ms Positive | null Positive no Longest accepted time from a stopped machine to a served response.
resident_memory_mb Positive | null Positive no Largest accepted resident set under load.
blocking_check_ms Positive | null Positive no Longest accepted time for one liveness or readiness check.
request_p99_ms Positive | null Positive no Longest accepted p99 for a served request.

Used by DeploymentView

Build

object

What is shipped and what it is built from.

propertytyperequireddescription
package string yes The Cargo package that is built.
binary string yes The binary target the image runs.
profile string yes The Cargo profile the image is built under.
inputs array of string yes The repository-relative paths the build context carries, and the only ones.
site string | null no The directory the canonical site pipeline writes; absent means the image serves no site.

Used by DeploymentView

BuildReport

object

What this executable is: enough to tell two builds apart without asking a repository.

propertytyperequireddescription
version string yes The version of the crate this executable was built from.
target string yes The Rust target triple it was built for; the model names a target by the same string.
profile string yes The cargo profile.
commit string yes The commit, or unknown when it was built outside a work tree.
distribution_target string | null no The target of the model this build matches, when the model declares one for the triple.

Used by distribution.build

CachePolicy

one of 2 variants

Whether, and how, the executor keeps results of this capability. Cache lives in the executor and nowhere else, so MCP, HTTP and the command line share one; the key is the canonical id, the normalised input and the registry fingerprint, so a changed repository never answers from an old entry.

variant Every call runs the handler.

policy"disabled"yes

variant Results are kept in this process's memory, bounded, for equal inputs.

max_entriesinteger (uint)yesThe most entries kept for this capability; the oldest is evicted first.
ttl_secondsinteger | nullnoSeconds an entry stays valid; `None` for the life of the process.
policy"process"yes

Used by Capability CapabilitySummary

CancelInput

object

The input of executions.cancel.

propertytyperequireddescription
id string yes The execution's id.

Used by executions.cancel

CancelReport

object

The answer of executions.cancel.

propertytyperequireddescription
outcome string yes What asking achieved: requested, already_requested or already_finished.
cancellable boolean yes Whether the capability declares that it looks at its cancellation flag. When it does not, the request is recorded and the execution runs to completion.
execution ExecutionView ExecutionView yes The execution as it stands after the request.

Used by executions.cancel

CanonicalSchema

object

A JSON Schema with, when the type has one, a stable component name (the type's title).

propertytyperequireddescription
name string | null no The component name projections use (RepositoryInfo); None for an anonymous schema such as the empty input.
schema any yes The schema itself, without $schema; nested types live under $defs.

Used by Capability

Capability

object

The canonical descriptor. Everything a projection may say about a capability is here.

propertytyperequireddescription
id CapabilityId CapabilityId yes The canonical identity.
module ModuleId ModuleId yes The module that composes it: the id's namespace for a builtin, the kind for a declarative object.
kind CapabilityKind CapabilityKind yes Query, command or resource.
title string yes The short name every projection shows.
description string yes The one-paragraph description every projection shows.
input CanonicalSchema CanonicalSchema yes The canonical schema of the input; an empty object for a resource.
output CanonicalSchema CanonicalSchema yes The canonical schema of the output; the object view for a resource.
provenance CapabilityProvenance CapabilityProvenance yes Where it came from.
exposure Exposure Exposure yes Where it is projected; absence is explicit.
availability CapabilityAvailability CapabilityAvailability yes Where it means anything: classified from the kind and the transports above, so that a projection reads a field instead of deciding for itself.
visibility CapabilityVisibility CapabilityVisibility yes Who it is for: classified from the same transports.
stability Stability Stability yes Where it stands.
tags array of string no Free tags, from the declarative object's tags or the descriptor.
benchmark BenchmarkPolicy BenchmarkPolicy yes Whether it is a benchmark target; the cases come from the input type.
cache CachePolicy CachePolicy yes Whether the executor keeps its results.
execution ExecutionPolicy ExecutionPolicy yes What running it as an execution means: classified from the kind, so that a client reads a fact rather than deciding for itself.

Used by capabilities.describe

CapabilityAvailability

"always" | "runtime" | "build_time" | "authenticated"

Where a capability means anything: the environment a caller must be in for it to answer at all.

The published site and the running server are genuinely different places. Without this on the model, every template grows its own idea of what works where — and the usual shape that takes is a condition on the page's own address, which is a rule hidden where nobody will find it and nothing can test it. This is the only thing a projection may ask.

It is classified rather than declared: the facts that decide it — what kind of thing this is and which transports it is projected through — are already on the descriptor, and asking each declaration to restate them would be the same knowledge written twice. [Availability::classify] is the one place the rule lives.

  • alwaysTrue in every environment, a published page with no server included: the layer's own content, which a build renders and a process serves from the same index.
  • runtimeA process must be running to answer: everything with a handler, whether it is reached over HTTP, over MCP or from the command line.
  • build_timeA value captured when the site was generated, rendered afterwards as the capture it is. Nothing classifies to this yet; the static projection of the graph is what will declare it, and it is on the model so that a captured value can be labelled as captured instead of being shown as current.
  • authenticatedA process must be running and the caller must be one it has authenticated. Nothing in this repository authenticates a caller yet; a surface that does will say so here rather than in the template that renders its link.

Used by Capability

CapabilityId

string

A stable, globally meaningful identity: a namespace, a dot, and a local part. repository.info and objects.get for executables; <kind>.<identity> for a declarative object (rule.majordomus.scope-integrity@1, document.docs/CLI.md, policy..ai/repo/policy.yaml).

Grammar: the namespace matches [a-z][a-z0-9_-]*; the local part is non-empty and carries no whitespace or control character, any other Unicode included, because it is opaque: a path, a versioned identity, or a name, as the kind's identity rule produced it.

Used by Capability CapabilitySummary CommandProvenance

CapabilityKind

"query" | "command" | "resource"

What a capability is. Three kinds exist because three semantics exist: something that is executed and changes nothing, something that is executed and changes this process's own memory, and something that is read. Nothing of any kind writes to the repository.

How long a call takes is not a kind. A read that walks every file of the layer is still a read, and the thing that makes it worth watching — that it reports as it goes and stops when it is asked to — is one property of its handler, declared with [crate::capability::Executable::cancellable] and carried on [ExecutionPolicy].

  • queryExecutable and read-only: a typed handler, an input schema, an output schema.
  • commandExecutable with an effect on this process's in-memory state and nowhere else (a peer announcing itself): a typed handler, bound to `POST` over HTTP, and announced to MCP clients as not read-only.
  • resourceDeclarative content the repository holds: read as it is, never executed.

Used by AnswerView Capability CapabilitySummary

CapabilityList

object

The answer of capabilities.list: the matching capabilities, summarised, and the registry counted.

propertytyperequireddescription
count integer (uint) yes How many capabilities matched the filters.
summary Summary Summary yes The whole registry, counted by kind, stability and projection.
capabilities array of CapabilitySummary CapabilitySummary yes The matching capabilities, by id, without their schemas.

Used by capabilities.list

CapabilityProvenance

one of 2 variants

Where a capability came from. Never an absolute path.

variant Written in Rust, in the named module of this executable. Written in Rust, composed in `builtin.rs`.

modulestringyesThe Rust module the descriptor was composed in.
source"builtin"yes

variant Read from the repository's layer.

pathstringyesRepository-relative path.
directorystringyesThe directory the path sits in, repository-relative; `.` for the root.
source_classstringyesThe `sources.yaml` class that discovered the file.
sectionstring | nullnoThe manifest section the path falls under, when it falls under one.
media_typestringyesIANA media type of the object's content.
memberstring | nullnoFor one member of a collection file, its key path in the file (`claims.3`).
source"declarative"yes

Used by AnswerView Capability CapabilitySummary

CapabilityRef

object

One capability of a module the feature names, with the projections the registry declares for it.

propertytyperequireddescription
id string yes The canonical id.
title string yes The title.
kind string yes query, command or resource.
stability string yes Where it stands.
tool string | null no The MCP tool name, when exposed as one.
resource string | null no The MCP resource URI, when exposed as one.
route string | null no METHOD /path, when exposed over HTTP.
cli string | null no The words after majordomus, when exposed on the command line.

Used by ModuleRef

CapabilitySummary

object

One capability as a listing shows it: everything the descriptor says except its two schemas, which capabilities.describe answers for one capability. A listing of a repository's registry runs to hundreds of entries; their schemas would be megabytes of the same object view repeated.

propertytyperequireddescription
id CapabilityId CapabilityId yes The canonical identity.
module ModuleId ModuleId yes The module that composes it.
kind CapabilityKind CapabilityKind yes Query, command or resource.
title string yes The short name.
description string yes The one-paragraph description.
provenance CapabilityProvenance CapabilityProvenance yes Where it came from.
exposure Exposure Exposure yes Where it is projected.
stability Stability Stability yes Where it stands.
tags array of string no Free tags.
benchmark BenchmarkPolicy BenchmarkPolicy yes Whether it is a benchmark target.
cache CachePolicy CachePolicy yes Whether the executor keeps its results.

Used by CapabilityList

CapabilityVisibility

"public" | "developer" | "internal"

Who a capability is for, and whether anything offers it.

Internal is a statement, not an omission: a capability nothing projects is invisible either way, and the difference between deliberate and forgotten is exactly what this records.

  • publicOffered to anyone who can reach the process: an HTTP route or an MCP entry.
  • developerOffered to whoever runs the executable, and to nobody over a network.
  • internalProjected nowhere. It exists, it is listed as existing, and no surface offers it.

Used by Capability

CatalogueView

object

The whole catalogue as a client reads it.

propertytyperequireddescription
schema string yes [SCHEMA].
fingerprint string yes The hash of the catalogue's own sources: stable for a tree, and independent of the rest of the index, so two runs over one tree agree.
counts Counts Counts yes The counts.
moments array of MomentSummary MomentSummary yes The matching moments, in presentation order.
audiences array of AudienceView AudienceView yes Every audience, with its derived membership.
areas array of AreaView AreaView yes Every area, with its derived membership.
facets Facets Facets yes The filters, derived from the records.

Used by why.list

Category

object

One category of out: pathspecs and file-name patterns.

propertytyperequireddescription
paths array of string no Pathspecs anchored at the repository root.
names array of string no Patterns matched against the file name alone.

Used by Out

Channel

"stable" | "prerelease"

Which releases an unpinned installation may resolve to.

  • stableResolved by `latest`.
  • prereleasePublished, addressable by its exact tag, never resolved by default.

Used by ReleaseView

CheckState

"ok" | "failed" | "unknown"

The state of one check in the installability report. Three states and no more: a check either holds, does not, or could not be made from what this process can see.

  • okThe check holds.
  • failedThe check does not hold, and the public installation is affected.
  • unknownThe check could not be made here; it says nothing either way.

Used by InstallCheck

ClaimRef

object

One claim the feature names, with the status the matrix gives it.

propertytyperequireddescription
id string yes The claim id.
claim string yes The sentence.
status string yes guaranteed, advisory, planned or rejected.

Used by ResolvedRefs

Classification

object

One path, judged.

propertytyperequireddescription
path string yes The path, repository-relative, as judged.
verdict Verdict Verdict yes In or out.
reason Reason | null Reason no Why it is out; absent when it is in.
rule string | null no The pattern or limit that decided: the in pathspec, the out pattern, binary, max_bytes or fixtures.max_bytes; absent for undeclared.
exists boolean yes Whether the path exists in the work tree; a path that does not is judged by name.
directory boolean yes Whether the path is a directory; a directory is in when something beneath it can be.
bytes integer | null no The size, when the path is an existing file.

Used by repository.scope_classify

CliExposure

object

How a capability appears on the command line: the words after majordomus.

propertytyperequireddescription
path array of string yes The words after majordomus, e.g. ["capabilities", "list"].

Used by Exposure

ClientInfo

object

What a client said about itself in initialize.

propertytyperequireddescription
name string yes clientInfo.name: claude-code, codex, gemini-cli, whatever the client sends.
version string yes clientInfo.version.
title string | null no clientInfo.title, when the client sends one.

Used by Announced Peer

Closure

object

What this checkout's active task owes, and how much of it is still true.

A clone that has never run the lifecycle answers this too, and answers it as absence: present false, no task, and a finding saying so. "Nothing owed" and "nothing to owe it" are different facts, and a served instance must not report the second as the first.

use majordomus_cli::capability::builtin::obligations::Closure;
let fresh: Closure = serde_json::from_str(
    r#"{"present":false,"worktree":"/srv/clone","branch":"master","closed":false,
        "tallies":{},
        "findings":["no active task in this checkout (.ai/local/state/current.yaml); nothing owes anything here"]}"#,
)
.unwrap();
assert!(!fresh.present && !fresh.closed, "nothing that does not exist is closed");
assert!(fresh.task.is_none() && fresh.obligations.is_empty());
assert_eq!(fresh.findings.len(), 1, "absence is reported, not implied");

propertytyperequireddescription
present boolean yes Whether this checkout has a task to report about at all. False in a clone that has never run the lifecycle, which is not a fault and is not "nothing owed".
worktree string yes The worktree this answer is about. Every reading below is scoped to it, and to no other checkout of the same repository.
branch string yes The branch, or DETACHED.
head string no The commit this checkout is on.
working_tree string no clean or dirty.
task ActiveTask | null ActiveTask no The active task, or None. Its requires is the list the entries below expand.
closed boolean yes True when the task declares obligations and every one of them is discharged and current — that is, when majordomus.obligation-closure would not refuse finish --outcome completed. False when anything is owed, stale or undeclared, and false when there is no task: nothing that does not exist is closed.
tallies map of integer (uint) yes How many obligations stand where, by state word. Absent states are absent rather than zero, so a reader never has to know the vocabulary to read the tallies.
obligations array of ObligationClosure ObligationClosure no Every obligation the task declared, in the order it declared them.
findings array of string no What a reader should know before trusting any of the above: an unreadable vocabulary, a ledger that could not be read, a task that declares nothing. Empty is the ordinary case.

Used by obligations.closure

ClosureMatrix

object

The whole matrix, with the findings and the debt beside it: one value that answers "where does each capability appear, and is any claim unmet".

propertytyperequireddescription
rows array of Row Row yes One row per capability, in id order.
unbacked array of string yes Runnable commands of the command line that no capability claims, in command order.

Used by capabilities.projections

CockpitAreaRef

object

One area of the Cockpit the feature names.

propertytyperequireddescription
id string yes The area id.
title string yes The label the Cockpit shows.
route string yes The route under the running server.

Used by ResolvedRefs

CommandArgument

object

One argument of a command, as the declaration gives it plus what can be inferred.

propertytyperequireddescription
name string yes The argument's id.
long string | null no --long, without the dashes.
short string | null no -s, without the dash.
positional boolean yes Given by position rather than by flag.
takes_value boolean yes Takes a value at all; a flag does not.
required boolean yes Must be given.
variadic boolean yes Takes any number of values.
global boolean yes Accepted by every command under the one that declares it.
help string yes The help text, one line.
value_name string | null no The placeholder, PATH.
values array of CommandValueChoice CommandValueChoice no The values the declaration carries, each with its help.
defaults array of string no The defaults, as the declaration renders them.
source CommandValueSource CommandValueSource yes Where further values come from.
secrecy CommandSecrecy CommandSecrecy yes How openly the value may be handled.

Used by CommandNode

CommandAvailability

object

Where a command means anything, and why not when it does not.

Derived from the repository environment rather than declared per command, so that a projection reads a field instead of re-deciding. The reason is carried because the answer a person needs is never false.

propertytyperequireddescription
available boolean yes Can it be run here, now?
reason string | null no Why not, in one line, when it cannot.
requires array of CommandRequirement CommandRequirement no What it needs, whether or not that is satisfied here.

Used by CommandNode

CommandDeprecation

object

A command that is no longer the name to use.

propertytyperequireddescription
reason string yes Why, in one line.
replaced_by CommandId | null CommandId no What to use instead.

Used by CommandNode

CommandDiagnostic

object

One thing the build found.

propertytyperequireddescription
severity CommandDiagnosticSeverity CommandDiagnosticSeverity yes How bad.
code string yes A stable code, for a gate to match on.
message string yes What is wrong, in one line.
commands array of CommandId CommandId no The nodes it is about.
remedy string | null no What to do about it.

Used by CommandGraph

CommandDiagnosticSeverity

"error" | "warning" | "info"

How bad a finding is.

  • errorThe graph is wrong and a projection built from it would be wrong.
  • warningWorth saying; the graph stands.
  • infoA fact a reader may want.

Used by CommandDiagnostic

CommandEffect

"read_only" | "local_mutation" | "repository_mutation" | "network_mutation" | "destructive"

What running a command changes. The one thing a surface policy is allowed to ask.

The order is the order of increasing consequence, and it is the order the derived exposure policy reads: a surface declares the strongest effect it will carry, and every node at or below it is projected there. Nothing configures a surface per command.

  • read_onlyReads and answers. Changes nothing anywhere.
  • local_mutationWrites only where the repository keeps a checkout's own state — the process's memory, `.ai/local/`, a build directory. Nothing a commit would carry.
  • repository_mutationWrites tracked files: generated artifacts, the worktree, git itself.
  • network_mutationReaches the network with an effect on the far side: a push, a deploy, a release.
  • destructiveRemoves something a person would have to reconstruct.

Used by CommandNode

CommandExecution

object

How a command is actually run: the program and the words before the caller's own.

This is what forbids a cycle. A projection renders an invocation from the execution descriptor, so a generated bridge always spells the canonical program — never the surface it is a bridge for.

propertytyperequireddescription
origin CommandOrigin CommandOrigin yes Which program.
argv array of string yes The words that precede the caller's arguments, the program's own name excluded.

Used by CommandNode

CommandGraph

object

The whole graph.

propertytyperequireddescription
schema string yes The schema of this document.
fingerprint string yes A hash of the semantic content: the identity a cache and a generated projection key on. Nothing that varies between two runs over the same tree is in it.
commands array of CommandNode CommandNode yes Every command, in a deterministic order: origin, then path.
diagnostics array of CommandDiagnostic CommandDiagnostic yes What the build found.

Used by CommandGraphReport

CommandGraphReport

object

The whole graph, with what its build found.

propertytyperequireddescription
graph CommandGraph CommandGraph yes The graph.
errors integer (uint) yes How many findings are errors; a projection refuses to write while this is not zero.

Used by commands.graph

CommandId

string

The canonical identity of one command.

Constructed from the origin and the command path, never written by hand, so that a projection cannot invent one and a rename of a display string cannot change one.

Used by CommandDeprecation CommandDiagnostic CommandNode

CommandIndex

object

The commands this repository offers, filtered.

propertytyperequireddescription
schema string yes The schema of the graph these came from.
fingerprint string yes The fingerprint of that graph: a client may cache against it.
total integer (uint) yes How many commands the graph holds, before the filter.
commands array of CommandSummary CommandSummary yes The commands that matched, in graph order.

Used by commands.list

CommandInteractivity

"non_interactive" | "interactive" | "long_running"

How a command behaves towards the caller's terminal and the caller's patience.

  • non_interactiveRuns, answers, exits. Safe to call from a machine surface.
  • interactiveAsks the person something, or reads the body of a record from a terminal. A machine surface that offered it would hang.
  • long_runningServes until it is stopped. A request/response surface cannot carry it.

Used by CommandNode

CommandNode

object

One command, from whichever program offers it.

propertytyperequireddescription
id CommandId CommandId yes The canonical identity.
origin CommandOrigin CommandOrigin yes Which program runs it.
path array of string yes The words after the program's own name.
invocation string yes The command line a person types, rendered once here.
summary string yes One line.
description string | null no The longer description, when the declaration carries one.
runnable boolean yes Can it be run on its own, or does it only group the commands under it?
arguments array of CommandArgument CommandArgument yes The arguments, in declaration order.
execution CommandExecution CommandExecution yes How it is run.
effect CommandEffect CommandEffect yes What it changes.
interactivity CommandInteractivity CommandInteractivity yes How it behaves towards a terminal.
stability Stability Stability yes Where it stands.
availability CommandAvailability CommandAvailability yes Where it means anything.
group string | null no The group a person finds it under, when the declaration has groups.
tags array of string no Free tags.
aliases array of string no Other names that resolve to this node, declared once here and honoured by every projection that has a use for one.
deprecation CommandDeprecation | null CommandDeprecation no Whether this is still the name to use.
provenance CommandProvenance CommandProvenance yes Where it came from.
projections CommandProjections CommandProjections yes Where it appears.
entrypoint boolean | null no Is this command an entry point of its group — the one a newcomer is offered?

Used by commands.get CommandGraph

CommandOrigin

"executable" | "tool" | "workflow"

Which program runs a command. Part of the identity, because the three are different programs that share one name on the path.

  • executableThe Rust executable, `apps/majordomus-cli`: the read-only interfaces, generation, introspection, the servers. Declared by clap.
  • toolThe shell tool, `bin/majordomus`: the task lifecycle. Declared by the shipped command registry and dispatched by the tool itself.
  • workflowA workflow the repository declares for a person to run — a `just` recipe that is not a generated bridge. Declared by the justfile and read from the runner's dump.

Used by CommandExecution CommandNode

CommandProjections

object

Where one command appears, derived from its effect, its interactivity and its origin.

Every field is computed by [super::policy]. Nothing declares a projection, and no surface keeps a list of what it carries: a surface asks the graph.

propertytyperequireddescription
cli string | null no The command line, as typed.
workflow string | null no The generated workflow bridge's recipe name.
mcp string | null no The MCP tool name, when the capability behind it declares one.
http string | null no The HTTP route, when the capability behind it declares one.
cockpit string | null no The Cockpit address, when the surface carries it.
docs string yes The page on the site. Every command has one.
withheld string | null no Why a machine surface does not carry it, when one does not.

Used by CommandNode CommandSummary

CommandProvenance

object

Where a node came from, in enough detail to open the file.

propertytyperequireddescription
declared_in string yes The repository-relative file that declares it.
read_by string | null no The command that reads that declaration, when a reader wants to reproduce it.
capability CapabilityId | null CapabilityId no The capability this command runs, when it runs one.

Used by CommandNode

CommandRef

object

One public command of the shell tool the feature names, as share/commands.yaml declares it.

propertytyperequireddescription
id string yes The command.
summary string yes One line.
stage string | null no The lifecycle stage it belongs to.
read_only boolean yes Whether it writes nothing.

Used by ResolvedRefs

CommandRequirement

"repository" | "layer" | "task" | "executable" | "workflow_runner" | "rust_toolchain" | "site"

One thing a command needs before it can run.

  • repositoryA git repository.
  • layerThe `.ai/` layer, initialised.
  • taskAn active task record.
  • executableThe Rust executable, built.
  • workflow_runnerThe workflow runner, installed.
  • rust_toolchainA cargo workspace and a toolchain to build it.
  • siteThe site sources and its generator.

Used by CommandAvailability

CommandSecrecy

"public" | "sensitive" | "secret"

How openly a value may be handled.

  • publicOrdinary: may be logged, completed, shown.
  • sensitiveA path or an identifier that names something private. Shown, never logged.
  • secretA credential. Never completed, never logged, never cached.

Used by CommandArgument

CommandSummary

object

One command, as an index shows it: enough to choose, never enough to have to skim.

propertytyperequireddescription
id string yes The canonical identity.
invocation string yes The command line a person types.
summary string yes One line.
origin string yes Which program runs it.
effect string yes What running it changes.
group string | null no The group it is found under.
projections CommandProjections CommandProjections yes Where it appears.

Used by CommandIndex

CommandValueChoice

object

One value an argument accepts, from the declaration.

propertytyperequireddescription
value string yes The value as typed.
description string | null no Its help, when the declaration carries one.

Used by CommandArgument

CommandValueSource

one of 13 variants

Where a value for an argument comes from, when something in this repository knows the set.

This is the completion contract, and it is a property of the argument, not of a shell script: the same source answers a shell's TAB, a generated form's select and a machine surface's enumeration of what it will accept. Inference from the declaration comes first — a value-enum argument carries its own values, a PATH placeholder is a path — and only what cannot be inferred is annotated beside the command.

variant Nothing here knows the set; the caller types a value.

kind"free"yes

variant The declaration carries the values; they are on the argument.

kind"enumerated"yes

variant A path in the filesystem.

kind"path"yes

variant A path inside the repository.

kind"repository_path"yes

variant A capability id, from the registry.

kind"capability"yes

variant A command id, from this graph.

kind"command"yes

variant A rule id, from the effective rule set.

kind"rule"yes

variant An object kind, from the index.

kind"object_kind"yes

variant A git branch in this repository.

kind"branch"yes

variant A graph id, from the graph registry.

kind"graph"yes

variant A moment id, from the why catalogue.

kind"moment"yes

variant A shell name, from the shells the activation supports.

kind"shell"yes

variant A secret. Never enumerated, never cached, never suggested.

kind"secret"yes

Used by CommandArgument

CommitAttribution

object

One commit and the contract it served, or the fact that none can be found.

propertytyperequireddescription
commit CommitRef CommitRef yes The commit.
attribution Attribution Attribution yes What is known.
issue string | null no The issue, when exactly one claims it.
milestone string | null no The milestone that issue belongs to, filled by the caller that has the index.
issues array of string yes Every issue whose branches contain it: one when attributed, none when unattributed, more than one when ambiguous.
branches array of string yes The branches that contain it, by the names their refs carry.
reason string yes Why the verdict is what it is, in one line a person can act on.

Used by trace.commit TraceReport

CommitRef

object

One commit, exactly as git names it. Nothing here is stored anywhere: the whole record is re-read from the object database on every call.

propertytyperequireddescription
id string yes The full object name.
short string yes The abbreviated object name, as this repository abbreviates it.
author string yes The author, as the commit records them.
date string yes The author date, ISO 8601 as the commit records it.
subject string yes The subject line.

Used by BranchTrace CommitAttribution

Comparison

"content" | "size"

How closely a file could be compared with what the index holds.

A file that is one object is compared byte for byte, because the index kept its whole content. A collection file holds one object per member, and what the index kept for each is that member as JSON rather than the file's text — so the strongest thing that can be said without re-parsing it is whether its size is what it was. The report says which comparison was made rather than implying the stronger one.

  • contentByte for byte against the content the index holds.
  • sizeBy size against the size the index recorded.

Used by DriftedObject

Concurrency

object

When the edge considers a machine loaded, in requests.

propertytyperequireddescription
soft_limit Positive Positive yes Where the edge starts preferring another machine.
hard_limit Positive Positive yes Where it stops sending requests to this one.

Used by Fly

Confidence

"exact" | "cached" | "unknown"

How far a resolved value can be trusted.

  • exactRead from its canonical source during this resolution.
  • cachedRead from a cache whose fingerprint still matches its inputs.
  • unknownNot resolved.

Used by FieldSource

ContainerView

object

The container, as the topology reports it.

propertytyperequireddescription
path string yes The derived path.
suffix string yes The suffix it was derived with.
exists boolean yes It exists on disk. Created by the first worktree that needs it.

Used by RepositoryTopology StatusReport

Continuity

object

What the lifecycle of this checkout is holding.

propertytyperequireddescription
present boolean yes Whether this checkout's lifecycle has ever run: a ledger line, a task, an episode or a record. False in a fresh clone, which is not a fault.

It is not "the directory exists". Several things create that directory before anything has been recorded in it, so a reader that took its presence for evidence would be told the lifecycle had run in a checkout where it never had.

worktree string yes The worktree this answer is about. Every selection below is scoped to it.
branch string yes The branch, or DETACHED.
head string no The commit this checkout is on.
working_tree string no clean or dirty.
session OpenSession | null OpenSession no The open episode, or None.
task ActiveTask | null ActiveTask no The active task, or None.
handover Record | null Record no The record the next worker would resume from, or None when nothing resolves here.
checkpoint Record | null Record no The newest progress note for this worktree and branch, or None.
blockers array of string no Unresolved questions on this branch. Every one refuses finish --outcome completed, whichever task opened it.
tallies map of integer (uint) yes How many records of each kind this checkout holds, against the policy's caps.
findings array of string no What a reader should know before trusting any of the above: a diverged record, a foreign open session, a malformed file that was skipped. Empty is the good case.

Used by continuity.state

ContractView

object

A directory contract as the document declares it, before anything is inherited.

propertytyperequireddescription
id string yes The document's identity; it survives a move, the file name does not.
path string yes The document's path, repository-relative.
title string | null no One line naming the directory.
description string | null no One line saying what the directory is for.
status string yes active or deprecated; a deprecated document is listed and never applied.
scope string yes directory, subtree or explicit: how far the document reaches.
composition string yes extend, replace or final: how it composes with what is above it.
order integer (int64) yes Ties within one depth are broken by this, then by path.
providers array of string yes *, or the providers the document is written for.
audience array of string yes Who it addresses; both when it says nothing.
tracks array of string no Pathspecs whose change names this document for review.
children_require_contract boolean | null no Whether the directories below owe a contract, when this document says.
children_exempt array of string no Subtrees below this one that owe nothing: carried, not authored here.

Used by DirectoryNode

CounterSnapshot

object

The counters and phase totals of this process at one moment. Every value is a count or a duration this process measured; none is written anywhere by hand.

propertytyperequireddescription
repository_scans integer (uint64) yes Enumerations of the repository's declared sources.
index_builds integer (uint64) yes Index builds.
registry_builds integer (uint64) yes Registry builds.
schema_generations integer (uint64) yes JSON Schemas derived from Rust types.
mcp_projection_builds integer (uint64) yes MCP tool and resource listings computed.
openapi_builds integer (uint64) yes OpenAPI documents built.
http_projection_builds integer (uint64) yes HTTP routers built.
graph_builds integer (uint64) yes Graphs derived from the registry and the index.
executions integer (uint64) yes Calls through the executor, every transport.
handler_invocations integer (uint64) yes Handlers actually run.
cache_hits integer (uint64) yes Executions answered from the cache.
cache_misses integer (uint64) yes Executions of a cached capability that ran the handler.
cache_evictions integer (uint64) yes Cache entries dropped.
phases map of PhaseTotals PhaseTotals yes Phase totals by phase name.

Used by perf.counters

Counts

object

How much the catalogue holds. Every count anywhere — a page, a heading, a report — is one of these, so no number is ever written down.

propertytyperequireddescription
moments integer (uint) yes Public moments.
moments_all integer (uint) yes Moments of every status, drafts included.
audiences integer (uint) yes Public audiences.
areas integer (uint) yes Public areas.
signals integer (uint) yes Signals across the public moments: the size of the questionnaire.
examples integer (uint) yes Concrete situations across the public moments.

Used by CatalogueView ValidationReport

CpuKind

"shared" | "performance"

What a machine's CPU is.

  • sharedA fraction of a core: the cheap profile.
  • performanceA dedicated one.

Used by Resources

Declaration

object

scope.yaml, typed. Unknown keys are refused by the type and by the scope schema.

propertytyperequireddescription
version integer (uint64) yes The format version; only [SCOPE_VERSION] is read.
in array of string yes The allow-list: pathspecs anchored at the repository root.
out Out Out yes What is never read; wins over in.

Used by ScopeReport

DemonstrateReport

object

The answer of executions.demonstrate.

propertytyperequireddescription
steps integer (uint64) yes How many steps ran.
elapsed_ms integer (uint64) yes How long it took, in milliseconds.
observed boolean yes Whether anything was watching: false when it was called directly rather than as an execution, which is the difference this capability exists to show.

Used by executions.demonstrate

DeploymentCheck

object

Whether the deployments this repository declares would work, decided locally: against the capability registry this process built and the workspace it sits in.

propertytyperequireddescription
ok boolean yes True when no deployment earned a refusal.
decided integer (uint) yes How many deployments were decided.
refusals array of Refusal Refusal yes Every refusal, in the order the objects and their keys appear.

Used by deploy.check

DeploymentList

object

Every deployment the layer declares.

propertytyperequireddescription
count integer (uint) yes How many.
deployments array of DeploymentView DeploymentView yes Each, in identity order.
unreadable array of Refusal Refusal no Objects of the deployment kind this executable could not read, with why. A malformed object is reported here rather than hidden by being skipped.

Used by deploy.list

DeploymentStatus

"declared" | "active" | "retired"

Where a deployment stands.

Status is the right name inside this module; the schema component namespace is flat, and distribution::Status answers a different question, so each says which it is.

  • declaredThe object exists and nothing is deployed from it yet.
  • activeIt is deployed.
  • retiredIt was, and the object is kept for the record.

Used by DeploymentView

DeploymentView

object

One deployment as this process reads it, with where it came from.

propertytyperequireddescription
file string yes The repository-relative file the object lives in.
schema string yes The format version; a version this executable does not read is refused.
kind string yes Always deployment.
id string yes The identity within the repository.
title string yes One line naming it.
description string | null no One line: what it serves and to whom.
status DeploymentStatus | null DeploymentStatus no Where it stands.
application string yes The application's name at the provider.
build Build Build yes What is shipped and what it is built from.
listen Listen Listen yes The address the process listens on.
health HealthRoutes HealthRoutes yes The routes a platform polls.
resources Resources Resources yes What one machine is granted.
machines Machines Machines yes How many machines run.
region string yes The region they run in.
budgets Budgets Budgets no The measured figures it is held to.
provider Provider Provider yes The provider and its own facts.
created_at string | null no When the object was written.
updated_at string | null no When it was last changed.

Used by deploy.get DeploymentList

Diagnosis

object

What a reader's selection implies, computed by counting rather than by inference.

The arithmetic is the whole model and is stated so a reader can check it: a selection resolves to a set of moments; an area or an audience scores the number of selected moments that name it; a recommendation scores the number that name it and carries their ids. There is no weighting and no percentage, because there is no model behind one.

propertytyperequireddescription
moments array of string yes The moments the selection resolved to, in presentation order.
unresolved array of string yes Selected names that resolved to nothing.
areas array of Recommendation Recommendation yes Operational areas by how many selected moments fall under them, heaviest first.
audiences array of Recommendation Recommendation yes Audiences by how many selected moments they recognise, heaviest first.
capabilities array of Recommendation Recommendation yes Capabilities of the executable that answer the selected moments.
commands array of Recommendation Recommendation yes Commands that answer them.
claims array of Recommendation Recommendation yes Claims that say what is guaranteed.
doctrines array of Recommendation Recommendation yes Rules of the effective set that govern them.
use_cases array of Recommendation Recommendation yes Use cases that show the way out.
also_worth_reading array of string yes Moments the selection did not include that share an area with one that it did.

Used by why.diagnose

Diagnostic

object

One finding about the declarative state, named by a stable code, tied to a path where there is one, and carrying the command that reproduces it where there is one.

propertytyperequireddescription
severity Severity Severity yes How bad.
code string yes A stable machine-readable code, e.g. unknown_key, duplicate_identity.
path string | null no Repository-relative path of the file concerned, when there is one.
message string yes What is wrong, for a person; the code is for a program.

Used by RepositoryEnvironment RepositoryReport

DiagnosticCode

"worktree.path_mismatch" | "worktree.container_occupied" | "worktree.nested" | "worktree.destination_conflict" | "worktree.missing" | "worktree.stale_registration" | "worktree.branch_already_checked_out" | "worktree.detached" | "worktree.ephemeral" | "worktree.primary_on_non_trunk" | "worktree.trunk_in_linked_worktree" | "worktree.path_escape" | "worktree.invalid_branch_name" | "worktree.locked" | "worktree.migration_verification_failed" | "worktree.trunk_unknown" | "worktree.case_collision" | "worktree.cross_device"

The stable machine name of everything that can be wrong with the topology. One code per condition, reused by the command line, the API, MCP, the Cockpit, the tests and the documentation; the prose beside a code is rendered from the typed state.

  • worktree.path_mismatchA linked work tree is not at its branch's canonical path.
  • worktree.container_occupiedA linked work tree occupies the container path itself.
  • worktree.nestedA linked work tree sits inside the primary checkout or inside another work tree.
  • worktree.destination_conflictThe canonical path of a branch is occupied by something that is not its work tree.
  • worktree.missingA registered work tree's directory does not exist.
  • worktree.stale_registrationGit reports the registration as prunable.
  • worktree.branch_already_checked_outA branch is checked out somewhere other than its canonical path.
  • worktree.detachedA linked work tree has no branch.
  • worktree.ephemeralA linked work tree is a session's scratch checkout: under the temporary directory or under the primary checkout's `.claude/worktrees/`.
  • worktree.primary_on_non_trunkThe primary checkout holds a branch that is not the trunk.
  • worktree.trunk_in_linked_worktreeThe trunk is checked out in a linked work tree rather than the primary checkout.
  • worktree.path_escapeA derived path would leave the container. Cannot happen for a valid branch name.
  • worktree.invalid_branch_nameA branch name git accepted that this executable cannot derive a path for.
  • worktree.lockedA work tree is locked, so it cannot be moved until it is unlocked.
  • worktree.migration_verification_failedA move happened and the fingerprint after it differs from the one before.
  • worktree.trunk_unknownThe trunk could not be determined.
  • worktree.case_collisionTwo branch names map to one directory on a case-insensitive filesystem.
  • worktree.cross_deviceA move crossed devices and was made by copy, repair and verification.

Used by TopologyDiagnostic

DirectoryNode

object

One directory of the layer, what it owes, and what applies to it.

propertytyperequireddescription
path string yes Repository-relative, forward slashes.
depth integer (uint) yes Segments below the layer root; the root itself is 0.
parent string | null no The directory above, when it is inside the layer.
children array of string no The directories immediately below, sorted.
state DirectoryState DirectoryState yes Whether it carries the contract it owes.
requires_contract boolean yes Whether a contract is owed here at all.
governed_by string | null no The contract that made the requirement explicit, when one did.
exempted_by string | null no The contract that released this subtree, when one did.
objects integer (uint) yes How many objects of any kind the index holds directly in this directory.
contract ContractView | null ContractView no The contract this directory declares, before inheritance.
effective array of EffectiveEntry EffectiveEntry no The contracts that apply here once inheritance is resolved, least specific first. Present when the request asked for it, or when it asked about one path.

Used by DirectoryReport

DirectoryReport

object

The layer's directories, what each owes, and the contracts that apply.

propertytyperequireddescription
root string yes The layer root the tree is rooted at.
tallies DirectoryTallies DirectoryTallies yes The directories in each state.
directories array of DirectoryNode DirectoryNode yes Every directory asked for, sorted by path.

Used by directories.list

DirectoryState

"documented" | "exempt" | "owed"

Whether a directory of the layer carries the contract it owes.

  • documentedIt carries a context document of its own.
  • exemptIt owes none, because a contract above it says so.
  • owedIt owes one and has none.

Used by directories.list DirectoryNode

DirectoryTallies

object

How many directories are in each state.

propertytyperequireddescription
directories integer (uint) yes Every directory of the layer the index knows.
documented integer (uint) yes Carrying a contract of their own.
exempt integer (uint) yes Released by a contract above them.
owed integer (uint) yes Owing a contract and carrying none.

Used by DirectoryReport

DirtyState

object

Uncommitted work in a work tree, counted from git status --porcelain. Untracked content counts: it is exactly what a careless move loses.

propertytyperequireddescription
staged integer (uint) yes Entries with a change in the index.
unstaged integer (uint) yes Entries with a change in the work tree that is not in the index.
untracked integer (uint) yes Untracked, not ignored, files.
conflicted integer (uint) yes Entries with an unresolved merge conflict.
clean boolean yes Nothing above is non-zero.
in_progress string | null no A merge, rebase, cherry-pick, revert or bisect is in progress here.

Used by MigrationStep WorktreeState

DistributionReport

object

The distribution, as a person or a script asks for it.

propertytyperequireddescription
binary string yes The command a person types after installing.
repository string yes owner/name, the only host release assets come from.
installer_url string yes The installer's canonical URL.
install_command string yes The one-line install command, composed from its parts.
install_and_init_command string yes The same, initialising the repository afterwards.
next_command string yes What a person runs next.
checksum string yes The digest algorithm the installer verifies.
install_dir string yes Where the launchers go by default.
prefix string yes Where the versioned trees go by default.
latest_url string yes Where the stable release metadata is published.
supported integer (uint) yes How many targets a release builds.
targets array of TargetView TargetView yes Every declared target, in the model's order.

Used by distribution.model

Divergence

"exact" | "advanced" | "diverged" | "different_context" | "unknown"

How far a record's recorded commit is from the commit this checkout is on.

The four words are the shell tool's, deliberately. A reader that met advanced from one surface and stale from another would have to learn the same four facts twice.

  • exactWritten at this commit. Trust it.
  • advancedGit has moved forward since. Trust it, and expect some of it to be done.
  • divergedThe recorded commit is not an ancestor: history was rewritten. Trust git, not this.
  • different_contextAnother branch or another worktree. This record is not about your work.
  • unknownGit could not answer, so this process says so rather than guessing `exact`.

Used by ObligationClosure Record

DocRef

object

One document the feature names.

propertytyperequireddescription
path string yes Repository-relative path.
title string | null no The title, when the document has one.

Used by ResolvedRefs

DocumentView

object

One document, and the encodings it is committed in.

propertytyperequireddescription
id string yes The document id, shared by every encoding of it.
schema string | null no The schema id its structured encodings carry.
source string yes One line: what it was derived from.
formats array of ArtifactFormat ArtifactFormat yes The encodings, in the manifest's order.

Used by ArtifactReport

DriftedObject

object

One file of the layer that is no longer what the index read.

propertytyperequireddescription
path string yes Its repository-relative path.
standing ObjectStanding ObjectStanding yes How it stands.
comparison Comparison Comparison yes How it was compared.
objects integer (uint) yes How many objects of the index came from it.
example_uri string yes One of the URIs it holds, so a reader can see what is affected.
detail string yes What is wrong, for a person.

Used by VerifyReport

Edge

object

One directed edge. Both ends are node ids of the same graph; a derivation that cannot resolve an end adds an external node rather than a dangling edge.

propertytyperequireddescription
source string yes The node the edge leaves.
target string yes The node the edge enters.
kind string yes One of the graph's declared edge kinds.

Used by Graph

EffectiveEntry

object

One contract in a directory's effective chain, in the order it is applied.

propertytyperequireddescription
id string yes The document's identity.
path string yes The document's path.
depth integer (uint) yes Depth below the layer root; less is less specific and applies first.
order integer (int64) yes The declared order, the second sort key.
composition string yes extend, replace or final.
reason string yes Why it applies to this directory, in words.
local boolean yes True for the directory's own document, false for one it inherits.

Used by DirectoryNode

EnvironmentProvenance

object

Where the values of one snapshot came from.

propertytyperequireddescription
resolution Resolution Resolution yes How the snapshot behind these entries was resolved.
fields array of FieldSource FieldSource yes One entry per field, in the order the resolver produced them.

Used by environment.explain

EnvrcApproval

one of 6 variants

What became of the .envrc of a worktree that was just created, found, or moved.

variant direnv accepted it: the next `cd` loads the environment.

outcome"approved"yes

variant The worktree has no `.envrc`; there is nothing to approve and nothing is blocked.

outcome"no_envrc"yes

variant direnv is not on the PATH; nothing was done, and nothing is blocked either, because nothing would load the file.

outcome"direnv_absent"yes

variant The worktree's `.envrc` is not the primary checkout's, so the approval given there does not carry. `direnv allow` in the worktree, after reading it, is the person's.

outcome"differs"yes

variant The primary checkout's `.envrc` is not approved, so there is no approval to carry.

outcome"not_approved_in_primary"yes

variant direnv was asked and refused, or could not be run; the message is its own.

messagestringyesdirenv's standard error, or the error running it.
outcome"failed"yes

Used by MigrationStep

ErrorBody

object

The body of every error response.

propertytyperequireddescription
error ErrorDetail ErrorDetail yes The one error.

Used by artifacts.list capabilities.list capabilities.projections capabilities.describe release.changelog commands.get commands.list commands.graph continuity.state deploy.get deploy.list deploy.check directories.list distribution.model distribution.artifact distribution.build distribution.releases distribution.status environment.status environment.explain executions.list executions.cancel executions.demonstrate executions.events executions.get executions.protocol executions.start graph.get graph.list health.report health.live objects.get objects.list objects.verify obligations.vocabulary obligations.closure peers.list peers.announce perf.counters plan.model plan.issues plan.next plan.record plan.roadmap plan.status plan.validate plan.waves product.feature product.features product.matrix product.providers product.validate quality.report health.ready release.version repository.info repository.scope repository.scope_classify objects.search trace.report trace.commit trace.issue web.surfaces why.list why.areas why.audiences why.diagnose why.moment why.validate worktree.topology worktree.inspect worktree.migration_plan worktree.status

ErrorDetail

object

What went wrong, as the HTTP projection names it.

propertytyperequireddescription
code string yes What kind of failure it is: invalid_input, not_found, method_not_allowed, refused, forbidden, too_large, unavailable (a surface whose producer has not run) or internal.
message string yes The reason, for a person.

Used by ErrorBody

EventHistory

object

The answer of executions.events: one page of an execution's retained history.

propertytyperequireddescription
execution_id string yes The execution the events belong to.
state ExecutionState ExecutionState yes Where the execution stands now, so a client needs one request rather than two.
events array of ExecutionEvent ExecutionEvent yes The events, oldest first.
last_sequence integer (uint64) yes The sequence of the last event here: the cursor for the next page, and the one to open the live channel with.
more boolean yes Whether more events follow this page right now.
truncated boolean yes Whether events before this page had already been dropped by the store's bound.

Used by executions.events

Evidence

object

The task.evidence line that discharged an obligation, as the ledger holds it.

Nothing older is consulted: evidence is superseded by evidence, and the ledger keeps the history for a reader that wants it.

use majordomus_cli::capability::builtin::obligations::Evidence;
let e: Evidence = serde_json::from_str(
    r#"{"recorded_at":"2026-09-09T21:01:00Z","head":"f00ba7","branch":"master",
        "kind":"ci","command":"scripts/ci/reference-check","inputs_hash":"7f68b9"}"#,
)
.unwrap();
assert_eq!(e.head, "f00ba7", "the envelope's commit is what a remote fact is judged against");
assert!(e.artifact.is_empty(), "one of command and artifact; narrative is not evidence");

propertytyperequireddescription
recorded_at string yes When the line was appended.
head string yes The commit the ledger's envelope stamped on it.
branch string no The branch it was recorded on.
kind string no How it was taken: test, build, ci, artifact or manual.
command string no The command that produced it. Narrative is not evidence, so one of this and artifact is always present.
artifact string no The reference it points at, such as a published URL.
result string no What the command said, when its output was the point.
session string no The episode that recorded it, when one was open.
inputs_hash string no The hash of the token's declared inputs at the moment it was taken. Empty for a token that declares none.

Used by ObligationClosure

Example

object

One concrete situation, in one audience, with what happens today and what happens instead.

propertytyperequireddescription
id string yes Unique within the moment.
audience string yes The audience this situation belongs to; must name an audience of the catalogue.
title string yes One line naming the situation.
before string yes What happens without the tool.
after string yes What happens with it.

Used by MomentDetail

ExecutionConcurrency

"unrestricted" | "serial"

Whether two executions of one capability may overlap.

  • unrestrictedAny number at once. Every read is one of these: the index and the registry are immutable for the life of the process, so concurrent readers cannot interfere.
  • serialOne at a time. A second execution of the same capability waits for the first, which is what a capability that changes anything — this process's own memory included — needs in order to be reasoned about at all.

Used by ExecutionPolicy

ExecutionDiagnostic

object

A structured finding an execution reported on its way, distinct from its outcome.

propertytyperequireddescription
severity Severity Severity yes How bad.
code string yes A stable machine-readable code.
summary string yes One line, for a person.
detail string | null no The rest, when there is more.
suggestion string | null no What to do about it, when there is something.

Used by ExecutionEvent ExecutionView

ExecutionEffect

"read" | "process_state" | "repository_mutation"

What running a capability changes outside the caller.

Classified, never declared: it follows from the kind, which is the field a declaration already carries. A projection reads this to decide whether to ask before running something — the Cockpit's confirmation is derived from it — instead of naming capabilities it must treat carefully, which is a list that goes stale the day after it is written.

  • readNothing changes. Every query and every resource of this executable.
  • process_stateThis process's own memory changes, and nothing outside it.
  • repository_mutationThe repository changes. Nothing classifies to this, and the doctrine of this tool is why: no capability of any kind writes to the repository. It is on the model so that the day one does, it says so here — where a projection already reads it and a client already asks before running it — rather than in whichever page happens to render its button.

Used by ExecutionPolicy

ExecutionError

object

Why an execution ended badly, in the repository's diagnostic vocabulary rather than in Rust's: a code a program branches on, a sentence a person reads, and where to look.

A panic message and a backtrace are never in here. The engine catches a panicking handler and reports internal with the execution's correlation id; the panic itself is on the process's own error stream, where the operator running the server can read it.

propertytyperequireddescription
code string yes invalid_input, not_found, refused, internal, cancelled, unavailable.
message string yes What went wrong, for a person.
suggestion string | null no What to do about it, when there is something.
correlation_id string yes The execution this failure belongs to, so a log line and a UI agree.

Used by ExecutionEvent ExecutionView

ExecutionEvent

one of 12 variants

One event about one execution.

sequence is dense and starts at 1 within an execution: a client that has seen sequence n knows it has missed something when the next event it reads is not n + 1, and asks for the gap by cursor rather than reloading the world.

propertytyperequireddescription
schema_version string yes The protocol version, [PROTOCOL_VERSION].
event_id string yes The identity of this event: the execution's id and the sequence, so a client that deduplicates needs no composite key of its own.
execution_id ExecutionId ExecutionId yes The execution it is about.
sequence integer (uint64) yes Its position in that execution's stream, from 1, without gaps.
timestamp string yes When the event was produced, RFC 3339 in UTC.

variant The execution was accepted and exists. Carries what it will run and with what, redacted, so a client that joins at the first event needs nothing else to render a heading.

type"execution.created"yes
dataobjectyes

variant It is waiting for a worker.

type"execution.queued"yes
dataobjectyes

variant A worker picked it up and is about to enter the handler.

type"execution.started"yes

variant How far along it is.

type"execution.progress"yes
dataProgressView ProgressViewyes

variant A named phase was entered.

type"execution.step.started"yes
dataobjectyes

variant A named phase finished.

type"execution.step.completed"yes
dataobjectyes

variant A line of output.

type"execution.log"yes
dataobject LogStreamyes

variant A structured finding, distinct from the outcome.

type"execution.diagnostic"yes
dataExecutionDiagnostic ExecutionDiagnosticyes

variant Cancellation was asked for; the handler has not stopped yet.

type"execution.cancelling"yes
dataobjectyes

variant It stopped because it was asked to.

type"execution.cancelled"yes

variant It finished, and the handler returned an output. The output is on this event and not on one of its own, because a client must never be able to read "succeeded" and find no result: the state and the value it produced are one fact and travel together.

type"execution.completed"yes
dataobjectyes

variant It finished, and it did not.

type"execution.failed"yes
dataobject ExecutionErroryes

Used by EventHistory

ExecutionId

string

The identity of one execution: x-<UTC timestamp>-<8 hex>.

The shape is the layer's own — a task is t-20260905034523-a9f1 — so that an id read in a log, a URL or a browser tab is recognisable as this repository's without a dependency on a UUID crate. The timestamp orders ids by creation for a reader; the suffix, not the timestamp, is what makes two ids created in the same second differ.

Used by ExecutionEvent ExecutionView

ExecutionList

object

The answer of executions.list.

propertytyperequireddescription
count integer (uint) yes How many are answered here.
remembered integer (uint) yes How many this process remembers in total, before the filter.
active integer (uint) yes How many are not finished.
queued integer (uint) yes How many are waiting for a worker.
live_channels integer (uint) yes How many live channels are following them.
executions array of ExecutionView ExecutionView yes The executions, newest first.

Used by executions.list

ExecutionPolicy

object

What running a capability as an execution means: what it changes, whether asking it to stop achieves anything, and whether two of them may overlap.

The effect and the concurrency are classified from the kind by [ExecutionPolicy::classify], for the same reason [Availability] is: the facts are already on the declaration, and asking each capability! block to restate them would be one more thing that can disagree with itself.

Cancellability is the one thing the kind cannot decide, because it is a fact about the handler: whether it looks at its cancellation flag and stops. A handler that does says so with [crate::capability::Executable::cancellable], and a client is then told whether a Cancel button will achieve anything instead of being given one that lies.

propertytyperequireddescription
effect ExecutionEffect ExecutionEffect yes What it changes.
cancellable boolean yes Whether asking it to stop does anything. A task looks at its cancellation flag; a query and a command do not, and a client is told so rather than being given a button that lies.
concurrency ExecutionConcurrency ExecutionConcurrency yes Whether two of them may overlap.

Used by Capability

ExecutionState

"queued" | "running" | "cancelling" | "succeeded" | "failed" | "cancelled"

Where an execution is in its life.

The transitions are the whole contract, and [ExecutionState::may_move_to] is the one place they are written down: the engine asks before every change, the store refuses a move it did not allow, and a client that reads a final state never sees it move again.

  queued ──► running ──┬──► succeeded
     │                 ├──► failed
     │                 └──► cancelling ──┬──► cancelled
     │                                   ├──► succeeded
     └──► cancelled                      └──► failed

There is no starting. An in-process engine claims an execution and enters its handler in the same instant, so a state between the two would be one no client could ever observe and every client would have to handle.

  • queuedAccepted, and no worker has picked it up.
  • runningThe handler is running.
  • cancellingCancellation was asked for and the handler has not stopped yet.
  • succeededThe handler returned an output.
  • failedThe handler returned an error, or the worker could not run it.
  • cancelledIt stopped because it was asked to.

Used by executions.list EventHistory ExecutionView

ExecutionView

object

One execution with the links to everything else about it.

propertytyperequireddescription
id ExecutionId ExecutionId yes The identity.
capability string yes The capability that ran, by its canonical id.
title string yes That capability's title, so a list needs no second lookup.
state ExecutionState ExecutionState yes Where it is.
created_at string yes When it was accepted, RFC 3339 in UTC.
started_at string | null no When the handler was entered.
finished_at string | null no When it reached a final state.
duration_ms integer | null no How long it ran, in milliseconds, once it has finished.
input any yes The input it was given, with every value the input schema marks sensitive replaced.
output any no What the handler returned, for a succeeded execution and never before.
error ExecutionError | null ExecutionError no Why it failed, for a failed execution and never before.
progress ProgressView | null ProgressView no The last progress the handler reported.
steps array of StepView StepView no The steps it entered, in order.
diagnostics array of ExecutionDiagnostic ExecutionDiagnostic no The findings it reported.
last_sequence integer (uint64) yes The sequence number of the last event: the cursor a client subscribes from.
event_count integer (uint64) yes How many events it has produced, including the ones no longer retained.
events_truncated boolean yes Whether the retained event history has lost its oldest entries to the bound.
cancellable boolean yes Whether asking to cancel this execution will do anything: the capability's policy.
actor Actor Actor yes Who asked for it.
repository RepositoryRef RepositoryRef yes Which repository it ran against.
correlation_id string yes The id used in this process's logs and tracing spans for this execution; the execution id itself, carried under the name a reader of a log expects.
links ExecutionLinks ExecutionLinks yes Where to read more.

Used by executions.get executions.start CancelReport ExecutionList

Exemption

object

A group of items the example policy does not apply to, with the reason it does not.

propertytyperequireddescription
reason string yes The reason, as the policy names it.
items integer (uint) yes How many items it covers.

Used by PublicApiQuality

Exposure

object

The projections a capability declares. Absence is explicit: None means not exposed there, and nothing infers an exposure a descriptor did not declare.

propertytyperequireddescription
mcp McpExposure | null McpExposure no The MCP projection, when declared.
http HttpExposure | null HttpExposure no The HTTP projection, when declared.
cli CliExposure | null CliExposure no The command-line projection, when declared.

Used by Capability CapabilitySummary

FacetValue

object

One selectable value of one facet, with how many public moments carry it. Every filter a reader is offered is one of these; nothing anywhere lists the values by hand.

propertytyperequireddescription
value string yes The value as a moment declares it.
label string yes The name to show; the value itself when the taxonomy holds no title for it.
count integer (uint) yes How many public moments carry it.

Used by Facets

Facets

object

The filters the catalogue offers, derived from the records rather than declared.

propertytyperequireddescription
audiences array of FacetValue FacetValue yes By audience.
areas array of FacetValue FacetValue yes By operational area.
tags array of FacetValue FacetValue yes By tag.
severities array of FacetValue FacetValue yes By severity.
frequencies array of FacetValue FacetValue yes By frequency.
lifecycle array of FacetValue FacetValue yes By stage of work.
capabilities array of FacetValue FacetValue yes By capability of the executable.
commands array of FacetValue FacetValue yes By command.

Used by CatalogueView

Fact

boolean | integer (int64) | string | array of string

One fact a node carries from its object's front matter, in the shapes a node can hold.

Used by Node

Feature

"mcp" | "cockpit"

A capability of the running process a surface needs in order to exist.

The registry describes the effective process, not the maximum one: a build or an invocation that answers no MCP has no MCP surface, and the home page cannot link to one. Stating the dependency as data is what keeps that automatic.

  • mcpThis process answers MCP over HTTP.
  • cockpitThis process serves the Cockpit.

Used by Surface

FeatureCounts

object

How much stands behind a feature, every number derived.

propertytyperequireddescription
capabilities integer (uint) yes Builtin capabilities of the modules it names.
mcp_tools integer (uint) yes MCP tools among them.
mcp_resources integer (uint) yes MCP resources among them, plus one per object of the kinds it names.
http_routes integer (uint) yes HTTP routes among them.
cli_paths integer (uint) yes Command-line paths of the executable among them.
commands integer (uint) yes Public commands of the shell tool it names.
objects integer (uint) yes Objects of the kinds it names.
rules integer (uint) yes Rules it names.
enforced_rules integer (uint) yes Rules the tool enforces among them.
docs integer (uint) yes Documents it names.
adrs integer (uint) yes Decisions it names.
claims integer (uint) yes Claims it names.
use_cases integer (uint) yes Use cases it names.
moments integer (uint) yes Moments it answers.

Used by FeatureSummary ResolvedRefs

FeatureEvidence

object

What is guaranteed about a feature, counted from the claims it names: never a word a person wrote about the feature's maturity.

propertytyperequireddescription
claims map of integer (uint) yes Claims by status: guaranteed, advisory, planned, rejected.
modules map of integer (uint) yes The modules it names by stability.

Used by FeatureSummary ResolvedRefs

FeatureList

object

The features as a client reads them.

propertytyperequireddescription
schema string yes [SCHEMA].
fingerprint string yes The hash of the model's sources and derived facts.
counts ProductCounts ProductCounts yes The counts.
surfaces array of SurfaceInfo SurfaceInfo yes The surface vocabulary, with how many stable features each exposes.
features array of FeatureSummary FeatureSummary yes The matching features, in presentation order.

Used by product.features

FeatureSummary

object

One feature as a listing shows it: everything a card needs and nothing a page needs.

propertytyperequireddescription
id string yes The identity and the slug.
title string yes The feature as a heading.
label string yes The name a narrow column shows: the short title, or the title.
headline string yes The promise a visitor reads first.
summary string yes One line: what it does.
status string yes stable, draft or deprecated.
weight integer (uint32) yes Presentation order.
featured boolean yes Whether the homepage shows it.
areas array of string yes The operational areas it serves.
audiences array of string yes The audiences it is written for.
tags array of string yes Free tags.
route string yes Derived: /features/<id>/.
surfaces Surfaces Surfaces yes Derived: the interfaces it is exposed through.
counts FeatureCounts FeatureCounts yes Derived: how much stands behind it.
evidence FeatureEvidence FeatureEvidence yes Derived: what is guaranteed.

Used by FeatureList

FieldSource

object

Where one field of the snapshot came from. This is what makes an inferred system debuggable: every fact can name the thing that decided it, so "why does it say that" is answered by the tool rather than by reading its source.

propertytyperequireddescription
field string yes The field, in dotted form: services.cockpit.url, vcs.branch.
value string | null no The value as it appears in the snapshot, rendered for a person; absent for a field that resolved to nothing.
source string yes What decided it: a file, a command, a compile-time constant, the cache.
resolver string yes The part of this executable that read it.
confidence Confidence Confidence yes How certain the value is.

Used by EnvironmentProvenance RepositoryEnvironment

Finding

object

One thing wrong with the catalogue, named where it is, with the nearest candidate when there is one. A finding always carries enough to fix it without searching.

propertytyperequireddescription
severity Severity Severity yes error or warning.
code string yes A short category: unknown_reference, duplicate_identity, missing_content, ...
path string yes The repository-relative file the finding is in.
id string | null no The record's identity, when one record owns the finding.
field string | null no The front-matter key the finding is about, when one key owns it.
message string yes What is wrong, in one sentence.
did_you_mean string | null no The nearest existing name, when the value looks like a typo of one.

Used by ValidationReport

Fixtures

object

The fixtures category: where fixtures live and how large one may be.

propertytyperequireddescription
paths array of string no Pathspecs anchored at the repository root.
names array of string no Patterns matched against the file name alone.
max_bytes integer (uint64) yes A fixture over this many bytes is out.

Used by Out

Fly

object

Fly.io's own facts: what has no meaning for any other provider.

propertytyperequireddescription
org string | null no The organisation the application belongs to.
force_https boolean | null no Whether the edge redirects plain HTTP to HTTPS.
concurrency Concurrency | null Concurrency no When the edge considers a machine loaded.

Used by Provider

GitInfo

object

What git said about the repository.

propertytyperequireddescription
toplevel string yes Absolute path of the work tree top level.
head string | null no Full commit id of HEAD, or None in an unborn repository.
branch string | null no Branch name, or None when detached or unborn.
working_tree string yes clean or dirty, from git status --porcelain.

Used by GitState

GitState

one of 2 variants

What git says about the repository, or why it could not be asked.

variant `git` answered; the facts follow.

state"available"yes

variant `git` could not be asked, or the root is not a work tree; the reason says which.

reasonstringyesWhat `git` said, or why it could not be run.
state"unavailable"yes

Used by RepositoryInfo

GitWorkingTree

object

The state of one work tree, as porcelain v2 reports it.

propertytyperequireddescription
head string | null no The commit HEAD names, or None in a repository with no commits yet.
branch string | null no The branch, or None when HEAD is detached or unborn.
detached boolean yes Whether HEAD names a commit directly rather than a branch.
upstream string | null no The upstream the branch tracks, when it tracks one.
ahead integer | null no Commits this branch has that its upstream does not; None without an upstream.
behind integer | null no Commits the upstream has that this branch does not; None without an upstream.
staged integer (uint32) yes Tracked files with staged changes.
modified integer (uint32) yes Tracked files changed in the work tree and not staged.
untracked integer (uint32) yes Files git does not track and is not ignoring.
conflicted integer (uint32) yes Files with an unresolved merge.
clean boolean yes Whether nothing at all is staged, modified, untracked or conflicted.
changed_paths array of string no Every path that is not clean, repository-relative, in git's order. Used to decide whether the cached tier is still valid, and shown to nobody.

Used by VcsState

Graph

object

A derived graph: what it is, where it came from, what its vocabularies mean, and the nodes and edges themselves.

propertytyperequireddescription
id string yes The identity, [a-z][a-z0-9-]*; the last segment of its route.
title string yes The short name.
description string yes One paragraph: what a reader learns from it.
source string yes What it was derived from, in the repository's own words.
node_kinds map of string yes Node kind to what that kind means.
edge_kinds map of string yes Edge kind to what that edge asserts.
nodes array of Node Node yes Sorted by id.
edges array of Edge Edge yes Sorted.
metadata GraphMetadata GraphMetadata yes Counts and invariants.

Used by graph.get

GraphInfo

object

One graph the executable can derive: what it is, without deriving it.

propertytyperequireddescription
id string yes The identity.
title string yes The short name.
description string yes One paragraph.
source string yes What it is derived from.

Used by GraphList

GraphList

object

Every graph this executable derives.

propertytyperequireddescription
count integer (uint) yes How many.
graphs array of GraphInfo GraphInfo yes Each, described but not derived.

Used by graph.list

GraphMetadata

object

What a reader needs to know about the graph as a whole before drawing it.

propertytyperequireddescription
nodes integer (uint) yes How many nodes.
edges integer (uint) yes How many edges.
acyclic boolean yes Whether the edges form a directed acyclic graph. Derived, never declared: a graph whose contract is a DAG and whose answer here is false is a defect in the data.
truncated boolean yes True when the derivation stopped at [MAX_NODES] and the graph is a prefix of what the repository holds.

Used by Graph

Health

object

The health of what this process serves.

propertytyperequireddescription
status HealthStatus HealthStatus yes The worst check's status.
tallies map of integer (uint) yes How many checks stand where, by status word.
checks array of HealthCheck HealthCheck yes Every dimension, in a stable order.

Used by health.report

HealthCheck

object

One dimension of the system, decided by one engine, with what a reader needs to check it themselves.

propertytyperequireddescription
id string yes A stable id, [a-z][a-z0-9-]*.
title string yes The short name.
status HealthStatus HealthStatus yes Where it stands.
detail string yes One line: what the engine decided and on what.
decided_by string yes The engine that decided it, named so the reader knows what to fix.
evidence array of string no What reproduces the verdict: a command, or a path.
findings array of string no Findings behind the verdict, when the engine produced any: the diagnostic messages, the stale files, the missing coverage lines.

Used by Health

HealthRoutes

object

The routes a platform polls, and how often.

propertytyperequireddescription
liveness Route Route yes Is this process alive.
readiness Route Route yes Can this process serve traffic.
grace_seconds integer | null no How long the platform waits before the first check counts.
interval_seconds Positive | null Positive no How often the platform polls liveness.
timeout_seconds Positive | null Positive no How long one check may take before it counts as failed.

Used by DeploymentView

HealthStatus

"ok" | "warn" | "fail" | "unknown"

Where one dimension of the system stands. Ordered by severity, so the worst check decides the whole.

  • okThe engine that decides this dimension is satisfied.
  • warnNothing is broken and something is worth looking at.
  • failThe engine that decides this dimension is not satisfied.
  • unknownThis process cannot decide it, and says so rather than reporting `ok`.

Used by Health HealthCheck Readiness

HttpExposure

object

How a capability appears over HTTP. GET binds every top-level input property as a query parameter; POST binds the input as the JSON request body. Paths are absolute and live under [HttpExposure::PREFIX].

propertytyperequireddescription
method HttpMethod HttpMethod yes The method.
path string yes The absolute path, under [HttpExposure::PREFIX].

Used by Exposure

HttpMethod

"GET" | "POST"

The HTTP methods a capability may be bound to.

  • GETRead-only; the input is bound from the query string.
  • POSTThe input is bound from the JSON body. No builtin uses it yet.

Used by HttpExposure

InspectReport

object

One branch, inspected: where its work tree belongs and what is there.

propertytyperequireddescription
branch string yes The branch asked about.
branch_exists boolean yes The branch exists locally.
expected_path string yes Where its work tree belongs.
destination_exists boolean yes Something exists at that path.
worktree WorktreeState | null WorktreeState no The work tree that holds the branch, when one does.
canonical boolean yes The branch is checked out at its canonical path.
diagnostics array of TopologyDiagnostic TopologyDiagnostic yes What stands in the way, if anything.

Used by worktree.inspect

InstallCheck

object

One check: what was asked, what was seen, and — when it does not hold — why, and the command that changes it. The cause and next fields exist so that a report is actionable without a second document; a check that fails without naming its remedy is a diagnostic nobody can act on.

propertytyperequireddescription
id string yes A short stable name: model, version, targets, release, artifacts, metadata.
state CheckState CheckState yes Whether it holds.
observed string yes What was observed, in one line.
cause string | null no Why it does not hold. Absent when it does.
next string | null no The command or action that would change it. Absent when there is nothing to do.

Used by InstallabilityReport

InstallabilityReport

object

Whether the advertised one-line installation works right now, and if not, what is missing.

This answers the operator's actual question — can a machine that has never seen this project install it with the published command? — from local state alone. It performs no network access: a repository can be offline and this still answers, because everything it needs is the distribution model and the release records the repository itself carries. What it cannot see it reports as unknown rather than guessing; the public half of the question is answered by the release workflow's smoke phase, which installs from the published URL on every native runner and is the only thing that proves the public path.

propertytyperequireddescription
installable boolean yes True when every check holds: a stable release is recorded and complete.
summary string yes One line for a person: what the state is, in the project's own terms.
local_version string yes The version this tree would release.
stable_tag string | null no The tag an unpinned installation resolves to, when a stable release is recorded.
required_targets integer (uint) yes How many targets a release must publish for that release to be complete.
published_artifacts integer (uint) yes How many of them the stable release actually publishes.
install_command string yes The command a person would run, whether or not it currently works.
installer_url string yes Where the installer is served.
latest_url string yes Where the stable pointer is served.
checks array of InstallCheck InstallCheck yes Every check, in the order they are worth reading.

Used by distribution.status

Integration

"open" | "merged" | "absorbed" | "unknown"

How a branch stands to the trunk, which is what decides which commits are its own.

  • openNot reachable from the trunk: its commits are the ones the trunk does not have.
  • mergedReachable from the trunk through a merge commit, which the trace names: its commits are the ones that merge brought in.
  • absorbedReachable from the trunk with no merge commit of its own — fast-forwarded, or rebased onto it. Its commits cannot be told from the trunk's and none are claimed.
  • unknownThe trunk is unknown, so there is nothing to measure the branch against.

Used by BranchTrace

Interface

"loopback" | "all"

Which interface a process listens on.

  • loopbackReachable from this host alone: the local default, and what every local invocation keeps.
  • allEvery interface. A hosted process needs it and a local one never does; stating it is the intent that replaces suppressing the bind warning.

Used by Listen

IssueTrace

object

Everything git knows about one issue's realisation.

propertytyperequireddescription
issue string yes The issue id, as the project model spells it.
declared boolean yes True when the project model declares this id. False is not an error and not an empty answer: it says the id was looked for and the model does not have it, which a caller must be able to tell apart from "declared, and nothing has realised it yet". A repository with no project model at all answers false for every id rather than refusing, because the branches naming an id are still derivable there.
milestone string | null no The milestone the canonical issue record names. Git does not hold this edge and nothing here derives it: the caller with the index fills it in, and it is null in a repository whose issue record does not name one.
trunk string | null no The trunk every branch was measured against.
branches array of BranchTrace BranchTrace yes The branches that name it, local first.
commits integer (uint) yes How many distinct commits the branches hold between them.
complete boolean yes True when every branch's commits could be derived. False when at least one reached the trunk without a merge commit, so part of the work is not distinguishable.

Used by trace.issue TraceReport

KindCount

object

How many valid objects of one kind the layer holds.

propertytyperequireddescription
kind string yes The kind, as share/kinds.yaml declares it.
count integer (uint) yes How many objects of it the index holds.

Used by LayerSummary

KindRef

object

One object kind the feature names, with how many objects of it the layer holds.

propertytyperequireddescription
name string yes The kind.
objects integer (uint) yes Objects of this kind in the index.

Used by ResolvedRefs

LayerSummary

object

What the layer holds, counted per kind, plus the registry the executable composes. Every number here comes from the index — the same objects every other surface serves — and never from counting files that match a pattern: a file that does not parse is not a rule, and a count that says otherwise is a lie a person acts on.

propertytyperequireddescription
state TierState TierState yes Where these numbers came from.
kinds array of KindCount KindCount no One entry per kind present, sorted by kind.
objects integer | null no How many objects the index holds.
capabilities integer | null no How many capabilities the registry holds.
invalid integer | null no How many files the layer declared that did not become objects.
degraded boolean | null no Whether the layer read cleanly.

Used by RepositoryEnvironment

Libc

"gnu" | "musl"

The C library a Linux artifact is linked against.

  • gnuGNU libc: the ordinary distributions.
  • muslmusl: Alpine, and any statically linked artifact.

Used by TargetView

LimitsView

object

What this process's execution store keeps.

propertytyperequireddescription
max_executions integer (uint) yes How many executions are remembered.
max_events integer (uint) yes How many events are retained per execution.
max_log_chars integer (uint) yes The longest a single log line may be.
max_running integer (uint) yes How many executions run at once.
max_subscriber_queue integer (uint) yes How far a live channel may fall behind before it is told to resynchronise.

Used by ProtocolReport

Listen

object

The address the process listens on.

propertytyperequireddescription
port Port Port yes The port, stated once for the process, the image and the provider configuration.
interface Interface Interface yes Which interface.

Used by DeploymentView

Liveness

object

The answer to "is this process alive": the cheapest true thing this executable can say about itself. Deliberately not a summary of anything — a probe that grew an opinion would stop reporting the one fact the platform polls it for.

propertytyperequireddescription
alive boolean yes Always true. A process that could not answer would not answer at all, which is the signal.
version string yes This executable's version, so a rolling deployment can tell which build answered.

Used by health.live

LogStream

"stdout" | "stderr" | "handler"

Which stream a log line came from.

  • stdoutThe standard output of a child process the handler ran.
  • stderrIts standard error.
  • handlerThe handler itself, saying something it wants a reader to see.

Used by ExecutionEvent

Machines

object

How many machines run, and whether the platform may stop them.

propertytyperequireddescription
count Positive Positive yes How many machines the application has.
min_running integer (uint32) yes How many stay running when idle.
autostart boolean yes Whether a request to a stopped machine starts it.
autostop boolean yes Whether an idle machine is stopped.

Used by DeploymentView

Match

"same_worktree_same_branch" | "same_branch"

Which tier of the resolution rule matched. There is no third tier on purpose: a record from an unrelated worktree or branch is never offered.

  • same_worktree_same_branchSame repository, same worktree, same branch.
  • same_branchSame repository, same branch, another worktree of it.

Used by Record

Matrix

object

Every feature against every interface, and every module, command and kind against the features that name it.

propertytyperequireddescription
schema string yes [SCHEMA].
surfaces array of SurfaceInfo SurfaceInfo yes The surface vocabulary.
rows array of MatrixRow MatrixRow yes One row per feature of any status but deprecated, in presentation order.
modules array of ProductCoverage ProductCoverage yes Every builtin module of the executable with the stable features that name it.
commands array of ProductCoverage ProductCoverage yes Every public command of the shell tool with the stable features that name it.
kinds array of ProductCoverage ProductCoverage yes Every kind of the layer a feature can present, with the stable features that name it.

Used by product.matrix

MatrixRow

object

One row of the matrix: a feature and the surfaces it is exposed through.

propertytyperequireddescription
id string yes The feature id.
label string yes The name a narrow column shows.
route string yes /features/<id>/.
status string yes stable or draft.
surfaces Surfaces Surfaces yes The surfaces, by id, in the vocabulary's order.
exposed array of string yes The surface ids that are true.

Used by Matrix

McpExposure

object

How, if at all, a capability appears to an MCP client.

propertytyperequireddescription
tool string | null no As a tool with this name ([a-z0-9_]+).
resource McpResource | null McpResource no As a readable resource.

Used by Exposure

McpResource

object

An MCP resource: its URI and the short name a client lists.

propertytyperequireddescription
uri string yes majordomus://<kind>/<identity>, or majordomus://repository.
name string yes The short name a client lists; the identity for a declarative object.

Used by McpExposure

MigrationAction

"move" | "move_via_staging" | "copy_and_repair" | "none"

How a step moves its worktree.

  • moveOne `git worktree move`.
  • move_via_stagingThe worktree is the container itself: out to a staging path, then into the container.
  • copy_and_repairThe move crossed devices: copy, `git worktree repair`, verify, remove the original.
  • noneNothing: the step is blocked.

Used by MigrationStep

MigrationPlan

object

A migration, planned or applied.

propertytyperequireddescription
schema string yes [SCHEMA].
container string yes The container everything moves into.
steps array of MigrationStep MigrationStep yes One step per misplaced worktree with a branch, container occupants first.
exceptions array of TopologyDiagnostic TopologyDiagnostic yes Worktrees the migration cannot address by design: detached, missing, the primary checkout off the trunk. Each says what a person does about it.
movable integer (uint) yes Steps that can be carried out as things stand.
blocked integer (uint) yes Steps that cannot.
moved integer (uint) yes Steps carried out and verified.
failed integer (uint) yes Steps attempted and not verified.
applied boolean yes Whether anything was changed.
moved_current string | null no The new path of the worktree the command was run from, when that one moved.

Used by worktree.migration_plan

MigrationStep

object

One worktree to bring home.

propertytyperequireddescription
branch string yes The branch it holds.
from string yes Where it is.
to string yes Where it belongs.
head string | null no The commit checked out.
action MigrationAction MigrationAction yes How it moves.
dirty DirtyState DirtyState yes Its uncommitted work, which moves with it.
blockers array of TopologyDiagnostic TopologyDiagnostic yes Why it cannot move, when it cannot.
outcome StepOutcome StepOutcome yes What happened.
message string | null no What happened, in words, when it was not simply moved.
before WorktreeFingerprint | null WorktreeFingerprint no The fingerprint before the move.
after WorktreeFingerprint | null WorktreeFingerprint no The fingerprint after it.
differences array of string yes What differs between the two; empty when verified.
envrc EnvrcApproval | null EnvrcApproval no What became of its .envrc under direnv once it was at its new path: the primary checkout's approval carried there, or why it was not. Only on a moved step.

Used by MigrationPlan

ModuleId

string

A module identity: the namespace of every capability the module composes, matching [a-z][a-z0-9_-]*. Builtin modules declare theirs in module!; a declarative object's module is its kind.

Used by Capability CapabilitySummary

ModuleQuality

object

What the exported module surface looks like.

propertytyperequireddescription
modules integer (uint) yes Modules the crate exports, the crate root included.
documented integer (uint) yes Of those, how many carry a //! header.
exampled integer (uint) yes How many carry an executable example in that header.
behaviourally_tested integer (uint) yes How many something exercises: an in-file test, or a test that names them.

Used by QualityReport

ModuleRef

object

One capability module the feature names.

propertytyperequireddescription
id string yes The module id.
title string yes The short name.
description string yes One paragraph.
stability string | null no Where the module stands, when it declared it.
source_path string yes Repository-relative path of the file its descriptors were composed in.
capabilities array of CapabilityRef CapabilityRef yes The builtin capabilities it composes, in id order.

Used by ResolvedRefs

MomentDetail

object

One moment in full, with everything derived that a page shows and no file states.

propertytyperequireddescription
id string yes The identity, the slug and the file name.
title string yes The moment as a heading.
short_title string | null no Two or three words for a narrow column, when the record carries one.
hook string yes The first-person line an index shows.
summary string yes One line: what is actually wrong.
status string yes stable, draft or deprecated.
severity string yes low, medium or high.
frequency string yes rare, occasional, common or constant.
weight integer (uint32) no Presentation order, lowest first.
featured boolean no Whether the homepage shows it.
audiences array of string yes The audiences that recognise it.
areas array of string yes The operational areas it falls under.
lifecycle array of string no The stages of work at which it shows up.
tags array of string no Free tags.
signals array of Signal Signal yes The observable symptoms.
examples array of Example Example yes The concrete situations.
commands array of string no Commands of the tool that answer it.
capabilities array of string no Capability ids of the executable that answer it.
claims array of string no Claims that say what is guaranteed here.
doctrines array of string no Rules of the effective set that govern it.
use_cases array of string no Use cases that show the way out.
related array of string no Moments explicitly related to this one. The reverse is derived.
aliases array of string no Other words a reader might search for.
route string no Derived: /why/<id>/. Never authored; the schema refuses a route key.
source string no Derived: the repository-relative file the record came from.
body string no The Markdown body, without its front matter.
responsibilities array of string yes Derived: the responsibilities the claims it names belong to.
backlinks array of string yes Derived: the moments that name this one in their related.
similar array of string yes Derived: moments sharing an area or an audience with this one and not already named by it, nearest first — most shared metadata, then presentation order.
related_detail array of MomentSummary MomentSummary yes Derived: the explicitly related moments, summarised so a page needs one call.
neighbours array of string yes Derived: what a reader should see next, in one list and in a stated order — what this moment names, then what names it, then what is nearest by shared metadata, each appearing once. The three lists above are the same relations kept apart for a reader that wants to know which is which.

Used by why.moment

MomentRef

object

One operational moment the feature answers: derived from the moments that name any of the feature's commands, capabilities, claims or rules.

propertytyperequireddescription
id string yes The moment id.
title string yes The title.
hook string yes The first-person line an index shows.
route string yes /why/<id>/.

Used by ResolvedRefs

MomentSummary

object

One moment as a listing shows it: everything a card needs and nothing a page needs.

propertytyperequireddescription
id string yes The identity and the slug.
title string yes The moment as a heading.
label string yes The name a narrow column shows: the short title, or the title.
hook string yes The first-person line an index shows.
summary string yes One line: what is actually wrong.
status string yes stable, draft or deprecated.
severity string yes low, medium or high.
frequency string yes rare, occasional, common or constant.
weight integer (uint32) yes Presentation order.
featured boolean yes Whether the homepage shows it.
audiences array of string yes The audiences that recognise it.
areas array of string yes The operational areas it falls under.
tags array of string yes Free tags.
route string yes Derived: /why/<id>/.
signals integer (uint) yes How many observable symptoms it declares.
examples integer (uint) yes How many concrete situations it carries.

Used by CatalogueView MomentDetail

Mount

string

An absolute mount path, without a trailing slash.

Used by Surface

Node

object

One node. id is unique within the graph; kind is what the graph's node_kinds declares it to be; route is where the Cockpit shows the thing itself, when it shows it anywhere.

propertytyperequireddescription
id string yes Unique within the graph.
kind string yes One of the graph's declared node kinds.
label string yes The short label a renderer draws.
summary string | null no One line about the thing, when the source holds one.
route string | null no Where the Cockpit shows this thing, when it shows it.
source string | null no The repository-relative file the node was derived from, when one file owns it.
status string | null no A status word the graph's own vocabulary defines (accepted, active, query).
external boolean no True when the node stands for something the graph names but does not hold: a reference that resolves to nothing in this repository.
facts map of Fact Fact no What the object's own kind declares about it, as its schema validated it: the fields of its front matter that are facts about the thing rather than the document itself. A rule carries its class and its statement, a skill its inputs and outputs, a decision its date — the vocabulary that makes each kind worth having, rather than the four fields every kind happens to share.

Used by Graph

ObjectList

object

The answer of objects.list: the matching objects, summarised, in URI order.

propertytyperequireddescription
count integer (uint) yes How many objects matched.
objects array of ObjectSummary ObjectSummary yes The objects, one summary each.

Used by objects.list

ObjectProvenance

object

Where an object came from. Every field is computed from the repository, never authored.

propertytyperequireddescription
path string yes Repository-relative path, forward slashes, as the version-control index names it.
directory string yes The directory the path sits in, repository-relative; . for the root. This is the hierarchy position a client orders by; no merge semantics are implied.
source_class string yes The sources.yaml class that discovered the file (rule, readme, ...).
section string | null no The manifest section the path falls under (rules, prompts, ...), when it falls under one; a root README.md falls under none.
bytes integer (uint64) yes Size of the file in bytes.
member string | null no For an object that is one member of a collection file: the member's key path in the file (claims.3).

Used by ObjectView

ObjectStanding

"current" | "changed" | "missing" | "unreadable"

How one file stands against what the index read from it.

  • currentIt is what the index read.
  • changedIt is there and it has changed since the index was built.
  • missingThe file the index read is no longer there.
  • unreadableIt is there and could not be read.

Used by DriftedObject

ObjectSummary

object

One object, summarised for a listing.

propertytyperequireddescription
uri string yes majordomus://<kind>/<identity>.
id string yes The capability id, <kind>.<identity>.
kind string yes The kind the object was read as.
identity string yes The identity within the kind.
title string | null no The title, when the kind's title rule found one.
description string | null no The one-line description, when the kind holds one.
path string yes Repository-relative source path.

Used by ObjectList

ObjectView

object

One declarative object of the repository's layer, as a client reads it.

propertytyperequireddescription
uri string yes majordomus://<kind>/<identity>.
id string yes The capability id, <kind>.<identity>.
kind string yes The kind the object was read as (rule, prompt, document, ...).
identity string yes The identity within the kind (majordomus.scope-integrity@1, continue, a path).
title string | null no The title the kind's title rule found, when it found one.
description string | null no The one-line description the kind's description field held, when it held one.
metadata any yes The parsed front matter or YAML, keys in the file's order.
provenance ObjectProvenance ObjectProvenance yes Where the object came from: path, directory, source class, section, size, member.
media_type string yes IANA media type of content (text/markdown, application/yaml, application/json, text/plain).
content string yes The file as read.

Used by ResourceView

Obligation

object

One token a task may declare in requires, as the distribution ships it.

remote and inputs are what decide how its evidence is judged, and they are the file's decision rather than this reader's: a fact the working tree cannot establish is bound to the commit it was taken at, and everything else is bound to the bytes of the files its pathspecs select.

use majordomus_cli::capability::builtin::obligations::Obligation;
let push: Obligation = serde_json::from_str(
    r#"{"id":"push","title":"The commit reached the remote",
        "summary":"The branch's head exists on the remote it tracks.",
        "discharged_by":"git","remote":true}"#,
)
.unwrap();
assert!(push.remote);
assert!(push.inputs.is_empty(), "a remote fact is bound to a commit, not to a tree");

propertytyperequireddescription
id string yes The token, as a task's requires names it.
title string yes The obligation as a heading.
summary string yes What a worker is being asked to have done.
discharged_by string yes The command that produces the evidence. none for a token held by another line of the contract and listed so that a report can say it rather than leave a hole.
inputs array of string no The pathspecs the evidence is hashed over. Empty for a token whose fact is remote, and empty for one bound to neither: see [ObligationClosure::staleness].
remote boolean yes True when the fact cannot be established from the working tree alone — a push, a publication, a deployment. Such evidence is bound to a commit, not to a tree.
note string no What the vocabulary says about the token beyond its summary.

Used by Vocabulary

ObligationClosure

object

One obligation the task declared, joined with what the vocabulary says about it and with the evidence that does or does not discharge it.

The vocabulary's fields are repeated here on purpose: a client asking what this task owes gets the token's title, its summary and the command that would discharge it in the same answer, and needs no second call to render a report.

use majordomus_cli::capability::builtin::obligations::{ObligationClosure, ObligationState};
let owed: ObligationClosure = serde_json::from_str(
    r#"{"id":"pages","title":"The published site serves this commit","remote":true,
        "state":"owed","detail":"owed, and no evidence was recorded",
        "reproduce":"majordomus evidence --covers pages --command 'scripts/pages verify'"}"#,
)
.unwrap();
assert_eq!(owed.state, ObligationState::Owed);
assert!(owed.evidence.is_none() && owed.staleness.is_none(), "nothing to label");
assert!(owed.reproduce.starts_with("majordomus evidence"), "a finding carries its repair");

propertytyperequireddescription
id string yes The token, as the task's requires names it.
title string yes From the vocabulary; the token itself when it declares none.
summary string no From the vocabulary.
discharged_by string no From the vocabulary: the command that produces the evidence.
remote boolean yes From the vocabulary: whether the fact is remote.
inputs array of string no From the vocabulary: the pathspecs the evidence is hashed over.
state ObligationState ObligationState yes Where it stands.
staleness Divergence | null Divergence no How far the evidence is from this checkout, in the repository's one staleness vocabulary. None when there is no evidence to label.

A remote fact is labelled against the commit it was taken at, because the site that serves a commit goes on serving it while the tree moves underneath. A tree-bound fact is labelled by re-hashing: equal hashes are exact, and a difference takes the commit's label, which is advanced when the working tree has merely moved on and diverged when the history it named is gone. A token that declares neither inputs nor a remote fact is bound to nothing and stays exact once recorded — that is the validator's behaviour, and it is reproduced rather than tightened here.

evidence Evidence | null Evidence no The line that discharged it, or None.
inputs_hash_now string | null no What the token's inputs hash to in this tree now — the other half of "stale against what". None for a token that declares no inputs, and None when git could not be asked which files they select.
inputs_files integer | null no How many tracked files that hash was taken over. Reported because the shell's selection and this one are not always the same set — see the module header — and a count is the cheapest way for a reader to see it rather than be told it.
detail string yes One line: what this obligation's standing actually is, in the words the validator uses when it refuses.
reproduce string yes The command that would discharge it. Every finding here carries the way to act on it, as project.finding-carries-reproduce asks.

Used by Closure

ObligationState

"owed" | "discharged" | "stale" | "undeclared"

Where one obligation stands.

The words are the validator's verdicts, not a severity scale: stale is not a worse owed, it is evidence that was true and no longer describes what it proved.

use majordomus_cli::capability::builtin::obligations::ObligationState;
// only one of the four lets a task be called completed
let completable = |s: ObligationState| s == ObligationState::Discharged;
assert!(completable(ObligationState::Discharged));
assert!(!completable(ObligationState::Stale), "evidence that no longer describes the tree");
assert!(!completable(ObligationState::Owed));
assert!(!completable(ObligationState::Undeclared));

  • owedDeclared, and no evidence for it was ever recorded.
  • dischargedEvidence exists and still describes this tree, or this commit.
  • staleEvidence exists and no longer describes what it proved: the inputs changed, or the commit it named is not this one.
  • undeclaredThe task requires a token the shipped vocabulary does not declare. Nothing can discharge it, because nothing knows what would.

Used by ObligationClosure

OpenSession

object

The open episode of this worktree, when there is one.

propertytyperequireddescription
session_id string yes The episode's id.
started_at string yes When it opened.
owner string no Who opened it.
worker string no The worker identity, when one was supplied. Never inferred.
provider string no The provider whose event opened it, when one did.
branch string no The branch it opened on.
start_head string no The commit it opened at.
foreign boolean yes True when the open record here belongs to another checkout. Such a record is reported and never treated as this checkout's episode.

Used by Continuity

OperationParity

object

What the canonical operations look like against the transports that project them.

propertytyperequireddescription
canonical integer (uint) yes Executable capabilities in the registry.
cli integer (uint) yes Of those, how many declare a command-line projection.
http integer (uint) yes How many declare an HTTP route.
openapi integer (uint) yes How many the OpenAPI document describes.
mcp integer (uint) yes How many declare an MCP tool.
cli_commands integer (uint) yes Commands of the command line, leaves and runnable parents.
cli_from_capability integer (uint) yes Of those, how many are the projection of a capability.
cli_local integer (uint) yes How many are declared to belong to the command line alone, with a reason.

Used by QualityReport

Origin

"repository" | "distribution"

Where the declaration was read from.

  • repositoryThe repository's own, named by the manifest's `scope` section.
  • distributionThe distribution's default, because the repository declares none.

Used by RepositoryInfo ScopeReport

Os

"macos" | "linux" | "windows"

An operating system a target runs on.

  • macosApple's, detected as `Darwin`.
  • linuxLinux, detected as `Linux`, and the only one where the C library matters.
  • windowsWindows; representable, and not built today.

Used by TargetView

Out

object

The out: mapping: every category optional, each the reason a path is out.

propertytyperequireddescription
paths array of string no Never read, by path: version control, the local half, dependencies, build outputs.
binary boolean no Content that is not text (a NUL byte in the first window) is out, whatever the name says.
max_bytes integer | null no A file over this many bytes is out, whatever it is.
archive Category | null Category no Archives.
image Category | null Category no Images.
video Category | null Category no Video.
pdf Category | null Category no PDF documents.
database_dump Category | null Category no Database dumps.
generated Category | null Category no Generated assets: changed by changing the source and regenerating.
secret Category | null Category no Secrets: never read, never served, never quoted; a tracked one is reported.
fixtures Fixtures | null Fixtures no Fixtures are read up to a size; over it they are data, not context.

Used by Declaration

OutFile

object

One tracked file that is out.

propertytyperequireddescription
path string yes Repository-relative.
reason Reason Reason yes Why.
rule string | null no The rule that decided; absent for undeclared.

Used by Tally

Overlap

object

Two peers that claimed the same ground.

Reported when the second of them announces, so that a collision is known at the moment it is created rather than discovered afterwards in the history of a branch.

propertytyperequireddescription
peer PeerId PeerId yes The other peer.
attached boolean yes Whether that peer is still attached. An overlap with a departed peer is a weaker signal than one with a live session, and the reader is told which it is.
intent string yes What it said it was doing.
paths array of OverlapPath OverlapPath yes The claims that meet: one line per pair, yours and theirs.

Used by Announced PeerList

OverlapPath

object

One pair of claims that contain one another.

propertytyperequireddescription
yours string yes The path the announcing peer claimed.
theirs string yes The path the other peer claimed.

Used by Overlap

ParameterView

object

One query parameter of the live channel.

propertytyperequireddescription
name string yes Its name.
description string yes What it does.
required boolean yes Whether it must be given.

Used by ProtocolReport

Peer

object

One peer as the board lists it.

propertytyperequireddescription
id PeerId PeerId yes p1, p2, ...
client ClientInfo ClientInfo yes The client behind it.
transport Transport Transport yes How it is attached.
connected_at string yes When it attached, RFC 3339, UTC.
last_seen_seconds_ago integer (uint64) yes Seconds since its last message.
attached boolean yes Whether the session is still attached. A peer that announced something and then went away is kept and listed with attached: false: what it said it was working on outlives the connection that said it, because the work does.
announcement Announcement | null Announcement no Its announcement, when it made one.

Used by PeerList

PeerId

string

A peer's identity for the life of the server: p1, p2, ... in attachment order. p1 is the session that started the server.

Used by Announced Overlap Peer PeerList

PeerList

object

The answer of peers.list: every client attached to this shared server.

propertytyperequireddescription
count integer (uint) yes How many peers are attached, the caller included.
caller PeerId | null PeerId no The caller's own peer id, when the call came through an MCP session.
peers array of Peer Peer yes The peers, in attachment order; p1 started the server. A peer that announced something and then went away is still here, with attached: false.
overlaps array of Overlap Overlap no Every pair of peers whose claimed scope meets, each pair once. Empty is the ordinary case, and a reader who sees an entry here is looking at two sessions about to do the same work.

Used by peers.list

PhaseTotals

object

A phase's totals.

propertytyperequireddescription
count integer (uint64) yes How many times the phase ran.
total_nanos integer (uint64) yes Nanoseconds spent in it, summed.

Used by CounterSnapshot

Plan

object

The whole derived plan: what every plan capability answers out of.

propertytyperequireddescription
project PlanProject PlanProject yes The plan's header, with the active milestone derived.
statuses PlanVocabulary PlanVocabulary yes The declared status vocabularies.
milestones array of PlanMilestone PlanMilestone yes Every milestone, in id order.
issues array of PlanIssue PlanIssue yes Every issue, in id order.
waves array of PlanWave PlanWave yes The execution waves, lowest first.
edges array of PlanEdge PlanEdge yes The issue dependency graph, sorted.
milestone_edges array of PlanEdge PlanEdge yes The milestone dependency graph, sorted.
findings array of PlanFinding PlanFinding yes Every finding, in derivation order.

Used by plan.model

PlanCounts

object

A milestone's issues counted: the two denominators, then one entry per declared status.

propertytyperequireddescription
total integer (uint32) yes Every issue naming this milestone.
required integer (uint32) yes The denominator the milestone's own status derivation uses: total less cancelled, so no surface prints "n of total" for a milestone the engine calls DONE.
by_status map of integer (uint32) yes One entry per declared issue status, keyed by the vocabulary.

Used by PlanMilestone PlanMilestoneProgress PlanStatusReport

PlanEdge

object

One dependency edge, from before to.

propertytyperequireddescription
from string yes The record that must be real first.
to string yes The record that waits for it.

Used by Plan

PlanFinding

object

One validation finding, in the shape project.finding-carries-reproduce asks for.

propertytyperequireddescription
level string yes FAIL or WARN. A failure means the model is invalid.
code string yes The stable code a reader greps for (unknown_dependency, scope_conflict, …).
subject string yes The record the finding is about, or graph when it is about the whole graph.
message string yes What is wrong, in one line.

Used by Plan PlanValidation PlanWaveReport

PlanIssue

object

One issue, as its record declares it and as the graph derives it.

propertytyperequireddescription
id string yes The identity, which is also the file name.
milestone string yes The milestone it belongs to.
status string yes The derived status. Never stored: an issue records what happened to it and the status follows from that and from the state of its dependencies.
wave integer (uint32) yes The execution wave: one past the longest path to it through the dependency graph.
priority string yes p0p3.
profile string yes The execution profile the issue is worked under.
parallel_safe boolean yes Whether it may run beside another issue of its wave.
title string yes One line naming the outcome.
slug string yes The slug, when the record carries one.
depends_on array of string yes Every issue it declares a dependency on, as declared — including one that does not exist, which is a finding rather than a silent omission.
blocked_by array of string yes The dependencies that are not DONE, plus milestone:<id> when the milestone gate holds the whole outcome back.
dependents array of string yes The issues that depend on this one.
scope array of string yes The paths it touches; two issues of one wave that share a path are serialised.
objective string yes One line: what the issue is for.
evidence_have integer (uint32) yes Evidence entries attached.
evidence_need integer (uint32) yes Evidence tokens the record requires before it may be DONE.
started_at string yes When execution began, when it did.
verified_at string yes When implementation was declared complete.
completed_at string yes When completion was recorded.

Used by Plan PlanIssueList PlanNextIssue PlanRecord PlanStatusReport PlanWaveView

PlanIssueList

object

Issues matching a filter, with the vocabulary that names their statuses.

propertytyperequireddescription
issues array of PlanIssue PlanIssue yes The matching issues, in id order.
total integer (uint) yes How many matched.
statuses PlanVocabulary PlanVocabulary yes The declared status vocabularies.

Used by plan.issues

PlanMilestone

object

One milestone, as its record declares it and as the two graphs derive it.

propertytyperequireddescription
id string yes The identity, which is also the file name; a stable slug, never a version.
status string yes The derived status.
order integer (int64) yes Tie-break inside one rank; the roadmap is ordered by rank first.
priority string yes p0p3.
title string yes One line naming the outcome.
slug string yes The slug, when the record carries one.
version string yes The release the milestone belongs to, when it declares one.
rank integer (uint32) yes Its layer in the milestone graph: what orders the roadmap.
depends_on array of string yes The milestones it requires.
blocked_by array of string yes Those of them that are not DONE. Non-empty means the gate holds every issue of this milestone back, whatever the issue graph says.
dependents array of string yes The milestones that require it.
claims array of string yes The claims of the repository this outcome makes true.
counts PlanCounts PlanCounts yes Its issues, counted by derived status.
issues array of string yes Its issues, in id order.
outcome string yes One line: what is true once the milestone is real.

Used by Plan PlanRecord PlanRoadmap

PlanMilestoneProgress

object

One milestone's progress, without its prose.

propertytyperequireddescription
id string yes The identity.
status string yes The derived status.
title string yes One line naming the outcome.
counts PlanCounts PlanCounts yes Its issues, counted by derived status.

Used by PlanStatusReport

PlanNextIssue

object

The one issue a worker should take now.

propertytyperequireddescription
issue PlanIssue | null PlanIssue no The issue, when the plan has one that is executable.
active_milestone string yes The milestone the search started in.
reason string | null no Why there is none, when there is none: what to run to see what is in the way.

Used by plan.next

PlanProject

object

The plan's header: what this repository is, plus the one field nobody authors.

propertytyperequireddescription
name string yes The project's name, from project.yaml.
repository string yes The repository it belongs to, owner/name.
default_branch string yes The branch the plan is executed on.
active_milestone string yes The milestone a worker is executing now: the lowest-ranked unblocked milestone that is ACTIVE, else the lowest-ranked unblocked one not finished. Derived on every read, stored nowhere, and never authored — the plan cannot nominate a milestone whose prerequisites are not real.

Used by Plan PlanStatusReport

PlanRecord

object | object

One record of the plan, milestone or issue, with everything derived about it.

Used by plan.record

PlanRoadmap

object

The milestones in derived order, with the one being executed and the one after it.

propertytyperequireddescription
milestones array of PlanMilestone PlanMilestone yes The milestones ordered by rank, then order, then id. The sequence is derived from the milestone graph; no list of versions is maintained anywhere.
now string | null no The first unfinished, unblocked milestone in that sequence.
next string | null no The one after it, blocked or not.

Used by plan.roadmap

PlanStatusReport

object

Where the plan stands: every milestone's progress, the milestone being executed, and the one issue to take next.

propertytyperequireddescription
project PlanProject PlanProject yes The plan's header, with the active milestone derived.
statuses PlanVocabulary PlanVocabulary yes The declared status vocabularies.
milestones array of PlanMilestoneProgress PlanMilestoneProgress yes Every milestone, in id order.
next_ready PlanIssue | null PlanIssue no The next ready issue, when there is one.
counts PlanCounts PlanCounts yes Every issue of the plan, counted by derived status.

Used by plan.status

PlanValidation

object

The model's own validation: what the graph refuses and what it merely warns about.

propertytyperequireddescription
valid boolean yes Whether the model is valid: no finding is a failure.
milestones integer (uint) yes How many milestones the plan holds.
issues integer (uint) yes How many issues.
failures integer (uint) yes How many findings are failures.
warnings integer (uint) yes How many are warnings.
findings array of PlanFinding PlanFinding yes Every finding, in derivation order.

Used by plan.validate

PlanVocabulary

object

The status vocabularies, so a reader never has to know which statuses exist.

propertytyperequireddescription
issue array of string yes The issue statuses, in derivation order.
milestone array of string yes The milestone statuses, in derivation order.

Used by Plan PlanIssueList PlanStatusReport

PlanWave

object

One execution wave: the issues the graph allows to run at the same time.

propertytyperequireddescription
wave integer (uint32) yes The layer, from zero.
issues array of string yes The issues in it, in id order.

Used by Plan

PlanWaveReport

object

The execution waves, with the overlaps that serialise issues the graph would let run together.

propertytyperequireddescription
waves array of PlanWaveView PlanWaveView yes The waves, lowest first, with the issues of each.
serialised_by_scope array of PlanFinding PlanFinding yes Scope overlaps between two issues of one wave. Two issues sharing a wave is a necessary condition for running them at once, not a sufficient one: overlapping scope serialises them, and the overlap is reported here rather than left for two workers to discover in a conflict.

Used by plan.waves

PlanWaveView

object

One wave, with the issues in it.

propertytyperequireddescription
wave integer (uint32) yes The layer, from zero.
issues array of PlanIssue PlanIssue yes The issues in it, in id order.

Used by PlanWaveReport

Port

integer (uint16)

A TCP port a deployed process may bind. Privileged ports are not among them: the process runs as a non-root user and could not bind one.

Used by Listen

ProductCounts

object

How much the model holds. Every count anywhere is one of these.

propertytyperequireddescription
features integer (uint) yes Stable features.
features_all integer (uint) yes Features of every status, drafts included.
featured integer (uint) yes Stable features the homepage shows.
providers integer (uint) yes Providers the tool has an adapter for.
modules integer (uint) yes Builtin modules of the executable, and how many a stable feature names.
modules_covered integer (uint) yes Modules a stable feature names.
commands integer (uint) yes Public commands of the shell tool.
commands_covered integer (uint) yes Commands a stable feature names.
kinds integer (uint) yes Kinds of the layer a feature can present.
kinds_covered integer (uint) yes Kinds a stable feature names.

Used by FeatureList ProductValidationReport

ProductCoverage

object

One thing of the product — a module, a public command, a kind — and the features that name it. Empty means the product page says nothing about it, which is a gap the validation reports and the matrix shows rather than hides.

propertytyperequireddescription
id string yes The id.
title string yes The title.
features array of string yes The stable features that name it.

Used by Matrix

ProductFinding

object

One thing wrong with the product model, named where it is, with the nearest candidate when there is one.

propertytyperequireddescription
severity Severity Severity yes error or warning.
code string yes unknown_reference, duplicate_identity, missing_content, uncovered, ...
path string yes The repository-relative file the finding is in, or the registry it is about.
id string | null no The record's identity, when one record owns the finding.
field string | null no The front-matter key the finding is about, when one key owns it.
message string yes What is wrong, in one sentence.
did_you_mean string | null no The nearest existing name, when the value looks like a typo of one.

Used by ProductValidationReport

ProductProvider

object

One provider the tool has an adapter for, discovered from the templates the distribution ships and decorated with what this repository does with it.

propertytyperequireddescription
id string yes The provider id: the template's file stem.
title string yes The name a person knows it by.
bootstraps array of ProviderBootstrap ProviderBootstrap yes The bootstraps this repository's policy renders through it: target, mode, whether every worker loads it.
client_config string | null no The client configuration at the repository root that starts the shared MCP server for this provider, when the repository carries it.
hooks array of string yes The enforcement entries of the policy wired by this provider's hooks.
scratch_roots array of string no The scratch roots this provider creates checkouts of its own under, as declared: the worktree topology reports a checkout there as a session's scratch checkout and never moves it (ADR 0024).

Used by ProviderList

ProductValidationReport

object

What the model's own validation found.

propertytyperequireddescription
valid boolean yes True when nothing is an error. Warnings do not make it false.
errors integer (uint) yes How many findings are errors.
warnings integer (uint) yes How many findings are warnings.
counts ProductCounts ProductCounts yes The counts the model reached.
findings array of ProductFinding ProductFinding yes The findings, errors first, then by file.

Used by product.validate

ProgressView

object

How far along an execution is.

propertytyperequireddescription
current integer (uint64) yes Units done.
total integer | null no Units in total, when the handler knows how many.
message string | null no What is being done, for a reader.

Used by ExecutionEvent ExecutionView

ProjectIdentity

object

What the project is, from the crate manifest and the prose written once in [crate::about]. Every field here is a compile-time constant of this executable: there is no file to read, nothing to parse, and nothing that can disagree with the binary that answers.

propertytyperequireddescription
name string yes The product name.
version string yes The version of this executable, from the crate manifest.
summary string yes One sentence: what this is.
license string yes The SPDX licence identifier.
repository string yes The source repository.
target string yes The Rust target triple this executable was built for.
profile string yes The cargo profile it was built with.
commit string yes The commit it was built from, or unknown outside a work tree.

Used by RepositoryEnvironment

ProjectionState

"current" | "stale" | "absent" | "unknown"

Where one provider projection stands against its policy.

  • currentThe file matches the rendering byte for byte.
  • staleThe file differs: it was hand-edited, or the policy moved under it.
  • absentThe file is not there.
  • unknownIt could not be rendered, so nothing can be said.

Used by ProviderState

ProtocolReport

object

The answer of executions.protocol: the live channel's whole contract, derived from the types that implement it.

propertytyperequireddescription
protocol_version string yes The version of the event protocol this server speaks.
websocket string yes Where the live channel is: a path on this same server, not a second daemon.
subscription array of ParameterView ParameterView yes How the subscription is expressed, and what a reconnect sends.
heartbeat_seconds integer (uint64) yes How many seconds of quiet before the server pings.
max_connections integer (uint) yes How many live channels this process serves at once.
max_replay integer (uint) yes How many retained events a scoped connection replays before going live.
event_types array of string yes The event types a client may receive, from the one enum that defines them.
stream_types array of string yes The stream's own control messages.
event_schema any yes The JSON Schema of an event, derived from the Rust type.
stream_schema any yes The JSON Schema of a control message, derived from the Rust type.
limits LimitsView LimitsView yes What the store keeps, so a client knows what it may ask for.

Used by executions.protocol

Provenance

one of 5 variants

Where a resolved value came from.

Kept for every field a consumer can be surprised by, so that web explain can answer "why is this mounted here?" without anybody reading the discovery code.

variant Read from the capability registry: the routes the executable already declares once.

source"registry"yes

variant Read from a producer's own declaration beside its output (`surface.json`).

pathstringyesThe declaration file, repository-relative.
source"producer-declaration"yes

variant Inferred from a file or directory being where the convention says it is.

pathstringyesWhat was found, repository-relative.
source"filesystem"yes

variant Inferred from the site generator's own configuration.

pathstringyesThe configuration file, repository-relative.
source"site-config"yes

variant The model's documented default for a value nobody stated.

source"default"yes

Used by Surface

Provider

object

The provider and the facts that belong to it alone.

propertytyperequireddescription
name ProviderName ProviderName yes Which provider.
fly Fly | null Fly no Fly's own block, when the provider is Fly.

Used by DeploymentView

ProviderBootstrap

object

One bootstrap a provider renders.

propertytyperequireddescription
target string yes The target file, repository-relative.
mode string yes file or region.
always_loaded boolean yes Loaded by every worker without asking.

Used by ProductProvider

ProviderList

object

Every provider.

propertytyperequireddescription
count integer (uint) yes How many.
providers array of ProductProvider ProductProvider yes Each, in id order.

Used by product.providers

ProviderName

"fly"

The hosting provider. One is supported; a second is an object of its own rather than an abstraction over this one.

  • flyFly.io.

Used by Provider

ProviderState

object

One provider projection the policy declares, and whether the file on disk still matches what the policy renders.

propertytyperequireddescription
id string yes The provider id, as the policy names it: agents, claude-code.
target string yes The repository-relative file it renders to.
state ProjectionState ProjectionState yes Whether the file matches what the policy renders now.
always_loaded boolean yes Whether the provider loads this file into every context.

Used by RepositoryEnvironment

PublicApiQuality

object

What the exported item surface looks like.

propertytyperequireddescription
items integer (uint) yes Items the crate exports, of every kind.
documented integer (uint) yes Of those, how many carry documentation.
owe_example integer (uint) yes How many owe an executable example under the policy.
exampled integer (uint) yes Of those, how many have one that counts.
exempt array of Exemption Exemption yes How many are exempt from the example policy for a structural reason, and why, by reason, so that the exemptions are visible rather than implied by a subtraction.

Used by QualityReport

QualityAnswer

object

The answer: the measurement, or the reason there was not one.

propertytyperequireddescription
measured boolean yes Whether a crate was found and measured. false is a complete answer, not a failure: the layer installs into repositories that carry no Rust crate, and a doctrine that cannot apply is not a violation.
reason string | null no Why nothing was measured, when nothing was.
report QualityReport QualityReport yes The measurement. Present and empty-of-findings when measured is false, so that a consumer reads one shape either way and measured is the only question it must ask.
passes boolean yes Whether the report as filtered leaves nothing blocking. Answered here so that a caller over any transport reads the verdict rather than deriving it, and so that the command line's exit code and this field can never disagree.
baselined integer (uint) yes The findings the ratchet accepts because they stood when the rule landed. A finding outside this count is what fails the gate.

Used by quality.report

QualityReport

object

One measurement of one crate, and everything found wrong in it.

propertytyperequireddescription
schema string no [SCHEMA].
target string yes What was measured: the crate directory, repository-relative.
public_api PublicApiQuality PublicApiQuality yes The exported item surface.
modules ModuleQuality ModuleQuality yes The exported module surface.
operations OperationParity OperationParity yes The canonical operations against their transports.
violations array of Violation Violation yes Every finding, errors first, then by file and line.

Used by QualityAnswer

QualitySeverity

"error" | "warning"

How much a finding matters.

There are two levels and not five, because the only question a gate can answer is whether the change may land. A warning is a finding the repository has decided not to block on; nothing else is a warning.

  • errorThe gate fails.
  • warningReported, and the gate passes.

Used by Violation

Readiness

object

The answer to "can this process serve traffic": the local initialisation a request would need, and nothing beyond this process. A readiness check that grew a dependency probe fails a deployment because an unrelated service is down.

propertytyperequireddescription
ready boolean yes Whether every part below is in place.
version string yes This executable's version.
capabilities integer (uint) yes How many capabilities the registry holds; zero would mean nothing to serve.
objects integer (uint) yes How many objects the index holds. Read from the index this process built at start-up: it is already in memory, and reading it walks nothing.
layer HealthStatus HealthStatus yes Whether the layer read cleanly. A degraded layer is still served — the diagnostics are the point — so this reports rather than refuses.

Used by health.ready

Reason

"path" | "secret" | "generated" | "archive" | "image" | "video" | "pdf" | "database_dump" | "undeclared" | "fixture_over_limit" | "over_limit" | "binary"

Why a path is out. The order is the order the rules decide in.

  • pathNamed under `out.paths`.
  • secretA secret.
  • generatedA generated asset.
  • archiveAn archive.
  • imageAn image.
  • videoVideo.
  • pdfA PDF document.
  • database_dumpA database dump.
  • undeclaredMatches no `in` pathspec.
  • fixture_over_limitA fixture over `out.fixtures.max_bytes`.
  • over_limitOver `out.max_bytes`.
  • binaryContent with a NUL byte in its first [`SNIFF_BYTES`]: not text.

Used by Classification OutFile

Recommendation

object

One recommendation, with the moments that produced it. A recommendation with no matched_because is a recommendation nobody can check.

propertytyperequireddescription
id string yes The thing recommended: a capability id, a command, a claim, a rule, a use case.
count integer (uint) yes How many of the selected moments name it.
matched_because array of string yes The selected moments that named it, in presentation order.

Used by Diagnosis

Record

object

One durable record of the local half, as much of it as a reader needs to decide whether to open the file.

propertytyperequireddescription
path string yes Repository-relative path. The body is at the path; it is not copied here.
created_at string yes When the record says it was written.
task_id string yes The task it belongs to, or none.
branch string yes The branch it was written on.
head string yes The commit it was written at.
working_tree string yes Whether the working tree was clean or dirty then.
matched Match Match yes Which tier of the resolution rule matched.
divergence Divergence Divergence yes How far its commit is from this one.
next_action string no The section a resuming worker acts on, when the record has one. A handover's Next Action; empty for a record that carries no sections.

Used by Continuity

Refusal

object

Why a deployment object is refused: what was read, where, and what to do about it.

propertytyperequireddescription
file string yes The repository-relative file the value came from.
key string yes The key path within it, as the contract names it.
found string yes The value observed, rendered as it was read.
problem string yes What is wrong with it, in one line.
correction string yes What to do instead.

Used by DeploymentCheck DeploymentList

ReleaseArtifactView

object

The artifact a target and a tag name, and the directory it unpacks into.

propertytyperequireddescription
target string yes The target's id in the model.
rust_target string yes The Rust target triple.
tag string yes The tag the name was derived for.
name string yes The archive's file name.
root string yes The directory the archive unpacks into.
url string yes Where a release publishes it, when the tag is a real one.

Used by distribution.artifact

ReleaseChange

object

One change, from one commit.

propertytyperequireddescription
kind ReleaseChangeKind ReleaseChangeKind yes What it did.
scope string | null no The area it did it in, when the subject named one: commands, ci, site.
subject string yes The subject, without the type and scope that prefixed it.
breaking boolean yes Whether the commit marked itself breaking, with ! or a BREAKING CHANGE: trailer.
commit string yes The abbreviated commit.
url string | null no Where that commit can be read, when the repository's own URL is known. Derived from about::REPOSITORY, never written beside each entry.
references array of ReleaseReference ReleaseReference no The records of the layer this commit names — issues, milestones — resolved against what the layer actually holds.

Used by ReleaseChangeGroup ReleaseVersionReport

ReleaseChangeGroup

object

The changes of one kind, with the heading and the rank that decide where they are shown.

The grouping is in the document rather than in each renderer. It was in the Markdown renderer alone, and the site — which cannot see a Rust function — grouped alphabetically instead, so the same changelog read in two orders depending on which surface showed it. A presentation order stated once and carried is the only kind that survives a projection.

propertytyperequireddescription
kind ReleaseChangeKind ReleaseChangeKind yes What the changes in it did.
heading string yes The heading it is shown under.
rank integer (uint8) yes Where it sorts among the other groups; ascending.
changes array of ReleaseChange ReleaseChange yes The changes, in the order the commits were read.

Used by ReleaseSection

ReleaseChangeKind

"feat" | "fix" | "perf" | "refactor" | "docs" | "test" | "chore" | "ci" | "style" | "build" | "revert" | "other"

What a conventional commit says it did.

The set is the one the repository's own commit convention uses; a commit whose subject does not parse is [ChangeKind::Other] and still appears, because a changelog that silently drops what it cannot classify is a changelog that lies by omission.

  • featA capability a person did not have before.
  • fixBehaviour that was wrong and is not any more.
  • perfPerformance, with the behaviour unchanged.
  • refactorStructure, with the behaviour unchanged.
  • docsDocumentation.
  • testTests.
  • choreThe build, the pipeline, the tooling.
  • ciContinuous integration.
  • styleFormatting, with the behaviour unchanged.
  • buildThe build system or its dependencies.
  • revertA change that undoes another.
  • otherA commit whose subject does not parse as a conventional commit.

Used by ReleaseChange ReleaseChangeGroup

ReleaseChangelog

object

The whole changelog.

propertytyperequireddescription
schema string yes The schema this document satisfies.
current string yes The version the tree currently declares.
sections array of ReleaseSection ReleaseSection yes Newest first, the unreleased section leading when there is one.
diagnostics array of string yes What could not be read, said rather than hidden: a repository with no git history, a release record that names no commit, a tag that is not in this clone.
produced_by ReleaseProducedBy | null ReleaseProducedBy no Which capability answered, and where else the same value can be had.

Used by release.changelog

ReleaseChangelogArtifact

object

One published artifact, from the release record's own evidence.

propertytyperequireddescription
target string yes The platform triple the record names.
name string yes The file name.
sha256 string yes Its SHA-256, as the record read it off the file.

Used by ReleaseSection

ReleaseDecision

object

One decision, as the layer's own ADR object states it.

propertytyperequireddescription
id string yes adr-0027.
title string yes The decision, in its own words.
status string yes proposed, accepted, superseded.
date string yes The date the record carries.
url string | null no Where the decision itself can be read: the file in the repository. The site has no per-ADR page, so this is the honest destination rather than an invented route.
added string | null no The commit that added the file, which is what decides the release it belongs to. The front-matter date says when the decision was made; those are different questions.

Used by ReleaseSection

ReleaseProducedBy

object

Which capability answered with this document, and where that capability is projected.

The document carries its own provenance so that a reader — a person on the site, a client over MCP — can find the same value elsewhere without anything having to enumerate the routes. A page that listed them would be declaring them a second time, which is the failure site-check's registry and cli assertions exist to catch; it caught this one.

use majordomus_cli::release::model::ProducedBy;
let by = ProducedBy {
    capability: "release.changelog".into(),
    cli: Some("majordomus release changelog".into()),
    http: Some("/api/v1/changelog".into()),
    mcp_tool: None,
    mcp_resource: Some("majordomus://changelog".into()),
};
let json = serde_json::to_value(&by).unwrap();
assert_eq!(json["capability"], "release.changelog");
// a surface the capability is not projected on is absent, not null
assert!(json.get("mcp_tool").is_none());
assert_eq!(ProducedBy::default().capability, "");

propertytyperequireddescription
capability string yes The capability id.
cli string | null no The command line that renders it.
http string | null no The HTTP route that answers with it.
mcp_tool string | null no The MCP tool.
mcp_resource string | null no The MCP resource URI.

Used by ReleaseChangelog

ReleaseReference

object

A record of the layer that a commit names in its own text.

Inferred, never declared beside the commit: an issue id or a milestone id appearing in a subject or a body is a reference, and the layer already holds the object it refers to. A reference to something the layer does not have is not carried — a link to a record that does not exist is worse than no link, because the reader cannot tell until they follow it.

use majordomus_cli::release::model::Reference;
let r = Reference {
    kind: "issue".into(),
    id: "I1305".into(),
    title: "An observed contract has a fingerprint".into(),
    route: Some("/plan/i1305/".into()),
};
let json = serde_json::to_value(&r).unwrap();
assert_eq!(json["id"], "I1305");
assert_eq!(json["route"], "/plan/i1305/");
// a reference the site has no page for carries no route rather than an invented one
let bare = Reference { route: None, ..r };
assert!(serde_json::to_value(&bare).unwrap().get("route").is_none());

propertytyperequireddescription
kind string yes issue or milestone.
id string yes I1305, M000.
title string yes What it is, from the record itself.
route string | null no Where it is published on this site, when it has a page.

Used by ReleaseChange

ReleaseSection

object

One version's worth of changelog.

propertytyperequireddescription
version string yes The version, or unreleased.
tag string | null no The tag, when one was published.
date string | null no When it was published, from the record.
commit string | null no The commit it was published from.
unreleased boolean yes Whether this section is the work that has not been released.
notes_url string | null no The release notes the record names — the published release itself.
compare_url string | null no Every commit between the previous release and this one, as the forge renders it.
tree_url string | null no The tree at this release.
decisions array of ReleaseDecision ReleaseDecision yes The decisions dated inside this release's window.
groups array of ReleaseChangeGroup ReleaseChangeGroup yes The changes, from the commits in this release's range, grouped by what they did and ordered by the rank each group carries. The flat list is the concatenation of the groups' own; nothing holds it twice.
artifacts array of ReleaseChangelogArtifact ReleaseChangelogArtifact yes What was published, when this section is a release.

Used by ReleaseChangelog

ReleaseVersionReport

object

What the version is, and what the commits since the last release imply it should become.

propertytyperequireddescription
declared string yes The version the crate manifest declares — the authority.
tool string yes The version bin/majordomus prints.
agree boolean yes Whether the two agree. scripts/release-version --check is the gate; this is the same question asked by the executable, so every surface can show the answer.
last_release string | null no The last release the layer records.
bump string yes What the commits since it imply: major, minor, patch, or none.
next string | null no The version that bump would produce.
changes array of ReleaseChange ReleaseChange yes How many commits since the last release, and of what kind — the evidence for the bump, so that a surprising answer can be checked rather than believed.

Used by release.version

ReleaseView

object

One release, as every projection shows it.

propertytyperequireddescription
tag string yes The git tag.
version string yes The semantic version.
channel Channel Channel yes Whether an unpinned installation may resolve it.
published_at string yes When it was published, UTC.
commit string yes The commit it was built from.
yanked boolean yes True when it has been withdrawn.
artifacts integer (uint) yes How many artifacts it published.
metadata_url string yes Where its public metadata is served.

Used by ReleasesReport

ReleasesReport

object

The releases this repository recorded, and the one an unpinned installation resolves to.

propertytyperequireddescription
count integer (uint) yes How many records there are.
latest ReleaseView | null ReleaseView no The release an unpinned installation resolves to, when there is one.
releases array of ReleaseView ReleaseView yes Every record, newest first.

Used by distribution.releases

RepositoryEnvironment

object

The snapshot: what this checkout is, right now.

Every surface that reports any of this renders this value. Collections are in a documented, stable order — kinds and workflows by name, services and providers in the order their canonical source declares them, diagnostics in the order they were found — so that two snapshots of the same repository serialise identically apart from [RepositoryEnvironment::generated_at].

propertytyperequireddescription
schema string yes The contract this document follows, majordomus/repository-environment/v1.
generated_at string yes When it was taken, RFC 3339 in UTC.
resolution Resolution Resolution yes How completely it was resolved.
project ProjectIdentity ProjectIdentity yes What the project is.
repository RepositoryIdentity RepositoryIdentity yes What the checkout is.
vcs VcsState VcsState yes What version control says.
toolchains array of ToolchainState ToolchainState yes The toolchains the repository declares, sorted by id.
layer LayerSummary LayerSummary yes What the layer holds.
workflows WorkflowCatalogue WorkflowCatalogue yes The workflows a person can run.
providers array of ProviderState ProviderState yes The provider projections the policy declares, in the policy's order.
services array of ServiceState ServiceState yes The local services, in the order the service table declares them.
diagnostics array of Diagnostic Diagnostic yes Everything that went wrong or is worth knowing, in the order it was found.
provenance array of FieldSource FieldSource yes Where every field came from.

Used by environment.status

RepositoryIdentity

object

The checkout this snapshot is of.

propertytyperequireddescription
name string yes The name a person calls it: the base name of the root directory.
root string yes The root, absolute. The same value repository.info reports.
layer_schema string yes The manifest's schema, ai-repository/v1.
sections map of string yes Section name to repository-relative path, as the manifest declares them.
local_path string yes The checkout-local half of the layer, repository-relative. Never tracked, and where anything this checkout alone knows — the server's lease, this snapshot's cache — is kept.
linked_worktree boolean yes Whether this checkout is a linked work tree rather than the main one.

Used by RepositoryEnvironment

RepositoryInfo

object

What the index knows about the repository it was built from.

propertytyperequireddescription
root string yes The repository root, absolute.
layer_schema string yes The manifest's schema, ai-repository/v1.
sections map of string yes Manifest section name to repository-relative path.
git GitState GitState yes What git said, or why it could not be asked.
discovery string yes vcs or filesystem.
source_classes array of array of any yes Source class id to kind, in declared order.
kind_sources array of string yes The kinds files the reader was configured from: the distribution's, then the repository's own when it has one.
scope_origin Origin Origin yes Where the scope was read from: repository or distribution.
scope_path string yes The scope file: repository-relative for the repository's own, the share path for the distribution's default.

Used by RepositoryReport

RepositoryRef

object

Which repository, and which checkout of it, an execution ran against.

An execution is never run against "wherever this process happens to be": the engine stamps the repository the index was read from, and a request that names a different one is refused. The path itself is not here — this value is served to whoever can reach the socket, and where the checkout sits on the host is of no use to them.

propertytyperequireddescription
name string yes The repository's name: the last component of its root.
id string yes The stable identity two processes over one checkout both compute.
branch string | null no The branch checked out, when git can say.

Used by ExecutionView

RepositoryReport

object

The repository, its layer, its git state, and the state of this process's index.

propertytyperequireddescription
repository RepositoryInfo RepositoryInfo yes The repository: root, layer schema, sections, git state, discovery mode, source classes, kind sources.
state State State yes ok when every discovered file became an object, degraded otherwise.
objects integer (uint) yes How many objects the index holds.
kinds map of integer (uint) yes Objects per kind.
diagnostics array of Diagnostic Diagnostic yes Every diagnostic the index produced.
capabilities Summary Summary yes The capability registry, counted.

Used by repository.info

RepositoryTopology

object

The whole topology: what worktree list, the MCP resource, the HTTP route and the Cockpit all read.

propertytyperequireddescription
schema string yes [SCHEMA].
repository RepositoryView RepositoryView yes The repository.
container ContainerView ContainerView yes The container every linked work tree belongs under.
trunk TrunkView TrunkView yes The trunk.
observed_from string yes The work tree the call was answered from.
worktrees array of WorktreeState WorktreeState yes Every registered work tree, primary first.
branches array of BranchState BranchState yes Every local branch, by name.
diagnostics array of TopologyDiagnostic TopologyDiagnostic yes Everything wrong with the topology, work trees first, then repository-wide.
tallies TopologyTallies TopologyTallies yes The counts.
valid boolean yes No error-level diagnostic stands.

Used by worktree.topology

RepositoryView

object

The repository's identity, as the topology reports it.

propertytyperequireddescription
primary_worktree string yes The primary checkout: what the container is named after.
git_common_dir string yes The common git directory: the repository's identity.
name string yes The primary checkout's directory name.

Used by RepositoryTopology StatusReport

Resolution

"fast" | "full"

How completely a snapshot was resolved. Carried in the snapshot because a consumer must be able to tell "there is no server running" from "nobody looked".

  • fastOnly what is cheap enough for a shell prompt; the rest from the cache.
  • fullEverything, including the index. Writes the cache.

Used by EnvironmentProvenance RepositoryEnvironment

ResolvedRefs

object

One feature, resolved: the record as its file declares it, and everything derived.

propertytyperequireddescription
id string yes The identity, the slug and the file name.
title string yes The feature as a heading.
short_title string | null no Two or three words for a card or a matrix row.
headline string yes The promise a visitor reads first.
summary string yes One line: what it does.
status string yes stable, draft or deprecated.
weight integer (uint32) no Presentation order, lowest first.
featured boolean no Whether the homepage shows it as a chapter.
areas array of string no The operational areas of the why catalogue it serves.
audiences array of string no The audiences of the why catalogue it is written for.
modules array of string no Capability modules of the executable it is made of.
commands array of string no Public commands of the shell tool it is made of.
kinds array of string no Object kinds of the layer it is made of.
rules array of string no Rules of the effective set that govern it, by id without the version.
docs array of string no The documents that explain it, by repository-relative path.
adrs array of string no The decisions behind it, by declared id.
claims array of string no Claims that say what is guaranteed here.
use_cases array of string no Use cases that show it in use.
cockpit array of string no Areas of the Cockpit that show it.
web array of string no Web surfaces of the topology it is offered through.
related array of string no Features explicitly related to this one. The reverse is derived.
tags array of string no Free tags.
route string no Derived: /features/<id>/. Never authored; the schema refuses a route key.
source string no Derived: the repository-relative file the record came from.
body string no The Markdown body, without its front matter.
surfaces Surfaces Surfaces yes Derived: the interfaces it is exposed through.
module_refs array of ModuleRef ModuleRef yes Derived: the modules it names, each with its capabilities and their projections.
command_refs array of CommandRef CommandRef yes Derived: the shell commands it names, as the command registry declares them.
kind_refs array of KindRef KindRef yes Derived: the kinds it names, each with its object count.
rule_refs array of RuleRef RuleRef yes Derived: the rules it names, each with its class and whether it is enforced.
doc_refs array of DocRef DocRef yes Derived: the documents it names, with their titles.
adr_refs array of AdrRef AdrRef yes Derived: the decisions it names, with their status.
claim_refs array of ClaimRef ClaimRef yes Derived: the claims it names, with their status.
use_case_refs array of UseCaseRef UseCaseRef yes Derived: the use cases it names.
cockpit_refs array of CockpitAreaRef CockpitAreaRef yes Derived: the Cockpit areas it names, with their routes.
web_refs array of SurfaceRef SurfaceRef yes Derived: the web surfaces it names, with their mounts.
moments array of MomentRef MomentRef yes Derived: the moments that name any command, capability, claim or rule of this feature.
backlinks array of string yes Derived: the features that name this one in their related.
counts FeatureCounts FeatureCounts yes Derived: how much stands behind it.
evidence FeatureEvidence FeatureEvidence yes Derived: what is guaranteed.

Used by product.feature

ResourceView

one of 2 variants

The answer of objects.get: what the URI resolved to, tagged by source the way a capability's provenance is.

variant A file of the layer, read as it is.

source"declarative"yes

variant A query with a resource exposure, executed and rendered as a JSON document.

source"builtin"yes

Used by objects.get

Resources

object

What one machine is granted.

propertytyperequireddescription
cpu_kind CpuKind CpuKind yes Shared or dedicated.
cpus Positive Positive yes How many CPUs one machine has.
memory_mb Positive Positive yes Memory per machine, in megabytes.

Used by DeploymentView

Route

string

A route a platform polls: an absolute path on this service, never a URL. The host is the deployment's to know and not the object's to state.

Used by HealthRoutes

Row

object

Where one capability is projected, and where it is not.

This is the coverage matrix of the rule: a row per capability, a column per interface. It is derived, never written down — a capability that reaches nothing shows as a row of false, which is exactly the "exists but is invisible" case worth seeing.

propertytyperequireddescription
id string yes The canonical id.
module string yes The module that composes it.
kind string yes Query, command or resource.
stability string yes Where it stands.
cli string | null no The command line, when it declares one and clap has it.
http string | null no The HTTP route, when it declares one.
mcp_tool string | null no The MCP tool name, when it declares one.
mcp_resource string | null no The MCP resource URI, when it declares one.
closed boolean yes Whether every exposure this row declares is answered by its surface.
source string yes Where the capability is declared; repository-relative.

Used by ClosureMatrix

RuleRef

object

One rule the feature names.

propertytyperequireddescription
id string yes The rule id, without the version.
identity string yes The identity the index holds, with the version.
title string yes The title.
class string yes blocking or advisory.
enforced boolean yes Whether the tool enforces it: the rule carries an x-majordomus block.
path string yes Repository-relative path.

Used by ResolvedRefs

ScopeReport

object

The scope: the declaration as read, its origin, and every tracked file against it.

propertytyperequireddescription
origin Origin Origin yes repository when the manifest names a scope section, distribution for the default.
path string yes The file the declaration was read from.
declaration Declaration Declaration yes The declaration as read.
tracked Tally Tally yes Every tracked file judged by name and size, counted; the out ones listed.

Used by repository.scope

SearchHit

object

One search hit: the object, summarised, and the first matching line of its content.

propertytyperequireddescription
uri string yes majordomus://<kind>/<identity>.
id string yes The capability id, <kind>.<identity>.
kind string yes The kind the object was read as.
identity string yes The identity within the kind.
title string | null no The title, when the kind's title rule found one.
description string | null no The one-line description, when the kind holds one.
path string yes Repository-relative source path.
snippet string | null no The first line of content that matched, when one did.

Used by SearchResult

SearchResult

object

The answer of objects.search.

propertytyperequireddescription
query string yes The query as given.
count integer (uint) yes How many hits were returned.
limit integer (uint64) yes The limit that applied.
hits array of SearchHit SearchHit yes The hits, in URI order, at most limit of them.

Used by objects.search

ServiceAvailability

"available" | "not_running" | "unknown"

Whether a service answers. Unknown is a real answer and never a disguised no: a probe that timed out and a port that refused the connection lead a reader to different actions.

  • availableThe address accepted a connection.
  • not_runningNo server holds the repository's lease, or the address refused the connection.
  • unknownThe probe did not finish in its budget, or this resolution did not probe.

Used by ServiceState

ServiceState

object

One local service of this repository: what it is, where it is, and whether anything answers there. The path is the one the router serves; the URL exists only while a server does.

propertytyperequireddescription
id string yes A stable id, [a-z][a-z0-9-]*.
title string yes The short name a person reads.
path string yes The absolute path the router serves it under.
url string | null no The full URL, when a server is running and published its address.
availability ServiceAvailability ServiceAvailability yes Whether anything answers there.

Used by RepositoryEnvironment

Severity

"info" | "warning" | "error"

How bad a diagnostic is. Error excludes the file it concerns from the index and puts the index into the degraded state; Warning and Info do neither.

  • infoWorth knowing; changes nothing.
  • warningSomething to look at; the object is still served.
  • errorThe file is excluded and the index is degraded.

Used by Diagnostic ExecutionDiagnostic Finding ProductFinding TopologyDiagnostic

Signal

object

One observable symptom of a moment: a question a reader can answer about their own week. The questionnaire on the site and the input of why diagnose are these and nothing else.

propertytyperequireddescription
id string yes Unique within the moment; the identity a diagnosis selects by.
text string yes The symptom, phrased so a reader can say whether it happened to them.

Used by MomentDetail

Stability

"implemented" | "behaviorally_verified" | "experimental" | "planned" | "unsupported"

Where a capability stands, in the repository's own vocabulary for claims. A capability that is Planned or Unsupported may be listed but is never executable through any projection; the registry refuses to build otherwise.

  • implementedImplemented, and no behavioural test names it yet.
  • behaviorally_verifiedImplemented and proved by a behavioural test.
  • experimentalImplemented, executable, and expected to change.
  • plannedSpecified and not implemented: listed, never executable.
  • unsupportedConsidered and refused: listed with the reason, never executable.

Used by Capability CapabilitySummary CommandNode

Standing

"primary" | "canonical" | "misplaced" | "detached" | "ephemeral" | "missing"

Where a work tree stands against the topology.

  • primaryThe primary checkout: exempt from the path rule, held to the trunk rule.
  • canonicalA linked work tree at exactly its branch's canonical path.
  • misplacedA linked work tree somewhere else. Migration brings it home.
  • detachedA linked work tree with no branch. It has no canonical path and is never moved.
  • ephemeralA linked work tree under the operating system's temporary directory or under the primary checkout's `.claude/worktrees/`: a session's scratch checkout, owned and removed by the harness that made it. Reported; migrated only on request.
  • missingA registration whose directory is gone. Repair drops it.

Used by WorktreeState

StartInput

object

The input of executions.start: which capability to run, and with what.

propertytyperequireddescription
capability string yes The canonical id of the capability to run (health.report, objects.verify).
input any no Its input, as its own input schema describes it; an empty object when it takes none.

Used by executions.start

State

"ok" | "degraded"

Whether every discovered file became an object.

  • okEvery discovered file became an object.
  • degradedAt least one file could not be read; the diagnostics say which.

Used by RepositoryReport

StatusReport

object

The answer to "where am I, and is that where I belong".

propertytyperequireddescription
schema string yes [SCHEMA].
repository RepositoryView RepositoryView yes The repository.
container ContainerView ContainerView yes The container.
trunk TrunkView TrunkView yes The trunk.
worktree WorktreeState WorktreeState yes The work tree the call came from, with its uncommitted work counted.
canonical boolean yes Whether this work tree is where it belongs: canonical, or the primary checkout on the trunk, or detached.
repository_errors integer (uint) yes How many error-level diagnostics the whole topology carries.

Used by worktree.status

StepOutcome

"planned" | "blocked" | "moved" | "failed"

What became of a step.

  • plannedPlanned and not applied.
  • blockedNot carried out, with the blockers on the step.
  • movedMoved, and the fingerprint after equals the one before.
  • failedAttempted and not completed, or completed and not verified; the message says which.

Used by MigrationStep

StepState

"running" | "completed" | "failed"

Where a step of an execution stands.

  • runningEntered and not finished.
  • completedFinished, and what it was asked to do happened.
  • failedFinished, and it did not.

Used by StepView

StepView

object

One named phase of an execution, as the handler reported it.

propertytyperequireddescription
name string yes A stable name, unique within the execution.
title string yes One line for a reader.
state StepState StepState yes Where it stands.
started_at string yes When it was entered, RFC 3339 in UTC.
finished_at string | null no When it finished, when it has.
detail string | null no What it said when it finished, when it said anything.

Used by ExecutionView

Summary

object

The registry counted: by source, kind, stability and projection.

propertytyperequireddescription
total integer (uint) yes Every capability.
builtin integer (uint) yes Composed in Rust.
declarative integer (uint) yes Read from the layer.
by_kind map of integer (uint) yes By kind (query, resource).
by_stability map of integer (uint) yes By stability.
mcp_tools integer (uint) yes With an MCP tool exposure.
mcp_resources integer (uint) yes With an MCP resource exposure.
http_routes integer (uint) yes With an HTTP exposure.
cli_commands integer (uint) yes With a CLI exposure.
modules integer (uint) yes Modules: composed, derived, and one per declarative kind.
benchmark_required integer (uint) yes Executables whose benchmark policy is required.
benchmark_waived integer (uint) yes Executables waived from benchmarking for a typed reason.
cached integer (uint) yes Executables the executor caches.

Used by CapabilityList RepositoryReport

Surface

object

One resolved surface: everything a consumer needs, with the provenance of what it could be surprised by.

propertytyperequireddescription
id string yes Identity, unique across the topology; the selector --only and --exclude use it.
title string yes One line: what a reader sees in a listing.
category SurfaceCategory SurfaceCategory yes What it is for, which is how a listing groups it.
visibility SurfaceVisibility SurfaceVisibility yes Whether a person is shown it.
kind SurfaceKind SurfaceKind yes How it answers.
mount Mount Mount yes Where it answers.
producer string yes What produced it: a command, a module, or the generator that writes the directory.
feature Feature | null Feature no The runtime capability it needs; absent when the process always has it.
artifact string | null no The generated directory, repository-relative, for a static surface.
index string | null no The file served for the mount itself, when the surface has one.
availability SurfaceAvailability SurfaceAvailability yes Where the surface's files go and who answers for it.
built_from string | null no The revision the artifact was built from, when its producer recorded one: what makes a stale build a finding rather than a surprise.
provenance map of Provenance Provenance yes Where each interesting value came from, by field name.

Used by SurfaceReport

SurfaceAvailability

"both" | "served-only" | "published-only"

Whether a surface is part of the static publication, served only while a process runs, or both.

  • bothServed by the running executable and published as files.
  • served-onlyAnswered by the running executable and never published: a route the process computes, or a build made for this server's own mount rather than for deployment.
  • published-onlyPublished as files; the running executable serves it from the same directory.

Used by Surface

SurfaceCategory

"interface" | "documentation" | "api" | "protocol" | "report"

What a surface is for, which is how a reader is shown it.

A category is the one piece of intent that a mount cannot carry: /openapi.json and /swagger sit beside each other and are a document and a viewer for it. Grouping is derived from this field and never from a list of paths kept somewhere else.

  • interfaceSomething a person opens and looks at: the home page, the Cockpit.
  • documentationProse and reference written for a person: the site, the Swagger UI.
  • apiA machine-readable surface of the capability registry.
  • protocolA wire protocol another program speaks.
  • reportGenerated evidence of a run: a test report, a benchmark report.

Used by Surface

SurfaceFinding

object

One thing wrong with a topology, said so a person can fix it without reading this file.

propertytyperequireddescription
severity SurfaceFindingSeverity SurfaceFindingSeverity yes How much it matters.
rule string yes The rule that produced it, stable enough to grep for.
surface string yes The surface it is about.
message string yes What is wrong.
remedy string yes What to do about it.

Used by SurfaceReport

SurfaceFindingSeverity

"warning" | "error"

How much a finding matters.

  • warningWorth reading; serving is still coherent.
  • errorThe topology may not be served or published in this state.

Used by SurfaceFinding

SurfaceInfo

object

One surface of the vocabulary, as a client reads it.

propertytyperequireddescription
id string yes cli, api, mcp, cockpit or docs.
title string yes The name a person reads.
route string yes The route on the website where the surface is documented.
features integer (uint) yes How many stable features it exposes.

Used by FeatureList Matrix

SurfaceKind

"static-directory" | "native-route" | "redirect"

How a surface answers a request.

Only what this repository serves: a directory of generated files, a path the executable answers itself, and a redirect. A new kind is a new behaviour, never a new name for the same behaviour with different data.

  • static-directoryA generated directory, mounted under its prefix and served from disk.
  • native-routeA path the executable answers itself, from its own registry or handlers.
  • redirectA path that answers with a redirect to another one.

Used by Surface

SurfaceRef

object

One web surface of the topology the feature names.

propertytyperequireddescription
id string yes The surface id.
title string yes The title.
mount string yes Where it is mounted.
category string yes What it is for.

Used by ResolvedRefs

SurfaceReport

object

The web surfaces of this repository, as the process that answers resolved them.

propertytyperequireddescription
surfaces array of Surface Surface yes Every resolved surface, in route-precedence order: the order a router consults them in, so the first whose mount owns a path is the one that answers it.
served array of string yes The ids a process answers for, in the same order. A surface published and not served is absent here.
published array of string yes The ids a publication holds, in the same order.
public array of string yes The ids offered to a person, which is what the home page lists.
findings array of SurfaceFinding SurfaceFinding yes What validation says about the topology as it stands. Empty is the healthy answer; a finding here is the same one majordomus web validate reports, with its remedy.

Used by web.surfaces

SurfaceVisibility

"public" | "internal"

Who a surface is offered to.

Two values and no more: a surface is either offered for a person to discover, or it is part of the topology without being advertised. Both are always in the machine-readable answer — hiding a served route from introspection would only hide it from the people maintaining it.

  • publicListed for a person: it appears on the home page.
  • internalServed and introspectable, not advertised: a machine speaks to it, or another surface links to it.

Used by Surface

Surfaces

object

The interfaces a feature is exposed through, decided from what its references project and from nothing a file says. Each is a fact with a reason a reader can check: cli is true when a module of the feature has a capability with a command-line path or the feature names a shell command; api when a module has an HTTP route; mcp when a module has an MCP tool or resource, or the feature names a kind, since every object of the layer is an MCP resource; cockpit when the feature names a Cockpit area or a module, since every capability has a Cockpit page; docs when it names a document.

propertytyperequireddescription
cli boolean yes The command line: the executable's own, or the shell tool's.
api boolean yes The HTTP routes under /api/v1/, and the OpenAPI document over them.
mcp boolean yes MCP: a tool, or a resource.
cockpit boolean yes The Cockpit.
docs boolean yes The documentation.

Used by FeatureSummary MatrixRow ResolvedRefs

Tally

object

Every tracked file against the scope, counted.

propertytyperequireddescription
files integer (uint) yes How many tracked files were judged.
in integer (uint) yes How many are in.
out integer (uint) yes How many are out.
by_reason map of integer (uint) yes How many are out for each reason present.
out_files array of OutFile OutFile yes Every tracked file that is out, with its reason and the rule that decided.

Used by ScopeReport

TargetStatus

"supported" | "experimental" | "unavailable"

What the project promises about a target.

See [crate::deploy::Status]: both are Status in their own module and neither is in the one component namespace the schema document has.

  • supportedBuilt by every release, offered by the installer, listed as supported. A release that is missing this artifact is not published.
  • experimentalBuilt and offered, and documented as not yet proven.
  • unavailableDocumented, never built, refused by the installer with its recorded reason.

Used by TargetView

TargetView

object

One target, as every projection shows it: what it is, what it is called in prose, and the artifact name the naming function derives for a tag yet to be chosen.

propertytyperequireddescription
id string yes The target's id in the model.
title string yes How it is written in prose: Linux x86_64 musl.
os Os Os yes The operating system.
arch Arch Arch yes The architecture.
libc Libc | null Libc no The C library, on Linux.
rust_target string yes The Rust target triple.
status TargetStatus TargetStatus yes What the project promises about it.
reason string | null no Why, when it is not built.
artifact string yes The artifact name, with {tag} where a release's tag goes.

Used by DistributionReport

TierState

"resolved" | "cached" | "unavailable"

Where a tier of the snapshot came from. A tier the active resolution cannot reach is [TierState::Unavailable] with the reason, and its values are absent rather than zero.

  • resolvedRead from its canonical source during this resolution.
  • cachedTaken from the cache written by an earlier full resolution.
  • unavailableNeither available; the values are absent and the reason is a diagnostic.

Used by LayerSummary WorkflowCatalogue

ToolchainAvailability

"installed" | "missing" | "unknown"

Whether a declared toolchain is usable here.

  • installedInstalled, and its version answered.
  • missingThe executable is not on the path.
  • unknownNobody asked: this resolution may not run a subprocess for it, and no cache held it.

Used by ToolchainState

ToolchainState

object

A toolchain the repository declares, and what is installed for it. The three are kept apart on purpose: a repository can declare a version nobody has, and a machine can have a version no repository asked for, and reporting either as the other is how a version mismatch stays invisible for a week.

propertytyperequireddescription
id string yes A stable id, [a-z][a-z0-9-]*: rust, node.
title string yes The short name a person reads.
declared string | null no The version the repository declares, when it declares one.
declared_by string yes The repository-relative file that declares it.
installed string | null no The version installed here, when it could be asked and the answer is not stale.
availability ToolchainAvailability ToolchainAvailability yes Where the installed version stands.

Used by RepositoryEnvironment

TopologyDiagnostic

object

One thing wrong with, or worth knowing about, the topology.

propertytyperequireddescription
code DiagnosticCode DiagnosticCode yes The stable code.
severity Severity Severity yes How serious it is.
path string | null no The work tree involved.
branch string | null no The branch involved.
expected string | null no Where the work tree belongs.
message string yes What is wrong, in one line.
remedy string yes The command that addresses it.

Used by InspectReport MigrationPlan MigrationStep RepositoryTopology WorktreeState

TopologyTallies

object

How many work trees and branches are in each state.

propertytyperequireddescription
worktrees integer (uint) yes Every registered work tree, primary included.
canonical integer (uint) yes Linked work trees at their canonical path.
misplaced integer (uint) yes Linked work trees somewhere else.
detached integer (uint) yes Linked work trees without a branch.
ephemeral integer (uint) yes Scratch checkouts of a session.
missing integer (uint) yes Registrations whose directory is gone.
locked integer (uint) yes Work trees git reports as locked.
dirty integer (uint) yes Work trees with uncommitted work, when it was asked for.
branches integer (uint) yes Local branches.
branches_without_worktree integer (uint) yes Local branches with no work tree.
cleanup_eligible integer (uint) yes Branches eligible for cleanup.
errors integer (uint) yes Error-level diagnostics.
warnings integer (uint) yes Warning-level diagnostics.

Used by RepositoryTopology

TraceReport

object

The whole traceability answer: every issue git can say something about, and every commit of a stretch of the trunk with the contract it served or the fact that it has none.

propertytyperequireddescription
trunk string | null no The trunk every branch and commit was measured against.
examined integer (uint) yes How many trunk commits were attributed.
issues array of IssueTrace IssueTrace yes The issues that at least one branch names, in id order.
without_branch array of string yes The issue ids the project model declares that no ref names. Not a fault: an issue nobody has started has no branch yet.
commits array of CommitAttribution CommitAttribution yes The examined trunk commits, newest first.
tallies TraceTallies TraceTallies yes The counts, so a caller need not add them up.

Used by trace.report

TraceTallies

object

The counts of one report.

propertytyperequireddescription
issues_declared integer (uint) yes Issue ids the project model declares.
issues_with_branch integer (uint) yes Of those, the ones at least one ref names.
branches integer (uint) yes Branches naming an issue.
branch_commits integer (uint) yes Distinct commits those branches claim.
attributed integer (uint) yes Examined trunk commits with exactly one issue.
unattributed integer (uint) yes Examined trunk commits no branch naming an issue contains.
ambiguous integer (uint) yes Examined trunk commits more than one issue claims.

Used by TraceReport

Transport

"stdio" | "http"

How a peer reached the server.

  • stdioThe owner's own client, on the process's stdin and stdout.
  • httpMCP over HTTP at `/mcp`: a `majordomus mcp` bridge, or a client speaking it directly.

Used by Announced Peer

TrunkSource

"remote_head" | "default_branch_config" | "conventional_name" | "primary_checkout" | "unknown"

Where the trunk was learned from, in the order it is looked for.

  • remote_head`refs/remotes/<remote>/HEAD`: what the remote calls its default branch.
  • default_branch_config`init.defaultBranch` in the git configuration, and that branch exists locally.
  • conventional_nameExactly one of `main` and `master` exists locally.
  • primary_checkoutThe branch the primary checkout holds, because nothing else said.
  • unknownNothing said; the trunk is unknown and every check that needs it says so.

Used by TrunkView

TrunkView

object

The trunk, as the topology reports it.

propertytyperequireddescription
branch string | null no The branch, when known.
source TrunkSource TrunkSource yes How it was decided.
checked_out_at string | null no Where it is checked out.

Used by RepositoryTopology StatusReport

UpstreamState

object

A branch's upstream and how far the two have moved apart, from for-each-ref in one subprocess for every branch, never a fetch.

propertytyperequireddescription
name string yes The upstream ref, short (origin/master).
ahead integer | null no Commits here that the upstream lacks.
behind integer | null no Commits upstream that this branch lacks.
gone boolean yes The upstream ref no longer exists.

Used by BranchState WorktreeState

UseCaseRef

object

One use case the feature names.

propertytyperequireddescription
id string yes The use case id.
title string yes The title.
category string | null no The category it is filed under.

Used by ResolvedRefs

ValidationReport

object

What the catalogue's own validation found.

propertytyperequireddescription
valid boolean yes True when nothing is an error. Warnings do not make it false.
errors integer (uint) yes How many findings are errors: a reference that resolves to nothing, a duplicate identity, a file name that disagrees with its id.
warnings integer (uint) yes How many findings are warnings: a public record that does not meet its floor.
counts Counts Counts yes The counts the catalogue reached.
findings array of Finding Finding yes The findings, errors first, then by file.

Used by why.validate

VcsState

one of 2 variants

What version control says about the checkout, or why it could not be asked.

variant `git` answered.

state"git"yes

variant `git` could not be asked, or this is not a work tree.

reasonstringyesWhat went wrong.
state"unavailable"yes

Used by RepositoryEnvironment

Verdict

"in" | "out"

In or out.

  • inRead.
  • outNever read; the reason says why.

Used by Classification

VerifyReport

object

The answer of objects.verify.

propertytyperequireddescription
files integer (uint) yes How many files were read.
current integer (uint) yes How many of them are what the index read.
drifted integer (uint) yes How many are not, of any kind of not.
objects integer (uint) yes How many objects of the index those files carry.
compared_by_content integer (uint) yes How many were compared byte for byte rather than by size.
fingerprint string yes The index fingerprint this process is serving.
index_is_current boolean yes Whether the index is still a true picture of the working tree, as far as this comparison can tell.
findings array of DriftedObject DriftedObject yes The files that are not, with what is wrong with each.

Used by objects.verify

Violation

object

One finding: what, where, why, and what to do.

propertytyperequireddescription
code ViolationCode ViolationCode yes The stable code.
severity QualitySeverity QualitySeverity yes How bad it is.
rule string yes The canonical id of the rule that requires this.
path string yes Where it is, repository-relative; empty when the finding is not about a file.
line integer | null no The line, 1-based; None when the finding is not about a line.
symbol string yes The item's full path, or the command, or the capability id: what the finding is about.
message string yes One sentence, specific to this occurrence.
why string yes Why it matters, from the code.
remediation string yes What to do, from the code.

Used by QualityReport

ViolationCode

"RUST_PUBLIC_MISSING_DOCS" | "RUST_PUBLIC_THIN_DOCS" | "RUST_PUBLIC_MISSING_EXAMPLE" | "RUST_EXAMPLE_NOT_EXECUTABLE" | "RUST_EXAMPLE_PLACEHOLDER" | "RUST_EXAMPLE_DOES_NOT_NAME_SUBJECT" | "RUST_MODULE_MISSING_DOCS" | "RUST_MODULE_MISSING_EXAMPLE" | "RUST_MODULE_MISSING_BEHAVIOURAL_TEST" | "OPERATION_CLI_UNCLASSIFIED" | "OPERATION_CLASSIFICATION_STALE" | "OPERATION_CLASSIFICATION_CONFLICT" | "OPERATION_MISSING_OPENAPI" | "OPERATION_PROJECTION_MISSING" | "OPERATION_PROJECTION_ORPHAN"

What is wrong, as a stable machine-readable code.

The codes are the contract between the validator and everything downstream: CI annotations, Cockpit filters, documentation anchors and an agent deciding what to fix. A code is never renamed once it has shipped; a rule that stops existing takes its code with it.

  • RUST_PUBLIC_MISSING_DOCSAn exported item carries no documentation at all.
  • RUST_PUBLIC_THIN_DOCSAn exported item's documentation says nothing its signature had not already said.
  • RUST_PUBLIC_MISSING_EXAMPLEAn exported item that carries behaviour has no executable example.
  • RUST_EXAMPLE_NOT_EXECUTABLEEvery example an item has is `ignore`d or is prose in a fenced box.
  • RUST_EXAMPLE_PLACEHOLDERAn example asserts nothing, or asserts something that is true of any program.
  • RUST_EXAMPLE_DOES_NOT_NAME_SUBJECTAn example never names the item it is documenting.
  • RUST_MODULE_MISSING_DOCSAn exported module carries no module-level documentation.
  • RUST_MODULE_MISSING_EXAMPLEAn exported module has no module-level executable example.
  • RUST_MODULE_MISSING_BEHAVIOURAL_TESTNo test names an exported module, and it declares none of its own.
  • OPERATION_CLI_UNCLASSIFIEDA command of the command line is neither a canonical capability nor classified as belonging to the command line alone.
  • OPERATION_CLASSIFICATION_STALEA command is classified as belonging to the command line alone, and the command line no longer has it.
  • OPERATION_CLASSIFICATION_CONFLICTA command is classified as local *and* bound to a capability: two answers to one question.
  • OPERATION_MISSING_OPENAPIA capability declares an HTTP route and the OpenAPI document does not describe it.
  • OPERATION_PROJECTION_MISSINGA capability declares a projection that the projection itself does not carry.
  • OPERATION_PROJECTION_ORPHANA projection carries an entry the registry does not hold.

Used by Violation

Vocabulary

object

The vocabulary the distribution ships: every token there is.

count is measured from obligations rather than written down, so a token added to the file is counted by the same act that declares it.

use majordomus_cli::capability::builtin::obligations::Vocabulary;
let v: Vocabulary = serde_json::from_str(
    r#"{"version":1,"source":"/opt/majordomus/share/obligations.yaml","count":1,
        "obligations":[{"id":"commit","title":"The work is committed",
                        "summary":"In the branch's history, not the working tree.",
                        "discharged_by":"git","remote":false}]}"#,
)
.unwrap();
assert_eq!(v.count, v.obligations.len());
assert_eq!(v.version, 1, "the only shape this reader accepts");

propertytyperequireddescription
version integer (uint64) yes The file's own format version. 1 is the only one this reader accepts.
source string yes Where it was read from, absolute: the distribution's share directory, which is not necessarily inside the repository.
count integer (uint) yes How many tokens there are. No number anywhere is written down.
obligations array of Obligation Obligation yes Every token, in the order the file declares them.

Used by obligations.vocabulary

WaiverReason

"not_executable" | "destructive" | "external_dependency" | "transient_state"

Why an executable capability is not benchmarked. Typed, so that a waiver is a reviewable statement and never a convenience; not_executable is the registry's own reason for resources and is never written by hand.

  • not_executableA resource: read, never executed; nothing to time but `objects.get`, which is.
  • destructiveThe capability changes something outside this process and cannot be run in a loop.
  • external_dependencyThe capability talks to something the benchmark host cannot provide.
  • transient_stateThe capability starts, or answers about, work that exists only while it is running. A benchmark host cannot stage an execution to read, and running the operation in a loop would measure the work rather than the operation.

Used by BenchmarkPolicy

WorkflowCatalogue

object

The workflows a person can run here, as the workflow runner itself describes them.

propertytyperequireddescription
state TierState TierState yes Where these came from.
source string | null no The command that produced them, when one did.
workflows array of WorkflowDescriptor WorkflowDescriptor no Every public workflow, sorted by name.
entrypoints array of WorkflowEntrypoint WorkflowEntrypoint no The entry point of each group, in the order the groups are declared: what a person new to the repository runs first. Derived, never listed anywhere.

Used by RepositoryEnvironment

WorkflowDescriptor

object

One workflow: a recipe of the repository's justfile, as just describes it.

propertytyperequireddescription
name string yes The name a person types after just.
namespace string | null no The module path, for a recipe in an imported module; empty at the root.
description string | null no The recipe's doc comment, when it has one.
group string | null no The [group(...)] it belongs to, when it declares one.
parameters array of WorkflowParameter WorkflowParameter no Its parameters, in declaration order.
dependencies array of string no The recipes it runs first, in order.
confirm boolean yes Whether it asks before it runs ([confirm]).

Used by WorkflowCatalogue

WorkflowEntrypoint

object

The entry point of one group of workflows: what the group is, and the one workflow that stands for it.

propertytyperequireddescription
group string yes The group, as the justfile declares it.
workflow string yes The workflow that stands for the group.
command string yes The command a person types.
description string | null no The workflow's description, when it has one.

Used by WorkflowCatalogue

WorkflowParameter

object

One parameter of a workflow.

propertytyperequireddescription
name string yes The name.
variadic boolean yes Whether it may be repeated (*args, +args).
required boolean yes Whether it must be given.

Used by WorkflowDescriptor

WorktreeFingerprint

object

What a work tree held at one moment, reduced to digests.

propertytyperequireddescription
branch string | null no The branch, or none when detached.
head string | null no The commit.
index_digest string yes A digest of the index: every tracked path with its mode, blob and stage.
staged_diff_digest string yes A digest of the staged diff against HEAD.
unstaged_diff_digest string yes A digest of the unstaged diff against the index.
untracked_manifest_digest string yes A digest of every untracked file: path, kind, size and content.
untracked_files integer (uint) yes How many untracked files the manifest holds.
ignored_manifest_digest string yes A digest of every ignored entry: path, kind and size, never content.
in_progress string | null no The operation in progress, if any.
tree_manifest_digest string | null no A digest of every entry of the directory tree, ignored included: path, kind, size and link target. Taken only for a move made by copying, where the rename guarantee does not hold.

Used by MigrationStep

WorktreeKind

"primary" | "linked"

Whether a work tree is the repository's own checkout or one linked to it.

  • primaryThe main work tree. It hosts the trunk, is never moved and is never removed.
  • linkedA linked work tree. Belongs at its branch's canonical path.

Used by WorktreeState

WorktreeState

object

One work tree, as the topology sees it.

propertytyperequireddescription
path string yes Absolute, as git holds it.
kind WorktreeKind WorktreeKind yes Primary or linked.
standing Standing Standing yes Where it stands against the topology.
branch string | null no The branch checked out here, short. Absent when detached.
label string yes The name it is shown under: the branch, or detached/<short commit>.
head string | null no The commit checked out here.
detached boolean yes HEAD is detached here.
expected_path string | null no Where this branch's work tree belongs. Absent when detached, or for the primary checkout on the trunk.
exists boolean yes The directory git registered still exists on disk.
current boolean yes The call came from inside this work tree.
locked string | null no Locked, with git's reason; an empty string when it recorded none.
prunable string | null no Prunable, with git's reason.
dirty DirtyState | null DirtyState no Uncommitted work here. Absent when it was not asked for: it costs one subprocess per work tree, and a topology check does not need it.
upstream UpstreamState | null UpstreamState no The branch's upstream and its distance from it.
issue string | null no The issue this branch provably names: a path component of the branch equal to an issue id of .ai/repo/project/issues/, or beginning with it and a hyphen. Nothing is inferred from similarity.
diagnostics array of TopologyDiagnostic TopologyDiagnostic yes What is wrong with this work tree, if anything.

Used by InspectReport RepositoryTopology StatusReport