Seats

Part of the team file — Each seat's model and launch, its label and the pane's two lines, and the effort word its lab allows.

Each seat names a model and how it is launched. model and version are required even when the launch picks the model itself: for a CLI that chooses its own — or one whose screen names no model — write the CLI's own name and version as the pair (model: Jules, version: "0.1.42") and mark the seat model_from: launcher, which tells doctor that the launcher chooses it and checks the running seat instead of the launch line. The orchestrator and the operator start in the project folder. Every other seat starts in the team's lobby. A lead already running in either folder is left there. The fields are in the README's file format. The sidebar has two lines:

  • label, when the file writes one, is line 1, the workspace title. A seat expanded from count keeps that label on the first instance; each later instance appends -<n>, the same suffix the seat's name gets, so the lines differ (desk, desk-2).
  • A seat with no written label is titled <name> · <role>. Count instances already have distinct names (maker, maker-2), so their lines differ too. The model is never line 1.
  • Left out, the stored label stays the model and version in lowercase, as a file written that way has always read. That stored field stays in the seat's digest.
  • display defaults to model and version (Claude Opus 5.5). It must contain the version as a token of its own when the file writes it. After launch, up and add set the pane's display_agent to <display> <effort> when the seat sets effort, and to <display> default when it does not. A CLI whose launcher takes no effort setting is the display alone — Jules 0.1.42, with no effort word and no default. The display stays the proper-case name, including a multi-word model (DeepSeek V4.1 Flash, Gemini 3.8 Flash). Herdr draws line 2 as its status word, then ·, then that text (done · Grok 4.7 high, idle · Opus 5.5 default, idle · Jules 0.1.42). That is line 2.

While the seat runs, the watch paints both lines. Line 1 is the file's title. Line 2 takes the running model and version the pane's screen shows when they differ from the file's, and the effort word the screen shows; a screen this version cannot read, or one that shows no running model, keeps the file's display — never the CLI's name. An effort word, once seen, stays until a later screen shows a different one.

effort is optional. It is a known field: a file may set it, and a file that leaves it out loads as before. The words a lab allows are src/profiles/efforts.json, format 1, keyed by the seat's vendor. Each list is the words that lab's own CLI help printed. A lab whose help or model list names none is left out of the file, and a vendor with no entry accepts any effort.

A word outside its lab's list is a warning, and the warning names the words that lab allows. It does not fail team check or team up. That is not a regression for a file that already loaded: an unknown field is refused, so no such file contains effort. Left out, the field is not stored on the seat, and the seat's digest is unchanged. Adding it, in or out of the list, changes that digest, because the word is part of the seat.

Nothing in the launch line reads effort.

nickname is optional on a seat: the human name for it, such as Ada. It takes the same characters as the seat's name — a letter or digit first, then letters, digits, ., _ and - — it must be unique in the team, and it must not be another seat's name. Either collision would make one address name two seats, so a file that writes one is refused when it loads, and team register and team add refuse it too (they load the file first). A nickname equal to its own seat's name is not a collision: both spellings reach one seat. A counted entry may not carry one: a nickname names one seat. It is not a capability — the role keeps the grants, and a nickname confers nothing. It is part of the seat's digest, so writing or changing one needs a new approval, and a file that writes none keeps every approval it had. The name is shown in team seats and team status --all (the NICKNAME column, and the nickname field of their JSON) and in team send --list.

A name's trailing digits are its number, read as a number rather than as text: builder-9 sorts before builder-10 and builder-100, and the next free one is the next integer. Two seats of one role whose names carry one number at different widths — builder-1 and builder-01 — are one seat written twice, and the file is refused when it loads; team add and team register refuse it too, because they load the file first.

delivery_order is optional on a seat: its own word on the order a send to it walks, described below.

liveness is optional on a seat: its own word on the three liveness windows — idle_lead_seconds, idle_owner_seconds and blind_after_seconds, each a positive number of seconds — and it applies to that seat alone. A seat tightens the windows in force and never loosens one: a longer word is set aside where the thresholds resolve, the value in force standing. (The blind window is the one a project may open again; a seat inside may close it, not open it further.) Writing the map changes the seat's digest, because the word is part of the seat. The levels above a seat declare their own words — the machine's ~/.config/team/settings.yaml, an entity's entities.yaml entry, a project's record — all under liveness, and the watch section's idle_first, idle_owner and blind_after are the team's own, described in team watch.