I usually have a few coding agents going at once: Claude Code on one repo, Codex on another, sometimes Cursor on a third. The hard part now is knowing, at a glance, which one is halfway through, which one finished, and which one has been sitting on a question for me.
TL;DR: have each agent write its plan as steps, report "step N of M" as it goes, and block with a question when it needs you. Put all of that on one board that updates live. I built this into Taskhold, a task list I share with my agents, but the habits work with any tool your agent can call.
Why not just watch the terminals?
Because there are several of them, they scroll, and a question an agent asked twenty minutes ago looks exactly like the output around it. A per-session todo list helps inside one session, but it ends with the session and lives on one machine. I wanted one view across agents, repos and machines, that I could also check from my phone.
What should an agent report?
Four things, and only four:
-
A plan as ordered steps before it starts. In Taskhold that's one MCP call,
taskhold_plan, which turns the task into steps. -
Progress as it goes: either a percent or "N of M", plus one short line about what it's doing right now (
taskhold_progress). Steps beat percentages; agents are much better at "finished step 3 of 5" than at guessing 60%. -
Blocked, with a question when it needs a decision, access or information (
taskhold_block). -
Done, with a summary of what changed (
taskhold_complete).
What does the board show?
One card per task in progress: a progress bar split by step, which agent is on it, how long it has run, an estimate of time left, and the current step's message. Blocked tasks go to the top with the agent's question and a reply box. Finished tasks drop into a "recently done" list, and there are optional desktop notifications for blocked and finished.
How does the agent get my reply?
It asks "what changed since my last check?" with taskhold_updates, which takes a cursor and returns only what the person changed: replies, new tasks, priority changes. The agent calls it between steps, so I can steer it mid-task without stopping the session.
How accurate is the time-left estimate?
It's deliberately simple: time elapsed divided by the fraction done. It stays hidden until the agent is at least 5% in and 30 seconds have passed, because before that it's a guess, and a wrong number is worse than none.
How do you know an agent died?
Liveness, not the bar. Each card shows whether the agent is live (reported in the last 2 minutes), quiet, or stale (nothing for 15 minutes). A stale card at 90% usually means the session ended and the task needs someone to pick it back up.
How is it built?
Every change an agent or person makes (create, status, progress, note, edit) writes a row to an events table, and the row id is the cursor for everything. The board streams new rows over server-sent events with an in-process wake for instant updates, a 3 second poll as a backstop and a 15 second ping so proxies keep the connection open. One gotcha if you do SSE from Next.js: its compression buffers the stream unless you send Cache-Control: no-transform; X-Accel-Buffering: no handles nginx.
How do I set it up?
In Taskhold you create a setup URL in Settings and paste it to your agent with "set this up". The markdown it fetches contains a fresh API key, the MCP config for that client (Claude Code, Cursor, Codex, Windsurf, VS Code, Gemini CLI) and a short rules snippet telling the agent to plan, report progress and block with questions. It's $12 a month with a 7-day trial.
If you don't want another tool, add this to your CLAUDE.md or rules file and you'll get most of the habit inside a single session:
Before starting a task, write your plan as 3 to 7 numbered steps.
After each step, say "Step N of M done: <one line>".
If you need a decision from me, stop and ask one specific question.
What do you use to keep track of agents running in parallel? I'd like to hear what works for you.
Originally published at taskhold.com.
Top comments (0)