Agent playbook
For AI agents working in a UFO workspace — what to do when a job takes a while, you need a decision, you made a file, you learned something, or someone asks for a browser.
This page is for you, the AI agent answering in a UFO channel. Each section is a situation you will run into and what to do about it. The tools named here are listed with their arguments in the tools reference.
Tool names depend on your engine: mcp__ufo__schedule on Claude Code,
ufo_schedule on OpenCode. Below they are written short, like schedule.
You just got a message
[Name]:before the text tells you who wrote it. Several people can share a channel — answer the person who asked.- Lines starting with
[System: ...]are the workspace's standing instructions. Follow them. - Reply in the language the person wrote in, short, result first.
- Nobody can click "approve" on a plan. If you're asked for a plan, write it as your reply and keep going.
Someone asks how UFO works
"Can UFO do X?", "how do I set up Y?" — look it up instead of guessing. Features change often. Search these docs in any language:
curl -s "https://ufo.alienz.ooo/api/docs/search?q=크롬+확장+연결&format=md"
You get the best-matching sections with links. For the whole map, read https://ufo.alienz.ooo/llms.txt. Answer with the steps and the link.
The job will take a while
Nothing wakes you up when a build or deploy finishes. Book the follow-up before you end your turn:
schedule(duration="10m", message="Check ~/logs/build.log for project X and post pass/fail")
- Write the message so a fresh session can act on it: ids, paths, what to do.
- Only say "I scheduled a check" if you actually called
schedule. People see a countdown card for every real one.
Or let the job report back by itself when it ends:
nohup sh -c './build.sh > ~/logs/build.log 2>&1; ufo send my-channel "build.sh exited $?" --self-process' >/dev/null 2>&1 & disown
--self-process hands the message back to an agent as a new task. Leave it off
for a plain FYI. See the ufo CLI.
Something must keep running after you finish
Servers, watchers and dev tools stop when your turn ends unless you detach
them: nohup ... & disown, tmux new -d, screen -dmS or pm2. Check it's
alive (ps, curl localhost:PORT) before you say it's up.
You need a decision
ask_user(question="Deploy to production now?", options=[{"label": "Deploy"}, {"label": "Wait"}])
People get buttons and can also type an answer. They only see the question and the labels — post what you want reviewed as a normal message first, then ask.
A tool call got cancelled
That usually means a new message arrived, not that someone said no. Read the
new message, deal with it, then try the call once more. If it's cancelled
again, say what's done and what's left, book the rest with
schedule(duration="1m", ...), and stop.
You made a file to show someone
Write its full path in your reply:
Here's the chart: /home/me/reports/weekly.png
People get a clickable preview — images and video play inline. Keep shared
files under the home folder and write the whole path (no .., no ...). To
keep something for good, also save it to Drive with drive.
The answer is numbers, a table or a chart
Show a screen instead of a wall of text with a ```ui-spec block. See
Rich replies.
You start real work
Open a task card so people can see it in the Tasks tab, and close it when you report:
task(action="create", title="Fix the login redirect", context="Wayne: Safari loops on /login")
task(action="complete", task_id="tsk-...", result="Fixed cookie SameSite; tested on Safari 19")
Skip cards for quick questions.
You learned something worth keeping
A preference, a decision, a gotcha you hit the hard way — save it so every agent knows next time:
memory(action="find", query="deploy branch") # already known?
memory(action="save", name="deploy-via-release-branch", kind="fact",
description="Production deploys from the release branch, not main",
content="Pushing main does not deploy. Run npm run ship.")
Update an existing entry instead of adding a near-duplicate. Never save passwords or keys.
You finished a procedure worth repeating
Offer to save it as a skill — a short recipe any agent can follow. And before a task, check whether a skill already covers it:
skills(action="find", query="app store release")
Someone says "remember when we…"
Search the conversation history instead of asking again:
search(query="staging deploy", channel="#builds", after="2w")
Someone asks you to open a website
Use browser. If the person's own Chrome is connected (a [System] line says
so), pages open there — with their logins — in a window that doesn't steal
their focus:
browser(action="repl", code="await openTab('https://example.com'); console.log((await snapshot(page, {interactive: true})).tree)")
Close tabs you opened in their Chrome when you're done. Don't start your own Chrome — it has none of the saved logins.
Someone asks you to use their computer
If they turned on Let agents use this computer, desktop can open apps,
click and type on their own computer while they watch a Stop bar. Look
before you act, and ask before deleting, sending, buying or posting anything.
The work splits into independent parts
delegate(prompts=["Summarize ~/repo-a/README.md", "List TODOs in ~/repo-b/src"])
Up to 8 prompts. Each one starts from zero, so make it complete.
Someone asks you to change the workspace
"Add an agent", "use a different model", "hook up GitHub", "rename this
channel" — use agents, models, mcp_servers and channels. Deleting
things and managing members stay with humans in Settings.
You get a key whose value is hidden
Some workspaces let agents use an API key without showing its value. You'll be told the variable name and which site it's for. Put it in a request header to that site, as-is.
Other people may be working in the same folder
Don't stash, reset, clean or switch branches in a shared checkout, and stage only your own files. For bigger changes, work in a git worktree and merge back when done.
Related
- UFO tools reference
- The ufo command line
- Rich replies
- How do I…? — the same features from the human side