Skip to content
Cockpit0.29.0
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.issues

The issues, filtered by what the graph derived

What it is

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

Descriptor

Canonical id
plan.issues
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
planprojectissues

Run

query
A query. It reads and changes nothing.

Only issues of this milestone. Default: every issue of the plan.

Only issues in this derived status — `READY` for the ready set, `BLOCKED` for the blocked set. The vocabulary travels with every answer, so a caller never has to know which statuses exist.

Only issues in this execution wave.

GET /api/v1/plan/issues

Projections

InterfaceAsWhere
MCP toolmajordomus_plan_issues-
MCP resourcenot exposed-
HTTPGET /api/v1/plan/issuesSwagger
Command linenot exposed-

Schemas

Input · PlanIssueFilter
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "milestone": {
      "type": [
        "string",
        "null"
      ],
      "description": "Only issues of this milestone. Default: every issue of the plan."
    },
    "status": {
      "type": [
        "string",
        "null"
      ],
      "description": "Only issues in this derived status — `READY` for the ready set, `BLOCKED` for the\nblocked set. The vocabulary travels with every answer, so a caller never has to know\nwhich statuses exist."
    },
    "wave": {
      "type": [
        "integer",
        "null"
      ],
      "format": "uint32",
      "minimum": 0,
      "description": "Only issues in this execution wave."
    }
  },
  "description": "Which issues to answer with.",
  "title": "PlanIssueFilter"
}
Output · PlanIssueList
{
  "type": "object",
  "properties": {
    "issues": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/PlanIssue"
      },
      "description": "The matching issues, in id order."
    },
    "total": {
      "type": "integer",
      "format": "uint",
      "minimum": 0,
      "description": "How many matched."
    },
    "statuses": {
      "$ref": "#/$defs/PlanVocabulary",
      "description": "The declared status vocabularies."
    }
  },
  "required": [
    "issues",
    "total",
    "statuses"
  ],
  "description": "Issues matching a filter, with the vocabulary that names their statuses.",
  "title": "PlanIssueList",
  "$defs": {
    "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."
    },
    "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."
    }
  }
}

Examples

These are the capability's own benchmark cases: the same inputs the benchmark runs and the OpenAPI document shows.

all
{}
ready
{
  "status": "READY"
}
one-milestone
{
  "milestone": "M000"
}