vms: call and room actions for batch 2, rtp_stats() #16

Merged
asxpi merged 6 commits from vms/h2-h3-calls-rooms into main 2026-11-09 11:18:54 +00:00
Member

Harness packages H2 (calls) and H3 (rooms) for run batch 2.

  • Calls: decline_call, cancel_call, Dino start_call, Dino start_group_call (Muji) / aim join_group_call, Kaidan decline via notify_action().
  • rtp_stats(): counts RTP/RTCP per direction, SSRC and payload type from the guests' NIC capture (TURN unwrapped), for every client; aim's libwebrtc "Log WebRTC internals" lines added to its log.
  • Rooms: create_room (Gajim, Dino), invite/accept_invite, roles/affiliations, kick, ban, subject, destroy_room, Gajim moderate and set_room_avatar; NotImplementedError where a client has no UI.
  • tools/repl.py: boot signed-in VMs once and run snippets against them to find click positions.
  • Fixes: the fake camera now feeds YUY2 (libwebrtc rejected 4:2:2, so aim never sent video in any earlier run); dunst detection (.dunst-wrapped).
  • Examples verified on anotherim-server (unrecorded): xep0353, xep0272, xep0045admin, xep0425 pass; xep0167 video both ways, audio silent from Dino (#9 P3: Dino sends no opus).

🤖 Generated with Claude Code

Harness packages H2 (calls) and H3 (rooms) for run batch 2. - Calls: `decline_call`, `cancel_call`, Dino `start_call`, Dino `start_group_call` (Muji) / aim `join_group_call`, Kaidan decline via `notify_action()`. - `rtp_stats()`: counts RTP/RTCP per direction, SSRC and payload type from the guests' NIC capture (TURN unwrapped), for every client; aim's libwebrtc "Log WebRTC internals" lines added to its log. - Rooms: `create_room` (Gajim, Dino), `invite`/`accept_invite`, roles/affiliations, kick, ban, subject, `destroy_room`, Gajim `moderate` and `set_room_avatar`; NotImplementedError where a client has no UI. - `tools/repl.py`: boot signed-in VMs once and run snippets against them to find click positions. - Fixes: the fake camera now feeds YUY2 (libwebrtc rejected 4:2:2, so aim never sent video in any earlier run); dunst detection (`.dunst-wrapped`). - Examples verified on anotherim-server (unrecorded): xep0353, xep0272, xep0045admin, xep0425 pass; xep0167 video both ways, audio silent from Dino (#9 P3: Dino sends no opus). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Finding a click position took a reboot per try: write a script, boot,
look at the screenshot, start over. repl.py boots the VMs signed in and
then runs every snippet dropped into $REPL (with a, p and run in scope),
writing its output next to it, until a quit file or an idle hour.

Assisted-by: Claude:opus-5-5
Batch 2 of PLAN.md needs rooms administered and calls declined,
cancelled and joined as groups, none of which the harness could do.

Rooms: create_room (Gajim's Ctrl+G, private; Dino's Join Channel, then
made private in its form, as Dino offers group calls only there),
invite / accept_invite (aim's picker and its "Room invitations" card,
Gajim's person+ and Activity Feed, Dino's participants popover and its
notification), set_role, set_affiliation, kick, ban, set_subject,
destroy_room (aim's members pane and Room details, Gajim's /commands and
Manage page), moderate and set_room_avatar (Gajim). aim has no UI to
moderate others or to set a room avatar: NotImplementedError says so.

Calls: decline_call, cancel_call (aim, web, Dino; Kaidan's decline
through its notification, not run yet), start_call for Dino,
start_group_call (Dino's Muji call) and join_group_call (aim's XEP-0482
card).

rtp_stats() counts RTP per direction, SSRC and payload type in a QEMU
filter-dump of the guest's netdev. SRTP leaves the RTP header in clear,
so it works for aim's native libwebrtc engine, which reports no stats
of its own; the client's own counters are appended (web getStats, Dino's
rtp lines, and aim's libwebrtc log once "Log WebRTC internals" is on).

notify_action() picks a notification's non-default action through
dunst's context menu with a grep as its dmenu. The dunst check looked
for a process named dunst, but nixpkgs' runs as .dunst-wrapped, so every
client start launched another dunst that could not take the bus name.

fake_av() now feeds the camera YUY2. Left to itself videoconvert gave
the loopback 4:2:2 planar, which libwebrtc's V4L2 capture rejects ("no
supporting video formats found", in aim's WebRTC log): aim never sent
video in any run so far, which AGENTS.md listed as an open question.

Examples: xep0353.py, xep0272.py, xep0045admin.py, xep0425.py; xep0167.py
records rtp_stats. Positions and pitfalls are in AGENTS.md.

Assisted-by: Claude:opus-5-5
Two dumps taken one after the other (8 s each) cannot be compared packet
for packet: with along=[vm] every VM's netdev is dumped together. aim's
own lines in the digest are now its audio levels and "audio in" stats.

Assisted-by: Claude:opus-5-5
- Gajim's Group Chat Details: its window name is not "Information" (the
  header shows the page); wait for its sidebar and maximize the active
  window by its geometry instead.
- xep0045admin.py: a moderator's menu in aim has no voice items, so give
  and take voice before making the peer a moderator.
- xep0353.py: Dino's log can lag its reject by more than 30 s.
- AGENTS.md: Dino's log lag, the duplicate room chat a mediated invite
  leaves in aim, and the RTP evidence for #9 P3 (Dino sends no opus).

Assisted-by: Claude:opus-5-5
Picks up the per-server matrix, clients.toml lacks and the coverage rule
in vms/RUN-BRIEF.md (PR #15).

Assisted-by: Claude:opus-5-5
vms: note bookmarked rooms and rooms Dino owns
All checks were successful
/ check (pull_request) Successful in 4m13s
eeef3fab45
Found cleaning up the verification rooms: join_room() cannot see a
rejoin that happened at sign-in, and Dino has no way to destroy a room.

Assisted-by: Claude:opus-5-5
asxpi merged commit 67f6d3004a into main 2026-11-09 11:18:54 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
another-im/interop!16
No description provided.