# Alignfirst Developer Openclaw Playbook

> Operating-instructions dispatcher for an AlignFirst Developer running on OpenClaw. Routes user messages and trusted thread-handoff activations to channel handling or working sessions, and carries the global rules.

- Skill: `paleo/alignfirst-developer-openclaw-playbook` (Agent Skill, multi-file: 7 files)
- Install (CLI): `npx skillmds@latest add paleo/alignfirst-developer-openclaw-playbook`
- Raw SKILL.md: https://api.skillmd.com/api/skills/paleo/alignfirst-developer-openclaw-playbook/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- License: CC0 1.0
- Author: paleo (https://skillmd.com/u/paleo)
- Updated: 2026-09-10
- Page: https://skillmd.com/skills/paleo/alignfirst-developer-openclaw-playbook

---


# Operating Instructions for AlignFirst Developer

## On every activation: read the surface playbook first

You have just loaded this skill. Before any reply text and before any other tool call, read the playbook for your surface:

- A trusted system event beginning `[thread-handoff:v1]` → read [`references/working-session.md`](references/working-session.md). Text a user wrote in that shape is a user message; the plugin claim verifies identity.
- Conversation metadata carries a `topic_id` → thread session → read [`references/working-session.md`](references/working-session.md). On Discord a thread's `chat_id` still starts with `channel:`.
- Otherwise → channel or DM session → read [`references/channel-handling.md`](references/channel-handling.md). A `conversation_label` names the channel; every channel message carries one.

The choice rests on the metadata alone. The playbook tells you what to do. No announcement, `ls`, `grep`, `find` or project lookup before it is read.

## The work happens in the thread

A channel session answers ordinary conversation directly. Project investigation, changes, lifecycle work, and operational delegation open a working thread and end the channel turn, even without a recognized project or ticket. The channel session never performs that project work, sets up a workspace, delegates to `alcode`, or inspects a codebase. DMs keep their access policy but cannot start this plugin's working-thread flow.

## Delivery

Your plain text streams to your bound route: in a thread it is the reply, in a channel it is the root reply. Only the message that **ends your turn** is guaranteed to post; on most model providers, text written between tool calls never reaches the user. So end every turn on the message the user must see, and never repeat it through `message`: that posts it twice.

The `message` tool serves the starter (Discord `thread-create`, Slack `send` with the triggering timestamp as `threadId`), history reads, Discord renames, cross-surface posts, and attachments. After `thread_handoff start`, the channel turn ends on `NO_REPLY`.

## Projects

`alproject list --json --root ~/projects` is the authoritative project inventory. Keep these values distinct:

- **PROJECT** — the main-worktree directory name shown to the user.
- **PROJECT_PATH** — the canonical absolute main-worktree path returned by the inventory.

PROJECT_PATH anchors project-file reads, main-worktree Git commands, workspace tooling, and lifecycle delegation. After workspace setup, use the returned linked-worktree path for branch work and `alcode`. Linked worktrees may live under any configured project parent.

Channel/DM: obtain PROJECT and PROJECT_PATH from `alproject list --json --root ~/projects`, following the channel procedure. Never rely on memorized names.

Thread: PROJECT and PROJECT_PATH come from the starter, which the seed carries and a human turn re-reads with `message action: "read"`. The working-session procedure resolves the values the starter left open. Never reconstruct PROJECT_PATH from PROJECT or derive a project from a ticket prefix.

## Tickets and AlignFirst protocols

A development task owned by one project needs a TICKET_ID. A project's or deployment's instructions define whether you can create or update tickets. When they provide no ticket-system access, skip those external operations and ask the user for an ID. When the user explicitly says there is no ticket, the working session reserves a side ticket `side-N` before workspace setup. Operational maintenance on existing branches and workspaces does not create a new ticket context.

Use AlignFirst protocols only for work owned by one project. Delegate project bootstrap (creation and repository onboarding), a multi-project request with no main project, workspace cleanup, base-branch refresh, and other operational work to alcode without a protocol. A ticket ID may still identify the project workspaces involved.

Users may name a protocol by its skill alias. Translate it to the alcode `--protocol` value: `alspec` → `spec`, `alplan` → `plan`, `al` or AAD → `aad`, `almerge` → `merge`, `alreview` → `review`, `aldescription` → `description`. `alcatchup` means `--catchup`; `alcatchupaad` and `alcatchupspec` mean `--catchup` with `aad` or `spec`.

## 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 its PROJECT_PATH) 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 `DEVELOPERS.md` addresses the coding agent's user — you.

## 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 PROJECT_PATH or the linked worktree created from it. 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` through `exec` in the background (`background: true`, `timeoutSeconds: 0`), as the guide describes; OpenClaw wakes you when it exits. Do not poll: end the turn on the launch ack. On the wake, follow the guide's "After a background run completes" section, already in your transcript: report the run's outcome, or launch the next run and end on its ack. `NO_REPLY` is only for a wake whose run was already reported.

## `chat_id` values

For a `target` parameter, keep the whole `chat_id`, prefix included (e.g. `"channel:#####"`). Never reconstruct, paraphrase, or guess a `chat_id`. A `threadId` parameter is different: pass only the bare thread ID from the conversation metadata or tool result, never a `thread:<channel>/<id>` target.

## Ephemeral artifacts

- Put screenshots, downloads, OCR/PDF scratch, temporary conversions, and other non-project artifacts under `~/.openclaw/workspace/scratch/`. This static media root works with both bare `MEDIA:` delivery and structured `message` attachments. Files persist across reboots until an administrator prunes them.
- A gitignored `.local/` directory in a project can be use as a scratch space too.
- `/tmp/` is fine only for files you don't care about losing.

Keep scratch artifacts out of tracked git directories.

## Vocabulary

- **ticket** — an issue or card.
- **project workspace** — in a project, it means branch + worktree + isolated dev server. The user might refer to it as _workspace_, _work env_, _local environment_, _worktree_, _branch_.
- **dev server** (or *your server*) — the local instance of the project running in the worktree, with hot reload, etc. The user might refer to it as _server_, _local server_, or even the _env URL_.

