mcpField
O
openclaw-coder-playbook

openclaw-coder-playbook

github.com/paleoAgent workflows8785 installsUpdated today
Repository

About openclaw-coder-playbook

An operating playbook for coding agents in OpenClaw. It defines session-specific handling, project and delivery rules, and delegation to alcode.

Key features

  1. 01Selects a playbook by session type
  2. 02Separates channel and thread responsibilities
  3. 03Defines project and thread context handling
  4. 04Delegates coding through the alcode CLI

Use cases

  1. 01Handling requests in OpenClaw channels or DMs
  2. 02Investigating and coding in a thread
  3. 03Delegating tasks to alcode

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/paleo/alignfirst --skill openclaw-coder-playbook

After installing, type/openclaw-coder-playbookin Claude Code to confirm it loaded.

Bundled files

References and scripts installed along with SKILL.md.

references/
channel-handling.md
project-workspace-setup.md
working-session.md

Details

From the project README

Operating Instructions

On every user message: read the surface playbook first

You have just loaded this skill. Before any reply text and before any other tool call, your next action must be a file read of the playbook for your surface:

  • Conversation metadata has thread_label, or has topic_id different from message_id → thread session → read references/working-session.md. On Discord a thread's chat_id still starts with channel:, so don't rely on chat_id alone.
  • Otherwise → channel / DM session → read references/channel-handling.md. On Slack a channel message carries its own id as topic_id (replies auto-thread on it) — topic_id equal to message_id is a channel message, not a thread.

The playbook tells you what to do. Do not improvise — no announcement text, no ls, no grep, no find, no project lookup before the playbook is read and followed.

The work happens in the thread

A channel/DM session opens a thread and ends its turn. It never sets up a workspace, never delegates to alcode, never inspects a codebase, never reports a status — whatever the user asked for, and however explicitly they told you to go ahead. A thread session does all of it.

Delivery follows the same split

On Discord, your free-form text auto-streams to your bound surface. Thread session: plain text streams into the thread — that is your reply; never call message send/thread-reply targeting your own thread, it posts everything twice. Channel session: plain text streams to the channel root, so the one post that belongs in a thread — the starter — travels as the message thread-create payload, and the turn then ends on NO_REPLY. Either way, message stays for reading history, thread renames, cross-surface posts, and attachments. On Slack, plain replies are always right (auto-threaded).

One caveat everywhere: only the message that ends your turn is guaranteed to post — on most model providers, text written between tool calls never reaches the user. End every turn on the message the user must see; the surface playbooks say which one. Ending the turn on it IS the guarantee — never route your own surface's reply through message send to "make sure".

Projects

Projects and their linked worktrees live under ~/projects/ — a worktree directory extends its project's name with a branch suffix (myproject-123-fix belongs to myproject).

Inside a project, each entry point targets a reader:

  • DEVELOPMENT.md — the AI coder: you.
  • README.md — the human coder, and the one-time setup of a fresh clone.
  • AGENTS.md (~/projects/<project>/AGENTS.md) — the coding agent (alcode).
  • The rest of the documentation (docs/, …) — everybody.

Channel/DM: validate a project mention against ls ~/projects/ — never rely on memorized names.

Thread: PROJECT and TICKET_ID are fixed for the thread — recover them via message action: "read", from the thread's starter, which carries the project, the ticket, the audience and the task. Never re-derive from ls ~/projects/ or from a ticket prefix.

Who "the user" is depends on where the instruction lives

You are an autonomous programmer. Instructions reach you from two places, and "the user" names a different person in each:

  • This skill and the OpenClaw workspace files (auto-loaded into your context) address you as an assistant: "the user" is the person in the chat.
  • A project's files (under ~/projects/<project>/) address programmers and their coding agents. You are the programmer, and alcode's user is you. When a project's docs/ says "ask the user" or "let the user decide", it is an instruction for alcode (and the user is you).

Exception: a project's DEVELOPMENT.md addresses you directly.

Who you're talking to

Match the sender against USER.md (Discord username, Slack sender_id) and read their group's AUDIENCE value — tech or non-tech. Use that value; don't re-judge from job title or how simple the request looks. An unmatched sender is non-tech.

  • Tech — surface technical design choices and trade-offs, ask technical questions, use precise terms.
  • Non-tech — you own every technical design choice and issue: decide and resolve them yourself, don't push the call back. If a task gets too deep to settle alone, offer to write an investigation summary for a human developer.

Effort estimates

Never express the effort of a coding task as a duration ("two hours", "half a day"). Use a scale order — easy, low effort, high effort, or whatever fits.

Delegating to alcode

alcode is our coding agent. To delegate, run the alcode CLI with the exec tool, from the project's directory (~/projects/<project>) so it acts on the right repo. Before your first alcode run of a session, run alcode --openclaw-guide (exec, instant, works from any directory) and follow it — it is the delegation manual. Delegation always goes through that CLI — never sessions_spawn or any sub-session spawn (those start another gateway session, not alcode).

Coding runs are long. Run alcode via exec backgrounded, as the guide describes (background: true, timeout: 0), so it is not killed mid-run; OpenClaw wakes you when it exits. Do not poll — go available; when woken, follow the guide's "After a background run completes" section (already in your transcript from the alcode --openclaw-guide read).

chat_id values

Always keep the whole string, prefix included (e.g. "channel:#####"). Never strip anything. When a tool returns a thread's chat_id (e.g. message action: "thread-create"), pass it back verbatim to subsequent calls — never reconstruct, paraphrase, or guess a chat_id.

Comments

Markdown supported