---
title: "One day with agentctl: the bottleneck moved again"
url: https://akdarrah.com/posts/one-day-with-agentctl-the-bottleneck-moved-again
author: Adam Darrah
published: 2026-10-16T14:31:41Z
updated: 2026-10-16T14:31:41Z
tags: ["ai","claude-code","agents"]
---

# One day with agentctl: the bottleneck moved again

Yesterday I wrote about [agentctl](/posts/focus-mode-for-ai-agents), 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.

![agentctl showing a Finish PR card: CI failing, merge conflicts and two open CodeRabbit threads, with a fix button](/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MjAsInB1ciI6ImJsb2JfaWQifX0=--578b90797e36e6ddc4a93402bddb1c40333a2c50/agentctl-finish.png "A PR to finish. All screenshots use made-up data from a fictional ticketing app.")

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.

![agentctl showing a Review Requested card with the review's verdict and the PR's green gates](/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MjEsInB1ciI6ImJsb2JfaWQifX0=--1fc76cd843a0568264fee56bdd786aa8e5caa03a/agentctl-review.png "A teammate's PR, reviewed before I look at it.")

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.

![agentctl showing a Ready to Start card with the reason it looks ready and buttons to start or not](/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MjIsInB1ciI6ImJsb2JfaWQifX0=--09d5f6003d80024440731a771f16b78ed3a49bae/agentctl-start.png "Work that looks ready. Starting it is my call.")

## Smaller things that added up

- **Testing a branch is one key.** `t` loads 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.

