Docs menuSeats

smalltalk pre-release

Seats

A seat is a durable agent: a harness, a model and a workspace that smalltalk keeps running. No mission owns a seat, so no mission ending stops it.

You declare a seat as a top-level agent in a KDL file. Keep that file in a Git repository so it's backed up:

version 2
agent "example/worker" {
  workspace "/srv/example/app"
  restart "always"
  harness "claude" {
    model "claude-sonnet-5"
    effort "medium"
  }
}
st agents apply worker.kdl --as person/ada
st terminals peek agent/example/worker

The seat starts its harness in the workspace, reads its boot instructions, checks for work, and waits.

Seats and mission agents

Agents can also be declared inside a mission. Those belong to the run: they start when it starts and stop when it ends. Use a seat for an agent that should outlive any single piece of work, and a mission agent for a helper that only exists for one run.

Don't model a durable agent as a mission with no steps. That run completes at once, and stops the agent it owns.

Work arrives as steps, not messages

You can talk to a seat, and it can talk back, but messages are conversation. Work never arrives as a message. It arrives as steps assigned to the seat.

Each seat has an ordered queue of the runs that have steps for it, and holds one step at a time. It takes the next ready step in queue order. A run that is waiting on a gate or a dependency is passed over, so it never blocks the runs behind it. A person can reorder the queue, and every move is recorded with who made it and why.

Waking a seat

When a step becomes ready, smalltalk sends a durable wake to the assigned seat through the harness's native driver. It never types into the agent's terminal.

The wake is only a nudge. The ready step lives in the graph, so it survives a daemon outage or a failed delivery.

It lives in a terminal

Every seat's harness runs in a pty session. You can peek at it, or attach to it with st terminals attach. It keeps running when the smalltalk daemon restarts: the new daemon adopts the running session instead of starting another one.