One day with agentctl: the bottleneck moved again
contents · notes
# contents
# in this post
▣fig.1 · A PR to finish. All screenshots use made-up data from a fictional ticketing app.img ▣fig.2 · A teammate's PR, reviewed before I look at it.img ▣fig.3 · Work that looks ready. Starting it is my call.imgor rss. no spam, one-click out.
Yesterday I wrote about agentctl, a terminal app that shows me one decision at a time while my Claude agents do everything else. After a full day of using it, I can say it plainly: it changed how I work, for the better. It's a game changer.
It also moved the bottleneck again. The limit is no longer me finding the next thing to do. It's my laptop keeping up with the amount of work in flight, and, for the first time, the tokens on my Claude Max plan.
Here's what I changed during that day, and where the tool landed.
PRs at the finish line don't wait quietly anymore
The first version only showed me a PR once every gate was green: CircleCI passing, no merge conflicts, every CodeRabbit thread resolved. That sounded right. In practice my queue said "nothing needs you" while four PRs sat one merge conflict away from done.
So a PR that's marked ready for review but can't merge now shows up right away, as a Finish PR card that lists everything still in the way.

The card has a button: fix what's left. Before, every finished factory left a watcher running that polled its PR every few minutes until merge. With a dozen PRs open, those watchers were eating my machine. Now nothing watches. When I press the button, agentctl types the request into the PR's own Claude session: merge main, fix the real CI failures, answer the CodeRabbit threads, push. The card disappears while it works and comes back only if something is still red.
"Its own session" took two tries. My first version resumed the session with claude --bg --resume, which quietly makes a copy when the session is still running, and background sessions always are. One afternoon later I had three sessions merging main into the same branch at once. Now agentctl attaches to the existing session out of sight, pastes the request into its prompt, and detaches. Same session, same context, no duplicates.
Reviews come to me, already done
Review requests used to mean a trip to GitHub. Now agentctl watches for PRs where my review is requested and runs a local superpowers review on each one in a background session. When the review finishes, a card shows me what it concluded, and → opens the session with the full review.

Once I submit my review on GitHub, the card goes away. I haven't opened GitHub's review tab since.
The dispatcher asks before it starts anything
The dispatcher looks at my Linear cycle for tickets nobody has started, skips anything blocked, and checks the rest against work in progress. In the first version it then started a factory on its own.
That was a mistake. "Nothing blocks it" is not the same as "it's ready". Some tickets need a product decision first, and one it started was literally "turn this feature on for every customer". Now the dispatcher still finds the candidates, but each becomes a Ready to start? card with its reason, and I answer with y or n. A "not yet" holds until the ticket changes in Linear.

Smaller things that added up
- Testing a branch is one key.
tloads the card's PR into my main checkout so I can click through it on my local dev site. It refuses if I have uncommitted work, and it tells me when there are migrations to run instead of running them for me. - Plan approvals actually show up. A session waiting on plan approval still records itself as "working", so agentctl missed all of them, and one morning showed "nothing to do" with five plans waiting. It now reads session state the way the agents list does, and the plan itself is on the card, so I can judge it before I go in.
- Focus stays put. The card I'm reading no longer changes when something new arrives. And when I come back from a session, agentctl re-checks the card. If I finished it, I land on the next one.
- ← comes straight back, with no flash of the agents list, even after a long conversation in the session.
- Finished sessions clean themselves up. Once every PR a session opened is merged, agentctl removes it from the agents list. Clearing a session there clears its cards here.
- Every link is clickable, the card fits the window, and ↑/↓ browse the queue without skipping anything.
Where it landed
The queue is ordered by what finishes work fastest:
| Card | What I do |
|---|---|
| Ready to merge | Read the QA and risk reports, merge in GitHub |
| Approve plan / answer questions | Decide, and an agent gets back to work |
| Review requested | Read the review, submit mine |
| Finish PR | Press fix, or step in myself |
| Ready to start? | Yes or not yet |
My day is now mostly that list: approve this plan, answer this question, ship this PR, start this ticket. Everything between those moments happens without me.
The new bottlenecks
The first one is my computer. A dozen agents means a dozen worktrees, test databases, browser QA runs and dev servers on one laptop. By the afternoon, the machine, not me, was deciding how fast work moved.
The second is tokens. For the first time I'm on track to hit the limits of my Claude Max subscription. When the agents stop waiting on me, they spend a lot more.
Both are good problems. A week ago the bottleneck was my attention. Now it's hardware and budget, and those are problems you can buy your way past.