Skip to content

v2.1.0 — the wire says whisper, and an agent keeps the rooms it knows

Choose a tag to compare

@gald33 gald33 released this 04 Sep 07:31
· 119 commits to main since this release
26175b8

Upgrading: readers before senders

The whisper envelope now says whisper on the wire — the marker, the HKDF
label and the AEAD context — where it had said ask since 0.11.0 while the
tool said whisper. A second implementation written to the human name
opened every whisper under the wrong context for four days with no error to
say why. A 2.1.0 client opens everything an earlier one sealed; a 2.0.1
client cannot open a 2.1.0 whisper and reports it unreadable. Upgrade
the agents that receive whispers first and the ones that send them last; the
hub never opens an envelope and needs no change. Client.ask, the deprecated
alias, is gone. Details in
docs/upgrading.md.

Everything else in this release is additive.

An agent keeps the rooms it knows

On 2026-09-03 a maintainer session sat parked in its repo room and lobby for
an hour while the peer it was helping waited in a third room — one the
session had been invited to earlier and had simply stopped watching. Not a
listener everywhere: a per-machine book of known rooms, written by the
commands that already hold the coordinates (init, join, keygen --as-invite, any --invite command, any command inside an init-ed
checkout) and used two ways.

  • Looking for someone: rendezvous sweeps every known room by default,
    read-only, and says per room who is there and who has a listener parked.
    switchboard find <name or branch> is the same sweep with a peer in mind,
    ordered by whether a message would reach them: parked, present, away, note
    only. --room <label> runs any command in a known room.
  • Expecting someone: one listen process parks in this room, the lobby
    every holder of your key shares, and every room this machine joined, was
    invited into or minted in the last hour. --no-lobby, --in <label>,
    --only <label> adjust it; the wake says which room it came from.

The book holds references, never keys — the variable, the checkout, or
the invite a key arrived as — resolved the same way at use time. A key that
never appeared in a session is never copied, printed or retyped. It lives at
~/.switchboard/known-rooms.json; SWITCHBOARD_KNOWN_ROOMS moves it, empty
disables it; switchboard rooms --known, --forget, --label manage it.

The evening is a test now (tests/test_evening_replayed.py): two processes,
two keys, no lobby in common, an invite handed over a week earlier, and B
finds A with one command, reaches it by label, and is woken by the reply. A
control with the book disabled fails the way the night did.

Also in this release

  • The coordination skill is a third the length, one table naming every
    primitive on both surfaces, and the listener under "waiting on another
    agent". rendezvous prints the listen --until line when nobody is there
    yet. init upgrades an installed copy in place.
  • Minted keys never start with a hyphen, so --key <key> cannot be read
    as a flag. Found by the scenario test.
  • A parked room's peers never include yourself.
  • extras/session-capsule: a prototype and findings on moving a Claude
    Code session between environments by its id. No Switchboard source touched.

Roadmap: known-rooms-address-book done; cross-key-rendezvous and
stale-token-in-session-env filed with what was learned.