Back to the network

Tooling

ai-automations

What runs while no one is typing: an overnight runner whose agent jobs work in a jail behind a guard that fails closed, 33 jobs, weekly reviews and local-first tools.

What runs without anyone typing

How my Claude Code sessions behave is set by one repository, claude-global-context: its rules, skills, agents and hooks are what Agent ops describes. ai-automations holds the other half, what runs when no one is typing: an overnight runner and its jobs, the timers that start them, the weekly pipelines, and a few command-line tools that each take one step of a session off the model.

The runner began inside claude-global-context, where its first commit is from 2026-10-17. The next day it moved here with its history, and since 2026-10-19 both of my machines run it from this repository.

A night, at a glance

A night of the overnight runnerAt 22:00 a preflight checks the runner's wiring and makes one short Haiku call, and notifies me only when the night would fail. At 00:30 a timer starts the runner: it fetches main, fast-forwards a clean, idle checkout and queues the jobs that ask to queue themselves. It then waits until no session has had a prompt or an answer for 45 minutes, and gives up at 06:30, when the jobs wait for the next night. Script jobs run first, then agent jobs, each in a lane and a jail of its own; no job starts after 06:30, and no agent job once agent jobs have spent $10. The brief is rewritten after every job and headed Not finished until the last write, and it is shown to me once, the first time I am at my desk.A night, at the machine on my desk22:00 · Preflightthe runner's wiring and one short Haiku turn;it notifies me only when the night would fail00:30 · The timerfetch main, fast-forward a clean, idle checkout,queue the jobs that ask to queue themselvesWait for 45 quiet minutesno prompt and no answer in any session;at 06:30 it gives up, and the jobs wait a nightScript jobsfirst: housekeeping, watches, measurementsand the weekly reviews: commands, not agentsAgent jobseach in a lane and a jail of its own;none starts after 06:30 or once they spent $10The briefrewritten after every job, headed Not finisheduntil the last write; shown once at my desk
A night on the machine at my desk. On the laptop, the run starts in a morning window instead.

The night starts with a check at 22:00. The runner tests its own wiring and makes one short Haiku call, which proves the login, and it sends a notification only when the night would fail. Before it, a night that was going to fail showed up only in the next morning's brief.

At 00:30 a timer starts the run. It fetches the runner's own repository, fast-forwards its main checkout when that is clean and idle, and queues, once each, the new jobs whose files ask to be queued. Then it waits until none of my sessions has had a prompt or an answer for 45 minutes. Script jobs go first, then agent jobs. The brief is written again after every job, and until the last write it opens with Not finished and the jobs not reached yet, so a night cut short by a power-off still says so.

Two machines, one runner

The same runner runs on the machine at my desk and on a laptop. Each job file names the machine it runs on, or any: a job that reads one machine's data runs there, and a job such as the secret scrubber runs on both, each over its own files. The laptop sleeps through the desk machine's night, so its night is a window in the morning.

Its bounded text work goes to the desk machine's 1-llm over the local network, with a key. It never switches the model loaded there, because its quiet test sees only the laptop's sessions, not whether I am working at the desk.

Small modules that stay apart

The repository is a set of independent modules. Each has its own folder, README, tests, state and settings, and one module does not import another, call its command line or read its state. That is not a hard rule, but it is kept wherever it can be: a link is allowed where it is a major improvement, and the module's spec names it and says why. The automation finder, for one, calls the secret scrubber's own redaction rather than a copy: there should be one definition of a secret, and a copy would drift and miss what the original catches.

The weekly efficiency review is the one exception to the layout: it landed beside the runner after the rule was written, and the README records that it stays there.

Tested without the machines

The repository's harness runs 2,414 checks in 38 suites. They are hermetic: temporary folders, and stand-ins for claude, for bwrap, for 1-llm's router and gateway, and for the session bus. A few suites read claude-global-context's checkout, as the runner itself does.

Like most of my recent work, it is written with Claude Code, to specs I approve: 201 of its 223 commits carry a Claude co-author trailer. The three main specs keep my answers at the top and a log of every decision the agent took on its own.

On the shelf

Stack

  • Python
  • bubblewrap
  • systemd
  • Claude Code

Connected to