vms: multi-VM harness and 89 GUI-client runs on three servers #10
Loading…
Reference in a new issue
No description provided.
Delete branch "vms/harness-1-5"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
The VM harness grown for real interop runs, and the 89 runs it recorded on
2026-11-08 (anotherim-js 0.8.0-rc9 / libtacky v1.2.3 against Gajim, Dino
and Kaidan on prosody, ejabberd and anotherim-server; 77 pass, 12 fail).
Bugs found: #9.
Harness (vms/):
--peer, nodes machine/peer/peer2,boot_all), disks per client and server so servers run in parallelfake_av/hears(PipeWire null sink, sine on a fake mic, v4l2loopbackcamera, Goertzel),
net_down/netem/freeze(+sync_clock),expect(text=, log=),wait_notify(dunst + dbus-monitor)open_chat,send,wait_message) andvm.py --recordwriting run dirs; examples/xep0308.pynix run path:./vms#client(plain ./vms copied the 3.5 GB repo into thestore on every commit), keyring crash recovery, screensaver off
Report: the app under test also shows its runs against peers in its own
matrix column; runs from VMs carry
driven = "vm"(🤖 in matrix.md, 🖥 inAI-RESULTS.md).
104 commits, runs one per commit (
vm:), harnessvms:.🤖 Generated with Claude Code
A thumbs-up reaction each way in the GUI clients in VMs (rc9, libtacky v1.2.3): AnotherIM's menu quick row and Gajim's hover bar each send one <reactions/> naming the other's message id with a <store/> hint, and both screens show the "👍 1" pill on the right bubble. Assisted-by: Claude:opus-5-5Once in a few starts rc9 came up on "Your messages are locked ... This device cannot open your messages right now" instead of signing in, so wait_main sat out its 180 s for a roster that never came. While the roster is missing, look for that dialog every 10 s and press its Unlock, which the dialog itself suggests ("try again in a moment"). Assisted-by: Claude:opus-5-5A thumbs-up reaction each way in GUI VMs with rc9: AnotherIM's from its message menu's quick bar, Gajim's from its hover bar. Each <reactions/> names the other's message id, and both screens show 👍 1 under the right message. Assisted-by: Claude:opus-5-5AnotherIM 0.8.0-rc9 (develop 142ee094, libtacky v1.2.3) and Gajim 2.6.0 in vms/ VMs on ejabberd 26.09. Each side puts a thumbs up on the other's message from its own UI (AnotherIM's menu quick bar, Gajim's hover bar): <reactions/> naming the message's id goes out and arrives, and both sides show 👍1 under the right message. Assisted-by: Claude:opus-5-5A thumbs-up reaction each way in GUI VMs with rc9: AnotherIM's from its menu's quick bar, Dino's from its emoji chooser. Each <reactions/> names the other's message id and both screens show 👍 1 under it. Assisted-by: Claude:opus-5-5A thumbs-up reaction each way in GUI VMs with rc9 on an OMEMO 2 chat: AnotherIM from its message menu quick bar, Kaidan from its message icon bar and emoji search. Both screens show 👍 1 under the right message. Kaidan encrypts its reaction; AnotherIM sends its <reactions/> in the clear although the chat is OMEMO 2. Kaidan takes it fine, so this is a pass, but the reaction is visible to the server. Assisted-by: Claude:opus-5-5AnotherIM 0.8.0-rc9 (develop 142ee094, libtacky v1.2.3) and Dino 0.5.1 in vms/ VMs on ejabberd 26.09. Each side puts a thumbs up on the other's message (AnotherIM's menu quick bar, Dino's emoji chooser): <reactions/> naming the message's id crosses, and both sides show 👍1 under the right message. Assisted-by: Claude:opus-5-5AnotherIM 0.8.0-rc9 (develop 142ee094, libtacky v1.2.3) and Kaidan 0.16.0 in vms/ VMs on ejabberd 26.09, OMEMO 2. AnotherIM's thumbs up on Kaidan's message and Kaidan's 😀 on AnotherIM's show on both sides under the right message. AnotherIM sends its <reactions/> in clear even in this OMEMO chat; Kaidan's travels inside the OMEMO 2 envelope. Assisted-by: Claude:opus-5-5AnotherIM 0.8.0-rc9 (develop 142ee094, libtacky v1.2.3) and Kaidan 0.16.0 in vms/ VMs on ejabberd 26.09. Kaidan rang (desktop notification, accepted through its default action) and answered both an audio and a video call, but its session-accept has no <rtcp-mux/>, and AnotherIM's WebRTC engine rejects that answer ("RTCP-MUX is not enabled when it is required"): the audio call stays ringing, the video call ends in failed-transport, no audio either way. rtcp-mux is optional in XEP-0167, so AnotherIM should accept such an answer. Assisted-by: Claude:opus-5-5AnotherIM 0.8.0-rc9 (develop 142ee094, libtacky v1.2.3) and Gajim 2.6.0 in vms/ VMs on ejabberd 26.09, Gajim's chat set to no encryption. Gajim's plaintext upload (https body plus jabber❌oob) shows inline in AnotherIM, marked not encrypted. The harness could not switch AnotherIM's own chat to no encryption (the long press on its lock was taken as a tap), so AnotherIM's picture went encrypted again and showed in Gajim; its plaintext upload is not covered here. Assisted-by: Claude:opus-5-5As with Gajim: AnotherIM creates the room but sends no muc#owner instant-room submit, Prosody keeps it locked, and Dino's join is refused with item-not-found ("Room does not exist"). Assisted-by: Claude:opus-5-5AnotherIM 0.8.0-rc9 (develop 142ee094, libtacky v1.2.3) calls Dino 0.5.1 in vms/ VMs on prosody, audio then video. Signalling completes (propose, proceed, session-initiate, session-accept), but ICE never connects: prosody answers the extdisco query with service-unavailable, so both NATed VMs offer only host candidates, and both calls end in connectivity-error ("Call failed to establish" on both screens). The same script connects on ejabberd, which hands out STUN/TURN. Cause: the server's missing STUN/TURN, not the clients. Assisted-by: Claude:opus-5-5AnotherIM 0.8.0-rc9 (develop 142ee094, libtacky v1.2.3) calls Kaidan 0.16 in vms/ VMs on prosody, audio then video, Kaidan accepting from its notification. Reproduces the ejabberd result: Kaidan's session-accept has no rtcp-mux, AnotherIM's WebRTC rejects the answer ("RTCP-MUX is not enabled when it is required"), the call never connects and no audio flows. rtcp-mux is optional in XEP-0167, so the cause stays with libtacky. Prosody's missing STUN/TURN would block ICE here as well. Assisted-by: Claude:opus-5-5