Repository navigation
Releases
v0.2.0
Five changes to seat-stage and seat-pace since v0.1.5. Two of them change what a seats file may hold, so this is a minor release.
What changed
work_locationmay repeat across repositories on one machine (#35, PR #36).seat-stagerefused two seats on one machine with the samework_locationeven in different repositories. It now refuses only the same label in the same repository, with the same message. A seats file can use bare labels (a,ci,primary) for every repository.- A
work_locationover 32 characters is refused (#21, PR #40). Core stores 32 (WorkIdentity::MAX_LOCATION); a longer name was recorded cut short atjoinand every resume'ssession_moveto the full name was refused. The seats file is now refused, naming the seat, the length and the limit. The default (the slot) is held to the same limit. A seats file that passed before can now be refused: shorten the label. --version, and a notice when the install is behind (#34, PR #37).seat-stage --versionandseat-pace --versionprint the installed release.seat-stage checkandstageprint one line on stderr when a newer release is out and name the update command; the exit status is unchanged. The latest release is looked up withcurlat most once a day, silent on failure;FLEET_KIT_NO_UPDATE_CHECK=1turns it off.collectandseat-pace(so a scheduledwatch --once) print nothing extra.- Remember the configuration path (#33, PR #38).
seat-stage config set <file>stores the seats file's path in one per-user file;config showsays which source supplied the path;config unsetforgets it. Both tools read--config, thenFLEET_KIT_CONFIG, then the remembered path, thenseats.tomlin the current directory.checkandstageprint a note when the seats file's repository is behind its upstream, and--pullrunsgit pull --ff-onlyfirst, only when asked. - The operator's GitHub username in the first prompt (#32, PR #39). An
[[account]]may carrygithub = "<username>"; every seat on a machine that account lists gets "Your operator's GitHub username is<username>." Withgithubunset the prompt is unchanged byte for byte. A machine listed under more than one[[account]]is refused when any of them setsgithub.
Upgrading
composer global update robot-council/fleet-kit, or see Updating. Run seat-stage check <machine> after updating: it reports a work_location over 32 characters. Nothing else in an existing seats file needs to change.
Not measured
The per-user file location on macOS and Linux (run by hand on Windows only), a --pull that needs credentials, and the version reported by a Composer-installed tagged release (the code path is there; the installed-package tests use untagged path installs).
v0.1.5
What each harness can do is now a table the code reads, and the Codex entry in it is filled from measurement.
What changed
- A capability table that
seat-stageitself reads (#6, PR #31).lib/stage/harnesses.tomlholds one table per harness (claude,codex): the program, its launch and resume arguments, the remote-control and channel flags, whether it shows the channels warning, wherechecklooks for a seat's conversation and for the bridge, and whetherwhen-freeandcollectcan work.seat-stage stage,checkandcollectread it instead of branching on a harness name, so a harness is now added by adding a table. For Claude Code seats nothing changes: the command line, the checks and the output are the same as in v0.1.4. - The Codex entry comes from measurement (macOS arm64,
codex-cli 0.163.0, brent-tank, 2026-10-30). Two answers v0.1.4 listed as unmeasured are now measured:- Waking a Codex seat from outside is possible.
codex queue --thread <id> --message <text>woke an idle session with no keypress, through Codex's shared local app-server. A session started with a-coverride runs embedded without that server, and queueing to it was not tested, so put a Codex seat's bridge args inconfig.toml, not-c. - Codex's usage can be read. Rollout files under
~/.codex/sessionscarrytoken_countrecords with token totals andrate_limits.primary(percent used over a 10,080-minute window, and its reset time).
- Waking a Codex seat from outside is possible.
- Recorded, not yet used. The table records
wakeandusagefor each harness, butseat-stagedoes not runcodex queueandseat-pacehas no Codex adapter. They are measurements for whoever builds those next. - Docs:
docs/restart.mdand the README now point at the table and say an idle Codex seat can be woken withcodex queue, which replaces v0.1.4's "a Codex seat is not woken by the fleet".
Still true from v0.1.4
A Codex seat's bridge must carry --auto-join with the seat's role, repository and work location in its MCP args, or the session keeps only join. seat-stage does not write those args.
Not measured
Windows and Linux for Codex, any Codex version but 0.163.0, and codex queue against an embedded session.
Upgrading
composer global update robot-council/fleet-kit, or see Updating. Nothing in an existing seats file needs to change.
v0.1.4
Codex seats can be staged, a seat can choose how it starts, and a resumed seat whose fleet session ended now rejoins.
What changed
- A resumed seat whose fleet session ended joins again (#22, PR #24). The old first prompt told a restaged seat it had already joined, which left it holding only
joinwith no instruction to use it. A resumed seat now heartbeats ifpresence_heartbeatis offered (and moves its session if its work location differs); if onlyjoinis offered, it joins with its declared role, repository, work location and capacity. No prompt tells a seat toleave. - Each seat can start on its own or wait for its operator (#25, PR #27). A per-seat
startoverrides the machine's setting. seat-stagestages a seat whose harness iscodex(#26, PR #28). The seats file acceptsharness = "codex",seat-stage checkchecks a Codex seat against Codex, andstagelaunchescodex "<prompt>"and resumes withcodex resume <id> "<prompt>".- Codex docs corrected after measurement (PR #29): the README's Codex row and
docs/restart.md("Codex seats").
Codex: what was measured and what was not
Run live on macOS (arm64) with codex-cli 0.163.0: staging a Codex seat, the first prompt at launch, and codex resume.
- A Codex seat is not woken by the fleet; it waits for its operator to prompt it.
- Its bridge must carry
--auto-joinwith the seat's role, repository and work location in its MCP args, or the session keeps onlyjoin.seat-stagedoes not write those args. - Not measured: reading Codex's usage, a remote-control equivalent, and Windows.
Upgrading
composer global update robot-council/fleet-kit, or see Updating. Nothing in an existing seats file needs to change.
v0.1.3
seat-pace can now fall back to another machine when an account's reading machine is down (#19, PR #20).
[[account]]
machine = ["office", "home"] # preferred first; a single string works as before- A machine later in the list first asks the fleet, with
robot-council api GET /api/lanes, whether an earlier machine has an active session. If one does, it doesn't read. If the command is missing or the fleet can't be reached, it doesn't read either, and says why on stderr. It never assumes the earlier machine is down. - If a machine's last local log row is more than 1.5 intervals old, its next reading counts as a fresh start and runs no
on_change. - A verdict change that happened while another machine was reading isn't reported on takeover.
- A machine that's present but whose scheduler is broken isn't detected.
read,logandwatchstill refuse to run on a machine that isn't in the list.docs/pacing.md,docs/coordinators.md,docs/getting-started.mdandexamples/seats.tomldescribe the list.
Not yet verified: the fleet's answer against a live fleet. Its shape comes from the core and cli source, and the tests replay a synthetic answer.
v0.1.2
Documentation for adopting fleet-kit (#16, PR #18). No code changes.
- README: what fleet-kit is for and who uses it, a "What's verified" table of everything not yet run live, and the install model. You install the package and keep your configuration in a private repository of your own, never a fork. A fork of a public repository has to stay public.
docs/getting-started.md: the operator's path from start to finish:- prerequisites, linking to robot-council/cli's setup;
- install;
- the private configuration repository, and what must never go in it;
FLEET_KIT_CONFIG;seat-stage check, then--dry-run, then a first stage;seat-pace pace, thenread, then a scheduler;- updating.
docs/coordinators.md:- who does what;
- getting the verdict through the log or
on_change; - writing a pacing policy;
- what a restart does to seats and their tasks;
- an adoption checklist for a new organization.
- Stale text fixed: the Windows Task Scheduler template no longer says
readis unsupported on Windows. The scheduler examples andexamples/seats.tomlnow assume a Composer install and a private config repository.
v0.1.1
fleet-kit is now a Composer library with command-line tools (#15, PR #17).
Install
composer global require robot-council/fleet-kit # puts seat-pace and seat-stage on PATH
composer create-project robot-council/fleet-kit # a standalone copy
Changes
composer.json:"type": "library", abinentry forseat-paceandseat-stage, package metadata, andext-mbstringis now required.- Both tools find Composer's autoloader whether run from a checkout or installed under
vendor/. With no autoloader they print "Composer's autoloader was not found" and exit 1. - The config default is
seats.tomlin the current directory, andFLEET_KIT_CONFIGor--configstill override it. - On Windows, Composer's
.batproxies run both tools. The.ps1wrappers remain optional. - The downloaded package leaves out tests and CI files.
- CI now tests the installed layout on macOS, Linux and Windows.
Not yet verified
composer global require from Packagist itself. Everything else listed in v0.1.0 also still applies.
v0.1.0
The first release of fleet-kit, forkable operator tools for a Robot Council fleet. It needs PHP 8.4.
seat-pace
Reports whether a usage allowance is on pace to its reset (#9).
- On macOS it reads the Claude usage credential from the keychain. On Windows it reads it from
%USERPROFILE%\.claude\.credentials.json(#13). - The token goes to
curlon stdin and appears in no error message. - Linux answers "unsupported on this platform" (#5 is still open for Linux).
seat-stage
Stages a machine's seats in a terminal multiplexer (tmux on macOS and Linux, psmux on Windows) and starts each seat joined to the fleet (#11). It has three commands:
stage, with--dry-runcheckcollect, which records live conversation ids in the seats file and keeps each line's own ending
confirm_channels works under psmux and matches wrapped screens (#12). On Windows, bin/seat-stage.ps1 wraps it. See docs/restart.md.
CI
Tests run on macOS, Linux and Windows for every pull request. ci-passed is a required check on main (#10).