Skip to content

Releases

v0.2.0

Choose a tag to compare

@joshdaugherty joshdaugherty released this 05 Nov 18:24
7950c72

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_location may repeat across repositories on one machine (#35, PR #36). seat-stage refused two seats on one machine with the same work_location even 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_location over 32 characters is refused (#21, PR #40). Core stores 32 (WorkIdentity::MAX_LOCATION); a longer name was recorded cut short at join and every resume's session_move to 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 --version and seat-pace --version print the installed release. seat-stage check and stage print 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 with curl at most once a day, silent on failure; FLEET_KIT_NO_UPDATE_CHECK=1 turns it off. collect and seat-pace (so a scheduled watch --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 show says which source supplied the path; config unset forgets it. Both tools read --config, then FLEET_KIT_CONFIG, then the remembered path, then seats.toml in the current directory. check and stage print a note when the seats file's repository is behind its upstream, and --pull runs git pull --ff-only first, only when asked.
  • The operator's GitHub username in the first prompt (#32, PR #39). An [[account]] may carry github = "<username>"; every seat on a machine that account lists gets "Your operator's GitHub username is <username>." With github unset the prompt is unchanged byte for byte. A machine listed under more than one [[account]] is refused when any of them sets github.

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

Choose a tag to compare

@joshdaugherty joshdaugherty released this 30 Oct 18:16
01bf2b0

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-stage itself reads (#6, PR #31). lib/stage/harnesses.toml holds 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, where check looks for a seat's conversation and for the bridge, and whether when-free and collect can work. seat-stage stage, check and collect read 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 -c override runs embedded without that server, and queueing to it was not tested, so put a Codex seat's bridge args in config.toml, not -c.
    • Codex's usage can be read. Rollout files under ~/.codex/sessions carry token_count records with token totals and rate_limits.primary (percent used over a 10,080-minute window, and its reset time).
  • Recorded, not yet used. The table records wake and usage for each harness, but seat-stage does not run codex queue and seat-pace has no Codex adapter. They are measurements for whoever builds those next.
  • Docs: docs/restart.md and the README now point at the table and say an idle Codex seat can be woken with codex 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

Choose a tag to compare

@joshdaugherty joshdaugherty released this 30 Oct 17:28
5f5aeef

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 join with no instruction to use it. A resumed seat now heartbeats if presence_heartbeat is offered (and moves its session if its work location differs); if only join is offered, it joins with its declared role, repository, work location and capacity. No prompt tells a seat to leave.
  • Each seat can start on its own or wait for its operator (#25, PR #27). A per-seat start overrides the machine's setting.
  • seat-stage stages a seat whose harness is codex (#26, PR #28). The seats file accepts harness = "codex", seat-stage check checks a Codex seat against Codex, and stage launches codex "<prompt>" and resumes with codex 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-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: 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

Choose a tag to compare

@joshdaugherty joshdaugherty released this 20 Oct 19:12
9ad19c8

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, log and watch still refuse to run on a machine that isn't in the list.
  • docs/pacing.md, docs/coordinators.md, docs/getting-started.md and examples/seats.toml describe 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

Choose a tag to compare

@joshdaugherty joshdaugherty released this 20 Oct 17:40
cce1a1c

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, then read, 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 read is unsupported on Windows. The scheduler examples and examples/seats.toml now assume a Composer install and a private config repository.

v0.1.1

Choose a tag to compare

@joshdaugherty joshdaugherty released this 20 Oct 17:11
34e6471

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", a bin entry for seat-pace and seat-stage, package metadata, and ext-mbstring is 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.toml in the current directory, and FLEET_KIT_CONFIG or --config still override it.
  • On Windows, Composer's .bat proxies run both tools. The .ps1 wrappers 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

Choose a tag to compare

@joshdaugherty joshdaugherty released this 20 Oct 16:46
42a3704

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 curl on 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-run
  • check
  • collect, 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).

Not yet verified

  • The usage endpoint has not been called with a live account.
  • Token expiry behaviour and CLAUDE_CONFIG_DIR are untested.
  • Linux credentials are unsupported (#5).
  • The Codex harness is not researched yet (#6).