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
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
- Overnight runner: the lane, the jail and the guard an agent job works in, what the runner checks for itself, and what may land without me.
- Jobs: the 33 job files: suites kept green, fixes from a backlog, nightly housekeeping, watches and one-off measurements.
- Weekly reviews: a cost review that checks its own proposals, a finder of work worth automating, and a digest of what my sessions show.
- Local-first tools: the ladder that tries a local model before Claude, and the command-line tools that send commit messages and a lane's small chores to free and local models first.