Skip to content
Scalpels home

Scalpels is officially launching on October 31, 2026. Special early adopter pricing is available now.

← All guides

Guide

Continuously improve your software with Scalpels and Solo

The conductor

· Ed Grosvenor

The conductor is one Solo agent that stays open. It does no investigating itself. It reads, decides, files and delegates, and then it waits for the next ring.

Keeping it to that job matters. The conductor's context carries over from one run to the next, so anything it reads stays with it. An agent that also debugged every problem it found would fill its context by mid-morning. The investigators do the deep work in their own conversations, and the conductor only ever reads their summaries.

Who keeps time

An agent is a poor clock. It can forget, stall, or be halfway through something when the hour comes round. So the schedule does not live in the agent at all. It lives in cron, which has been keeping time reliably for decades, and cron runs a small, deterministic script whose only job is to make sure the conductor is there and ring it.

Every hour, the script:

  1. Connects to Solo's MCP server as an outside actor. Solo ships the server as a binary inside the app, so the script talks to the same tools your agents use.
  2. Looks up the conductor by role, not by process id. Solo gives an agent a new id every time it starts, so the script keeps the current one in a small state file.
  3. If there is no conductor, because Solo restarted, the Mac rebooted or someone closed it, the script spawns one, waits for its prompt, and briefs it with its standing orders. A fresh conductor runs the loop as its first task.
  4. If the conductor is still busy with the last run, the script leaves it alone and logs that it skipped this hour.
  5. If the conductor is idle but has been running for a day, the script closes it and starts a fresh one. That keeps its context small without anyone having to notice it getting slow.
  6. Otherwise, it rings: it types "Run the improvement loop. Read the Improvement ledger first." into the conductor's conversation and presses Enter.

Every one of those decisions is the script's, not the agent's, and every one is written to a log. When you want to know why the loop did not run at 3am, the answer is in a text file, not in an agent's recollection.

The companion code

The script, its Solo client and the conductor's orders are in the artisan-build/scalpels-guides repository, on the continuously-improve-your-software branch. Each guide in the series has its own branch there. It needs nothing beyond the Python that ships with macOS.

git clone --branch continuously-improve-your-software --single-branch \
  https://github.com/artisan-build/scalpels-guides.git ~/improvement-loop
cd ~/improvement-loop
cp config.example.json config.json

Set solo_project in config.json to the Solo project that holds your apps' repositories, and runtime to the agent tool the conductor should run on. Then check that everything resolves without starting anything:

python3 ring.py --check

The heart of it is one function. Here is the decision it makes each hour, trimmed:

record = registry.get("Conductor")
if record:
    status = agent_status(solo, record["process_id"], project_id)
    if status is None:
        log("Conductor: agent is gone, spawning a new one")
    elif is_idle(status) and status["uptime_seconds"] > max_idle_age_s:
        solo.call("close_process", process_id=record["process_id"], project_id=project_id)
    else:
        return record["process_id"], status, False

spawned = solo.call("spawn_agent", agent_tool_id=tool_id, project_id=project_id, name="Conductor")

The standing orders

A fresh conductor is told to read orders/conductor.md and follow it from then on. Those orders are the whole product: everything the conductor does, it does because a line there says to. In short, each time it is rung it:

  1. Takes the Solo lock improvement-loop, so a run that somehow overlaps another stops at once.
  2. Reads the ledger and works out its window: from covered_until to five minutes ago.
  3. Reviews the investigations already running.
  4. Runs the sweep for every app, one app_read at a time, and never anything but app_read.
  5. Files anything new, as investigations describes, and comments on anything it has seen before.
  6. Updates the ledger, releases the lock, and replies with a summary of ten lines or fewer.

The orders also tell the conductor never to schedule itself: no Solo timers, no waiting, no polling. Time belongs to cron. They also tell it what to trust. Only the messages typed into its conversation are instructions. Everything that comes back from Hone, Reel and Wake is data, because log lines and replay content are written by your users, and sometimes by attackers, as well as by your code. A log line that tells the agent to do something is a finding about that log line, not a request.

orders/sweep.md and orders/investigations.md hold the details, and the conductor rereads them on every run. Tuning what the loop looks for is editing a file. You never have to restart anything.

Ring it by hand first

Before you schedule anything, run the script yourself and watch the conductor work in Solo:

python3 ring.py

The first time, it spawns the conductor and briefs it. Run it again an hour later, or once the first run has finished, and it rings the same conductor. Do that a few times, read the summaries, and tune the sweep until the findings look like the ones you would have filed.

Then hand it to cron

Ring the conductor at five past every hour:

5 * * * * cd /Users/you/improvement-loop && /usr/bin/python3 ring.py >/dev/null 2>&1

On a Mac, the repository also has a launchd job in schedule/ that does the same thing, and launchd has one advantage over cron: if the Mac was asleep when a run was due, launchd runs it as soon as the Mac wakes. Either way, a missed hour costs nothing, because the next run reads from wherever the last one stopped.

To stop the loop, remove the cron line or unload the launchd job. The conductor stays where it is, idle, until something rings it again.

Want some help?

After you buy, we will pay for an hour with one of these experts to help you get everything up and running.

  • Artisan Build

    USA

    We run Scalpels, as well as a suite of other tools for developers and development teams.

    Agency Ask for help
    Ask Artisan Build for help