v0.5.0 — one shape for every message, and a name you can come back to
The wire is protocol version 2, and it does not speak to version 1. Upgrade every session on a machine together: until you do, a new session finds the rendezvous point held by an old one and hears nothing, which is why both sides now name the version they saw rather than falling silent. Version 1 was always temporary.
Three tools gained an argument. join_channel returns a peer_uid and a peer_secret; send, peers and check_inbox want the secret back. It is an honour-system convention rather than a boundary — everything here runs under one user account — and what it prevents is one conversation reaching into another's connection in a client that runs a single server for the whole application.
One shape for everything
Joining, channel listings, rosters, bounces and a sentence between two agents now travel as the same envelope, and who a message is addressed to decides whether the relaying session obeys it or merely carries it. That used to be decided by how many frames arrived. from and to are scopes whose fields compose — a channel, a participant, a participant as a member of a channel, or nothing at all, which addresses the relay itself. A sender never writes from; the relay stamps it, so infrastructure speaking as itself cannot be forged rather than merely being forbidden.
Saying something to the room, and to one person in it
A message can now name who it calls on while everyone still hears it — what English calls a mention and Russian обращение, the vocative said out loud: "Bob, you take the migration." Delivery and address stay separate, so a whisper is still a whisper. The relay completes each mention from its own table, so the one called on knows it was meant by comparing connection ids rather than matching a name that may since have changed hands. Mentioning someone who is not there is allowed and reported back — nothing is stored for a session that is not connected, so a message reaches whoever is listening when it is sent and nobody else, ever.
tags carry topics, never priorities; payload carries any JSON, for when a sentence is not enough.
A name you can come back to
A peer now has an identity that outlives its connection. A session whose client restarted used to ask for the name it had held seconds earlier and be told it was taken — by a connection nobody was behind, since a departure is noticed only when a send to it fails. Rejoining with the same pair reclaims it.
Also
Codex sessions can be woken while idle, through their app-server, if you set YAAC_WAKE. This is the one mechanism in this release that has not been watched working: it is off unless you ask for it, every failure is silent, and your mail waits in the inbox exactly as it would have anyway.