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.waves
What may run at the same time
What it is
The topological layering of the issue graph: an issue enters a wave only once every dependency has left it, so its wave is one past the longest path to it. Sharing a wave is a necessary condition for running two issues at once, not a sufficient one — overlapping scope serialises them, and every such overlap is reported beside the waves rather than left for two workers to discover in a merge conflict.
Descriptor
- Canonical id
plan.waves- Module
plan- Kind
- query
- Stability
- behaviorallyverified
- Provenance
- declared
- Source
apps/majordomus-cli/src/capability/builtin/plan.rs- Cache
disabled- Benchmark
required- Tags
- planprojectgraphwaves
Run
queryA query. It reads and changes nothing.
Projections
| Interface | As | Where |
|---|---|---|
| MCP tool | majordomus_plan_waves | - |
| MCP resource | not exposed | - |
| HTTP | GET /api/v1/plan/waves | 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 · PlanWaveReport
{
"type": "object",
"properties": {
"waves": {
"type": "array",
"items": {
"$ref": "#/$defs/PlanWaveView"
},
"description": "The waves, lowest first, with the issues of each."
},
"serialised_by_scope": {
"type": "array",
"items": {
"$ref": "#/$defs/PlanFinding"
},
"description": "Scope overlaps between two issues of one wave. Two issues sharing a wave is a\nnecessary condition for running them at once, not a sufficient one: overlapping\nscope serialises them, and the overlap is reported here rather than left for two\nworkers to discover in a conflict."
}
},
"required": [
"waves",
"serialised_by_scope"
],
"description": "The execution waves, with the overlaps that serialise issues the graph would let run\ntogether.",
"title": "PlanWaveReport",
"$defs": {
"PlanWaveView": {
"type": "object",
"properties": {
"wave": {
"type": "integer",
"format": "uint32",
"minimum": 0,
"description": "The layer, from zero."
},
"issues": {
"type": "array",
"items": {
"$ref": "#/$defs/PlanIssue"
},
"description": "The issues in it, in id order."
}
},
"required": [
"wave",
"issues"
],
"description": "One wave, with the issues in it."
},
"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."
},
"PlanFinding": {
"type": "object",
"properties": {
"level": {
"type": "string",
"description": "`FAIL` or `WARN`. A failure means the model is invalid."
},
"code": {
"type": "string",
"description": "The stable code a reader greps for (`unknown_dependency`, `scope_conflict`, …)."
},
"subject": {
"type": "string",
"description": "The record the finding is about, or `graph` when it is about the whole graph."
},
"message": {
"type": "string",
"description": "What is wrong, in one line."
}
},
"required": [
"level",
"code",
"subject",
"message"
],
"description": "One validation finding, in the shape `project.finding-carries-reproduce` asks for."
}
}
}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"
}