Back to blog
Engineering

The Interrupt Is the Interface

A running coding agent changes the job. The control that matters is the record that lets you stop, steer, and inspect a run and keep the work.

A quiet altitude interior at night: a closed laptop, a small amber status light, and code-review notes on a travertine desk.

I used to think a long-running coding agent needed a better progress bar.

It needs a better interrupt.

That sounds small until you watch a run work in a repository for a while. It reads files you did not point it at. It takes a wrong turn. It finds a second problem hiding behind the first one. Then a human learns something new and needs to change the assignment. At that moment, cancel only begins the interaction.

The old terminal contract is blunt: send a signal, get your prompt back. That is correct for a process. It is too thin for a run that has read a repository, made edits, and is supposed to leave a PR another person can review. “Can I stop it?” has a direct answer. The useful question is, “What survives when I do?”

That is where the interface moves. A coding agent needs three controls: stop, steer, and inspect. Stop prevents a bad trajectory from getting more expensive. Steer preserves the useful work while changing the target. Inspect turns the interrupted run into evidence.

A cancel key is a destructive API

The terminal got interruption right for the job it had. SIGINT is intentionally immediate. In a small measurement I ran for this piece, a trapped local process exited and was reaped in 15.1 ms, 7.1 ms, and 13.9 ms after SIGINT. The process ends on the spot. That is its virtue.

SIGINT-to-exit measurements for three local process runs Three measured local process exit times in milliseconds: 15.1, 7.1, and 13.9. The 7.1 millisecond result is gold; the others are silver. 0 ms5101520 Run 115.1 msRun 1: 15.1 ms Run 27.1 msRun 2: 7.1 ms Run 313.9 msRun 3: 13.9 ms The mechanics are fast. The handoff is the hard part.
Three local runs, 9 October 2026. Each process installed a SIGINT handler, slept, then exited; timing starts immediately before kill -INT and ends after wait reaps it. Hover or focus a bar for its exact value. Source: author measurement; POSIX signal semantics.

That measurement is deliberately boring. It times a local signal handler and nothing else, which makes the contrast clean. The operating system can end a process in a handful of milliseconds. A person deciding whether to preserve the edits, add a constraint, or turn the investigation into a review usually needs more than a handful of milliseconds.

The first interface gives us the fast part. The second must give us the rest.

The run has already become a record

Claude Code's own documentation now puts background agents, a resume picker, and session management next to ordinary coding workflows. The Codex CLI documentation lists returning to a saved chat, splitting work across subagents, and moving work to Codex cloud among its core features. Both products now treat coding work as something with a lifetime.

Claude Code docs, Common workflows page: the Resume previous conversations section, with claude --continue, claude --resume and the /resume command.
Source: Claude Code common workflows, Resume previous conversations.
Claude Code docs, Manage sessions page: name, resume, branch and switch conversations, a table of resume commands, and a contents entry for resuming a running background session.
Source: Claude Code, Manage sessions.
OpenAI Codex CLI docs: feature cards for codex resume (return to a saved chat), subagents (split up a larger investigation) and codex cloud (move work to Codex cloud).
Source: OpenAI Codex CLI.

This is the useful shift: a run has a starting instruction, a changing working tree, tool calls, a set of decisions, and an ending that can be inspected. Interrupting it should change its state and keep its record.

What should survive an interrupt?

At minimum: the exact revision the run saw, the files it changed, the command output that explains its last action, the constraints it was following, and an explicit terminal state. “Stopped by a human after test failure” is useful. A vanished spinner tells the next person nothing.

The capture below scrolls the live Codex CLI page from its hero down to those feature cards. The product detail will change. The contract should hold: a person must be able to come back to a run and know what it was doing.

Source: the Codex CLI page: a scroll from the hero to the feature cards for codex resume, subagents and codex cloud.

Stop, steer, inspect

The control loop for an intervened coding-agent run A running task can be stopped, steered with a follow-up, or inspected through its record. Each path returns a legible result. RUNNING TASK STOP STEER INSPECT A legible result: state, diff, checks, and the next decision
The interface is a control loop with a kill switch inside it. Gold marks the one control that changes the run without discarding its record.

Stop is a terminal state with a reason. The run should say what it last completed and what remains safe to keep.

Steer is the control that matters when the new information is not an emergency. “Do not touch the migration. Add a test for the edge case you just found.” A good steering mechanism attaches that instruction to the same working context. Starting a fresh agent and re-explaining the repository is a tax on changing your mind.

Inspect is what makes both controls safe. When the run returns a diff, commands, check results, and a record of how it got there, a reviewer can decide whether to continue, reset, or turn the work into a PR. Missing proof is a different result from done, and it deserves its own name.

Cancel onlyStops the process. The next operator reconstructs the context from memory, a terminal scrollback, and whatever changed on disk.
Control loopStops or redirects work while preserving the record. The next operator begins with the task, the state, and the proof already attached.

The first proof comes before the PR

Teams usually notice proof at the end of a run. They want a PR, checks, and a reviewable change. They should. The first proof arrives earlier: the moment a person intervenes and the system can explain what was happening without asking them to reconstruct it from scratch.

That is how a long-running session earns trust: it makes interruption cheap.

The useful agent interface gives a human a clean place to apply judgment while the work is still alive, then leaves enough evidence behind for the next person to understand the decision.

This is how runs work in Rush. A follow-up message starts a new turn in the same sandbox, so the working tree and the session carry over. Cancel is a status change on the run. A run with missing proof ends as needs_review instead of done. The captured trajectory, every message and tool call, can be read back through the API after the run ends.

The cancel key stays. It just stops being the whole product.


Primary sources: POSIX sigaction, Claude Code common workflows, Claude Code, Manage sessions, and OpenAI Codex CLI, first accessed 9 October 2026. The three latency values are author measurements from the command described in the chart caption; they time a local signal handler and say nothing about model or agent latency. Related: An Agent You Can't Find Is an Agent You Don't Have and Every Agent Demo Hides the Same Number.

Read Next