I2740 — An issue's delivery is inferred from branches, pull requests, merges, tags and the published site
Add the capability plan.delivery (CLI majordomus plan delivery [--json] [<id>], HTTP and MCP from the one capability declaration) that answers, for every issue, the furthest stage of none, branch, pr_open, merged, released, deployed, each with the object that proved it and when it was observed, and expose it in the site data the plan pages read.
DONE wave 0 · p0 · implementation profile · parallel safe
Objective
Add the capability plan.delivery (CLI majordomus plan delivery [--json] [<id>], HTTP and MCP from the one capability declaration) that answers, for every issue, the furthest stage of none, branch, pr_open, merged, released, deployed, each with the object that proved it and when it was observed, and expose it in the site data the plan pages read.
Why
ADR 0166. Status is derived from stamps only (lib/project.awk:156-170, plan.rs derive); trace.issue, delivery.report and github-sync each read a part of the truth and nothing joins them. I2653 was merged whole by #1097 and still reads READY.
Current state
trace.issue (capability/builtin/trace.rs, worktree/trace.rs) gives an issue's branches and merged commits; the served forge cache holds pull requests and releases; nothing answers a stage per issue.
Desired state
plan.delivery reuses trace.issue for branches and merges, the issue edge of I1405 for pull requests named by title, branch or trailer, the served forge cache for open pull requests (unread forge reported as unread, never as none), git tag --contains for the first v* tag, and the published latest.json for deployed; scripts/generate-site-data writes site/data/generated/delivery.json from it.
Scope
- apps/majordomus-cli/src/capability/builtin/plan.rs
- apps/majordomus-cli/src/plan
- apps/majordomus-cli/src/plan.rs
- apps/majordomus-cli/tests/plan_delivery.rs
- scripts/generate-site-data
- site/data/generated/delivery.json
- docs/PLANNING.md
- docs/generated
- test/cases/3100_an_issue_delivery_is_inferred.sh
Dependencies
None. This issue is a root of the graph.
What waits on this
- I2741DONE Merged work the plan has not recorded is drift, and on the trunk past a window it is red
- I2743READY The public roadmap draws every milestone in the graph's order, each issue with its inferred delivery
- I2744READY The UI roadmap reads delivery and the releases themselves, and its now is where work is
- I2851READY the homepage's product view counts the delivery the history proves beside the statuses the records declare, each count a link
- I3119READY The delivery report computes required_tests_current, test_evidence_published and ui_linked instead of citing a merged pull request
- I3203BLOCKED Delivery lead time is measured per phase, from a pull request's opening to its verified publication
- I3257BLOCKED intent explain follows each served issue past its merge to the release and the observed deployment that carry it
- I3270READY A blocked issue says which kind of block holds it: a dependency, contention, or a stale record
Acceptance criteria
- An issue named by a merged pull request in a fixture repository reads merged with the merge commit, and released once a v* tag contains it
- An issue with only an open pull request reads pr_open with its number; with an unread forge the answer says unread
- The capability is declared once and reaches CLI, HTTP and MCP through majordomus generate
- site/data/generated/delivery.json is produced by the executable and checked by generate-site-data --check
Validation
- cargo test --manifest-path apps/majordomus-cli/Cargo.toml --test plan_delivery
- bash test/run.sh 3100_an_issue_delivery_is_inferred
Evidence required
- delivery_stage_case
- mutations_fail_the_case
Evidence
| covers | type | command | result | at commit |
|---|---|---|---|---|
| delivery_stage_case | test | cargo test --manifest-path apps/majordomus-cli/Cargo.toml --test plan_delivery | 3 passed, 0 failed (merged with merge commit and PR #5, released by the first release record v0.1.0, pr_open #9 from the forge observation, unread forge reported unread and unsettled, deployed from the observed Pages deployment's latest.json; --at reads history only and is byte-stable across a later tag; CLI = HTTP = MCP) | b80c183 |
| mutations_fail_the_case | test | bash test/run.sh 3100_an_issue_delivery_is_inferred | 1 passed; 4 code mutations of src/plan/delivery.rs applied one at a time each failed it where named (slug half of branch_names, merge title dropped, unread forge not named, open pulls empty) | b80c183 |
| delivery_stage_case | ci | validate run 39438896504 at master 9a5a9b77520: suite-shard (2) job 118683338077 runs 3100_an_issue_delivery_is_inferred; rust (1) job 118683336143 runs cargo test incl. tests/plan_delivery.rs | success (the run's only red job is pages, which runs no test) | 573df96 |
Timeline
- started
- 2026-10-16T09:56:45Z
- verified
- 2026-10-16T13:32:49Z
- completed
- 2026-10-20T22:11:19Z
Those three fields, the evidence above and the state of the dependencies are all the status is made of. There is no status field to disagree with them.
Canonical record: .ai/repo/project/issues/I2740.yaml. Read it back with majordomus plan show I2740.