Skip to content

I2850 — the published PR Drain carries its pull requests, and counts pull requests rather than plan issues

A UI page the snapshot writes carries every slow panel the screen defers to its script, already read, in the place the script would have put it: the published /ui/prs shows the drain, the Dashboard its pull requests and Deployments its delivery. The PR Drain's counts are the integration queue's own, one card per lane the queue counted, each a link to that lane.

DONE wave 0 · p0 · implementation profile · parallel safe

Part of truthful-plan-surfaces — The plan's surfaces are inferred from delivery, and nothing they show is typed beside the repository.

Objective

A UI page the snapshot writes carries every slow panel the screen defers to its script, already read, in the place the script would have put it: the published /ui/prs shows the drain, the Dashboard its pull requests and Deployments its delivery. The PR Drain's counts are the integration queue's own, one card per lane the queue counted, each a link to that lane.

Why

Found by the landing seat on 2026-10-18 at master 707a04c7ce8 (v0.29.0), from a screenshot of the published https://majordomus.dev/ui/prs/ at 1440 px. The screen showed no pull request at all, only the placeholder line 'Open the drain on its own page', because the snapshot's script fetches no panel. Its hero counted plan issues from plan.status (ready 86, blocked 159), not pull requests. The drain's own cards were three lanes typed in the screen ('repair', 'waiting', 'held'), so a lane the queue adds was never counted.

Current state

The snapshot writes each screen as its first paint: a slow panel is a placeholder with a link. The PR Drain's hero reads plan.status; its tally strip names three lanes literally.

Desired state

The snapshot asks every page with the X-Majordomus-Snapshot header. The UI then replaces each data-panel-src placeholder with the panel's own view, through one dispatcher the server also routes by. The live UI still paints first and defers. The PR Drain's hero reads no plan source, and its strip has an Open card, one card per lane in /queue/tallies/by_lane linked to ?lane=<word>, and the merge throughput.

Scope

  • apps/majordomus-cli/src/ui/mod.rs
  • apps/majordomus-cli/src/ui/prs.rs
  • apps/majordomus-cli/src/web/report/snapshot.rs
  • apps/majordomus-cli/src/cockpit/html.rs
  • docs/MAJORDOMUS_UI.md
  • test/cases/3240_the_published_screens_carry_their_slow_panels.sh

Out of scope

  • The rest of the /ui/prs plan the landing seat relayed: the reading order (what can land, what blocks, issue, milestone, intent), every id a link both ways, ui::prose, one primary action per PR and moves disabled as live only. These are separate issues of this block, after the alpha where they are features.
  • The gate that every mj-ui-* class a screen emits is defined (taken over from I2905; claim.rs and intent.rs still emit the undefined mj-ui-list, idd.rs mj-ui-subhead): its own issue after the alpha. Here the PR Drain's two lists move to the kit's mj-ui-prose-list, as /ui/idd's did.

Dependencies

None. This issue is a root of the graph.

Acceptance criteria

  • Every screen that defers a panel answers a snapshot request with no data-panel-src placeholder and one heading
  • The snapshot's PR Drain carries the drain's own answer
  • The PR Drain's cards are the lanes the queue counted, each a link to its lane; its hero counts no plan issue
  • The PR Drain emits no class the UI's stylesheet does not define

Validation

  • bin/majordomus plan validate
  • cargo test --lib -- ui:: cockpit::html web::report::snapshot

Evidence required

  • snapshot_reads_every_slow_panel_test
  • counts_are_the_queues_lanes_test

Evidence

coverstypecommandresultat commit
snapshot_reads_every_slow_panel_testcivalidate run 39438896504 at master 9a5a9b77520: rust (1-3) jobs 118683336143 118683336062 118683336401 run cargo test, incl. ui::a_snapshot_reads_every_slow_panel_into_its_screen (82ace9a104d)success (the run's only red job is pages, which runs no test)a81b1e3
counts_are_the_queues_lanes_testcivalidate run 39438896504 at master 9a5a9b77520: rust (1-3) jobs 118683336143 118683336062 118683336401 run cargo test, incl. ui::prs::the_counts_are_the_queues_own_lanes_and_never_the_plans_issues (38f2e9b7f21)success (the run's only red job is pages, which runs no test)a81b1e3

Timeline

started
2026-10-20T16:15:52Z
verified
—
completed
2026-10-20T16:29:16Z

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/I2850.yaml. Read it back with majordomus plan show I2850.

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