A snapshot: read at commit 707a04c7ce8 on 2026-10-18T00:06:01Z by majordomus 0.29.0. Nothing on this page is read again. See it live
plan.status
Where the plan stands
What it is
Every milestone with its derived status and its issues counted by status, the milestone a worker is executing now, the next ready issue in full, and the plan's own totals. The counts are keyed by the declared vocabulary, which travels with the answer, so a status added to the engine appears here without anything being edited.
Descriptor
- Canonical id
plan.status- Module
plan- Kind
- query
- Stability
- behaviorallyverified
- Provenance
- declaredcached
- Source
apps/majordomus-cli/src/capability/builtin/plan.rs- Cache
process, 16 entries, per generation- Benchmark
required- Tags
- planprojectstatus
Run
queryA query. It reads and changes nothing.
Projections
| Interface | As | Where |
|---|---|---|
| MCP tool | majordomus_plan_status | - |
| MCP resource | not exposed | - |
| HTTP | GET /api/v1/plan/status | Swagger |
| Command line | not exposed | - |
Schemas
Input · PlanMilestoneFilter
{
"type": "object",
"additionalProperties": false,
"properties": {
"milestone": {
"type": [
"string",
"null"
],
"description": "Restrict the answer to one milestone. Default: the whole plan, and for `next` the\nactive milestone with the rest of the plan as the fallback."
}
},
"description": "Which part of the plan to answer about.",
"title": "PlanMilestoneFilter"
}Output · PlanStatusReport
{
"type": "object",
"properties": {
"project": {
"$ref": "#/$defs/PlanProject",
"description": "The plan's header, with the active milestone derived."
},
"statuses": {
"$ref": "#/$defs/PlanVocabulary",
"description": "The declared status vocabularies."
},
"milestones": {
"type": "array",
"items": {
"$ref": "#/$defs/PlanMilestoneProgress"
},
"description": "Every milestone, in id order."
},
"next_ready": {
"anyOf": [
{
"$ref": "#/$defs/PlanIssue"
},
{
"type": "null"
}
],
"description": "The next ready issue, when there is one."
},
"counts": {
"$ref": "#/$defs/PlanCounts",
"description": "Every issue of the plan, counted by derived status."
}
},
"required": [
"project",
"statuses",
"milestones",
"counts"
],
"description": "Where the plan stands: every milestone's progress, the milestone being executed, and the\none issue to take next.",
"title": "PlanStatusReport",
"$defs": {
"PlanProject": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "The project's name, from `project.yaml`."
},
"repository": {
"type": "string",
"description": "The repository it belongs to, `owner/name`."
},
"default_branch": {
"type": "string",
"description": "The branch the plan is executed on."
},
"active_milestone": {
"type": "string",
"description": "The milestone a worker is executing now: the lowest-ranked unblocked milestone that\nis ACTIVE, else the lowest-ranked unblocked one not finished. Derived on every read,\nstored nowhere, and never authored — the plan cannot nominate a milestone whose\nprerequisites are not real."
}
},
"required": [
"name",
"repository",
"default_branch",
"active_milestone"
],
"description": "The plan's header: what this repository is, plus the one field nobody authors."
},
"PlanVocabulary": {
"type": "object",
"properties": {
"issue": {
"type": "array",
"items": {
"type": "string"
},
"description": "The issue statuses, in derivation order."
},
"milestone": {
"type": "array",
"items": {
"type": "string"
},
"description": "The milestone statuses, in derivation order."
}
},
"required": [
"issue",
"milestone"
],
"description": "The status vocabularies, so a reader never has to know which statuses exist."
},
"PlanMilestoneProgress": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The identity."
},
"status": {
"type": "string",
"description": "The derived status."
},
"title": {
"type": "string",
"description": "One line naming the outcome."
},
"counts": {
"$ref": "#/$defs/PlanCounts",
"description": "Its issues, counted by derived status."
}
},
"required": [
"id",
"status",
"title",
"counts"
],
"description": "One milestone's progress, without its prose."
},
"PlanCounts": {
"type": "object",
"properties": {
"total": {
"type": "integer",
"format": "uint32",
"minimum": 0,
"description": "Every issue naming this milestone."
},
"required": {
"type": "integer",
"format": "uint32",
"minimum": 0,
"description": "The denominator the milestone's own status derivation uses: total less cancelled, so\nno surface prints \"n of total\" for a milestone the engine calls DONE."
},
"by_status": {
"type": "object",
"additionalProperties": {
"type": "integer",
"format": "uint32",
"minimum": 0
},
"description": "One entry per declared issue status, keyed by the vocabulary."
}
},
"required": [
"total",
"required",
"by_status"
],
"description": "A milestone's issues counted: the two denominators, then one entry per declared status."
},
"PlanIssue": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The identity, which is also the file name."
},
"milestone": {
"type": "string",
"description": "The milestone it belongs to."
},
"status": {
"type": "string",
"description": "The derived status. Never stored: an issue records what happened to it and the\nstatus follows from that and from the state of its dependencies."
},
"wave": {
"type": "integer",
"format": "uint32",
"minimum": 0,
"description": "The execution wave: one past the longest path to it through the dependency graph."
},
"priority": {
"type": "string",
"description": "`p0` … `p3`."
},
"profile": {
"type": "string",
"description": "The execution profile the issue is worked under."
},
"parallel_safe": {
"type": "boolean",
"description": "Whether it may run beside another issue of its wave."
},
"title": {
"type": "string",
"description": "One line naming the outcome."
},
"slug": {
"type": "string",
"description": "The slug, when the record carries one."
},
"depends_on": {
"type": "array",
"items": {
"type": "string"
},
"description": "Every issue it declares a dependency on, as declared — including one that does not\nexist, which is a finding rather than a silent omission."
},
"blocked_by": {
"type": "array",
"items": {
"type": "string"
},
"description": "The dependencies that are not DONE, plus `milestone:<id>` when the milestone gate\nholds the whole outcome back."
},
"dependents": {
"type": "array",
"items": {
"type": "string"
},
"description": "The issues that depend on this one."
},
"scope": {
"type": "array",
"items": {
"type": "string"
},
"description": "The paths it touches; two issues of one wave that share a path are serialised."
},
"serves": {
"type": "array",
"items": {
"type": "string"
},
"description": "The intent criteria it exists to make true, each `<intent>#<criterion>`, as declared.\nEmpty for maintenance work under a milestone no intent names; whether a named\ncriterion exists is the intent coverage's question, not the plan's."
},
"objective": {
"type": "string",
"description": "One line: what the issue is for."
},
"evidence_have": {
"type": "integer",
"format": "uint32",
"minimum": 0,
"description": "Evidence entries attached."
},
"evidence_need": {
"type": "integer",
"format": "uint32",
"minimum": 0,
"description": "Evidence tokens the record requires before it may be DONE."
},
"started_at": {
"type": "string",
"description": "When execution began, when it did."
},
"verified_at": {
"type": "string",
"description": "When implementation was declared complete."
},
"completed_at": {
"type": "string",
"description": "When completion was recorded."
}
},
"required": [
"id",
"milestone",
"status",
"wave",
"priority",
"profile",
"parallel_safe",
"title",
"slug",
"depends_on",
"blocked_by",
"dependents",
"scope",
"serves",
"objective",
"evidence_have",
"evidence_need",
"started_at",
"verified_at",
"completed_at"
],
"description": "One issue, as its record declares it and as the graph derives it."
}
}
}Examples
These are the capability's own benchmark cases: the same inputs the benchmark runs and the OpenAPI document shows.
whole-plan
{}one-milestone
{
"milestone": "M000"
}