Install any skill in seconds. Free to start, no credit card required.
Get Started Free →sonichi/room-ops-an-agents-room-participation-capability-collection
**One skill, multiple tools.** Everything an agent does in a room beyond its task
Passed 16 of 19 test cases with the skill, and 7 of 19 without it.
and 9 more in the full report
11 fixed7 passed either way3 still failing1 broke
Tokens, turns and time describe resource use, not a dollar price.
One of 10 test cases the skill fixed. Same model, same prompt, with and without the skill.
You want to post a general status update 'Deployment successful' to room `!announcements:ag2.space`. The update should be readable by everyone in the room but must not trigger ping alerts for any members. Which tool/verb should you execute?
| Checked | Without skill | With skill |
|---|---|---|
| Uses the say verb for plain text room announcements | Missed | Passed |
The instructions your model reads when the skill loads.
One skill, multiple tools. Everything an agent does in a room beyond its task
inbox lives here as a tool, so the parity capabilities are self-evidently one
collection (not N scattered skills). Each tool is a thin gateway-only client
verb sharing _gateway.py; the gateway/broker (box-side) owns the platform creds and
does the privileged Matrix ops + authoritative membership enforcement.
Collection name
agent-room-ops(provider-agnostic; alts:room-participant,agent-chat-io). Platform-tied names (e.g.matrix-agent) are avoided.
| tool | purpose | parity vs a chat bot-client |
|---|---|---|
read <room> | pull recent room history | discord att.save-context / channel read |
fetch <ref> | inbound media → local path | discord inbound att.save→inbox |
send <room> <path> | outbound file/image upload | discord outbound [file:] |
say <room> <text> | post plain text, mentioning no one — status lines, an answer to the room | discord plain channel message |
react <room> <event> | add an m.reaction (ack) | discord add_reaction (👀/✅) |
unreact <room> <event> | remove the agent's reaction | discord remove-on-reply |
join <room> | accept the agent's own pending invite | discord guild-join on invite |
doc get|put|rm <room> | read/write/delete the room's shared Room Context docs (context, todo, memos — or any agent-defined folder) | the durable-state half: like a pinned channel wiki the bot can edit |
python3 skills/agent-room-ops/room_ops.py read '!room:hs' --limit 20 --agent '@a:hs'
python3 skills/agent-room-ops/room_ops.py fetch 'mxc://hs/abc' --room '!room:hs' --agent '@a:hs'
python3 skills/agent-room-ops/room_ops.py send '!room:hs' /tmp/pic.png --caption 'fig 1' --agent '@a:hs'
python3 skills/agent-room-ops/room_ops.py react '!room:hs' '$evt' --ack received --agent '@a:hs'
python3 skills/agent-room-ops/room_ops.py unreact '!room:hs' '$evt' --ack received --agent '@a:hs'
python3 skills/agent-room-ops/room_ops.py say '!room:hs' 'deploy finished, 3 green' --agent '@a:hs'
# -> {"ok":true,"state":"confirmed|unconfirmed","event_id":...}. `confirmed` means an
# event id came back. `unconfirmed` is a 200 with no proof: the send probably landed, so do
# NOT re-send blindly, but do not drop a fallback/result path on it either.
# Use `mention` instead when a specific agent must be triggered; `say` never pings.
python3 skills/agent-room-ops/room_ops.py say '!room:hs' 'on it' --reply-to '$evt' --agent '@a:hs'
# --reply-to (on `say` and `mention`) CITES the message being replied to. The post stays
# in the MAIN TIMELINE — it is not thread membership. Only a relation with
# rel_type m.thread puts an event in a thread, and the gateway has no field for that,
# so room-ops deliberately offers no way to ask for one: a call that reported success
# while landing outside the requested thread is the failure worth refusing. A malformed
test cases passed, vs 7 / 19 without
More skills from the same source and nearby in the registry, with their headline benchmark lift.