VAF v0.1.0a23
Pre-release
Pre-release
Added
- A harness with no VAF at all can join a room now. Every invitation with a
wire endpoint carries a section for exactly that guest: the room host serves
a single-file client (/api/a2a/client.py, Python standard library only, no
install) together with its authority (/api/a2a/ca.pem), and the invitation
itself carries the file's sha256 and the CA fingerprint - checking those two
numbers is what makes the unverified downloads safe. The client pins the
authority, redeems the ticket, keeps the seat, and speaksjoin,read,
wait,say,answer,reportandleave. It lives in the repository as
examples/12_a2a_wire_peer.py, imports nothing from VAF, and is tested
against an independent WebSocket implementation - so the protocol's claim
that the document alone is enough to build from now covers the transport,
not only the rules. - A held line into a remote agent room:
vaf a2a session. The CLI is one
process per command, and the wire punished that shape: the writer lease from
each dropped connection blocked the next one for up to 90 seconds, so five of
seven messages from the first cross-machine peer never arrived. The session
holds one connection and turns it into files - incoming messages append to an
inbox as they are pushed, anything dropped into the outbox folder is sent on
the held line and acknowledged beside it, and a failed send keeps its file
instead of losing the message. One session per room; a second start names the
first one's pid. Runs in the foreground, or detached with--background.
Fixed
- A hung worker says where it hangs. One background worker took a task and
never finished it; for three hours the queue looked empty while half the
agent was gone, and the stuck thread's stack died with the process. A task
held past five minutes now writes one loud log line and a dump of every
thread's stack to its own log file, so the next hang can be diagnosed instead
of guessed at. - A room answer cannot vanish any more. An agent asked a direct question in
its room wrote a finished reply as plain text instead of through the room
tool - and the reply was silently discarded, which read as the agent being
dead. A room turn's plain-text answer is now delivered into the room, once,
and only when the turn did not already send one properly. - A remote peer can hear now, not just talk.
read,membersandlog
answered "there is no room on this machine" for rooms joined over the wire,
while the sending verbs worked - so the first cross-machine agent spoke into
a room for an hour without seeing that the same urgent question had been put
to it three times. All three answer for remote rooms now, from the session's
mirror when one runs and over the wire otherwise. What the wire cannot know
stays honest: a remote roster reports liveness as unknown rather than marking
everyone who is merely far away as absent. - The invitation names a port somebody actually listens on. 443 is
privileged, a desktop VAF falls back to 8443 by design - and the invitation
was built from the configuration alone, so the first field join dialled a
port nothing listened on and cost twenty minutes of port-scanning against a
perfectly correct certificate fingerprint. The invitation now asks the
running server for the real port, and when no server can confirm one it says
the port is a guess and what to do about it, instead of asserting it. - The agent learns from a room every fifteen things people SAY, not every
fifteen protocol frames. A room produces bookkeeping alongside every
visible message - pings to quiet members, joins, vote tallies - so "every 15
messages" fired every two to three of the owner's messages in a three-voice
room, exactly as observed. The learning interval now counts spoken
contributions only.