Skip to content

plan.roadmap

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

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

  • query
  • behaviorally_verified
  • module plan
  • #plan
  • #project
  • #roadmap

Exposure

Where this one definition is reachable. Absence is explicit: a surface not listed does not carry it.

surfaceas
MCPtool majordomus_plan_roadmap
HTTPGET /api/v1/plan/roadmap operationId plan.roadmap
command line—

Schemas

The canonical input and output, from the Rust types; the MCP tool schema and the OpenAPI parameters and responses are derived from these.

input · Empty

No input.

No properties: the capability takes no input.

JSON Schema
{
  "additionalProperties": false,
  "description": "No input.",
  "title": "Empty",
  "type": "object"
}

output · PlanRoadmap

The milestones in derived order, with the one being executed and the one after it.
propertytyperequireddescription
milestones array yes The milestones ordered by rank, then order, then id, each with the release that carried it (released_in). The sequence is derived from the milestone graph and the release from the release records; no list of versions is maintained anywhere.
next string | null no The one after it, blocked or not.
now string | null no The first unfinished, unblocked milestone in that sequence.
JSON Schema
{
  "$defs": {
    "PlanCounts": {
      "description": "A milestone's issues counted: the two denominators, then one entry per declared status.",
      "properties": {
        "by_status": {
          "additionalProperties": {
            "format": "uint32",
            "minimum": 0,
            "type": "integer"
          },
          "description": "One entry per declared issue status, keyed by the vocabulary.",
          "type": "object"
        },
        "required": {
          "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.",
          "format": "uint32",
          "minimum": 0,
          "type": "integer"
        },
        "total": {
          "description": "Every issue naming this milestone.",
          "format": "uint32",
          "minimum": 0,
          "type": "integer"
        }
      },
      "required": [
        "total",
        "required",
        "by_status"
      ],
      "type": "object"
    },
    "PlanMilestone": {
      "description": "One milestone, as its record declares it and as the two graphs derive it.",
      "properties": {
        "blocked_by": {
          "description": "Those of them that are not DONE. Non-empty means the gate holds every issue of this\nmilestone back, whatever the issue graph says.",
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        "claims": {
          "description": "The claims of the repository this outcome makes true.",
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        "counts": {
          "$ref": "#/$defs/PlanCounts",
          "description": "Its issues, counted by derived status."
        },
        "dependents": {
          "description": "The milestones that require it.",
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        "depends_on": {
          "description": "The milestones it requires.",
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        "id": {
          "description": "The identity, which is also the file name; a stable slug, never a version.",
          "type": "string"
        },
        "issues": {
          "description": "Its issues, in id order.",
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        "last_accepted": {
          "description": "The last accepted issue of a DONE milestone: its DONE issue with the latest\n`completed_at`, the greater id on a tie. Empty for a milestone that is not DONE, or\nthat is DONE with no issue (its evidence finished it). Which release carried it is\n`released_in`'s to answer.",
          "type": "string"
        },
        "order": {
          "description": "Tie-break inside one rank; the roadmap is ordered by rank first.",
          "format": "int64",
          "type": "integer"
        },
        "outcome": {
          "description": "One line: what is true once the milestone is real.",
          "type": "string"
        },
        "priority": {
          "description": "`p0` … `p3`.",
          "type": "string"
        },
        "rank": {
          "description": "Its layer in the milestone graph: what orders the roadmap.",
          "format": "uint32",
          "minimum": 0,
          "type": "integer"
        },
        "released_in": {
          "description": "The release that carried the milestone — the first release record whose commit\ncontains the merge of its last accepted issue (or, with no issue, the commit that\nrecorded its latest evidence), else `unreleased` — when the reader\nasked for it\n(`released_in`); the roadmap always does. Never a typed field (ADR 0166).",
          "type": [
            "string",
            "null"
          ]
        },
        "slug": {
          "description": "The slug, when the record carries one.",
          "type": "string"
        },
        "status": {
          "description": "The derived status.",
          "type": "string"
        },
        "title": {
          "description": "One line naming the outcome.",
          "type": "string"
        }
      },
      "required": [
        "id",
        "status",
        "order",
        "priority",
        "title",
        "slug",
        "rank",
        "depends_on",
        "blocked_by",
        "dependents",
        "claims",
        "counts",
        "issues",
        "outcome"
      ],
      "type": "object"
    }
  },
  "description": "The milestones in derived order, with the one being executed and the one after it.",
  "properties": {
    "milestones": {
      "description": "The milestones ordered by rank, then order, then id, each with the release that\ncarried it (`released_in`). The sequence is derived from the milestone graph and the\nrelease from the release records; no list of versions is maintained anywhere.",
      "items": {
        "$ref": "#/$defs/PlanMilestone"
      },
      "type": "array"
    },
    "next": {
      "description": "The one after it, blocked or not.",
      "type": [
        "string",
        "null"
      ]
    },
    "now": {
      "description": "The first unfinished, unblocked milestone in that sequence.",
      "type": [
        "string",
        "null"
      ]
    }
  },
  "required": [
    "milestones"
  ],
  "title": "PlanRoadmap",
  "type": "object"
}

Policies

benchmark
required — a target on every transport the exposure declares; the cases are the input type's
cache
generation — up to 4 entries in the process, scoped by the registry fingerprint and the context's reading of the repository

Benchmark targets

Derived from the registry for this repository: one requirement per transport, and the cases the input type provides. The whole matrix is on the benchmarks page.

transportstatecasestargets
directcovered1default cold+warm
mcpcovered1default cold+warm
httpcovered1default cold+warm

Searches the titles and descriptions of every page this site publishes.