Agent instructions
1
Check the MCP
Use the bundled
vibeconferencing MCP. If its tools are absent, ask the
operator to open the app, then run /mcp and reconnect it.2
Join
Run
/join-call (the skill accepts a full Meet URL). If you call the raw join_call tool yourself, pass the meet code (xxx-xxxx-xxx) — the tool does not parse URLs (server.js:2645-2649).3
Wait — without self-healing
Do not pretend you joined. Wait until the tool reports that you are in the
meeting; a human may need to click Admit, and Google Meet sometimes
hides that button behind the ⋮ overflow menu with a “potential risks”
warning. Waiting several minutes is normal. Keep polling
wait_for_speech — do not conclude the app is broken.4
Participate visibly
Listen with
wait_for_speech, speak with speak, and use chat or the
whiteboard when useful. Leave with leave_call.Two guarantees, stated honestly
- Speaker attribution is Meet’s caption label, verbatim. Transcript entries carry
whatever name Meet renders beside the caption block (
google-meet-provider.js:2535-2570) — scraped, not diarized. Two participants with the same display name are indistinguishable; dial-in callers appear however Meet labels them. If you are writing one person’s words into one person’s file, treat attribution as best effort and confirm anything that matters. - Admission state is reported, not inferred.
get_room_inforeturnsnavigating,joining,waiting-to-be-admitted, andin-call; a denial is detected when the in-call UI never appears within a grace period, and the app retries with visible status (“Denied — reloading to retry join”,google-meet-provider.js:1632,:1818). So pollget_room_infofor the state; don’t guess fromwait_for_speechtimeouts alone.
The four field rules
Learned the hard way, on real calls. Breaking any of these takes down a working call.1. Never kill or relaunch the app
1. Never kill or relaunch the app
If a tool call fails with a connection error, the fix is never to
restart the Vibeconferencing app. The app may have moved to a new local
port (it walks from 7865 upward when a port is taken) — killing it makes
this worse, and a kill-and-relaunch loop is how working calls die.
Instead: tell the operator, and re-check the port (hover the bot name in
the app panel to see it). Restarting is the operator’s decision, made in
the app, not yours.The stale-teardown wedge (#254)
is fixed in current builds: teardown completes directly, a 10-second watchdog
catches a hang, and any unfinished teardown is repaired on the next join
(
main.js:750-827, :1184-1191). Quit-and-reopen is a last resort after all of
that fails — an operator decision, still never the agent’s.2. The name is locked at join
2. The name is locked at join
Whatever name the bot joins the Meet under is fixed for the whole call —
routing, the tile, and wake-words all hang off it. You cannot rename
mid-call. To change identity: say so plainly,
leave_call, and rejoin
under the new name. Until then, answer to the tile name.3. One driver per bot
3. One driver per bot
If you are driving a bot from a session, the operator must not click the
app’s Join/Add to call buttons for that bot — the app spawns its own
session and two agents end up talking through one mouth. If you see a
displacement message, stand down.
4. Admission can look broken when it isn't
4. Admission can look broken when it isn't
“Waiting to be admitted” for minutes, a “potential risks” flag on the
host’s screen, an Admit button hidden in the ⋮ menu — all normal
since Google Meet added its guest queue. Say what you are waiting for
out loud in the terminal so the operator does not conclude you crashed.