Skip to main content

Run parallel agents well

Once several agents are active, your job is to define clean boundaries and respond at the right moments. Saggar keeps the state visible, but it can't make coupled tasks independent.

Saggar showing projects and agent sessions with live status

Decide what deserves its own session

Give a task its own session when it has one result you can review independently. Good boundaries include one bug, one issue, one migration step, or one piece of research. Name the session for that result, such as fix sign-in loop or audit cache invalidation.

Keep coupled work together. Two agents editing the same types, tests, and call sites will spend more time colliding than they save. Split by ownership or sequence instead: let one agent finish the shared contract, then start the consumers.

Protect concurrent edits with worktrees

If two tasks may edit the same repository, open at least one from In a new worktree… in the new-session menu. Saggar creates a branch and sibling checkout, then attaches their Git state to the session.

A worktree prevents file-level collisions. It doesn't prevent logical ones. Two branches can still make incompatible decisions, so tell each agent what it owns and which shared surfaces it must not change.

Use the main checkout for the task you expect to supervise closely. Put bounded, reviewable work in worktrees. Project workspace covers creation and cleanup.

Put support processes in monitors

A dev server, test watcher, log tail, or compiler watch isn't another task. Run it in the monitor dock with ⌘⇧M. It stays visible without competing with agent sessions for your attention and turns amber when its recent output contains errors.

This leaves the Project menu describing pieces of work rather than every process needed to support them.

Give every agent a finish line

An agent is easier to leave alone when its first instruction names:

  • the outcome;
  • the relevant files or existing pattern;
  • what it must not change;
  • the checks it should run; and
  • what evidence should be waiting when it finishes.

For example:

Fix issue #123 in a new worktree. Follow the existing error-response pattern in
Sources/API. Add a regression test and run the affected test suite. Don't change
the public response schema. Finish with a concise summary of the cause, changed
files, and checks run.

The agent may discover a better implementation than the prompt suggests. The finish line matters more than prescribing every step.

Read state instead of watching terminals

Ignore Working sessions. Respond to Needs you, investigate Failed, and review finished work that remains dirty. Press ⌘J to walk those claims in priority order until Saggar reads 0 waiting.

Attention cards let you answer routine prompts without leaving the session you are using. If the default answer is safe and repetitive, unsupervising a session allows Saggar to answer supported approval prompts. Its destructive-command guard still refuses unsafe work, and prompts it can't handle still enter the queue.

Don't unsupervise a vague task, an unfamiliar migration, or anything with a wide blast radius. Automatic approval removes interruptions, not responsibility.

Review before cleanup

Treat Ready for review as the start of your review, not proof that the work is correct. Read the diff, run the relevant checks if needed, and confirm the task's finish line. Commit or hand the work back before closing the session.

Only remove a worktree after its changes are committed or deliberately discarded and no live session uses it. Saggar's cleanup review protects recent, dirty, detached, and active checkouts.

A reliable rhythm

  1. Split work into independently reviewable outcomes.
  2. Put concurrent repository edits in separate worktrees.
  3. Dock support processes as monitors.
  4. State the finish line before starting each agent.
  5. Leave Working sessions alone.
  6. Press ⌘J until the human queue is empty.
  7. Review dirty finished work before closing anything.

Use the workflow recipes for three complete examples.