MCP surface
The tools and resources the executable serves to an MCP client, the transports, the shared server, and what decides all of it.
An MCP client sees the registry as tools and resources. Every tool is a capability with an mcp.tool exposure; every builtin capability with a resource exposure answers its URI; every object of the layer is one more resource. Nothing is listed here that the registry does not hold.
How a client reaches the server — majordomus mcp over stdio, the one shared server per repository with MCP over HTTP, the lease, the peers, what the server refuses — is the MCP document; the shared server's resilience is doctrine.
Tools
205 tools, as tools/list answers. The input schema of each is the capability's canonical input; the page of the capability shows it. The effect is the capability's own classification, and a tool's annotations (readOnlyHint, destructiveHint, idempotentHint) are derived from it.
| tool | capability | kind | input → output | effect |
|---|---|---|---|---|
majordomus_artifactsThe 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. |
artifacts.list | query | ArtifactsInput → ArtifactReport | read — changes nothing |
majordomus_blackboardEvery worker of this repository — attached to a checkout's board or in an active mesh session on any linked machine — with the client it is, what it announced, its checkout, branch, machine and claims (advisory or exclusive); the claims that meet (potential, or confirmed when both are exclusive or the mesh marked one conflicted); the open reviews and untaken handovers; typed relations between workers, verified only when an explicit identifier joins them; the newest signals with the monitor's cursor a follower resumes from; each source with how it was read, and whether the answer is complete. Reads only. |
blackboard.snapshot | query | BlackboardInput → Blackboard | read — changes nothing |
majordomus_briefOne line and a few: this session's episode and task (the one the given provider session owns, else the pointer's), the peers of every board with the boards that could not be read named, the mesh's links and what its journal addresses to this runtime, the integration queue as `majordomus prs brief` says it, and the machine's derive lock. Composed by the server holding this checkout's lease, which holds the board and the mesh: the command line asks it and composes the brief itself only when none answers, saying so; a superseded server says its own board is unreachable by the repository's gather. Carries the reporting interval the policy declares (`session.brief_interval_minutes`) and the keep-awake text a session is told at its start. Writes nothing. |
brief.session | query | BriefInput → SessionBrief | read — changes nothing |
majordomus_capabilityOne capability by canonical id: its kind, schemas, provenance, stability, exposures, benchmark and cache policy. |
capabilities.describe | query | DescribeInput → Capability | read — changes nothing |
majordomus_capabilitiesEvery 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. |
capabilities.list | query | CapabilitiesInput → CapabilityList | read — changes nothing |
majordomus_projectionsA 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. |
capabilities.projections | query | ProjectionsInput → ClosureMatrix | read — changes nothing |
majordomus_commandOne 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. |
commands.get | query | CommandRequest → CommandNode | read — changes nothing |
majordomus_command_graphThe 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. |
commands.graph | query | Empty → CommandGraphReport | read — changes nothing |
majordomus_commandsThe 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. |
commands.list | query | CommandFilter → CommandIndex | read — changes nothing |
majordomus_commit_historyEvery commit in a git range against the commit policy, in one pass: how many were read, how many git composed and are exempt, how many carry an error, and every commit that has a finding with what it is. What the gate reads to refuse new debt, and what answers `is the history of this branch clean?` without a process per commit. |
commit.history | query | HistoryInput → HistoryReport | read — changes nothing |
majordomus_commit_planThe working tree as git reports it — branch, upstream, divergence, every staged, unstaged and untracked path, and any merge or rebase in progress — divided into the commits the history's own scoping supports, each with the evidence for it, under a fingerprint of the repository, the worktree, HEAD and the exact change set, so that a plan acted on later can be refused rather than applied to a tree it was not made for. |
commit.plan | query | Empty → CommitPlan | read — changes nothing |
majordomus_commit_scopesEvery scope this repository's commit history uses, how often, and the directories each one is written about — learned from the history rather than declared in a table, so that a subsystem committed today is in the vocabulary today and one nobody has touched falls to the bottom on its own. |
commit.scopes | query | Empty → ScopesReport | read — changes nothing |
majordomus_commit_validateOne message against this repository's commit policy: the grammar, the subject width, whether the scope is one the history uses, whether every record the message names exists, whether a fix carries a test, and whether a breaking change explains itself — as typed findings with severities, or an exemption for a subject git composed. The same verdict the commit-msg hook refuses with and the gate reads the history through. |
commit.validate | query | ValidateInput → CommitVerdict | read — changes nothing |
majordomus_continuity_deviceThe device a published handover names: the mesh node key (created when this device has none, in the user's state directory and never in a repository), its node id, its public key — what a trust list admits — and the label a person reads. With a label, renames the device; the key and every signature it made are unchanged. |
continuity.device | command | DeviceInput → DeviceView | process state — changes this process's memory |
majordomus_continuity_planWrites nothing. Chooses the record (named, or the one other device's handover this checkout has not resumed, on this branch first) and decides: is its signer trusted, does it diverge from the record this checkout stands on, does the local source hold the commit and branch it was written against, was it written in a dirty tree whose uncommitted files never reached a commit, may the other device still be working. The verdict is ready, ready_with_warnings, requires_source_update, conflict, choose_record, nothing_to_resume or refused, with blockers, warnings, the commands that resolve them (recommended, never run), what a resume restores and what this checkout recomputes for itself. |
continuity.plan | query | RecordInput → ResumePlan | read — changes nothing |
majordomus_continuity_publishProjects the newest handover record into a portable record — the handover body, the repository and device identity, the episode, the source state (branch, commit, and for a dirty tree the changed paths and a fingerprint, never their content), the task and its decisions, and the record it continues — refuses it when any value carries a credential, a secret environment value or a path of this machine's disk, signs it with the device's mesh key and adds it to refs/majordomus/continuity. Touches no branch, index or working tree, and no network: a sync publishes it. |
continuity.publish | command | PublishInput → Published | repository mutation — writes the repositorymay overwrite or remove |
majordomus_continuity_recordsEvery record of refs/majordomus/continuity that passed admission — schema, id, signature, repository identity, portability — by line, with each line's heads, and a diagnostic for every file refused and every lineage defect. |
continuity.records | query | Empty → Records | read — changes nothing |
majordomus_continuity_resumePlans exactly as continuity.plan does and acts only on a ready or ready_with_warnings plan: writes the handover into this checkout's handovers (where handover --resolve and the session briefing find it), appends the task's decisions to the decision log once each, and records the record as the one this checkout continues, so that its next publication extends the same line. Runs nothing the record says; the start command for the task is returned as a recommendation. |
continuity.resume | command | RecordInput → Resumed | repository mutation — writes the repositorymay overwrite or remove |
majordomus_continuityThe 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. |
continuity.state | query | Empty → Continuity | read — changes nothing |
majordomus_continuity_statusThis device and repository identity, the record this checkout continues on its branch, how the local continuity store stands towards the remote's (from the refs alone, no network), every line of work with its heads, the handovers other devices published that this checkout could resume, and every refused record or broken lineage as a diagnostic. A diverged line — the same work continued twice — is reported; separate lines of work on separate devices are not a conflict. |
continuity.status | query | Empty → Status | read — changes nothing |
majordomus_continuity_syncFetches the remote's refs/majordomus/continuity, merges it into the local store as the union of both (records are content-addressed, so a name holding different bytes is reported and the local copy kept), and pushes the result, never forced. Reports each line as equal, remote_newer, local_newer, diverged, local_only or remote_only. An unreachable remote changes nothing and leaves what is pending pending. |
continuity.sync | command | SyncInput → Synced | repository mutation — writes the repositorymay overwrite or remove |
majordomus_convergenceEvery holding of this repository with its disposition, the evidence read for it and the command that would move it out of danger, the tallies per disposition, how many holdings exist on one disk only, and the one verdict over them. Read from git on every call: a commit, a push or an editor's save changes the answer between two calls. |
convergence.report | query | Empty → ConvergenceReport | read — changes nothing |
majordomus_dashboard_overviewIs it healthy, what changed, what is broken, what needs action — each answered by cards read out of `health.report`, `release.version`, `plan.status`, `worktree.status`, `plan.next`, `continuity.state` and `peers.list` (this checkout's board), asked once each through the executor. Every card carries its source capability, input and RFC 6901 pointer, so asking the source the same question yields the same value; a source that cannot answer makes its cards `unknown`, never `ok`. Nothing here rebuilds canonical state or asks anything beyond this process and its checkout. |
dashboard.overview | query | Empty → DashboardOverview | read — changes nothing |
majordomus_delivery_featureOne product feature against the delivery invariant: every dimension with its verdict, the sentence that decided it and what would change it, whether it exists, and — when it does not — how far development has carried it and which dimensions block it. An id the layer does not declare is not found rather than answered as not delivered. |
delivery.feature | query | DeliveryFeatureInput → FeatureDelivery | read — changes nothing |
majordomus_deliveryEvery product feature of the layer against the delivery invariant, ordered by id: the six dimensions with their verdicts, reasons and remediations; the development stage when it is not delivered; the paths it is implemented by and the revisions that last touched them at HEAD and on the trunk; and the publication — the public site's identity, read once, and whether scripts/pages verified it. Reads git and the network; the site address can be replaced with MAJORDOMUS_DELIVERY_SITE_URL. |
delivery.report | query | Empty → DeliveryReport | read — changes nothing |
majordomus_deploy_checkEvery 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. |
deploy.check | query | Empty → DeploymentCheck | read — changes nothing |
majordomus_deploymentOne deployment by its identity, typed, with the repository-relative file it was read from. |
deploy.get | query | GetDeploymentInput → DeploymentView | read — changes nothing |
majordomus_deploymentsEvery 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 and the measured budgets. An object of the kind this executable cannot read is reported with the reason rather than skipped. |
deploy.list | query | Empty → DeploymentList | read — changes nothing |
majordomus_deployments_observedEvery deployment the forge recorded, to every environment it has one in — GitHub Pages among them — with the commit, the ref, who created it, how it ended, where it is served and the run that did it; every environment described by its newest deployment; and every release the forge published. Read from the record `majordomus served forge` wrote when it last asked the forge: nothing here reaches the network, and a checkout that has never asked answers `observed: false` with what to run. |
deploy.observed | query | Empty → ObservedDeployments | read — changes nothing |
majordomus_design_contrastEvery foreground the design puts on a ground, in both themes, measured against WCAG 2.1 AA: the pair, the palette entries behind it, the ratio and the threshold. The pairs are not a list — they are derived from the declaration, which files each status's text with its own ground, and from the primitives that consume it, where a rule that sets a colour and a background states a pair and a rule that sets only a colour states a foreground that lands on every ground a container sets. A pair below the threshold is a finding that names the role, the ground, the theme, the measured ratio and the required one. |
design.contrast | query | Empty → ContrastReport | read — changes nothing |
majordomus_design_explainOne token by name or by the custom property it becomes: what it is for, what it resolves to in each theme, which Flowbite names are synonyms of it, which state words it colours, and which generated files it reaches. |
design.explain | query | ExplainTokenInput → Token | read — changes nothing |
majordomus_designWhat the design is: the fingerprint every stylesheet carries, the identity, the type stacks, the theme contract with the pre-paint statement every surface runs, the audit widths, how many tokens of each kind, and every generated file the declaration is projected into. |
design.system | query | Empty → DesignReport | read — changes nothing |
majordomus_design_tokensEvery token of the design, explained: roles with their light and dark values, statuses with their text, ground and border and the state words filed under them, the type scale, the layout values, the theme contract, the palette. Narrow it to one kind. |
design.tokens | query | TokensInput → TokenList | read — changes nothing |
majordomus_devcontextThe objects a session working on this issue, milestone, intent or set of paths should be given: each with its canonical identifier, the index's own provenance, every discovery path that reached it with the reason and the confidence, its version, its tier and its cost in estimated tokens — followed by everything reached and not given with the reason for each, everything that collapsed into one entry, every pair that does not agree, and the per-tier spend against the budget. Deterministic for a given tree and request; the index fingerprint it was compiled from is in the answer. |
devcontext.compile | query | DevContextInput → CompiledContext | read — changes nothing |
majordomus_devcontext_explainOne canonical identifier judged under a request: whether it was selected, reached and excluded, folded into another identifier, held by the index and never reached, or unknown — with the entry, the exclusion or the collapse itself, and the budget the judgement was made under so that `excluded for budget` can be acted on without a second call. |
devcontext.explain | query | DevContextExplainInput → Explanation | read — changes nothing |
majordomus_devcontext_policyWhat the compiler decides and how: the tiers in the order the budget spends in with the kinds that land in each, every edge kind the composed graph declares with the relevance multiplier the compiler follows it by in each direction — or the reason it refuses to follow it at all — the selectors with which of them infer rather than read, and the defaults for the budget, the depth and the relevance floor. Read this rather than inferring the policy from an answer. |
devcontext.policy | query | Empty → CompilerPolicy | read — changes nothing |
majordomus_devtaskIdentity, title, intent, status, milestone, acceptance criteria, dependencies, blockers, the commits its own evidence names and the commits git found, its branches, the sessions that worked on it, its readiness and everything wrong with its records — each field carrying whether a person authored it (`explicit`), a machine worked it out by a rule that cannot be wrong (`derived`), a machine worked it out by a rule that can (`inferred`, with the rule stated), or it is not available at all (`unknown`, with the reason). A key the record does not carry is `unknown`, never an empty string: `objective: ""` and a record with no objective are the same string and different facts. An id the model does not declare is answered, not refused. `git: false` answers from the records alone, which is what a comparison across machines wants. |
devtask.issue | query | DevTaskInput → DevTask | read — changes nothing |
majordomus_devtask_milestoneEvery issue of the milestone as a node with its readiness, its wave and what waits on it; every dependency edge with at least one end inside, the crossing ones marked; the issues partitioned into ready, blocked, waiting, active, review, completion-blocked, complete and cancelled; the critical blockers ordered by how much unfinished work each holds back; the startable work partitioned into subsets that may genuinely run at the same time — same wave, each parallel-safe, no two sharing a scope path — with each serialisation naming the path that caused it; every dependency cycle as its strongly connected component; and every finding about the milestone or its issues. A pure function of the canonical records: no git, no clock, no network, every list in canonical order, so two runs on two machines produce the same bytes. A work surface reading this derives nothing itself. |
devtask.milestone | query | DevMilestoneInput → MilestoneGraph | read — changes nothing |
majordomus_directoriesEvery 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. |
directories.list | query | DirectoriesInput → DirectoryReport | read — changes nothing |
majordomus_artifactThe 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. |
distribution.artifact | query | ReleaseArtifactInput → ReleaseArtifactView | read — changes nothing |
majordomus_buildWhat 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. |
distribution.build | query | Empty → BuildReport | read — changes nothing |
majordomus_distributionThe 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. |
distribution.model | query | Empty → DistributionReport | read — changes nothing |
majordomus_releasesEvery 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. |
distribution.releases | query | Empty → ReleasesReport | read — changes nothing |
majordomus_install_statusWhether 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. |
distribution.status | query | Empty → InstallabilityReport | read — changes nothing |
majordomus_economics_checkScan the repository's hand-written prose and claim sentences for a quantity (a percentage, 'N times fewer') stated next to the economics vocabulary, and check every claim the methodology binds to a metric: a bound claim may be guaranteed only while its metric's evidence meets the binding and is current. `ok: false` names every finding. |
economics.check | query | EconomicsCheckInput → EconomicsCheckReport | read — changes nothing |
majordomus_economics_explainOne metric and everything it rests on: its formula, its measurement class and what that class means, the pairs and runs behind it (including the invalid ones), excluded runs, the suites and revisions, and the commands that reproduce it. A repository that declares no methodology has no metric, and any id is answered with `present: false` and the statement why, not refused. |
economics.explain | query | EconomicsExplainInput → EconomicsExplanation | read — changes nothing |
majordomus_economics_runsThe raw facts every economics metric is computed from: each recorded run with its task, variant, repetition, model, revision, success-gate verdicts and the totals derived from its provider usage, and the path of its record. |
economics.runs | query | EconomicsRunsQuery → EconomicsRunList | read — changes nothing |
majordomus_economicsEvery metric of the economics benchmark with its value, measurement class, sample size, distribution and bootstrap interval; every pair of runs with its status (valid, control failed, treatment failed, incomparable, ...); results by segment; the state of each suite's evidence (current, stale, incompatible); and the one statement the publication rule allows. Context reduction and total-token reduction are separate metrics and are never merged. |
economics.summary | query | EconomicsQuery → EconomicsSummary | read — changes nothing |
majordomus_economics_tasksOne record per task, folded from the ledger of every checkout `git worktree list` reports and the archives a ledger rotation left: its issue and intent, checkout and branch, first start, last finish or refusal, wall seconds, refusal count, and the episodes that carried it with their spans. Interventions, CI reruns, spend and acceptance are present on every record as not_observed, each with the reason and the issue that will supply it. Lists every ledger read with its line and skipped-line counts and every checkout not read; an optional since/until window filters by each task's start. |
economics.tasks | query | TaskEconomicsQuery → TaskEconomicsList | read — changes nothing |
majordomus_editorsEvery adapter (Zed, Antigravity) with each capability it supports, does not, or cannot be verified for, and the evidence; every projected file with the inputs it is derived from, its content address and its state here (current, stale, absent, or a conflict with a file this generator did not write); orphaned projections; and every finding with its remedy. Writes nothing: `majordomus generate editors` does. |
editors.status | query | Empty → EditorProjection | read — changes nothing |
majordomus_kindsThe kinds the layer holds, each with the route of its index and how many objects it carries, and every route collision there is. A collision is the only way an object of the index can fail to have an address of its own; the healthy answer is none. |
entity.kinds | query | Empty → KindList | read — changes nothing |
majordomus_entityOne object of the layer as an addressable node, by URI or by the address it is served at: identity and route, provenance, front matter and content, every reference it declares and every reference that resolves to it, the surfaces that answer for it, the state of the executable artefacts it names, and its public documentation page as the repository's site/data/publication.toml derives it (null when the repository declares none). |
entity.show | query | EntityInput → EntityView | read — changes nothing |
majordomus_environment_explainThe 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. |
environment.explain | query | ExplainInput → EnvironmentProvenance | read — changes nothing |
majordomus_preflightOne verdict per claim about this checkout — git; the episode, its briefing, the task and the handover; the policy, the rule corpus and the ADRs; the shared server and the MCP, API and Cockpit surfaces it serves; the peer board; recorded test runs, rule enforcement, provider projections, generated documentation and the deployment — each `verified`, `active`, `fresh`, `stale`, `degraded`, `unavailable`, `failed`, `unknown` or `not_applicable`, with the evidence it rests on. A verdict that asserts something is in force cannot be produced without evidence. The same value the command line prints and the entry banner summarises. |
environment.preflight | query | PreflightInput → Preflight | read — changes nothing |
majordomus_environmentOne 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. |
environment.status | query | EnvironmentInput → RepositoryEnvironment | read — changes nothing |
majordomus_session_attachOpen an execution episode for the calling client, or resume the one it already had. 'external_id' is the client's own durable name for the sitting — its conversation or thread id — and must survive a reconnect: a client that comes back under the same identity is given its own episode again, under whatever peer id it now has, rather than a second one. This server's peer id will not do; it is handed out per connection. After this the client's own traffic keeps the episode alive, losing the connection detaches rather than closes it, and it is closed by majordomus_session_detach, by the server stopping, or by the reaper once the reattach grace has passed. The repository's episode is opened by the same command a provider hook runs, and what it reported is in the answer. Needs an MCP session: over plain HTTP there is no connection to bind to. |
episodes.attach | command | AttachInput → Attached | process state — changes this process's memory |
majordomus_session_detachClose an execution episode deliberately: the work is done, not merely interrupted, and the repository's record says so. Without 'external_id' it is whichever episode the calling connection holds, which needs an MCP session: over plain HTTP there is no connection, so the call is refused and the episode must be named. A client that simply goes away does not need this — its episode detaches and the reaper closes it as interrupted — and the difference between those two records is the one thing about an ended episode that changes what somebody does next. |
episodes.detach | command | DetachInput → Detached | process state — changes this process's memory |
majordomus_episodesEvery execution episode this shared server holds, open and detached, with the connection holding each, when its client last spoke, how many connections have carried it, and what the repository's own episode command reported. In-memory: what survives the process is the repository's session record. |
episodes.list | query | Empty → EpisodeList | read — changes nothing |
majordomus_evidence_claimOne claim with its proof state, the execution behind it — outcome, duration, commit, tree state, digest, time and origin — the command that reproduces it, and the other claims the same test proves. A claim the matrix does not declare is a not-found rather than an empty answer, because a typo that read as 'this claim has no evidence' is the one answer this capability must never give. |
evidence.claim | query | EvidenceClaimInput → ClaimEvidence | read — changes nothing |
majordomus_evidenceThe whole claims matrix joined to the ledger and judged at the presented revision: the working tree by default, or the checked-out commit as committed, read from the ledger that commit holds. Per claim: the proof state, the sentence explaining how that state was derived, why when the state alone does not say, the execution behind it, the files that changed since it, and the command that produces it again. A run on a commit the presented revision does not contain is stale, a test that declined to run is not run, and a run the working ledger holds that the presented commit's does not can only withhold proven. The tallies count the whole matrix even when the answer is filtered, and the findings name every claim that declares a guarantee the evidence does not support. Kept per checkout state, never longer: the ledger is a file that changes outside this process, and an edit of it, of a test or of any tracked file, a new untracked file, a commit or a new ref is a new answer. |
evidence.report | query | EvidenceReportInput → EvidenceReport | read — changes nothing |
majordomus_evidence_testOne test — by identity or by the path a claim names it with — with its latest execution, whether its source still hashes to what that execution recorded, the command that runs it again, and every claim that names it. This is the reverse of evidence.claim and reads the same derivation, so the two directions cannot disagree. |
evidence.test | query | EvidenceTestInput → TestEvidence | read — changes nothing |
majordomus_execution_cancelSet 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. |
executions.cancel | command | CancelInput → CancelReport | process state — changes this process's memory |
majordomus_demonstrate_executionWalk 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. |
executions.demonstrate | query | DemonstrateInput → DemonstrateReport | read — changes nothing |
majordomus_execution_eventsThe 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. |
executions.events | query | EventsInput → EventHistory | read — changes nothing |
majordomus_executionThe 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. |
executions.get | query | GetInput → ExecutionView | read — changes nothing |
majordomus_executionsEvery execution this process remembers, newest first, narrowed by state or by capability: the ones it ran and the ones `majordomus run` in another process of the checkout reported to it, each with who started it. The counts beside them — remembered, active, queued, live channels — are what a control plane shows without asking a second question. |
executions.list | query | ListInput → ExecutionList | read — changes nothing |
majordomus_execution_protocolWhere 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. |
executions.protocol | query | Empty → ProtocolReport | read — changes nothing |
majordomus_execution_startRun 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. On the command line (`majordomus run`) it runs in that process and is reported to the server serving the checkout, when one is, through executions.report; a run never starts a server. |
executions.start | command | StartInput → ExecutionView | repository mutation — writes the repositorymay overwrite or remove |
majordomus_completionThe active task's own change set — from the commit it started at to the working tree, uncommitted files included — put through the CI model: which gates it selects and why, what each one last reported and over which files, which verdicts have gone stale because the tree moved underneath them, which required gates have never reported at all, and which obligations the change implies whether or not the task declared them. `finishable` is false only when a required gate is known to be failing, stale or blocked by one that is; absence of a verdict is reported as unverified rather than silently accepted. The done invariant is the questions of share/completion.yaml, in its order, each answered from the source it names; `stage` is the stage of the work those answers fold to, and `complete` is true only when every question passes or is exempt — finishable and complete are two different words. |
gates.completion | query | CompletionInput → Completion | read — changes nothing |
majordomus_gatesEvery validation gate this repository declares — the job that runs it, the command it runs, what it proves, whether every plan selects it and whether its runner can be had on demand at all — with the path classes that decide which change selects which gate, and, derived from those classes, the pathspecs each gate's evidence is taken over. |
gates.model | query | Empty → GateModelReport | read — changes nothing |
majordomus_completion_policyThe one definition of done: the stages of the work in order, every question a task must answer before it may be called finished, the stage each question belongs to and the source its answer is taken from — an obligation of share/obligations.yaml, a gate of the CI model, the change set, the repository's convergence or the closing readings. Read from share/completion.yaml, the file `gates.completion` takes its questions from. A token the policy names and the vocabulary lacks is reported as a problem, and a gate question this repository's CI model never answers is listed by name. |
gates.policy | query | Empty → CompletionPolicyReport | read — changes nothing |
majordomus_gate_stateEvery gate the CI model declares with the standing of its last recorded run in this checkout, whichever task recorded it: `pass` or `fail` over the files as they stand now, `stale` when those files have changed since the run, `queued` when no run has ever reported — listed again under `never_reported`, because a missing verdict is the case an absent reader renders green — and `unknown` when a run exists and cannot be checked against this tree. Each run carries the commit it was taken at and whether that is the commit checked out now. Read offline from this checkout's own record; what it did not consult, the forge's CI runs, is named under `unreached` rather than left out. |
gates.state | query | Empty → GateStateReport | read — changes nothing |
majordomus_graphOne 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. |
graph.get | query | GraphInput → Graph | read — changes nothing |
majordomus_graphsEvery graph this executable derives: its id, what it shows, and what it is derived from. |
graph.list | query | Empty → GraphList | read — changes nothing |
majordomus_guard_editWhether the given session may write the given path now: allowed when the policy's session.edits_require_claim is off, the path is outside the checkout or its local state, the repository declares no enabled mesh, the active task's scope covers it, or a live mesh claim of the session covers it; refused as unclaimed otherwise, with the remedy. What cannot be read — the policy, the mesh — is let through and named, never refused. |
guard.edit | query | GuardEditInput → EditVerdict | read — changes nothing |
majordomus_healthEvery dimension of what this process serves — the layer as it was read, the registry, the scope, version control, benchmark coverage, the committed registry manifest, the shared server of this checkout and the attached peers — each decided by the engine that owns it, with the command that reproduces the verdict. |
health.report | query | Empty → Health | read — changes nothing |
majordomus_pull_requests_cleanupThe cleanup plan, decided offline from the recorded observation: every open pull request cleanup would close — redundant (its work is on master already) or superseded (by a declared successor that landed) — and every one it leaves for a person — possibly redundant (weak evidence) or obsolete (a person marked it, owner decision D3) — each with its disposition and the reasons that decided it, in rank order; beside it, the branches merged pull requests left on origin as `majordomus prs cleanup` last read them, with when and how long ago. A read: it closes, deletes and asks the forge for nothing — `majordomus prs cleanup` reads the forge and `--apply` closes. `observed: false` with the reason when this checkout has recorded no observation. |
integration.cleanup | query | Empty → IntegrationCleanup | read — changes nothing |
majordomus_integration_eventsEvery action the repository's executors recorded, from any of its worktrees, oldest first: the lease taken and given back, observations, selections, stale decisions, each act's attempt before it and its outcome after — merges with the master before and after, refusals, refreshes, verification failures and closures — each with a typed action, its actor, the pull request, the head, the decision's reasons and, on an act, the evidence it was decided on. The trail is one file under the common git directory, so every worktree reads the same one. |
integration.events | query | Empty → IntegrationEvents | read — changes nothing |
majordomus_pull_request_explainOne pull request's assessment — disposition, lane, reasons, every gate of the policy with whether it passed, next action, the master and head it was decided against and when the forge was observed, required checks, review, relation to master, dependencies, overlaps, risk with its factors, and every piece of evidence — with its rank in the queue. `found: false` with the reason when it is not open or nothing is observed. |
integration.explain | query | PullRequestExplainInput → IntegrationExplanation | read — changes nothing |
majordomus_pull_requests_prove_dry_runRuns the executor's non-mutating cycle — refresh, plan, drain --dry-run and cleanup without --apply — between two snapshots of everything it could move if it were wrong: every ref origin serves, every open pull request's number, head, state and labels, the integration audit trail, the executor's lease, and every local ref outside the two namespaces the refresh mirrors. `ok` is true exactly when the snapshots are equal and refs/remotes/origin/<base> and every refs/majordomus/prs/<n> equal what origin serves. A read that reaches the network: the refresh asks the forge through the GitHub CLI and fetches the base and the pull-request heads, and like every read it rewrites the observation, relation and summary caches. It merges, closes and pushes nothing, and takes no input that could make it. |
integration.prove_dry_run | query | Empty → DryRunProof | read — changes nothing |
majordomus_pull_requestsThe ranked queue: the repository, the base and the master commit every assessment was decided against, when the forge was observed, the policy in force (the branch protection's required checks and reviews, the label policy, the merge method: a merge commit, or none when the repository allows none), every open pull request's assessment in rank order — an actionable one with how long it has waited for the executor and how often another was chosen instead — the next merge, the pull requests that need master brought in, the starving ones, the tallies by disposition and lane, and the diagnostics, a stale observation first; beside it, who holds the base branch's integration lease and the last merge the executor recorded. `observed: false` with the reason when this checkout has recorded no observation. |
integration.queue | query | Empty → IntegrationStatus | read — changes nothing |
majordomus_ci_timingsHow long CI takes on the open pull requests, measured from the recorded forge observation: for every check, how many of its runs started and completed, how many passed and failed, and its median, 90th percentile (nearest rank) and longest duration in seconds, the slowest median first; for every open head with a measured check, the wall time from its first check's start to its last check's completion and the check that took longest, the longest wait first; and how many runs could not be measured (still running, queued, or recorded before starts were read), which are counted and never measured as zero. A read: it asks the forge for nothing; `majordomus prs refresh` records the observation. `observed: false` with the reason when this checkout has recorded none. |
integration.timings | query | Empty → IntegrationTimings | read — changes nothing |
majordomus_pull_request_trainsEvery train of open pull requests — a group joined by confirmed dependencies: a base branch that is another open pull request's head, or a `Stacked on #N` / `Depends on #N` line in the body — in landing order. Per link: number, title, author, head and base branch, head commit, the forge's page and checks, disposition, lane, reasons, next action, required-check state and every check on the head, relation to master with how far behind it is and whether it carries master, the prepared head under refs/prep/<n> with whether it is the head the forge serves (pushed) or not yet (pending), its position and depth, whether its turn has come, what it stands on and what it carries, its queue rank and whether a cycle catches it. Per train: roots, tops, the next link the order allows, the edges (STACKED_ON or DEPENDS_ON, satisfied when the link below landed), and the pull requests beneath it that are no longer open. Beside them the prepared heads no train holds, the tallies and the queue's diagnostics. Read from the recorded observation, the queue `majordomus prs status` prints and the local refs: it fetches, pushes and moves nothing. `observed: false` with the reason when this checkout has recorded no observation. |
integration.trains | query | Empty → TrainsView | read — changes nothing |
majordomus_intent_explainOne intent explained from the derivations alone: a sentence for its stage naming each milestone's derived status, a sentence per criterion naming its evidence state, the plan's coverage of it and the command that reproduces it, a sentence for the work and providers realising it, and each drift finding; beside them the derived intent, the coverage of its criteria, its realization and the work linked to it. |
intent_realization.explain | query | IntentExplainInput → IntentExplanation | read — changes nothing |
majordomus_intent_realizationEvery unit of work this checkout can see — ledger tasks with their episodes, providers and handovers, closed session records, peer claims — with every intent it realises through issue, milestone and criterion, each link's provenance (declared: the work cites the issue; observed: its episode moved the issue; derived: its branch names the issue; inferred: only an open issue's scope overlaps) or the first missing link; every intent with its unmet criteria and the issues serving each, the work and providers realising it, and its drift: closed_work_contradicted when every milestone is DONE and a criterion's evidence is stale or failing, closed_work_unproven when it never existed, criterion_closed_unmet when every serving issue is DONE and the criterion is not met; and where the stage and the verdict disagree (ADR 0107), evidence_ahead_of_plan when the verdict is satisfied while the stage is planned or executing, closed_work_not_satisfied when every milestone is DONE and the verdict is unsatisfied or unknown. Live work serving no intent is a warning. |
intent_realization.work | query | IntentRealizationInput → IntentRealization | read — changes nothing |
majordomus_intent_bindingWhat a task asks before it starts (ADR 0111): given the issue the work executes, the intent it serves, the paths it will touch, or an exemption class with its reason, one standing — `bound` when the work serves a criterion of a live intent through links the preflight accepts, `maintenance` when its issues sit under milestones no live intent names, `exempt` when the class is one the policy declares under `intent.exemptions` and a reason was given, `refused` otherwise, each refusal with a cause: the preflight's own seven, and nothing_named, unknown_intent, intent_retired, intent_has_no_open_work, issue_outside_intent, ambiguous_intent (paths alone reached more than one intent), unknown_exemption, exemption_without_reason, exemption_names_work. The answer carries what was named, the issues and intents resolved with what each intent asks of the worker, a note when the paths lie outside the named issue's scope, and two pins a later reader compares: `plan_revision`, which moves when the intent, a link or the critique is edited, and `evidence_standing`, which moves when a served criterion's evidence changes state. Nothing is stored. |
intents.binding | query | IntentBindingInput → IntentBinding | read — changes nothing |
majordomus_intent_coverageThe plan read against the intents (ADR 0073): every criterion of every live intent with the live issues that serve it, the milestones they belong to, and its strength — covered, weakly covered when no serving issue requires evidence, observed when the recorded gap saw it already true, or uncovered when nothing in the plan will make it true — and every issue with the reason it exists: the criteria it serves, maintenance under a milestone no intent names, or unexplained under one that realises an intent. |
intents.coverage | query | Empty → IntentCoverage | read — changes nothing |
majordomus_intentsEvery intent the project model declares, each with the status the plan derives for its milestones, the state of the evidence behind each satisfaction criterion, the stage those two derive — declared, planned, executing, verifying or satisfied, or cancelled or superseded when the record says so — and the verdict the criteria alone derive (ADR 0107): satisfied when every criterion is met, unsatisfied when a test or claim criterion is not, unknown when only command or deployment criteria are unmet or none is declared, with the criteria holding it back. |
intents.list | query | Empty → IntentList | read — changes nothing |
majordomus_intent_preflightGiven the issue a piece of work executes, or the paths it will touch, one verdict: `serves` when no issue is refused and at least one serves a criterion of a live intent through a link that holds, the plan of each such intent critiqued with no blocking finding open (issues judged maintenance beside it do not change the verdict); `maintenance` when the issues sit under milestones no live intent names and serve nothing, as `intent validate` allows; `refused` otherwise, each refusal with its issue, a cause — unknown_issue, no_issue_covers_paths, issue_serves_nothing, serves_another_intent, serves_unknown_criterion, intent_not_critiqued, open_blocking_finding — in path mode every issue judged and the worst verdict answered. The answer carries, for the intents reached and no others, the statement, the served criteria with the live state of their evidence, the invariants, non-goals and governance, the critique with its open blocking findings, and the recorded gap bounded to those criteria. |
intents.preflight | query | IntentPreflightInput → IntentPreflight | read — changes nothing |
majordomus_intent_proposeWrite a new intent record under `.ai/repo/project/intents/` from a statement of what must become true, with an optional title (the statement's first line when absent) and id (the title's slug when absent). The record names no milestone, criterion or invariant: its stage derives as `declared`, `intent validate` reports the two absences as warnings rather than failures, and no work can serve it until it is planned (ADR 0144). Nothing about its standing is stored. An existing record is refused, never overwritten, and the file appears whole or not at all. The answer names the identity and the file; `intents.record` answers the derived stage once the index holds it. |
intents.propose | command | IntentProposeInput → Proposed | repository mutation — writes the repositorymay overwrite or remove |
majordomus_intent_recordOne intent in full: its statement and invariants as authored, each milestone with the status the plan derives, each satisfaction criterion with the state of its evidence and the command that reproduces it, the stage, and the verdict the criteria alone derive with the criteria holding it back. The record's own file stays at `majordomus://intent/<id>`. |
intents.record | query | IntentRecordInput → IntentView | read — changes nothing |
majordomus_intent_validateEvery finding over the intents: an intent naming no milestone or no criterion, a milestone that does not resolve, a criterion with no evidence reference or one that names nothing this repository holds, governance that does not resolve, a successor that is not an intent, a file name that disagrees with its id — each a failure — and a milestone no intent serves, a warning. |
intents.validate | query | Empty → IntentValidation | read — changes nothing |
majordomus_knowledge_candidatesEvery knowledge record with status candidate under the candidates source class: its class, its assertion, the episode it came from and that episode's branch, and how long it has waited — measured from the derivation that wrote it, then the commit that added it, then its own date — judged against session.freshness; against the policy's cap. A candidate whose episode this checkout does not know is reported with no branch rather than hidden. Ordered by id. |
knowledge_base.candidates | query | Empty → KnowledgeCandidates | read — changes nothing |
majordomus_knowledge_recordOne knowledge record by id — candidate or curated — with every reference it names resolved: a session against the tracked session records and the ledger, a task or decision against the ledger and the task store, a commit against git, a file or test against the index and the tree, a rule, an ADR, an issue or another record against the index. Which references dangle is the question a reviewer asks before promoting, and the one the integrity validator asks of every record. A `task:none` or `decision:none` reference is refused by name. |
knowledge_base.record | query | KnowledgeRecordInput → KnowledgeRecord | read — changes nothing |
majordomus_knowledge_statusThe freshness half of the stopped-writer judgement (ADR 0052, applied to the knowledge deriver by ADR 0091): the newest knowledge.derived line, the newest session.closed line, how many closed episodes no derivation names, the candidate counts, and — once a derivation has run in this checkout and the switch is on — whether the newest closed episode went underived past session.freshness.stale_minutes. Episode ids are compared, never line order. Whether the close path still calls the deriver is read from the source by the shell validator, not here. |
knowledge_base.status | query | Empty → KnowledgeStatus | read — changes nothing |
majordomus_layout_checkEvery path a declared layout excludes, named with the contract it violates: a tracked file under the tracked half that git's ignore rules match (state that does not travel, under a contract that excludes cache or runtime), and a file under the local half that is a byte copy of a tracked canonical file or declares the schema of a kind share/kinds.yaml calls canonical (under the manifest's `local.excludes: [canonical]`). Only what a contract declares is judged. Reads git and the local half's files; no build and no network. |
layout.check | query | Empty → LayoutReport | read — changes nothing |
majordomus_lifecycle_closedThe tracked, durable projection of closed episodes: how many there are, how many closed on this branch, and the newest twenty. This is the only half of the subsystem that survives a clone; everything under .ai/local/ names this machine and travels nowhere. |
lifecycle.closed | query | Empty → ClosedSessions | read — changes nothing |
majordomus_lifecycle_episodesEvery open episode in this checkout's store, with the provider session that owns it, the worktree and branch it opened on, where it stands, and what the ledger last saw it do. `continuity.state` reports the one episode the pointer resolves to, which is right for a briefing and blind to every other window open on the same worktree. |
lifecycle.episodes | query | Empty → Episodes | read — changes nothing |
majordomus_lifecycle_providersPer provider: the lifecycle events its adapter declares in the provider's own vocabulary, whether it can archive prompts, the official seams through which it reports what a session consumed (usage, with the citation), and which of this repository's enforcement entries name its hook. Declared in share/providers.yaml and in the policy; never inferred from whether a shim happens to be on disk. |
lifecycle.providers | query | Empty → ProviderLifecycles | read — changes nothing |
majordomus_lifecycle_recoveryOpen records that can no longer close themselves, temporary files a killed close left in the tracked sessions section, whether the pointer has been migrated to the per-provider layout, and the arithmetic that says whether every episode the ledger has seen start is accounted for. Every finding carries the command that clears it. |
lifecycle.recovery | query | Empty → Recovery | read — changes nothing |
majordomus_lifecycle_runtimeThe commit the served index was built at, against the commit the repository is on, read on this call. A server that froze its index at start-up answers every question about a commit from hours ago with nothing in the answer saying so; this is the reading that can tell. |
lifecycle.runtime | query | Empty → RuntimeView | read — changes nothing |
majordomus_mcpWho answers `initialize` and with which protocol versions; the transports and the sessions attached over each; the methods served, and that prompts and notifications are not; every tool (or only those with one effect) with its capability, effect and the hints its annotations are derived from; the tools that write the repository; the resources; and whether each client the distribution declares has a configuration here that starts this repository's server. Reads the registry and one file per declared client; writes nothing. |
mcp.projection | query | McpProjectionInput → McpProjection | read — changes nothing |
majordomus_mesh_build_cache_envWhat the process that starts the sccache server should have in its environment on this machine, derived and never typed: the local disk as the first level and the selected store as the second (SCCACHE_MULTILEVEL_CHAIN=disk,s3, the bucket, the endpoint, the region, whether TLS is used, a key prefix of rustc's host triple, the credential FILE path and its profile) only when sccache has the multi-level chain (measured on a throwaway server, not assumed), a credential file of mode 0600 holding the profile exists, and the store answered its readiness route now; otherwise no variable at all, with the one condition that did not hold. sccache fixes its chain at server start and fails the compile when a level is down then, so a store is added only to a server that is starting. No key is ever in the answer, only the credential file's path (ADR 0157, I2673). |
mesh.build_cache.env | query | BuildCacheEnvInput → BuildCacheEnvReport | read — changes nothing |
majordomus_mesh_build_cache_keyEvery lockfile the repository tracks — Cargo.lock, mix.lock, package-lock.json — as the thing it makes cacheable (a cargo build directory, mix dependencies, npm node_modules), each with its key: a schema version, the platform (the toolchain's own host triple, or `any` for platform-independent source), the toolchain as its executables state it, and the digest of every input and environment variable that changes what the install leaves. Where the entry is restored to is a separate field, so two checkouts with one lockfile share one entry. A kind whose toolchain is absent says why and has no key (ADR 0157, I3950). |
mesh.build_cache.key | query | BuildCacheKeyInput → BuildCacheKeyReport | read — changes nothing |
majordomus_mesh_claimClaim repository paths for a session. An exclusive claim that meets a live exclusive claim of another session — on this runtime or any runtime this one has heard — is refused as `claim_conflict` with the claims it meets; an advisory claim is recorded and its overlaps reported. A claim lives while its session is open and its runtime beats: a crashed holder's claim expires everywhere on its own. Writes this runtime's journal only. |
mesh.claim | command | ClaimInput → Written | process state — changes this process's memory |
majordomus_mesh_cooperationWhether this runtime cooperates and why not when it does not: its runtime and stream, the repository identity links are matched on, the link protocol and features, the heartbeat and expiry, every linked peer with its link state, last exchange, round trip and failures, every refused candidate with the rule that refused it, and the counters of handshakes, syncs, reconnects, expiries, replicated and refused events. |
mesh.cooperation | query | Empty → CooperationStatus | read — changes nothing |
majordomus_mesh_doctorEvery prerequisite proved on this machine alone — the declaration parses, the identity loads and, under an allowlist, is on it, the repository has a mesh identity, a UDP socket binds, the multicast group joins, broadcast enables, and the discovery and link protocols sign and verify end to end in memory — and then the server's own verdict: in a shared server, whether an enabled declaration actually activated the mesh and, when it did not, the server's reason, which fails the report. Each failed check names its impact and its remedy. Deterministic, no second node required. |
mesh.doctor | query | Empty → MeshDoctorReport | read — changes nothing |
majordomus_mesh_enrolAdd this machine's public key to trust.allow of the repository's mesh declaration, under a comment naming the machine, creating the node identity first when there is none. Idempotent: a listed key changes nothing. The comments and every other line of the declaration stay as they were, and an edit that would not parse back as a declaration is refused before anything is written. Under deny_unknown a machine opens its mesh only once its key is listed, so this is the one step that joins a machine; commit the file and restart the server. |
mesh.enrol | command | Empty → MeshEnrolment | repository mutation — writes the repositorymay overwrite or remove |
majordomus_mesh_eventsThe journal's events a page at a time, in Lamport order: each with its stream, sequence, stamp, repository, signing key, kind and body. The answer's cursor is the next page's `cursor`, and a walk resumed from each one returns every event exactly once, a partitioned runtime's late event included; `after` still walks by Lamport stamp. |
mesh.events | query | MeshEventsInput → EventList | read — changes nothing |
majordomus_mesh_firewallWhat inbound traffic the declaration implies this machine must admit — the multicast group's port, the broadcast port when it is a permitted fallback, every declared hub port whose address is this machine's, and the server's own port when it listens beyond loopback — from the private networks the declaration names; which firewall front this host runs (ufw, nftables, the macOS application firewall); the commands that admit the plan there; what the firewall itself says about the plan now (present, missing, inactive, or unobservable without root); and what the kernel logged it dropping toward those ports in the last five minutes. Fails when a rule is observed missing or a drop was logged. Reads the host; changes nothing. |
mesh.firewall | query | FirewallInput → FirewallReport | read — changes nothing |
majordomus_mesh_handover_consumeTake a handover another runtime published: record the consumption on the mesh, and write it into this checkout's handovers directory as a record `majordomus handover --resolve` finds on the same branch — once, however often it is consumed. |
mesh.handover.consume | command | HandoverConsumeInput → ConsumeAnswer | process state — changes this process's memory |
majordomus_mesh_handover_publishPublish a handover record of this checkout — the newest, or the one named under .ai/local/state/handovers/ — to every linked runtime: its task, branch, head and time from its front matter, the issue and milestone given, and its Markdown body, bounded and identified by the body's digest. No path of this machine travels, and no file outside the handovers directory is ever read. |
mesh.handover.publish | command | HandoverPublishInput → Written | process state — changes this process's memory |
majordomus_mesh_identityThe node identity kept under the user's state directory, public half only: node id, public key, display name. The signing key appears in no projection. Absent is an answer, not an error — the identity is created when a mesh first activates. |
mesh.identity | query | Empty → MeshIdentityReport | read — changes nothing |
majordomus_mesh_nodesEvery runtime this process has observed, one record per node and runtime slot, deduplicated across every discovery source, in node-id order: identity, trust, presence, endpoints, capabilities, repositories, provenance and versions. In memory, gone with the process. |
mesh.nodes | query | Empty → NodeList | read — changes nothing |
majordomus_mesh_peerOne runtime by its key (`<node>-<runtime>`, or a node id for its first runtime): the machine it runs on, its liveness, its link from here, its sessions and claims, and any refusal recorded against it. Not found is an answer with the reason. |
mesh.peer | query | PeerInput → PeerDetail | read — changes nothing |
majordomus_mesh_peersMachine → runtime → session → claim: every runtime this one is linked to or has heard through the journal, grouped by machine, local first; each runtime with its liveness, the milliseconds since its beat rose, its link and its newest live claim. The default `summary` view lists only the active sessions, each with its live claims counted and its intent cut; `view=full` lists every session with every claim. `session` and `runtime` narrow either. Remote and local runtimes share one shape, and the whole fold's digest closes the answer: equal digests, equal state. |
mesh.peers | query | MeshQuery → PeerTree | read — changes nothing |
majordomus_mesh_registerPresent one signed envelope; it is verified exactly as a datagram — bounds, staleness, signature, trust policy — and recorded as a rendezvous observation when it holds. The answer carries this node's own envelope and the candidates its registry holds, each verifiable end to end on its own signature. Registration grants nothing: the caller becomes a record, never an authorization. Changes this process's memory only. |
mesh.register | command | RegisterInput → RegisterAnswer | process state — changes this process's memory |
majordomus_mesh_releaseRelease a claim this runtime's current run holds, by its key. A claim written elsewhere is refused as `not_own`: only its holder releases it, and a dead holder's claim expires instead. Writes this runtime's journal only. |
mesh.release | command | ReleaseInput → Written | process state — changes this process's memory |
majordomus_mesh_review_answerAnswer a review request from any runtime with approved, changes_requested or commented, and a note. Replicated to every linked runtime. Writes this runtime's journal only. |
mesh.review.answer | command | ReviewAnswerInput → Written | process state — changes this process's memory |
majordomus_mesh_review_requestAsk for a review of a branch, commit or pull request, optionally of one named runtime — which must be linked and carry the `reviews` feature, or the request is refused as `feature_unsupported`. Replicated to every linked runtime. Writes this runtime's journal only. |
mesh.review.request | command | ReviewRequestInput → Written | process state — changes this process's memory |
majordomus_mesh_review_withdrawEnd a review request this runtime asked for — done, void or superseded — with an optional result note the request then carries. Any session of the asking runtime may (a reconnected asker is another session of it); no other runtime may, and it is never counted as an answer. An unanswered request also reads expired while its runtime has stopped beating. Replicated to every linked runtime. Writes this runtime's journal only. |
mesh.review.withdraw | command | ReviewWithdrawInput → Written | process state — changes this process's memory |
majordomus_mesh_session_closeEnd a session of this runtime; every claim it holds ends with it, on every linked runtime. Writes this runtime's journal only. |
mesh.session.close | command | SessionCloseInput → Written | process state — changes this process's memory |
majordomus_mesh_session_openSay what a session of this runtime is: its client, worker, intent, task, issue, milestone, branch, head, dirtiness and context revision. Replicated to every linked runtime; a later word replaces an earlier one. Writes this runtime's journal only. |
mesh.session.open | command | SessionInput → Written | process state — changes this process's memory |
majordomus_mesh_stateThe journal folded. The default `summary` view is bounded whatever the history: sessions and claims counted by standing, each runtime with its liveness, its counts and its newest live claim, the open review requests and the handovers nobody has taken, and the digest two runtimes compare. `view=full` is every session, every claim with its standing (held, released, expired, conflicted with its winner), the advisory overlaps, every handover with who consumed it, every review request with its answers, and every stream's liveness on this runtime's clock. `claims=live`, `after` (a Lamport stamp), `session` and `runtime` narrow either view; the digest is always the whole fold's. |
mesh.state | query | MeshQuery → MeshStateAnswer | read — changes nothing |
majordomus_meshWhether the mesh runs in this process and why not when it does not; this node's public identity; every discovery provider with its state and counters; the registry's tallies; and the refused datagrams by reason. The one status every surface shows. |
mesh.status | query | Empty → MeshStatus | read — changes nothing |
majordomus_mesh_verifyRun a live verification: cooperation is active, the repository identity resolves, the endpoints are reachable beyond loopback, the heartbeat beats, the journal holds no stuck gap; then one sync round with every peer this runtime dials, timed, and whether both sides now hold the same high-water marks. Each failed check names its impact and remedy. Changes nothing but the journal's replication. |
mesh.verify | command | Empty → MeshVerifyReport | process state — changes this process's memory |
majordomus_modelsEvery declared vendor and model, optionally narrowed by vendor, capability word, or one id or alias. Vendors carry whether their named credential variable is set — presence only, never a value. The order is the declaration's, which is also routing's preference order; the catalogue's own findings (a duplicate alias, an undeclared vendor) ride along. |
models.list | query | ModelsFilter → ModelsReport | read — changes nothing |
majordomus_models_routeDecide which declared model a stated need selects: the first in declaration order satisfying every requirement, the qualifying rest as the fallback chain, and every excluded model with the first check it failed. Pure over the catalogue and the input — the same question gets the same answer, and 'why' is in the answer itself. |
models.route | query | RouteInput → RoutingDecision | read — changes nothing |
majordomus_monitorA page of signals after a cursor, oldest first, or without one the newest of the last `since` seconds: each with its time, source, kind, severity, machine, session, actor, pull request, branch, issue, paths, a one-line summary and whether it is for the reader. Re-projections and undecided steps are counted as `suppressed`; a source that cannot be read is listed with its reason, never answered as empty. The page's `cursor` is the next page's `after`, and nothing on this page comes back. Reads only. |
monitor.stream | query | MonitorInput → MonitorPage | read — changes nothing |
majordomus_getOne 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. |
objects.get | query | GetInput → ResourceView | read — changes nothing |
majordomus_listList the declarative objects of the repository's AI layer, optionally by kind or tag. |
objects.list | query | ListInput → ObjectList | read — changes nothing |
majordomus_searchCase-insensitive substring search over identities, titles, descriptions and content. |
objects.search | query | SearchInput → SearchResult | read — changes nothing |
majordomus_verify_objectsRead 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. |
objects.verify | query | VerifyInput → VerifyReport | read — changes nothing |
majordomus_obligation_closureEvery 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. |
obligations.closure | query | Empty → Closure | read — changes nothing |
majordomus_obligationsThe 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. |
obligations.vocabulary | query | Empty → Vocabulary | read — changes nothing |
majordomus_observatory_captureThe mesh scenes of the Observatory as this process has them live, fit for publication: machines, runtimes, sessions and events by ordinal, an event by its kind, logical clock and time only. Writes nothing; committing the answer to .ai/repo/observatory/recording.json is what publishes it. |
observatory.capture | query | Empty → ObservatoryRecording | read — changes nothing |
majordomus_observatory_eventsThe events of the mesh journal above a cursor, as the Observatory's activity scene draws them: identity, kind, node, logical clock and time, newest first, at most a page. The answer's cursor is the next request's `after`; a cursor this journal never reached is expired, and the reader takes a fresh projection. Without a cursor, the newest page. |
observatory.events | query | ObservatoryEventsInput → ObservatoryEvents | read — changes nothing |
majordomus_observatory_replayThe recording of the mesh scenes the repository carries at .ai/repo/observatory/recording.json, which the Observatory draws, labelled as a replay, where no mesh runs. Absent is present: false; a file that cannot be read is an error. |
observatory.replay | query | Empty → ObservatoryReplay | read — changes nothing |
majordomus_pack_planWhat a profile of share/archive.yaml would pack: the files carried and their bytes and o200k_base tokens, every file left out by reason (worktree, link, artifact, binary, derived, excluded; derived counted, the rest listed), the shards it is cut into within the profile's token budget and file count, and every finding that refuses the build — a file over the budget, too many shards, a machine path or credential in a selected file, an empty selection, a profile without limits. Reads git's index and blobs only; writes nothing. |
pack.plan | query | PackPlanInput → PackPlan | read — changes nothing |
majordomus_pack_verifyRead a pack directory inside the repository against its pack.json: every file it names is present with its digest and nothing else is, every carried file's content has the digest its marker records, no carried path is a binary, an artifact, a link or a gitlink under the profile the manifest names, no file is over the profile's token budget or holds a NUL byte or a leak, and there are no more files than the profile allows. An unreadable manifest is unmeasured, never a pass. |
pack.verify | query | PackVerifyInput → PackVerdict | read — changes nothing |
majordomus_announceTell the other peers of this shared server what the calling session is doing and which paths it expects to touch. A peer may hold several claims at once: name one with 'claim' and it stands beside the others, announce under that name again and it is updated, leave it out and this is the peer's one unnamed claim. Name your claims when one session is doing several things at once — subagents share their parent's session, so an unnamed announcement from each of them would replace the last rather than adding to it. Changes this process's memory only; the repository is never written. Needs an MCP session: over plain HTTP there is no caller. |
peers.announce | command | AnnounceInput → Announced | process state — changes this process's memory |
majordomus_peersEvery worker of this repository: id, the client's own name and version from its initialize, transport, when it attached, when it was last seen, what it announced, and which checkout it is attached to. A server serves one checkout, so the board of a repository worked on through linked worktrees is gathered: this checkout's board out of memory, every other checkout's from the server its lease names, asked for its own board alone. 'covered' says how many checkouts were covered, 'boards' lists each one with a server, a worker or a board that could not be read (the rest counted in 'omitted'; 'view: full' lists every one), and 'complete' whether every board could be read, so a short board is never mistaken for an empty repository. 'checkouts: this' reads one board and enumerates, probes and asks nothing else. In-memory on every server; gone with the processes. |
peers.list | query | PeerListInput → PeerList | read — changes nothing |
majordomus_perfThe 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. |
perf.counters | query | Empty → CounterSnapshot | read — changes nothing |
majordomus_plan_deliveryFor every issue (or one), the furthest delivery stage proved — none, branch, pr_open, merged, released, deployed — each with the object that proved it and when it was observed: the branch that names the issue (by id, the I1405 rule, or by its slug), the open pull request in the recorded forge observation, the newest commit in the trunk's history that names it (a merge by its pull-request title or branch, any other commit by its subject, never by its body), the first release record (`.ai/repo/releases/v*.yaml`) whose commit contains that merge, and the published `latest.json` that names that release or a later one. Beside it, the issue's declared status, so a contradiction between the stamps and the work is one comparison away. Live by default: the trunk this clone knows, every branch, the forge observation `majordomus prs refresh` recorded, the release records, and the `latest.json` of the commit the last Pages deployment published. With `at`, the merges of that commit's history and the tree's release records and nothing live — every branch, forge and deployment source is reported unread — so only merged and released can be proved and the answer is a function of the commit alone. A source that was not read is reported unread with its reason, never as none: an issue it could have moved further is not settled and names it. Inferred on every call and stored nowhere; it never writes a stamp. |
plan.delivery | query | PlanDeliveryInput → IssueDeliveryReport | read — changes nothing |
majordomus_plan_driftEvery contradiction between an issue's declared status and its delivery (plan.delivery), each with the objects that prove it: `merged_not_recorded` — READY, BLOCKED or ACTIVE, with a merge on the trunk naming it (pull request, merge commit, release) and no open pull request naming it; `active_without_work` — ACTIVE since before the window, with no branch, pull request, merge or live mesh claim naming it; `done_without_trace` — DONE with no merge naming it, advisory because record-only issues exist. Each finding carries its age, whether it is past the window `.ai/repo/ci/plan.yaml` declares (`drift.window`, seconds), the sources that were not read and could have dissolved it, and the command that settles it (`majordomus plan verify|done <id>`). With `gate`, judged as a gate: on a `head` every merged_not_recorded is pending; on the `trunk` one merged longer than the window ago is refused and a younger one pending; the other classes never refuse; a missing or unreadable window refuses (exit 12); refusals fail the gate (exit 10) only under `drift.enforcement: blocking`, and are reported with exit 0 under `advisory`. Observed live, or `at` a commit as plan.delivery is. Inferred on every call; it never writes a stamp. |
plan.drift | query | PlanDriftInput → DriftReport | read — changes nothing |
majordomus_plan_flightThe milestones with work in flight, the one the graph allows next, and the latest release as the releases themselves say it, read live on every call (ADR 0166, decision 4). Now is every open milestone holding an open issue with an open pull request that names it (`plan.delivery`'s `pr_open`), a live mesh claim made for it, or a declared ACTIVE status, each with those issues, why they are in flight, their declared status beside their inferred stage, and the objects that prove it (branch, pull request, merge commit, release tag, published `latest.json`, claim), linked on the forge where the forge has them. Next is the first open milestone in the plan's order that is not now and whose unfinished prerequisites are all now. The latest release is the highest stable version among the release records, the `v*` tags of this clone and the `latest.json` the last successful Pages deployment published, so a release whose record merged after its tag is not shown older than it is; `executable_tagged` says whether the answering executable's own version is tagged. `milestone` adds that milestone with every one of its issues. A source that was not read (the forge, the publication, the mesh outside a server) is named with its reason, never treated as empty. |
plan.flight | query | PlanFlightInput → PlanFlight | read — changes nothing |
majordomus_plan_issuesOne 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. |
plan.issues | query | PlanIssueFilter → PlanIssueList | read — changes nothing |
majordomus_planEvery 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. |
plan.model | query | Empty → Plan | read — changes nothing |
majordomus_plan_nextThe 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. |
plan.next | query | PlanMilestoneFilter → PlanNextIssue | read — changes nothing |
majordomus_plan_recordA 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. |
plan.record | query | PlanRecordInput → PlanRecord | read — changes nothing |
majordomus_plan_roadmapThe 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. |
plan.roadmap | query | Empty → PlanRoadmap | read — changes nothing |
majordomus_plan_statusEvery 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. |
plan.status | query | PlanMilestoneFilter → PlanStatusReport | read — changes nothing |
majordomus_plan_transitionRecord that execution of an issue began (`start`), that implementation is complete with evidence outstanding (`verify`), or that it is finished (`done`). One field of the issue's own record is stamped, the seal of its event is written beside it, and the event is appended to the ledger; a stamp without that seal moves no status. The move is refused when the model says it is illegal — an issue that is not READY cannot start, one that was never ACTIVE cannot be verified, and one that was never started, whose dependencies are unfinished or whose required evidence is absent cannot be done — and the refusal names what is in the way. The status that comes back is derived from the record afterwards, not announced by the move: a `done` whose evidence is missing leaves the issue in VERIFY and says so. |
plan.transition | command | PlanTransitionInput → PlanTransitionResult | repository mutation — writes the repositorymay overwrite or remove |
majordomus_plan_validateEvery 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 lifecycle stamp its transition did not write (no seal of its plan_* event beside it), 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. |
plan.validate | query | Empty → PlanValidation | read — changes nothing |
majordomus_plan_wavesThe 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. |
plan.waves | query | PlanMilestoneFilter → PlanWaveReport | read — changes nothing |
majordomus_product_domainsThe few things the product controls, each declared once under the layer's features section with its promise and the failure it answers, and each holding the stable features that name it: their interfaces, the distinct claims, use cases, rules and capabilities behind them, and the operational moments they answer, all derived. A domain lists no features; a feature names its domain. The default is the stable set; pass status=any for every domain. |
product.domains | query | DomainQuery → DomainList | read — changes nothing |
majordomus_featureOne 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. |
product.feature | query | FeatureInput → ResolvedRefs | read — changes nothing |
majordomus_featuresEvery product feature this repository declares, narrowed by any of the facets the model derives — featured, area, domain, 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. |
product.features | query | ProductQuery → FeatureList | read — changes nothing |
majordomus_product_matrixEvery 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. |
product.matrix | query | Empty → Matrix | read — changes nothing |
majordomus_providersEvery 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. |
product.providers | query | Empty → ProviderList | read — changes nothing |
majordomus_product_validateEvery 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. |
product.validate | query | Empty → ProductValidationReport | read — changes nothing |
majordomus_qualityThe 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. |
quality.report | query | QualityInput → QualityAnswer | read — changes nothing |
majordomus_quality_rustdocThe crate's rustdoc tree — the rustdoc surface's artifact, as the web topology resolves it — judged against the crate's own inventory of exported items: every item that owns a page has it at the route rustdoc gives it, no item page is left without an item, the tree declares it was built from HEAD, the library's index is present and names the crate, its assets are present, every relative link resolves, and no file names the machine it was built on or carries a credential. Answers the verdict (clean, findings, or no_tree when there is nothing to judge), the counts it joined, every exported module with its page, and one typed finding per defect with the file and what to do. |
quality.rustdoc | query | RustdocInput → RustdocReport | read — changes nothing |
majordomus_reasoning_advisorsEvery declared advisor — then every linked mesh peer carrying the review feature — with its status (available, unavailable, not_configured, disabled, temporarily_failed, rate_limited) and why, from presence alone (an executable on PATH, a credential variable set; never a value), the reasoning mode and the recorded outcomes of earlier consultations. Plus the capacity per advisory capability. No advisor is an ordinary answer: reasoning is operational either way. |
reasoning.advisors | query | Empty → AdvisorsReport | read — changes nothing |
majordomus_reasoning_checkThe executable half of the rules advisors-are-optional and review-is-recorded-not-claimed: the advisor catalogue resolves against the provider table and the model catalogue; every adapter it names has its transport module; no provider-independent source names an advisor; no CI workflow or gate names a model credential; no document asserts a refused claim; every stored consultation names an advisor its plan selected, and every conclusion's review matches what it cites. The CI and claims checks judge what this repository's own workflows and documents say, so they apply only where the rule advisors-are-optional is declared; an adopter is held to what it adopted. |
reasoning.check | query | Empty → ReasoningCheck | read — changes nothing |
majordomus_reasoning_explainOne reasoning record with the whole chain of its assessment: the uncertainty and its evidence, the plan and who it selected or why nobody, each consultation, each disagreement and the experiment that settled it, the conclusion and its validation — the provenance of a decision without the conversation that produced it. |
reasoning.explain | query | ReasoningExplainInput → ReasoningExplanation | read — changes nothing |
majordomus_reasoning_planDecide, without recording anything, whether a stated uncertainty warrants independent review, how much the mode allows, and which available advisors a capability-driven selection would ask — with every advisor left out and why. Trivial and low uncertainty is decided locally; material uncertainty with no suitable advisor gets the structured local review instead. Pure over the catalogue, the availability and the input. |
reasoning.plan | query | PlanPreviewInput → ReviewPlan | read — changes nothing |
majordomus_reasoning_recordWrite one typed reasoning record of the open task under .ai/local/state/reasoning/: an assessment (with its evidence), a plan (computed here from the availability of this moment, never supplied), a consultation (only of an advisor its plan selected), a disagreement, a resolution (evidence, never a count), a conclusion (its review count computed from the consultations it cites; refused while a disagreement on its assessment is unsettled), a validation or a failed attempt. Secret shapes are redacted before anything is written. |
reasoning.record | command | ReasoningRecordInput → ReasoningRecorded | repository mutation — writes the repositorymay overwrite or remove |
majordomus_reasoningThe reasoning state of the open task (or of a named one, or of all): assessments and where each stands, consultations and how each ended, disagreements and what settled them, conclusions with their computed review and validation, the timeline, token totals the adapters reported, and the Markdown report a handover carries. Derived from the records alone, deterministically. |
reasoning.status | query | ReasoningStatusInput → ReasoningStatus | read — changes nothing |
majordomus_recover_orphansWalk the publish temps of every record store, the rename temps under the layer's local half and the tracked sessions section, and the site generator's staging directories at the repository root; give each a verdict by reading its age and then its content; and, unless the call is a check, remove the ones the verdict says nothing is holding. Nothing is deleted for being unrecognised: a temp holding the only copy of a record is reported as `incomplete` and left for the caller to publish, content this version cannot classify is `foreign` and left exactly where it is, a candidate whose age this platform cannot read is `unmeasurable` and never a candidate, and no directory is ever removed. The threshold is required and has no default, because a sweep measuring against an absent threshold would find every file stale. |
recover.orphans | command | RecoverOrphansInput → RecoverOrphansResult | repository mutation — writes the repositorymay overwrite or remove |
majordomus_release_analysisThe public capability surface of this tree against the one the last release published, every movement of it named with the reason it counts for what it does, and the smallest version this tree may therefore declare. The compatibility level is measured from the contract rather than read off the commit subjects: a capability, route, MCP tool, command, or a required field of either schema that a caller could hold and cannot any more is breaking whatever the commit that removed it called itself. What the commits said about themselves is carried beside the verdict as evidence, and the answer says when the two disagree. |
release.analysis | query | ReleaseAnalysisInput → ReleaseVersionPlan | read — changes nothing |
majordomus_changelogEvery 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. |
release.changelog | query | ReleaseChangelogInput → ReleaseChangelog | read — changes nothing |
majordomus_release_currencyHow much landed work the trunk holds past the last release, since when, and at which version, measured when asked (I3070). The last release is the newer of the release the layer records and the newest version tag the trunk contains: a tag is pushed before its record lands. Landed work is every commit of the trunk past it except merges and release commits. A landing is a commit of the trunk's first-parent history, and the work has waited since the oldest landing that brought anything but release commits. The stance is current when nothing has landed past the release, owed when work has, and overdue once it has waited longer than six hours. The version the public contract requires is decided by the version selection release.version makes, but only from a recorded release and only in a checkout at the trunk; otherwise the answer says which it is not. Ask with next false to leave the version out, as the brief and doctor do. It reads git and the clock, so it is never committed into derived data. |
release.currency | query | ReleaseCurrencyInput → ReleaseCurrency | read — changes nothing |
majordomus_release_nextWhat the integration executor raises the trunk's version to when it lands a head (ADR 0134): the version the trunk declares, how far the head moves the public contract measured against the trunk's committed registry, what that movement requires under the version's mode, the repository's floor from `release.floor` in the policy, the exemption class that lowered the floor if every changed path falls in one, the larger of the requirement and the floor, and the trunk's version raised by it — with one sentence per step. Everything is read from git at the two refs, so the answer does not depend on which executable runs or on the branch's own version, which is why a retried landing cannot raise twice. It decides and writes nothing; an input that cannot be read is refused rather than guessed. |
release.next | query | ReleaseNextInput → LandingDecision | read — changes nothing |
majordomus_release_versionThe version the crate manifest declares — the one place it is authored — the version the shell tool prints from its projection `share/version.txt`, and whether that projection is current — the question `generate --check` refuses and `scripts/release-version --check` gates on. Then the next version, which is the public contract's answer: the version `release analyze` requires against the last release — the declared version when it already satisfies the contract, otherwise the smallest one it allows, and the smallest release above the last when the contract requires none over it — with `decided_by` naming who answered. It is the one release selection `release bump` also raises to when no target is named, so the report and the writer cannot disagree. When the contract cannot be measured — no published baseline, a version that is not three numbers, or any other error that makes the plan unsound, the plan `release bump` refuses to write from — the baseline is refused, not guessed: `next` is absent, `decided_by` is `undecided` and `contract_unreadable` carries every error, one per line. The bump the conventional commits since the last release imply, the version it would produce and the commits themselves are carried beside it as evidence, and never answer `next` in the contract's place. |
release.version | query | Empty → ReleaseVersionReport | read — changes nothing |
majordomus_repositoryThe repository root, layer sections, git state, discovery mode, kinds present, every diagnostic, and the capability registry counted. |
repository.info | query | Empty → RepositoryReport | read — changes nothing |
majordomus_scopeThe 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. |
repository.scope | query | Empty → ScopeReport | read — changes nothing |
majordomus_scope_classifyWhether 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. |
repository.scope_classify | query | ClassifyInput → Classification | read — changes nothing |
majordomus_rule_provesOne test — by identity or by the path a rule names it with — with every rule that names it and the rules that would be left with no proof at all if it were deleted. This is the reverse of rules.show and reads the same derivation, so the two directions cannot disagree. It is the question that could not be asked while the relation ran one way only: before deleting or renaming a case, what stops being enforced. |
rules.proves | query | RuleTestInput → TestSubjects | read — changes nothing |
majordomus_rulesThe whole rule corpus joined to the tree and the ledger: per rule, its class, its enforcement mode, the validator and the cases it names, whether each is in the tree, the execution behind each, the CI gates that run them, and the sentence explaining how the state was derived. The tallies count the whole corpus even when the answer is filtered, and the findings name every rule whose declared class the proof does not support. Kept per checkout state, never longer: the ledger is a file that changes outside this process, and an edit of it, of a validator or of any tracked file, a new untracked file, a commit or a new ref is a new answer. |
rules.report | query | RulesReportInput → RulesReport | read — changes nothing |
majordomus_ruleOne rule with its full proof: the validator and the cases it names, the execution behind each, the gates that run them, the rules it depends on and the rules that depend on it — each with the state it is in, because a rule is proven only as far as its dependencies are — and, when it is not proven, the one sentence saying what would have to be true for it to be. A rule this repository does not declare is a not-found rather than an empty answer, because a typo that read as 'this rule has no proof' is the one answer this capability must never give. |
rules.show | query | RuleInput → RuleDetail | read — changes nothing |
majordomus_servedThe newest recorded observation of each deployment, re-judged against a commit (HEAD unless named), and for a deployment the layer declares as an object its status derived from that: `active` only while it serves the commit. A record keeps proving every commit its served build contains and stops proving the moment the commit asked about is not among them; a record that received nothing proves nothing. Asks no network and writes nothing. |
served.show | query | ShowInput → ServedStanding | read — changes nothing |
majordomus_serverWhere this checkout's server stands — absent, starting, ready, outdated or stale — measured against what this executable would serve; how far the tree it serves is from the remote trunk (`trunk`: current, lagging, stale, unjudged or unmeasured against the policy's `checkout.trunk_distance`, as of the last fetch); the lease this process holds when it is the server; and, unless `checkouts` narrows it to this one, every checkout git registers for the repository, the primary first, each with its lease, its standing and the reason, and the peers its server reports. `checkouts: this` reads one lease and probes one server and enumerates no other checkout, which is what a caller asking only about the checkout it is in should pay. Read from the lease files and the servers on every call; nothing is cached, because the leases are written by other processes. |
server.status | query | ServerStatusInput → ServerStatus | read — changes nothing |
majordomus_session_identityThe repository, the checkout, the open episode and the provider session, each with the canonical value this executable computes and each store's own spelling beside it. The stores record the repository sometimes as an absolute .git path and sometimes as a remote URL, the worktree as a path and as a digest, and the session as both an episode id and a provider UUID; this is the surface that says so, so that a reader never compares two spellings of different things and concludes they disagree. |
session_domain.identity | query | Empty → IdentityReport | read — changes nothing |
majordomus_session_machineEvery state an episode can be in, whether it is terminal and what it may move to; every transition — open, resume, checkpoint, detach, close, recover — with the states it runs between and whether it moves the state at all. Derived from the types, so a diagram that disagrees with the code cannot exist. What the machine deliberately does not depend on is stated rather than left to be inferred: task state, which is ADR 0052. |
session_domain.machine | query | Empty → MachineReport | read — changes nothing |
majordomus_shell_checkEvery shell unit under bin/, lib/, scripts/, share/, apps/majordomus-cli/assets/, .githooks/ and .claude/hooks/ — by interpreter line or by a .sh name, as git would commit it, links not followed — against .ai/repo/automation/inventory.jsonl: an undeclared unit, a record whose unit is gone, an exemption missing its reason or its removal condition, a disposition outside A-F, a duplicate and a record out of canonical order are each a finding that names the file and the remedy. Reads the tree and git's index only; no build and no network. |
shell.check | query | Empty → ShellReport | read — changes nothing |
majordomus_skill_explainOne skill in full: its authored identity, status and provenance marker, each test that names it with the state of its latest recorded run and the command that reproduces it, its page, its doctrine and gates, every invocation by path and line, its standing and the findings about it. The file itself stays at `majordomus://skill/<id>`. |
skills.explain | query | SkillExplainInput → SkillStatus | read — changes nothing |
majordomus_skillsEvery skill the index holds, each with the tests that name it and the evidence state of their latest runs, its page projection, the doctrine and gates that hold it, every invocation that references it, and the standing those derive: proven, partial, orphan, invalid, or not_required for a draft or deprecated skill. |
skills.status | query | Empty → SkillStatusList | read — changes nothing |
majordomus_skills_verifyEvery finding over the skills: a file that breaks the skill contract, an active skill no test names or nothing invokes, a test whose latest run failed, a test or an invocation naming a skill that does not exist — each a failure — and evidence that is not current, a missing page or a missing gate, each a warning. |
skills.verify | query | Empty → SkillVerification | read — changes nothing |
majordomus_trace_commitOne 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. |
trace.commit | query | TraceCommitInput → CommitAttribution | read — changes nothing |
majordomus_trace_issueOne 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. |
trace.issue | query | TraceIssueInput → IssueTrace | read — changes nothing |
majordomus_traceabilityEvery 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. |
trace.report | query | TraceReportInput → TraceReport | read — changes nothing |
majordomus_web_surfacesThe 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. |
web.surfaces | query | Empty → SurfaceReport | read — changes nothing |
majordomus_why_areasEvery 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. |
why.areas | query | Empty → AreaList | read — changes nothing |
majordomus_why_audiencesEvery 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. |
why.audiences | query | Empty → AudienceList | read — changes nothing |
majordomus_why_diagnoseWhat 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. |
why.diagnose | query | DiagnoseInput → Diagnosis | read — changes nothing |
majordomus_whyEvery 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. |
why.list | query | Query → CatalogueView | read — changes nothing |
majordomus_why_momentOne 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. |
why.moment | query | MomentInput → MomentDetail | read — changes nothing |
majordomus_why_validateEvery 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. |
why.validate | query | Empty → ValidationReport | read — changes nothing |
majordomus_worktree_inspectThe 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. |
worktree.inspect | query | InspectInput → InspectReport | read — changes nothing |
majordomus_worktree_migration_planOne 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. |
worktree.migration_plan | query | Empty → MigrationPlan | read — changes nothing |
majordomus_worktree_statusOne 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. |
worktree.status | query | StatusInput → StatusReport | read — changes nothing |
majordomus_worktreesThe 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. |
worktree.topology | query | Empty → RepositoryTopology | read — changes nothing |
majordomus_worktree_trunkThe checkout's `HEAD` and the local trunk branch, each counted against the remote-tracking trunk — commits behind and ahead, a merge in progress counting what it brings in — as of the last fetch, whose time is part of the answer; judged against the policy's `checkout.trunk_distance` as `current`, `lagging`, `stale`, `unjudged` (no threshold declared) or `unmeasured` (no remote trunk), with the commands that bring it current. What doctor renders and what `server.status` and the MCP instructions say about the tree a server serves (`project.a-checkout-serves-the-current-trunk`). Fetches nothing and writes nothing. |
worktree.trunk | query | StatusInput → TrunkDistance | read — changes nothing |
majordomus_worktree_uncommittedEvery linked worktree whose index or working tree holds changes no commit carries: how many paths (staged, unstaged, untracked, conflicted), when the oldest change was made (the earliest modification time among the changed paths, the index file's standing in for a deleted one), and what holds the work — an active task record, an open episode that is not stranded, or a process whose working directory is inside. Work nothing holds and older than the threshold is `abandoned`, with the command that would put it on a remote `rescue/` ref; it is suggested, never run. The threshold is the policy's `session.stranded_after` unless `older_than` names another. Reads every worktree and writes none: every status runs without optional locks, so no index is refreshed. |
worktree.uncommitted | query | UncommittedInput → UncommittedReport | read — changes nothing |
Resources
The builtin capabilities that answer a URI, and the shape of every declarative object's URI. resources/list returns these first, then one entry per object of the layer (3319 in this repository, listed on the registry page).
majordomus://artifactsList the generated artifactsartifacts.listmajordomus://commandsEvery command, one line eachcommands.listmajordomus://commit/planWhat the working tree would commitcommit.planmajordomus://commit/scopesThe scope vocabularycommit.scopesmajordomus://continuityWhat the lifecycle is holdingcontinuity.statemajordomus://convergenceIs any work held where it can be lost?convergence.reportmajordomus://deploymentsDeploymentsdeploy.listmajordomus://designThe design systemdesign.systemmajordomus://devcontext/policyThe compiler's own rulesdevcontext.policymajordomus://directoriesThe layer's directory contractsdirectories.listmajordomus://economicsToken economics summaryeconomics.summarymajordomus://editorsEditor and agent projectionseditors.statusmajordomus://environment/preflightWhether Majordomus is in force here, and what proves itenvironment.preflightmajordomus://environmentThe repository environmentenvironment.statusmajordomus://evidenceEvery claim against the evidence recorded for itevidence.reportmajordomus://executionsList executionsexecutions.listmajordomus://executions/protocolThe live channel's contractexecutions.protocolmajordomus://gates/completionWhether this task may be called finishedgates.completionmajordomus://gatesThe CI modelgates.modelmajordomus://gates/policyThe completion policygates.policymajordomus://gates/stateHow each gate last wentgates.statemajordomus://graphsList graphsgraph.listmajordomus://healthHealth of this processhealth.reportmajordomus://intentsEvery intent, with its derived stage and verdictintents.listmajordomus://knowledge-candidatesCandidates awaiting reviewknowledge_base.candidatesmajordomus://knowledge-statusWhether the deriver is still writingknowledge_base.statusmajordomus://lifecycle/episodesEvery open episodelifecycle.episodesmajordomus://lifecycle/recoveryWhat the store needs somebody to dolifecycle.recoverymajordomus://mcpThe MCP projection of this registrymcp.projectionmajordomus://meshThe mesh, at a glancemesh.statusmajordomus://modelsThe model cataloguemodels.listmajordomus://obligations/closureWhat this task still owesobligations.closuremajordomus://obligationsEvery obligation there isobligations.vocabularymajordomus://planThe whole derived planplan.modelmajordomus://product/domainsThe domainsproduct.domainsmajordomus://productThe featuresproduct.featuresmajordomus://product/matrixFeatures against interfacesproduct.matrixmajordomus://product/providersThe providersproduct.providersmajordomus://qualityPublic API quality reportquality.reportmajordomus://quality/rustdocRustdoc tree integrityquality.rustdocmajordomus://reasoning/advisorsThe advisors and what they can do nowreasoning.advisorsmajordomus://reasoningThe session's reasoning statereasoning.statusmajordomus://changelogThe changelogrelease.changelogmajordomus://repositoryRepository and index staterepository.infomajordomus://scopeThe repository scoperepository.scopemajordomus://rulesEvery rule against the proof there is for itrules.reportmajordomus://servedWhat each deployment was last seen servingserved.showmajordomus://serverThe shared server, and every server of the repositoryserver.statusmajordomus://session/identityWhat identifies this checkout, and how each store spells itsession_domain.identitymajordomus://session/machineThe episode lifecycle, as datasession_domain.machinemajordomus://skillsEvery skill, with its derived standingskills.statusmajordomus://traceabilityThe whole work graph above the branchtrace.reportmajordomus://webEvery web surface, resolvedweb.surfacesmajordomus://why/areasOperational areaswhy.areasmajordomus://why/audiencesAudienceswhy.audiencesmajordomus://whyThe cataloguewhy.listmajordomus://worktreesThe whole topologyworktree.topologymajordomus://<kind>/<identity>one per object of the layer; a read resolves the URI exactly as the object tool and the HTTP route do
Protocol
- server name
- majordomus 1.0.0-alpha.8
- protocol versions
- 2025-06-18, 2025-03-26, 2024-11-05
- transports
- stdio (
majordomus mcp), and MCP over HTTP at/mcpon the shared server - side effects
- 9 tool(s) write the repository:
majordomus_continuity_publish,majordomus_continuity_resume,majordomus_continuity_sync,majordomus_execution_start,majordomus_intent_propose,majordomus_mesh_enrol,majordomus_plan_transition,majordomus_reasoning_record,majordomus_recover_orphans; the lease under the local state directory while a server runs
Claims about the MCP surface and the shared server
Attached by the file that implements each claim; every one links to its page with the implementation and the test that proves it.
- guaranteed mcp-stdio-surfaceThe Rust executable serves the repository's AI layer to an MCP client over stdio, with protocol frames alone on stdouttest: test/cases/72_rust_mcp.sh
- guaranteed mcp-shared-serverOne shared server serves a checkout: the first majordomus mcp binds loopback HTTP with Swagger UI and MCP over HTTP beside its stdio session and logs the URL, every later client of that checkout attaches to it, and it ends when the last client leavestest: test/cases/90_mcp_shared_server.sh
- guaranteed mcp-lease-resilienceNothing a client leaves behind locks another client out of the shared server; a corrupt, empty, stale or abandoned lease is taken over and named, a client that cannot share is served alone with the reason logged, and a signal removes the lease before the server diestest: apps/majordomus-cli/tests/mcp_shared.rs
- guaranteed mcp-lease-lostA server whose lease was taken over says so on the endpoint every reader probes, refuses to take on a new client, and reports that what its health describes is another process; the sessions it already had continue and it ends with themtest: apps/majordomus-cli/tests/lease_lost.rs
- guaranteed mcp-peersEvery client attached to a checkout's server is a peer named by its own initialize, and majordomus_peers lists every worker of the repository - its own board and the board of every other checkout, each peer stamped with the worktree it is working in - while majordomus_announce tells the others what it is working on and which paths it expects to touchtest: test/cases/250_the_board_is_repository_wide.sh
- guaranteed mesh-off-by-defaultNo mesh discovery socket opens until the repository commits an enabled mesh declaration, and a disabled or absent declaration is reported as the reason, not an errortest: apps/majordomus-cli/tests/mesh.rs