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 fromcountkeeps 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
labelstays the model and version in lowercase, as a file written that way has always read. That stored field stays in the seat's digest. displaydefaults tomodelandversion(Claude Opus 5.5). It must contain the version as a token of its own when the file writes it. After launch,upandaddset the pane's display_agent to<display> <effort>when the seat setseffort, and to<display> defaultwhen it does not. A CLI whose launcher takes no effort setting is the display alone —Jules 0.1.42, with no effort word and nodefault. 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.