Files
clawd/antfarm/docs/creating-workflows.md
Echo dc64d18224 fix: convert antfarm from broken submodule to regular directory
Fixes Gitea 500 error caused by invalid submodule reference.
Converted antfarm from pseudo-submodule (missing .gitmodules) to
regular directory with all source files.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-11 16:03:37 +00:00

325 lines
9.5 KiB
Markdown

# Creating Custom Workflows
This guide covers how to create your own Antfarm workflow.
## Directory Structure
```
workflows/
└── my-workflow/
├── workflow.yml # Workflow definition (required)
└── agents/
├── agent-a/
│ ├── AGENTS.md # Agent instructions
│ ├── SOUL.md # Agent persona
│ └── IDENTITY.md # Agent identity
└── agent-b/
├── AGENTS.md
├── SOUL.md
└── IDENTITY.md
```
## workflow.yml
### Minimal Example
```yaml
id: my-workflow
name: My Workflow
version: 1
description: What this workflow does.
agents:
- id: researcher
name: Researcher
role: analysis
description: Researches the topic and gathers information.
workspace:
baseDir: agents/researcher
files:
AGENTS.md: agents/researcher/AGENTS.md
SOUL.md: agents/researcher/SOUL.md
IDENTITY.md: agents/researcher/IDENTITY.md
- id: writer
name: Writer
role: coding
description: Writes content based on research.
workspace:
baseDir: agents/writer
files:
AGENTS.md: agents/writer/AGENTS.md
SOUL.md: agents/writer/SOUL.md
IDENTITY.md: agents/writer/IDENTITY.md
steps:
- id: research
agent: researcher
input: |
Research the following topic:
{{task}}
Reply with:
STATUS: done
FINDINGS: what you found
expects: "STATUS: done"
- id: write
agent: writer
input: |
Write content based on these findings:
{{findings}}
Original request: {{task}}
Reply with:
STATUS: done
OUTPUT: the final content
expects: "STATUS: done"
```
### Top-Level Fields
| Field | Required | Description |
|-------|----------|-------------|
| `id` | yes | Unique workflow identifier (lowercase, hyphens) |
| `name` | yes | Human-readable name |
| `version` | yes | Integer version number |
| `description` | yes | What the workflow does |
| `agents` | yes | List of agent definitions |
| `steps` | yes | Ordered list of pipeline steps |
### Agent Definition
```yaml
agents:
- id: my-agent # Unique within this workflow
name: My Agent # Display name
role: coding # Controls tool access (see Agent Roles below)
description: What it does.
workspace:
baseDir: agents/my-agent
files: # Workspace files provisioned for this agent
AGENTS.md: agents/my-agent/AGENTS.md
SOUL.md: agents/my-agent/SOUL.md
IDENTITY.md: agents/my-agent/IDENTITY.md
skills: # Optional: skills to install into the workspace
- antfarm-workflows
```
File paths are relative to the workflow directory. You can reference shared agents:
```yaml
workspace:
files:
AGENTS.md: ../../agents/shared/setup/AGENTS.md
```
### Agent Roles
Roles control what tools each agent has access to during execution:
| Role | Access | Typical agents |
|------|--------|----------------|
| `analysis` | Read-only code exploration | planner, prioritizer, reviewer, investigator, triager |
| `coding` | Full read/write/exec for implementation | developer, fixer, setup |
| `verification` | Read + exec but NO write — preserves verification integrity | verifier |
| `testing` | Read + exec + browser/web for E2E testing, NO write | tester |
| `pr` | Read + exec only — runs `gh pr create` | pr |
| `scanning` | Read + exec + web search for CVE lookups, NO write | scanner |
### Step Definition
```yaml
steps:
- id: step-name # Unique step identifier
agent: agent-id # Which agent handles this step
input: | # Prompt template (supports {{variables}})
Do the thing.
{{task}} # {{task}} is always the original task string
{{prev_output}} # Variables from prior steps (lowercased KEY names)
Reply with:
STATUS: done
MY_KEY: value # KEY: value pairs become variables for later steps
expects: "STATUS: done" # String the output must contain to count as success
max_retries: 2 # How many times to retry on failure (optional)
on_fail: # What to do when retries exhausted (optional)
escalate_to: human # Escalate to human
```
### Template Variables
Steps communicate through KEY: value pairs in their output. When an agent replies with:
```
STATUS: done
REPO: /path/to/repo
BRANCH: feature/my-thing
```
Later steps can reference `{{repo}}` and `{{branch}}` (lowercased key names).
`{{task}}` is always available — it's the original task string passed to `workflow run`.
### Verification Loops
A step can retry a previous step on failure:
```yaml
- id: verify
agent: verifier
input: |
Check the work...
Reply STATUS: done or STATUS: retry with ISSUES.
expects: "STATUS: done"
on_fail:
retry_step: implement # Re-run this step with feedback
max_retries: 3
on_exhausted:
escalate_to: human
```
When verification fails with `STATUS: retry`, the `implement` step runs again with `{{verify_feedback}}` populated from the verifier's `ISSUES:` output.
### Loop Steps (Story-Based)
For steps that iterate over a list of stories (like implementing multiple features or fixes):
```yaml
- id: implement
agent: developer
type: loop
loop:
over: stories # Iterates over stories created by a planner step
completion: all_done # Step completes when all stories are done
fresh_session: true # Each story gets a fresh agent session
verify_each: true # Run a verify step after each story (optional)
verify_step: verify # Which step to use for per-story verification (optional)
input: |
Implement story {{current_story}}...
expects: "STATUS: done"
max_retries: 2
on_fail:
escalate_to: human
```
#### Loop Template Variables
These variables are automatically injected for loop steps:
| Variable | Description |
|----------|-------------|
| `{{current_story}}` | Full story details (title, description, acceptance criteria) |
| `{{current_story_id}}` | Story ID (e.g., `S-1`) |
| `{{current_story_title}}` | Story title |
| `{{completed_stories}}` | List of already-completed stories |
| `{{stories_remaining}}` | Number of pending/running stories |
| `{{progress}}` | Contents of progress.txt from the agent workspace |
| `{{verify_feedback}}` | Feedback from a failed verification (empty if not retrying) |
#### STORIES_JSON Format
A planner step creates stories by including `STORIES_JSON:` in its output. The value must be a JSON array of story objects:
```json
STORIES_JSON: [
{
"id": "S-1",
"title": "Create database schema",
"description": "Add the users table with email, password_hash, and created_at columns.",
"acceptanceCriteria": [
"Migration file exists",
"Schema includes all required columns",
"Typecheck passes"
]
},
{
"id": "S-2",
"title": "Add user registration endpoint",
"description": "POST /api/register that creates a new user.",
"acceptanceCriteria": [
"Endpoint returns 201 on success",
"Validates email format",
"Tests pass",
"Typecheck passes"
]
}
]
```
Required fields per story:
| Field | Description |
|-------|-------------|
| `id` | Unique story ID (e.g., `S-1`, `fix-001`) |
| `title` | Short description |
| `description` | What needs to be done |
| `acceptanceCriteria` | Array of verifiable criteria (also accepts `acceptance_criteria`) |
Maximum 20 stories per run. Each story gets a fresh agent session and independent retry tracking (default 2 retries per story).
## Agent Workspace Files
### AGENTS.md
Instructions for the agent. Include:
- What the agent does (its role)
- Step-by-step process
- Output format (must match the KEY: value pattern)
- What NOT to do (scope boundaries)
### SOUL.md
Agent persona. Keep it brief — a few lines about tone and approach.
### IDENTITY.md
Agent name and role. Example:
```markdown
# Identity
- **Name:** Researcher
- **Role:** Research agent for my-workflow
```
## Shared Agents
Antfarm includes shared agents in `agents/shared/` that you can reuse:
- **setup** — Creates branches, establishes build/test baselines
- **verifier** — Verifies work against acceptance criteria
- **pr** — Creates pull requests via `gh`
Reference them from your workflow:
```yaml
- id: setup
agent: setup
role: coding
workspace:
files:
AGENTS.md: ../../agents/shared/setup/AGENTS.md
SOUL.md: ../../agents/shared/setup/SOUL.md
IDENTITY.md: ../../agents/shared/setup/IDENTITY.md
```
## Installing Your Workflow
Place your workflow directory in `workflows/` and run:
```bash
antfarm workflow install my-workflow
```
This provisions agent workspaces, registers agents in OpenClaw config, and sets up cron polling.
## Tips
- **Be specific in input templates.** Agents get the input as their entire task context. Vague inputs produce vague results.
- **Include output format in every step.** Agents need to know exactly what KEY: value pairs to return.
- **Use verification steps.** A verify -> retry loop catches most quality issues automatically.
- **Keep agents focused.** One agent, one job. Don't combine triaging and fixing in the same agent.
- **Set appropriate roles.** Use `analysis` for read-only agents and `verification` for verifiers to prevent them from modifying code they're reviewing.
- **Test with small tasks first.** Run a simple test task before throwing a complex feature at the pipeline.