Airforge / Operator playbook

How to keep five agents moving while you're in meetings

Around minute twenty of the meeting, one of your five agents hits a question only you can answer. What happens next?

Your next ninety minutes belong to a meeting. Five agents are mid-task in the tracker. Around minute twenty, one of them will hit a question only you can answer. What happens next depends on what you set up before you left the desk.

The version where everything stops

The failure has two familiar shapes. In the first, the agent blocks its terminal on your input. You are in a room, the prompt sits there, and the session drains its own momentum while other work piles up behind the stalled task. In the second shape you saw this coming and left standing instructions: “if anything is ambiguous, take the safe option.” Now the agent guesses, the guess is wrong in a way you would have caught in five seconds, and the afternoon goes to unwinding it.

Both shapes share a root cause: the question has nowhere durable to live. It exists in a live session or in your head, and for ninety minutes neither is available.

The setup

Three mechanisms carry the whole playbook.

Leases on every claim. Each agent in the fleet takes work through next, which selects and claims the best actionable task in one race-safe step, with an expiry:

$ axial next --lease 30m
claimed PLAT-4 [todo] p:high @codex: Rate-limit the webhook (lease expires 2026-07-24T13:35:00Z)

A live agent renews with issue heartbeat. A crashed one silently loses the lease, and the task returns to the pool for whichever agent asks next. Recovery from a dead process needs nothing from you.

Decisions instead of blocked terminals. When the agent on PLAT-2 hits its wall (migrate a 40-million-row table, or add a column?), it files the question as a record with bounded options and a deadline:

$ axial decision request PLAT-2 "Migrate users table or add a column?" \
    --option migrate --option add-column --timeout 4h
requested PLAT-2#1 [open]: Migrate users table or add a column?
  option 1: migrate
  option 2: add-column
  expires: 2026-07-24T17:20:00Z

That one write does three jobs. PLAT-2 leaves the dispatch pool, through the same mechanism as an open dependency edge, so no agent picks it up half-decided. The asking agent is free to release PLAT-2 with a handoff and take other work. And in cloud mode, a notification email goes out carrying the question and its options, with a Reply-To address that encodes a signed token.

Answer channels that reach you where you are. Which brings us back to the meeting.

Minute twenty, from your phone

The notification arrives. You read the question under the table and reply with one word:

migrate

That reply is the answer. The service verifies the token in the address it arrived at, takes the first non-empty line of the body (an option number, an option’s text, or free text all work), and records the decision: answered by you, channel email. If you prefer a screen to an inbox, the oversight page shows the same open decision with option buttons and records channel web.

Either way PLAT-2 rejoins the dispatch pool. An agent parked on it with

$ axial issue await PLAT-2 --until change

wakes up the moment the answer lands, because answering writes an activity event on the issue. Note what you did not do: open a laptop or type into someone else’s session.

Minute ninety, back at the desk

If an agent died at minute forty, its lease has lapsed and its task went back to the pool without you. The one thing to check is the decision queue:

$ axial decision list
count: 1 decision (1 open)
PLAT-5#1 [open] by claude 2026-07-24T13:40:00Z: Which OAuth scopes should the app request?

One question waited. Answer it from the CLI:

$ axial decision answer PLAT-5 1 --choose read-only
answered PLAT-5#1 [answered] by mark: read-only

Attribution is the point of the record. The asker cannot answer its own decision (that fails as a CONFLICT), and in cloud mode the answering identity is bound to the authenticated login principal. Six weeks from now, decision show PLAT-5 1 still knows who chose read-only, when, and through which channel. Every approval your fleet ever needed is a queryable event rather than a memory.

What still needs you now

Honest limits. The email channel is a cloud-service feature; local mode has no delivery path, deliberately, though the decision record and the queue exist everywhere. An expired decision synthesizes no answer: the agent chose the timeout and owns the fallback, so timeouts should match your actual calendar, and four hours on a question you will see within two is a sane default. A decision also carries exactly one bounded question. “Migrate or add a column?” fits the record. “Is this whole approach wrong?” is a conversation, and no queue makes a conversation asynchronous.

The takeaway

The meeting was never the problem. An agent that blocks on you turns your calendar into the fleet’s scheduler; an agent that files a decision and moves on turns your calendar into what it should be, a list of times you will answer a short queue of questions.

If the question can wait in a queue, the agent doesn’t have to.