Skip to content
Adam OspalakContact →
← Back to workCase study · Agent orchestration

JARVIS: agents that have to prove it.

A command centre for running a team of AI agents, where nothing counts as done until it is checked.

5Orchestrators
271Receipts logged
97Test files
JARVIS front page: the core, what needs Adam, what is running, the weekly limit and the orchestrators
Shown with demo data

Problem

An AI agent will report work as finished when it isn't, and one session can't hold every project's context. I needed agents I could hand work to without re-checking everything by hand.

Build

01 Request

Work enters through one chief orchestrator, which routes it to one of four lanes: client work, OS, school and venture. Each lane has its own orchestrator and state file.

JARVIS work tree: the chief orchestrator, its lanes, builds and subagents
Fig. 01JARVIS work tree: the chief orchestrator, its lanes, builds and subagents · Demo data

02 Contract

Before an agent starts, its orchestrator writes a contract: the task, the deliverable, a mechanical done-when, what not to assume and which files it may read. A gate refuses an incomplete contract.

03 Agent

Scouts read, builders write code and tests, reviewers check. Each touches only the files its contract names.

04 Receipt

Every agent returns a receipt, and the gate refuses one that overclaims.

05 Check

The orchestrator re-runs the check itself instead of trusting the agent's summary.

06 Handoff

Near 150k tokens of context, an orchestrator is designed to hand off: it writes a short delta, and a fresh session claims the lane and starts from its state.

The page

JARVIS is the window onto all of it: a local page that shows what is running, what needs me, every contract with its receipt, and the spend. It uses the Python standard library only and binds to 127.0.0.1, so nothing leaves the Mac.

JARVIS Projects tab: progress per project with sub-task bars
Fig. 02JARVIS Projects tab: progress per project with sub-task bars · Demo data

Results

The receipts sit in four ledgers, one per lane. My rulings are logged word for word, so a fresh session inherits decisions instead of asking again.

My roleI design the system, set the rules and review every change; Claude Code writes most of the code.
StackPython standard library · Claude Code · tmux · macOS LaunchAgent · JSONL ledgers