I2470 — The pull requests drain in the UI: a queue a reader narrows, inspects and follows to what each depends on
Give majordomus ui a PR Drain screen (/ui/prs) that shows every open pull request as the integration lane assessed it, lets the reader narrow it by disposition, lane and text, inspect one pull request and the plan issue it names, and follow each dependency and overlap to the pull request it leads to; every control is a link or a GET form, so every view has an address and the screen is complete without JavaScript.
DONE wave 2 · p1 · implementation profile · runs alone
Part of development-runtime — The runtime has a development surface.
Objective
Give majordomus ui a PR Drain screen (/ui/prs) that shows every open pull request as the integration lane assessed it, lets the reader narrow it by disposition, lane and text, inspect one pull request and the plan issue it names, and follow each dependency and overlap to the pull request it leads to; every control is a link or a GET form, so every view has an address and the screen is complete without JavaScript.
Why
The owner asked on 2026-10-11 to implement every component and view of the UI screenshots, maximally interactive and clickable (references campaigns/majordomus-ui-unified-real-data-v2-20261011/reference/03-pr-drain.png and 05-issues-and-prs.png; pack v3 milestone M05). I2462 (PR #948) shows the queue as a table on /ui/work with one pull request's detail; nothing in it narrows, searches or leads anywhere but back to it. The data for the rest exists in integration.queue: tallies by disposition and lane, next_merge, next_refresh, starving, last_merge, and per pull request its dependencies (certainty, state, satisfied), overlaps (with the shared paths), risk factors, required checks, review and how long it has been actionable; plan.issues holds every issue with its dependencies, dependents, the intents it serves and its evidence counts.
Current state
The queue is a table of rows that each open one detail on /ui/work; there are no tabs, no search, no dependency or overlap navigation, no blockers view and no issue view.
Desired state
/ui/prs paints at once (plan.status, plan.issues) and fills the drain from /ui/panels/drain after the paint, because integration.queue asks the forge. The drain shows the lane's tallies (each a link to the lane it counts), what the lane does next (next merge, next refresh, starving, last merge, each pull request a link), the queue's own dispositions as tabs with their counts, a search over title, branch, author and number, the admitted pull requests in rank order, the blockers (conflicting or needing a repair, with what would move each), and a graph of which open pull request depends on which (a merged dependency is not drawn; one the queue does not hold is drawn small and leads to the forge). ?pr=N opens the inspector: badges, next action, reasons and since when it is actionable, the plan issues its title or branch names (each a link to that issue), gates, dependencies and overlaps (each a link to that pull request, or to the forge when it is not open), risk factors, evidence and authored paths, and a link to the pull request on the forge. ?issue=ID opens the issue: its objective, status, milestone, what it depends on, is blocked by and unblocks (each a link), the intents it serves, its scope, its evidence as a meter and its dates, and a link to the pull requests that name it. The Dashboard's queue rows lead here. A forge nobody observed says so and shows no number; a value a link carries that is not the queue's word or an issue id is dropped.
Scope
- apps/majordomus-cli/src/ui/prs.rs
- apps/majordomus-cli/src/ui/mod.rs
- apps/majordomus-cli/src/ui/dashboard.rs
- .ai/repo/project/issues/I2470.yaml
- docs/MAJORDOMUS_UI.md
- test/cases/1075_the_pull_requests_drain_in_the_ui.sh
Dependencies
What waits on this
- I2471DONE The roadmap opens a milestone: what it holds, what can start, its critical path, and what it waits for
- I2473DONE A pull request shows its trail: what the executor did to it, and the drain what the lane did lately
- I2475DONE The issues are browsed: every issue of the plan by status, milestone, priority or text, each a link onward
Acceptance criteria
- /ui/prs answers 200 with a hero and a drain panel deferred to /ui/panels/drain, carrying the reader's choices in its query
- the drain's tabs are the queue's own dispositions with their counts, and each narrows the rows; the search finds a title, a branch, an author or a number
- /ui/prs?pr=N opens the inspector, with dependencies and overlaps leading to their pull requests, the forge link, and the issues the title names; a number the queue did not observe says so
- /ui/prs?issue=ID opens the issue with its dependencies and dependents as links; an id the plan does not hold says so
- the graph draws only open dependencies, and a forge that was not observed shows no tab and no number
Validation
- cargo test --lib ui::
- test/run.sh 1075_the_pull_requests_drain_in_the_ui
Evidence required
- ui_prs_unit_tests
- ui_prs_case_1075
Evidence
| covers | type | command | result | at commit |
|---|---|---|---|---|
| ui_prs_unit_tests | ci | cargo test --lib ui::prs (CI job rust, validate run 38223440282 on 722228ef3c) | 17 ui::prs tests ok, 106 ui:: tests ok in total, none failed | 722228e |
| ui_prs_case_1075 | ci | test/run.sh 1075_the_pull_requests_drain_in_the_ui (validate run 38223440282 on 722228ef3c, the v0.21.0 top) | case 1075_the_pull_requests_drain_in_the_ui ok | 722228e |
Timeline
- started
- 2026-10-12T11:00:46Z
- verified
- 2026-10-12T11:00:51Z
- completed
- 2026-10-12T11:00:58Z
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/I2470.yaml. Read it back with majordomus plan show I2470.