Openclaw coder playbook
Companion products for AI-assisted software work.
npx -y skills add paleo/alignfirst --skill openclaw-coder-playbookAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
What its author says it does
Copied from the file, not written here
Operating-instructions dispatcher for the openclaw-coder autonomous-programmer workspace. Routes every user message by surface — thread → working session, channel/DM → channel handling — and carries the global rules. The workspace AGENTS.md loads this skill first on every user message.
The file declares its own license as CC0 1.0. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.
SKILL.md
4.1 KB, as published. Nobody here has run it
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 hastopic_iddifferent frommessage_id→ thread session → readreferences/working-session.md. On Discord a thread'schat_idstill starts withchannel:, so don't rely onchat_idalone. - Otherwise → channel / DM session → read
references/channel-handling.md. On Slack a channel message carries its own id astopic_id(replies auto-thread on it) —topic_idequal tomessage_idis 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.
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; posting into a thread requires message thread-reply. Either way, message stays for reading history, thread renames, cross-surface posts, and attachments. On Slack, plain replies are always right (auto-threaded).
Projects
Projects live under ~/projects/. 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": the [WORK] header carries both; before it's posted, the starter names the project and the ticket comes from the user's messages. Never re-derive from ls ~/projects/ or from a ticket prefix.
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.
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.