Docs
ALIENZ Open UFO

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.