Repository navigation
GitHub plugin: a PR inbox that says what each pull request needs next, and hands it to an agent #5867
Description
The workflow
I run several agents in parallel; each one opens a pull request. Several times a day I open the GitHub panel to answer one question: which pull requests need me, and for what — a merge, a failing check, a conflict, a draft to finish — and then hand the work back to an agent.
What happens today
On bb 0.46.1 (GitHub plugin 0.2.1), with get-bb/bb itself tracked, the Pull requests tab shows 50 rows that all read open with a Review button. GitHub's own data for the same 50 (snapshot 2026-10-20 16:33 UTC) says:
- 9 have failing checks
- 1 has merge conflicts
- 20 are green and mergeable
- 11 are drafts — the list calls Typecheck with tsrs instead of TypeScript 7 tsc #5861
open, its detail view calls itdraft - 10 are stacked on another open pull request's branch
None of that is on the row, so I open each pull request, or GitHub, to find it. The list query asks for number title state author labels assignees url body updatedAt only (listFields); getPull already asks for isDraft, headRefName, baseRefName, mergeStateStatus and statusCheckRollup, for the detail view (server.ts#L1227-L1232, draft label).
Same public data on both sides; the right column is the prototype below.
| Today (plugin 0.2.1) | Proposal (prototype) | |
|---|---|---|
| List | ![]() | ![]() |
| Pull request with 2 failing checks (#5849) | ![]() | ![]() |
| Phone, list | ![]() | ![]() |
| Phone, pull request | ![]() | ![]() |
| Dark | ![]() | ![]() |
What you would expect
Clickable prototype: https://alexandre-vl.github.io/bb/prototype/ — one HTML file, built on the snapshot above; agents and their threads are simulated. Press ? for shortcuts.
- Inbox by whose move. Rows are grouped by what the pull request needs next (Your move, Ready to merge, Needs fixing, In progress, Drafts), with one status glyph in bb's own PR vocabulary (
assemblePullRequestAttention,pull-request-display.ts) and the reason as a plain second line:#5849 · 2 checks failing,#5760 · 23 checks passed · stacked on #5756. - One next-step card on the pull request. Failing check names with their logs and Fix with an agent; Resolve with an agent on conflicts; Merge when green; Mark ready / Finish with an agent on drafts. While an agent works or waits for an answer, the card says so and takes the reply.
- Agents launch from bb's own composer. Fix with an agent opens
experimental_NewThreadComposerprefilled with a prompt and the PR branch; the spawned thread is recorded as linked to the pull request (covers GitHub plugin: picking a PR in the thread sidebar should persist the thread↔PR link #4509). - bb's kit, not a web table. Inter 13/12, three inks, hue only on the status glyph,
state-hover/state-active, 32px buttons, Hugeicons throughexperimental_Icon, a bottom drawer under 768px, and J/K, X to select, A for an agent, M to merge. - Ambient surfaces. A status glyph on linked thread rows (
experimental_setThreadRowStatus), a header control on threads whose pull request bb cannot infer (experimental_threadHeaderAction), palette commands (app.commands.register), a homepage section.
More states from the prototype
| An agent fixing the checks (#5835) | Ready, reviewed by an agent (#5856) |
|---|---|
![]() |
![]() |
| An agent waiting for an answer (#5563) | Fix with an agent, prefilled |
![]() |
![]() |
Context and alternatives
- Cost of the list data, measured on get-bb/bb with the existing
RepositoryListsquery: addingisDraft headRefName baseRefName mergeable reviewDecision isInMergeQueue, review requests and check counts (checkRunCountsByState,statusContextCountsByState) to open pull requests takes it from 5 to 6 GraphQL points and from 2.2–3.1 s to 4.1–4.9 s (three runs each), still one request per repository per sweep. WithmergeStateStatusas well it took 7–9 s and failed twice with HTTP 502/504, so the list leaves that field to the detail view (Host daemon PR status reads exhaust the GitHub GraphQL hourly limit #5704). - Related: GitHub plugin: show the author in the issue/PR list, not just the detail view #2030 (author in the list), GitHub panel rows do not say which repository they belong to #2542 (which repository a row belongs to), GitHub plugin: picking a PR in the thread sidebar should persist the thread↔PR link #4509 (persist the thread↔PR link), A pull request in a GitHub merge queue reads as ready to merge, and bb offers a merge action the queue already owns #2048 (merge queue reads as ready to merge — the inbox must not offer Merge there), Host daemon PR status reads exhaust the GitHub GraphQL hourly limit #5704 (GraphQL budget), Plugin-embedded NewThreadComposer: an unseeded or not-yet-known project seed silently resolves to the personal project instead of the remembered new-thread project #5340 (composer project seed).
- I can split this into reviewable PRs: (1) list data + inbox grouping, (2) PR detail next-step card, (3) agent launch + link at spawn, (4) ambient surfaces. Happy to drop or reshape any part, and I will wait for sign-off before opening any of them here.
Checks
- I searched open and closed issues for the same request.
- If an agent wrote this, the body ends with
> AGENT GENERATED.
AGENT GENERATED














Activity
alexandre-vl commentedon Oct 20, 2026
A first slice — list data and inbox grouping — is implemented on my fork, ready to retarget here after sign-off: alexandre-vl#1 (diff against main).
scripts/check-plugin-forks.mjspass.bb github prsprints the same next step;--jsonaddsnextStepandpr.alexandre-vl commentedon Oct 20, 2026
Prototype update, same link: https://alexandre-vl.github.io/bb/prototype/. Menus now open at their trigger, and every read and write has a loading state you can watch.
Menus open at their trigger
Two menus were misplaced. The reply target menu was laid out inside the composer and made it taller. The display menu opened at the window's right edge, over the pull request.
Loading
Reads and writes now take time in the prototype, so each loading state can be seen. The prototype adds none of its own loading patterns: each state uses something bb already ships.
The recording: first load, then Refresh. The agent fixing #5835's checks has finished, so its row moves into Ready to merge.
DelayedLoading,Skeleton, stable dimensions, abstract barsappToast.loading, then the same id,running: true,animate-shinearia-busy, and shows a spinner. Re-run checks then tick through live.To try it, use the bar above the prototype: Replay loading empties the cache and loads everything again, Slow network makes every request about 3× slower, and Offline makes every request fail.
#net=slowand#net=offlineopen the prototype in those modes.The prototype departs from bb in one place.
Skeletonhas no exit transition, so in bb the content replaces it in a single frame. The prototype instead fades the skeleton out over 150 ms, above rows that are already laid out; drop that if you prefer bb's swap. With reduced motion, spinners and skeletons stand still and rows don't slide.Each loading state
alexandre-vl commentedon Oct 20, 2026
Prototype update, same link: https://alexandre-vl.github.io/bb/prototype/#pr=5849. The pull request status is now a menu, and the diff stat uses bb's own colours.
The status is a menu
Today the status pill only labels the pull request, so changing the status means going to GitHub. In the prototype, clicking the pill or pressing
Slists the four states and what picking each one does.Picking Draft on #5849: the pill spins, the toast resolves with Undo, and Activity records the change.
On a phone the menu is a bottom drawer.
PULL_REQUEST_STATE_DISPLAY. Merged pull requests keep a static pill.For any listed pull request, the plugin would call GitHub's
markPullRequestReadyForReview,convertPullRequestToDraft,closePullRequestandreopenPullRequest. It would offer each state only when the pull request reportsviewerCanUpdate,viewerCanCloseorviewerCanReopen.Diff stat and branch
+74 -14takes thetext-diff-added/text-diff-removedcolours fromDiffStatsTallyand the five blocks fromDiffSizeBar. Clicking it opens the Files tab. Rows (Show on rows → Changes) and the Files tab use the same colours.Smaller fixes
S).bb-slop-cop commentedon Oct 20, 2026
🚨 SLOP COP 🚨 ·
new-issue-autopilotApplied missing classification: Type: Feature · Priority: Medium · Effort: High. Added labels:
ui,github. No existing classification values or labels were replaced; all writes were verified.This adds a PR inbox and agent-handoff workflow rather than correcting a single unexpected behavior. Existing detail views and GitHub provide workarounds; the proposed grouping, actions, thread linkage, and ambient surfaces require substantial interaction design and integration.
No reproduction report or pull request: this is a feature request requiring product/design decisions, outside the bug-only fix path.