Kind
docs
Component
forgectl
What needs doing
Umbrella for the review-queue subsystem. Bulk review launch is currently
unbounded: forgectl pr prs prepares every selected PR and launches every prepared result,
so picking 12 PRs gets you 12 sessions. The pieces that make bulk review safe to leave
running are a launch cap, an auto-draining backlog, and a notification when the drainer
starts one — three changes that only read as coherent together.
Scope boundary vs #55
#55 already owns displaying a review queue — its menu-bar shell lists staged review
sessions as one section. This epic is about bounding launches: how many review sessions
may run at once, what happens to the overflow, and how the operator learns that a queued
review started. #55 is explicitly not that — it renders state it does not produce. The two
compose: this epic produces the queue, #55 shows it.
Children
Why one epic
Filed separately these read as four unrelated nits — a magic number, a missing notifier, a
tray scoping note. Filed together they are one subsystem: the thing that lets you select 20
PRs, walk away, and come back to a bounded, drained, legible queue rather than 20
simultaneous sessions.
Ordering
The cap ships first (it is the load-bearing safety change). Notification is additive and can
land any time after. The #32 comment is independent and can go immediately.
Evidence
Verified against 58a2845. There is no queue, no poll daemon, no tray, and no
max-concurrent setting anywhere in the tree — internal/ has no queue package, go.mod
declares no systray dependency, and the only notify hits are the docs watcher's fsnotify
usage. This is greenfield, not a repair.
Kind
docs
Component
forgectl
What needs doing
Umbrella for the review-queue subsystem. Bulk review launch is currently
unbounded:
forgectl pr prsprepares every selected PR and launches every prepared result,so picking 12 PRs gets you 12 sessions. The pieces that make bulk review safe to leave
running are a launch cap, an auto-draining backlog, and a notification when the drainer
starts one — three changes that only read as coherent together.
Scope boundary vs #55
#55 already owns displaying a review queue — its menu-bar shell lists staged review
sessions as one section. This epic is about bounding launches: how many review sessions
may run at once, what happens to the overflow, and how the operator learns that a queued
review started. #55 is explicitly not that — it renders state it does not produce. The two
compose: this epic produces the queue, #55 shows it.
Children
max_concurrentbound on launched sessions, plus a window-countadmission gate that admits zero when the count is unreadable. Filed as its own issue.
starting a review as a window frees is not silent. Filed as its own issue.
rather than shipping a second menu bar item. Posted as a comment on feat(forgectl): pr poll — auto-review daemon + LaunchAgent + tray #32, not a new issue.
Why one epic
Filed separately these read as four unrelated nits — a magic number, a missing notifier, a
tray scoping note. Filed together they are one subsystem: the thing that lets you select 20
PRs, walk away, and come back to a bounded, drained, legible queue rather than 20
simultaneous sessions.
Ordering
The cap ships first (it is the load-bearing safety change). Notification is additive and can
land any time after. The #32 comment is independent and can go immediately.
Evidence
Verified against
58a2845. There is no queue, no poll daemon, no tray, and nomax-concurrent setting anywhere in the tree —
internal/has noqueuepackage,go.moddeclares no systray dependency, and the only
notifyhits are the docs watcher's fsnotifyusage. This is greenfield, not a repair.