Autonomous software engineering fleet of AI agents for production-grade PRs on AgentField: plan, code, test, and ship.
$ npx -y skills add Agent-Field/SWE-AF --agent claude-code
Run the curl in your terminal, the rest in Claude Code.
Repo: Agent-Field/SWE-AF
What's inside
Pronounced: "swee-AF" (one word)
One API call โ full engineering team โ shipped code.
One API call spins up a full autonomous engineering team โ product managers, architects, coders, reviewers, testers โ that scopes, builds, adapts, and ships complex software end to end. SWE-AF is a first step toward autonomous software engineering factories, scaling from simple goals to hard multi-issue programs with hundreds to thousands of agent invocations.
Trigger it with the af CLI (requires af โฅ 0.1.87) โ it streams live progress and prints the result:
af call swe-planner.build --in '{
"goal": "Refactor and harden auth + billing flows",
"repo_url": "https://github.com/user/my-project",
"config": {
"runtime": "claude_code",
"models": { "default": "sonnet", "coder": "opus", "qa": "opus" },
"enable_learning": true
}
}'
Prefer raw HTTP? Hit the API directly with curl:
curl -X POST http://localhost:8080/api/v1/execute/async/swe-planner.build \
-H "Content-Type: application/json" \
-d @- <<'JSON'
{
"input": {
"goal": "Refactor and harden auth + billing flows",
"repo_url": "https://github.com/user/my-project",
"config": {
"runtime": "claude_code",
"models": {
"default": "sonnet",
"coder": "opus",
"qa": "opus"
},
"enable_learning": true
}
}
}
JSON
Swap models.default and any role key (coder, qa, architect, etc.) to any model your runtime supports.
SWE-AF works in two modes: point it at a single repository, or orchestrate coordinated changes across multiple repos in one build.
The default. Pass repo_url (remote) or repo_path (local) and SWE-AF handles everything:
curl -X POST http://localhost:8080/api/v1/execute/async/swe-planner.build \
-H "Content-Type: application/json" \
-d '{
"input": {
"goal": "Add JWT auth",
"repo_url": "https://github.com/user/my-project"
}
}'
When your work spans multiple codebases โ a primary app plus shared libraries, monorepo sub-projects, or dependent microservices โ pass config.repos as an array with roles:
curl -X POST http://localhost:8080/api/v1/execute/async/swe-planner.build \
-H "Content-Type: application/json" \
-d '{
"input": {
"goal": "Add JWT auth across API and shared-lib",
"config": {
"repos": [
{
"repo_url": "https://github.com/org/main-app",
"role": "primary"
},
{
"repo_url": "https://github.com/org/shared-lib",
"role": "dependency"
}
],
"runtime": "claude_code",
"models": {
"default": "sonnet"
}
}
}
}'
Roles:
primary โ The main application. Changes here drive the build; failures block progress.dependency โ Libraries or services modified to support the primary repo. Failures are captured but don't block.Use cases:
Rust-based Python compiler benchmark (built autonomously):
| Metric | CPython (subprocess) | RustPython (SWE-AF) | Improvement |
|---|---|---|---|
| Steady-state execution | Baseline (~19ms) | Optimized in-process runtime | 88.3x-602.3x faster |
| Geometric mean | 1.0x baseline | 253.8x | 253.8x |
| Peak throughput | ~52 ops/s | 31,807 ops/s | ~612x |
Throughput comparison measures different execution models: CPython subprocess spawn (~19ms per call โ ~52 ops/s) vs RustPython pre-warmed interpreter pool (in-process). This is the real-world tradeoff the system was built to optimize โ replacing repeated subprocess invocations with a persistent pool for short-snippet execution.
Artifact trail includes 175 tracked autonomous agents across planning, coding, review, merge, and verification.
Details: examples/llm-rust-python-compiler-sonnet/README.md
Most agent frameworks wrap a single coder loop. SWE-AF is a coordinated engineering factory โ planning, execution, and governance agents run as a control stack that adapts in real time.
coder: opus, qa: haiku). Works with Claude, OpenRouter, OpenAI, and Google.enable_learning=true, conventions and failure patterns discovered early are injected into downstream issues.resume_build after crashes or interruptions.PR #179: Go SDK DID/VC Registration โ built entirely by SWE-AF (Claude runtime with haiku-class models). One API call, zero human code.
| Metric | Value |
|---|---|
| Issues completed | 10/10 |
| Tests passing | 217 |
| Acceptance criteria | 34/34 |
| Agent invocations | 79 |
| Model | claude-haiku-4-5 |
| Total cost | $19.23 |
| Role | Cost | % |
|---|---|---|
| Coder | $5.88 | 30.6% |
| Code Reviewer | $3.48 | 18.1% |
| QA | $1.78 | 9.2% |
| GitHub PR | $1.66 | 8.6% |
| Integration Tester | $1.59 | 8.3% |
| Merger | $1.22 | 6.3% |
| Workspace Ops | $1.77 | 9.2% |
| Planning (PM + Arch + TL + Sprint) | $0.79 | 4.1% |
| Verifier + Finalize | $0.34 | 1.8% |
| Synthesizer | $0.05 | 0.2% |
79 invocations, 2,070 conversation turns. Planning agents scope and decompose; coders work in parallel isolated worktrees; reviewers and QA validate each issue; merger integrates branches; verifier checks acceptance criteria against the PRD.
Claude, open-source, and Codex models supported: Run builds with any runtime and tune models per role in one flat config map.
runtime: "claude_code" maps to Claude backend.runtime: "open_code" maps to OpenCode backend (OpenRouter/OpenAI/Google/Anthropic model IDs).runtime: "codex" maps to the OpenAI Codex CLI backend.SWE-AF uses three nested control loops to adapt to task difficulty in real time:
| Loop | Scope | Trigger | Action |
|---|---|---|---|
| Inner loop | Single issue | QA/review fails | Coder retries with feedback |
| Middle loop | Single issue | Inner loop exhausted | run_issue_advisor retries with a new approach, splits work, or accepts with debt |
| Outer loop | Remaining DAG | Escalated failures | run_replanner restructures remaining issues and dependencies |
This is the core factory-control behavior: control agents supervise worker agents and continuously reshape the plan as reality changes.
af install)Already running an AgentField control plane? Install SWE-AF straight from GitHub โ no clone, no local Python setup:
af install https://github.com/Agent-Field/SWE-AF
af run swe-planner
af install clones the repo, provisions an isolated Python environment, and registers the swe-planner node with your control plane. On first af run you're prompted for the one required secret โ an LLM provider key (ANTHROPIC_API_KEY or OPENROUTER_API_KEY) โ which is stored encrypted and reused across every node, so you enter it only once. (Add GH_TOKEN when you want builds to clone private repos and open pull requests.) Then kick off a build:
af call swe-planner.build --in '{"goal": "Add JWT auth", "repo_url": "https://github.com/user/my-repo"}'
New to AgentField? Install the control plane first with curl -fsSL https://agentfield.ai/install.sh | bash, or use the Railway / local options below.
One click deploys SWE-AF + AgentField control plane + PostgreSQL. Exactly one environment variable is required in Railway โ an LLM provider key:
OPENROUTER_API_KEY โ recommended, simplest. One key, 200+ open and proprietary models. With only this set (no ANTHROPIC_API_KEY, no SWE_DEFAULT_RUNTIME), SWE-AF auto-selects the open_code runtime and defaults every role to openrouter/deepseek/deepseek-v4-flash-0731 โ no further configuration needed.ANTHROPIC_API_KEY, or CLAUDE_CODE_OAUTH_TOKEN from claude setup-token in Claude Code CLI (uses Pro/Max subscription credits), to run the claude_code runtime instead.Optional:
GH_TOKEN โ GitHub personal access token with repo scope. Needed only to clone private repos, push branches, and open pull requests; builds against public repos work without it.Once deployed, trigger a build:
curl -X POST https://<control-plane>.up.railway.app/api/v1/execute/async/swe-planner.build \
-H "Content-Type: application/json" \
-H "X-API-Key: this-is-a-secret" \
-d '{"input": {"goal": "Add JWT auth", "repo_url": "https://github.com/user/my-repo"}}'
af)python3.12 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install -e ".[dev]"
af # starts AgentField control plane on :8080
python -m swe_af # registers node id "swe-planner"
# Default (uses Claude)
curl -X POST http://localhost:8080/api/v1/execute/async/swe-planner.build \
-H "Content-Type: application/json" \
-d @- <<'JSON'
{
"input": {
"goal": "Add JWT auth to all API endpoints",
"repo_url": "https://github.com/user/my-project"
}
}
JSON
# With open-source runtime + flat role map
curl -X POST http://localhost:8080/api/v1/execute/async/swe-planner.build \
-H "Content-Type: application/json" \
-d @- <<'JSON'
{
"input": {
"goal": "Add JWT auth",
"repo_url": "https://github.com/user/my-project",
"config": {
"runtime": "open_code",
"models": {
"default": "openrouter/minimax/minimax-m2.5"
}
}
}
}
JSON
# With Codex CLI runtime
curl -X POST http://localhost:8080/api/v1/execute/async/swe-planner.build \
-H "Content-Type: application/json" \
-d @- <<'JSON'
{
"input": {
"goal": "Add JWT auth",
"repo_url": "https://github.com/user/my-project",
"config": {
"runtime": "codex",
"models": {
"default": "gpt-5.3-codex"
}
}
}
}
JSON
# Fast mode with Codex CLI runtime
curl -X POST http://localhost:8080/api/v1/execute/async/swe-fast.build \
-H "Content-Type: application/json" \
-d @- <<'JSON'
{
"input": {
"goal": "Add a focused bug fix",
"repo_url": "https://github.com/user/my-project",
"config": {
"runtime": "codex",
"models": {
"default": "gpt-5.3-codex"
}
}
}
}
JSON
# Local workspace mode (repo_path) + targeted role override
curl -X POST http://localhost:8080/api/v1/execute/async/swe-planner.build \
-H "Content-Type: application/json" \
-d @- <<'JSON'
{
"input": {
"goal": "Refactor and harden auth + billing flows",
"repo_path": "/path/to/repo",
"config": {
"runtime": "claude_code",
"models": {
"default": "sonnet",
"coder": "opus",
"qa": "opus"
},
"enable_learning": true
}
}
}
JSON
For OpenRouter with open_code, use model IDs in openrouter/<provider>/<model> format (for example openrouter/minimax/minimax-m2.5).
For Codex with ChatGPT subscription auth, install the Codex CLI on the host, run codex login, leave OPENAI_API_KEY unset for this process, and set SWE_CODEX_AUTH_MODE=chatgpt or auto. For OpenAI API-platform billing, set SWE_CODEX_AUTH_MODE=api_key and OPENAI_API_KEY.
Codex deployments using the Docker image must set
SWE_DEFAULT_MODEL=gpt-5.3-codexon the environment (or passmodels: {"default": "gpt-5.3-codex"}in every build'sconfig). The image bakesHARNESS_MODEL=openrouter/moonshotai/kimi-k2.6as an OpenCode fallback, and SWE-AF's model-resolution env cascade readsHARNESS_MODELโ so withoutSWE_DEFAULT_MODELset, the Codex CLI receives an OpenRouter model id it can't handle and the Product Manager reasoner fails in ~13s. SettingSWE_DEFAULT_MODELmakes the cascade pin every role to the Codex model.
Codex CLI's
workspace-writesandbox uses bubblewrap (bwrap) and needs Linux user namespaces enabled on the host. Most production Linux hosts and managed container runtimes (Railway, etc.) allow this by default, but local Docker on WSL2 or hardened environments may refuse withbwrap: No permissions to create a new namespace. If the verifier reports that error, the coder ran but couldn't write files โ enable user namespaces on the host before relying on the codex runtime there.
Coding and review agents can look up external documentation, library APIs, error messages, and version/deprecation status during a build. This is opt-in via two env vars on the deployment:
OPENCODE_ENABLE_EXA=1
EXA_API_KEY=...
When set, opencode's built-in websearch and webfetch tools become available to every reasoner running through the open runtime โ the model decides when to use them based on the task. Get a key at exa.ai.
The coder reasoner additionally gets a brief restraint guideline appended to its system prompt, so a long coding loop doesn't rabbit-hole on searches it could answer by reading the codebase. No setup required beyond the env vars; the wiring inherits parent env naturally through agentfield's CLI harness.
This works on the open runtime (opencode). The Claude runtime uses Anthropic's first-party WebSearch/WebFetch and is currently not wired here โ file an issue if you want it.
Typical runs spin up 400-500+ agent instances across planning, execution, QA, and verification. For larger DAGs and repeated adaptation/replanning cycles, SWE-AF can scale into the high hundreds to thousands of agent invocations in a single build.
95/100 with haiku and MiniMax: SWE-AF scored 95/100 with both Claude haiku-class routing ($20) and MiniMax M2.5 via open runtime ($6), outperforming Claude Code sonnet (73), Codex o3 (62), and Claude Code haiku (59) on the same prompt.
| Dimension | SWE-AF (haiku) | SWE-AF (MiniMax) | CC Sonnet | Codex (o3) | CC Haiku |
|---|---|---|---|---|---|
| Functional (30) | 30 | 30 | 30 | 30 | 30 |
| Structure (20) | 20 | 20 | 10 | 10 | 10 |
| Hygiene (20) | 20 | 20 | 16 | 10 | 7 |
| Git (15) | 15 | 15 | 2 | 2 | 2 |
| Quality (15) | 10 | 10 | 15 | 10 | 10 |
| Total | 95 | 95 | 73 | 62 | 59 |
| Cost | ~$20 | ~$6 | ? | ? | ? |
| Time | ~30-40 min | 43 min | ? | ? | ? |
Same prompt tested across multiple agents. SWE-AF with Claude runtime (haiku-class model mapping) used 400+ agent instances; SWE-AF with MiniMax M2.5 via open runtime achieved identical quality at 70% cost savings.
Prompt used for all agents:
Build a Node.js CLI todo app with add, list, complete, and delete commands. Data should persist to a JSON file. Initialize git, write tests, and commit your work.
| Dimension | Points | What it measures |
|---|---|---|
| Functional | 30 | CLI behavior and passing tests |
| Structure | 20 | Modular source layout and test organization |
| Hygiene | 20 | .gitignore, clean status, no junk artifacts |
| Git | 15 | Commit discipline and message quality |
| Quality | 15 | Error handling, package metadata, README quality |
# SWE-AF (Claude runtime, haiku-class mapping) - $20, 30-40 min
curl -X POST http://localhost:8080/api/v1/execute/async/swe-planner.build \
-H "Content-Type: application/json" \
-d @- <<'JSON'
{
"input": {
"goal": "Build a Node.js CLI todo app with add, list, complete, and delete commands. Data should persist to a JSON file. Initialize git, write tests, and commit your work.",
"repo_path": "/tmp/swe-af-output",
"config": {
"runtime": "claude_code",
"models": {
"default": "haiku"
}
}
}
}
JSON
# SWE-AF (MiniMax M2.5 via OpenRouter runtime) - $6, 43 min
curl -X POST http://localhost:8080/api/v1/execute/async/swe-planner.build \
-H "Content-Type: application/json" \
-d @- <<'JSON'
{
"input": {
"goal": "Build a Node.js CLI todo app with add, list, complete, and delete commands. Data should persist to a JSON file. Initialize git, write tests, and commit your work.",
"repo_path": "/workspaces/todo-app-benchmark",
"config": {
"runtime": "open_code",
"models": {
"default": "openrouter/minimax/minimax-m2.5"
}
}
}
}
JSON
# Claude Code (haiku)
claude -p "Build a Node.js CLI todo app with add, list, complete, and delete commands. Data should persist to a JSON file. Initialize git, write tests, and commit your work." --model haiku --dangerously-skip-permissions
# Claude Code (sonnet)
claude -p "Build a Node.js CLI todo app with add, list, complete, and delete commands. Data should persist to a JSON file. Initialize git, write tests, and commit your work." --model sonnet --dangerously-skip-permissions
# Codex (gpt-5.3-codex)
codex exec "Build a Node.js CLI todo app with add, list, complete, and delete commands. Data should persist to a JSON file. Initialize git, write tests, and commit your work." --full-auto
MiniMax M2.5 Measured Metrics (Feb 2026):
Production Quality Analysis: Objective comparison of measurable metrics across all agents.
Benchmark assets, logs, evaluator, and generated projects live in examples/agent-comparison/.
Ship code, then audit it: SEC-AF runs the same multi-agent architecture against your codebase โ 250 agents, 94% noise reduction, every finding proven.
cp .env.example .env
# Uncomment exactly ONE provider key: OPENROUTER_API_KEY (recommended),
# ANTHROPIC_API_KEY, CLAUDE_CODE_OAUTH_TOKEN, OPENAI_API_KEY, or GOOGLE_API_KEY
# Optionally add GH_TOKEN (private-repo clones, pushing branches, opening PRs)
docker compose up -d
.env.exampleships with every provider key commented out โ uncomment exactly one. In particular, don't leave a placeholderANTHROPIC_API_KEYvalue in place: any non-empty value forces theclaude_coderuntime and breaks an OpenRouter-only setup.
Submit a build:
# Default runtime (auto-selected from whichever provider key is in .env)
curl -X POST http://localhost:8080/api/v1/execute/async/swe-planner.build \
-H "Content-Type: application/json" \
-d @- <<'JSON'
{
"input": {
"goal": "Add JWT auth",
"repo_url": "https://github.com/user/my-repo"
}
}
JSON
# With open-source runtime (set OPENROUTER_API_KEY in .env)
curl -X POST http://localhost:8080/api/v1/execute/async/swe-planner.build \
-H "Content-Type: application/json" \
-d @- <<'JSON'
{
"input": {
"goal": "Add JWT auth",
"repo_url": "https://github.com/user/my-repo",
"config": {
"runtime": "open_code",
"models": {
"default": "openrouter/minimax/minimax-m2.5"
}
}
}
}
JSON
# Local workspace mode (repo_path)
curl -X POST http://localhost:8080/api/v1/execute/async/swe-planner.build \
-H "Content-Type: application/json" \
-d @- <<'JSON'
{
"input": {
"goal": "Add JWT auth",
"repo_path": "/workspaces/my-repo"
}
}
JSON
Scale workers:
docker compose up --scale swe-agent=3 -d
Use a host control plane instead of Docker control-plane service:
docker compose -f docker-compose.local.yml up -d
Pass repo_url instead of repo_path to let SWE-AF clone and open a PR after execution.
curl -X POST http://localhost:8080/api/v1/execute/async/swe-planner.build \
-H "Content-Type: application/json" \
-d @- <<'JSON'
{
"input": {
"repo_url": "https://github.com/user/my-project",
"goal": "Add comprehensive test coverage",
"config": {
"runtime": "claude_code",
"models": {
"default": "sonnet",
"coder": "opus",
"qa": "opus"
}
}
}
}
JSON
Requirements:
GH_TOKEN in .env with repo scope โ required for this workflow, since
it clones private repos, pushes the branch, and opens the PR. Builds that
stay local (repo_path) or target a public repo don't need it.After SWE-AF pushes the integration branch and opens a PR (ready for review,
not draft), it watches GitHub Actions on that PR until checks are
conclusive. If they fail, a bounded fix-and-repush loop runs an agent that
is explicitly forbidden from silencing tests (no pytest.skip, no xfail,
no commenting tests out, no loosening assertions) โ it must produce a
legitimate fix in the production code and push a new commit. When CI is
green, the gate returns success; when CI fails after fix attempts, the PR
stays open with visible failing checks so a human reviewer can step in.
Configuration on BuildConfig:
| Field | Default | Purpose |
|---|---|---|
check_ci | true | Run the post-PR CI gate. Set false to return immediately after the PR is created. |
max_ci_fix_cycles | 2 | Cap on watch โ fix โ repush iterations after the initial push. |
ci_wait_seconds | 1500 | Wall-clock cap per gh pr checks watch (25 min). |
ci_poll_seconds | 30 | Poll interval for gh pr checks. |
The full build pipeline is feature-level: it plans, decomposes, and
verifies a whole feature, which takes hours. When the caller is itself a
coding harness โ Claude Code, Codex, OpenCode โ it has already done the
planning. For that case SWE-AF exposes an issue-level entry point,
implement_issue, that skips every planning agent and runs just the coding
loop on an isolated branch. Delegating well-scoped issues to SWE-AF on cheap
or open-weight models keeps the main harness's token budget for the work that
needs it.
Rule of thumb for the two prompt shapes:
| Prompt shape | Entry point |
|---|---|
| "Implement X feature" (needs decomposition) | swe-planner.build / swe-fast.build |
| "Change this code in this file, like this" (fully scoped, context supplied) | swe-planner.implement_issue / swe-fast.implement_issue |
A harness does not need this table hardcoded: both entry points register with
the control plane carrying an entrypoint tag and a routing description, so
af ls --entrypoints (or GET /api/v1/discovery/capabilities) lists them โ
with when-to-use guidance โ on any AgentField control plane the node joins
(agentfield โฅ 0.1.113).
Each call creates its own git worktree and an issue/<build_id>-<slug> branch
off base_branch (default: the current branch), implements the issue with the
coder โ reviewer loop (a QA + synthesizer path when needs_deeper_qa is set),
optionally runs one verifier pass against the acceptance criteria, removes the
worktree, and returns the branch. The caller's checkout, current branch, and
git status are untouched โ so a main harness can fan out several issues
against the same repo_path concurrently and merge the returned branches
itself. Nothing is pushed and no PR is opened unless enable_github_pr is set:
the caller owns merge and CI. Typical cost is 4โ8 LLM calls (vs hundreds for a
feature-level build).
# Delegate one scoped issue (async; returns an execution_id immediately)
curl -X POST http://localhost:8080/api/v1/execute/async/swe-planner.implement_issue \
-H "Content-Type: application/json" \
-d @- <<'JSON'
{
"input": {
"issue": {
"title": "Add retry with exponential backoff to fetch_user",
"description": "In src/api/client.py, wrap fetch_user's HTTP call in a retry helper: 3 attempts, 0.5s base delay, doubling. Reuse the existing logger for retry warnings.",
"acceptance_criteria": [
"fetch_user retries up to 3 times on ConnectionError",
"tests cover the retry-then-succeed path"
],
"files_to_modify": ["src/api/client.py"],
"testing_strategy": "pytest tests/api/test_client.py"
},
"repo_path": "/workspaces/my-project",
"base_branch": "main",
"config": { "models": { "default": "haiku" } }
},
"webhook": { "url": "https://my-harness.example/hooks/swe-af" }
}
JSON
# Poll instead of (or in addition to) the webhook
curl http://localhost:8080/api/v1/executions/<execution_id>
# Progress notes while it runs
curl http://localhost:8080/api/v1/executions/<execution_id>/notes
The result's branch field is the deliverable:
{
"success": true,
"outcome": "completed",
"branch": "issue/a1b2c3d4-add-retry-with-exponential-backoff",
"base_branch": "main",
"commits": ["<sha>"],
"files_changed": ["src/api/client.py", "tests/api/test_client.py"],
"iterations": 1,
"verification": { "passed": true, "criteria_results": ["..."] },
"debt_items": [],
"pr_url": ""
}
issue fields: title + description (required), acceptance_criteria,
files_to_create / files_to_modify, testing_strategy, needs_deeper_qa
(routes through QA + reviewer + synthesizer), estimated_complexity, name.
additional_context (top-level) is appended to the description.
config keys (full schema: swe_af/issue/schemas.py):
| Key | Default | Description |
|---|---|---|
runtime / models | as in build | Same runtime + flat role map; valid role keys: default, coder, code_reviewer, qa, qa_synthesizer, verifier, git |
max_coding_iterations | 3 | Inner-loop budget (the feature-level default is 5) |
verify | true | One verifier pass against the acceptance criteria |
enable_github_pr | false | Push the branch and open a PR (needs an origin remote) |
agent_timeout_seconds | 1800 | Per-agent timeout |
agent_max_turns | 50 | Tool-use turn budget per agent |
keep_worktree | false | Leave the worktree in place for debugging |
Notes for main-harness authors:
repo_path must be a checkout the SWE-AF node can reach (same machine, or
the shared workspaces volume in the Docker setup) with at least one commit.success: false) so
the caller can triage; a build that produced no commits deletes its branch
and returns branch: "".swe-fast.implement_issue, and on the Go
implementation under those same node ids.A ready-made Claude Code skill for this flow ships in
.claude/skills/delegate-issue/.
Core async endpoints (returns an execution_id immediately):
# Full build: plan -> execute -> verify
POST /api/v1/execute/async/swe-planner.build
# Issue-level build (sub-harness entry): coding loop only, no planning
POST /api/v1/execute/async/swe-planner.implement_issue
# Plan only
POST /api/v1/execute/async/swe-planner.plan
# Execute a prebuilt plan
POST /api/v1/execute/async/swe-planner.execute
# Resume after interruption
POST /api/v1/execute/async/swe-planner.resume_build
Monitoring:
curl http://localhost:8080/api/v1/executions/<execution_id>
Every specialist is also callable directly:
POST /api/v1/execute/async/swe-planner.<agent>
| Agent | In -> Out |
|---|---|
run_product_manager | goal -> PRD |
run_architect | PRD -> architecture |
run_tech_lead | architecture -> review |
run_sprint_planner | architecture -> issue DAG |
run_issue_writer | issue spec -> detailed issue |
run_coder | issue + worktree -> code + tests + commit |
run_qa | worktree -> test results |
run_code_reviewer | worktree -> quality/security review |
run_qa_synthesizer | QA + review -> FIX / APPROVE / BLOCK |
run_issue_advisor | failure context -> adapt / split / accept / escalate |
run_replanner | build state + failures -> restructured plan |
run_merger | branches -> merged output |
run_integration_tester | merged repo -> integration results |
run_verifier | repo + PRD -> acceptance pass/fail |
generate_fix_issues | failed criteria -> targeted fix issues |
run_github_pr | branch -> push + PR |
Pass config to build or execute. Full schema: swe_af/execution/schemas.py
| Key | Default | Description |
|---|---|---|
runtime | "claude_code" | Model runtime: "claude_code", "open_code", or "codex". The default also honors the SWE_DEFAULT_RUNTIME env var when no runtime is passed in config โ set it on the deployment so callers don't need to plumb a config through. |
models | null | Flat role-model map (default + role keys below). Without a caller-supplied value, the SWE_DEFAULT_MODEL env var is used as the default for all roles โ set it on the deployment to pin a model without code changes. Caller models.default or per-role keys still win. |
max_coding_iterations | 5 | Inner-loop retry budget |
max_advisor_invocations | 2 | Middle-loop advisor budget |
max_replans | 2 | Build-level replanning budget |
enable_issue_advisor | true | Enable issue adaptation |
enable_replanning | true | Enable global replanning |
enable_learning | false | Enable cross-issue shared memory (continual learning) |
agent_timeout_seconds | 2700 | Per-agent timeout |
agent_max_turns | 150 | Tool-use turn budget |
models supports:
defaultpm, architect, tech_lead, sprint_plannercoder, qa, code_reviewer, qa_synthesizerreplan, retry_advisor, issue_writer, issue_advisorverifier, git, merger, integration_testerruntime defaults < models.default < models.<role>
Minimal:
{
"runtime": "claude_code"
}
Codex:
{
"runtime": "codex",
"models": {
"default": "gpt-5.3-codex"
}
}
Fully customized:
{
"runtime": "open_code",
"models": {
"default": "openrouter/minimax/minimax-m2.5",
"pm": "openrouter/qwen/qwen-2.5-72b-instruct",
"architect": "openrouter/qwen/qwen-2.5-72b-instruct",
"coder": "openrouter/deepseek/deepseek-chat",
"qa": "openrouter/deepseek/deepseek-chat",
"verifier": "openrouter/qwen/qwen-2.5-72b-instruct"
},
"max_coding_iterations": 6,
"enable_learning": true
}
.artifacts/
โโโ plan/ # PRD, architecture, issue specs
โโโ execution/ # checkpoints, per-issue logs, agent outputs
โโโ verification/ # acceptance criteria results
make test
make check
make clean
make clean-examples
docs/CONTRIBUTING.mdCODE_OF_CONDUCT.mdSECURITY.mdCHANGELOG.mdApache-2.0The node under go/ is what af install gives you, and it
registers under the same ids as everything above โ swe-planner and
swe-fast โ so no trigger, reasoner name, or API shape changes with it. The
repo-root manifest declares itself superseded_by //go, so
af install https://github.com/Agent-Field/SWE-AF lands there and replaces an
existing Python install in place, keeping its node-scoped secrets.
The Python implementation is unchanged and still what python -m swe_af and
the compose stack in docker-compose.yml run. Because the two now answer to
the same node ids, running both against one control plane needs an explicit
NODE_ID on one of them โ docker-compose.go.yml does that. See
go/README.md for build, run, and Docker instructions.
The Go node ships a prebuilt high-performance coding engine next to the classic coding loop. Whether it runs depends on how you got the node:
| How you run SWE-AF | Engine | To change it |
|---|---|---|
af install / AgentField Desktop | On by default โ go/agentfield-package.yaml declares SWE_PRO_ENGINE with default: "1", and the installer injects it | SWE_PRO_ENGINE=0 for the classic loop |
Clone, fork, docker-compose.go.yml, or a bare binary | Off โ nothing changes unless you ask for it | SWE_PRO_ENGINE=1 to opt in |
The gate is purely the environment variable; the manifest is simply what sets
it for you on an af install. With the engine on, builds route per-issue
coding through it โ everything else, including branch/push/PR, stays with the
standard pipeline. Turn it off and the node returns to the classic
coder โ reviewer/QA loop. Reasoner names and input/output shapes are identical
either way, so switching costs nothing but a restart.
If the binary isn't present or isn't runnable, the node logs a warning and keeps using the classic loop, so the flag is safe to leave on.
Tuning knobs (SWE_PRO_VARIANT, SWE_PRO_MAX_COST, SWE_PRO_PUBLIC_URL)
and the full env surface are documented in
go/docs/pro-engine.md.
SEC-AF โ AI-native security auditor. 250 agents per audit, 94% noise reduction, every finding proven exploitable.
Contract-AF โ Legal contract risk analyzer. Agents spawn agents at runtime. Adversarial review catches what solo LLMs miss.
SWE-AF is built on AgentField as a first step from single-agent harnesses to autonomous software engineering factories. See what else we're building โ
.claude/
skills/
delegate-issue/
SKILL.md
.dockerignore
.env.example
.github/
ISSUE_TEMPLATE/
bug_report.yml
config.yml
feature_request.yml
pull_request_template.md
workflows/
ci.yml
.gitignore
agentfield-package.yaml
assets/
archi.png
banner.jpg
CHANGELOG.md
CODE_OF_CONDUCT.md
CODEOWNERS
docker-compose.go.yml
docker-compose.local.yml
docker-compose.yml
Dockerfile
docs/
ARCHITECTURE.md
CONTRIBUTING.md
deployment.md
SKILL.md
examples/
agent-comparison/
claude-code-haiku/
claude-code-haiku-log.txt
coverage/
clover.xml
coverage-final.json
lcov-report/
base.css
block-navigation.js
favicon.png
index.html
prettify.css
prettify.js
sort-arrow-sprite.png
sorter.js
lcov.info
package.json
src/
cli.js
store.js
test/
store.test.js
claude-code-sonnet/
claude-code-sonnet-log.txt
.gitignore
cli.js
coverage/
clover.xml
coverage-final.json
lcov-report/
base.css
block-navigation.js
favicon.png
index.html
prettify.css
prettify.js
sort-arrow-sprite.png
sorter.js
todo.js.html
lcov.info
package.json
README.md
todo.js
todo.test.js
codex/
codex-log.txt
.gitignore
bin/
todo.js
coverage/
clover.xml
coverage-final.json
lcov-report/
base.css
block-navigation.js
favicon.png
index.html
prettify.css
prettify.js
sort-arrow-sprite.png
sorter.js
lcov.info
package.json
src/
cli.js
todoStore.js
test/
cli.test.js
swe-af-haiku/
.gitignore
cli.js
coverage/
clover.xml
coverage-final.json
lcov-report/
base.css
block-navigation.js
favicon.png
index.html
prettify.css
prettify.js
sort-arrow-sprite.png
sorter.js
lcov.info
lib/
commands.js
store.js
utils.js
package.json
tests/
acceptance/
add-command.test.js
cli-entry.test.js
complete-command.test.js
concurrent-operations.test.js
data-persistence.test.js
delete-command.test.js
edge-cases.test.js
list-command.test.js
integration/
cli.test.js
cross-feature-interactions.test.js
smoke/
integration.test.js
unit/
commands.test.js
store.test.js
utils.test.js
swe-af-minimax/
diagrams/
.artifacts/
execution/
checkpoint.json
iterations/
app-module.json
ascii-renderer.json
cli-module.json
documentation-and-polish.json
error-module.json
final-acceptance-verification.json
integration-tests-reorganize.json
integration-tests.json
layout-module.json
lexer-module.json
parser-module.json
project-scaffold.json
smoke-test-core-components.json
svg-renderer.json
types-module.json
validator-module.json
logs/
architect.jsonl
coder_app-module_iter_1.jsonl
coder_app-module_iter_2.jsonl
coder_ascii-renderer_iter_1.jsonl
coder_cli-module_iter_1.jsonl
coder_documentation-and-polish_iter_1.jsonl
coder_documentation-and-polish_iter_2.jsonl
coder_error-module_iter_1.jsonl
coder_final-acceptance-verification_iter_1.jsonl
coder_final-acceptance-verification_iter_2.jsonl
coder_final-acceptance-verification_iter_3.jsonl
coder_integration-tests_iter_1.jsonl
coder_integration-tests_iter_2.jsonl
coder_integration-tests-reorganize_iter_1.jsonl
coder_integration-tests-reorganize_iter_2.jsonl
coder_integration-tests-reorganize_iter_3.jsonl
coder_integration-tests-reorganize_iter_3.jsonl_backup
coder_integration-tests-reorganize_iter_4.jsonl
coder_integration-tests-reorganize_iter_5.jsonl
coder_layout-module_iter_1.jsonl
coder_lexer-module_iter_1.jsonl
coder_parser-module_iter_1.jsonl
coder_project-scaffold_iter_1.jsonl
coder_project-scaffold_iter_2.jsonl
coder_project-scaffold_iter_3.jsonl
coder_smoke-test-core-components_iter_1.jsonl
coder_svg-renderer_iter_1.jsonl
coder_types-module_iter_1.jsonl
coder_validator-module_iter_1.jsonl
integration_tester_level_0.jsonl
integration_tester_level_2.jsonl
integration_tester_level_3.jsonl
integration_tester_level_5.jsonl
issue_advisor_documentation-and-polish_1.jsonl
issue_advisor_integration-tests_1.jsonl
issue_advisor_integration-tests-reorganize_1.jsonl
issue_advisor_integration-tests-reorganize_2.jsonl
issue_advisor_project-scaffold_1.jsonl
issue_writer_app-module.jsonl
issue_writer_ascii-renderer.jsonl
issue_writer_cli-module.jsonl
issue_writer_documentation-and-polish.jsonl
issue_writer_error-module.jsonl
issue_writer_final-acceptance-verification.jsonl
issue_writer_integration-tests-reorganize.jsonl
issue_writer_integration-tests.jsonl
issue_writer_layout-module.jsonl
issue_writer_lexer-module.jsonl
issue_writer_parser-module.jsonl
issue_writer_project-scaffold.jsonl
issue_writer_smoke-test-core-components.jsonl
issue_writer_svg-renderer.jsonl
issue_writer_types-module.jsonl
issue_writer_validator-module.jsonl
merger_level_0.jsonl
merger_level_1.jsonl
merger_level_2.jsonl
merger_level_3.jsonl
merger_level_4.jsonl
merger_level_5.jsonl
merger_level_6.jsonl
merger_level_7.jsonl
product_manager.jsonl
qa_app-module_iter_8216949a.jsonl
qa_app-module_iter_c106435e.jsonl
qa_ascii-renderer_iter_fc338177.jsonl
qa_cli-module_iter_ad7f2057.jsonl
qa_documentation-and-polish_iter_0d9c9c5d.jsonl
qa_error-module_iter_5e7c9fcc.jsonl
qa_final-acceptance-verification_iter_85f28a4b.jsonl
qa_final-acceptance-verification_iter_cafb0856.jsonl
qa_final-acceptance-verification_iter_cf64e5c5.jsonl
qa_integration-tests_iter_99ea7272.jsonl
qa_integration-tests_iter_afcf9773.jsonl
qa_integration-tests-reorganize_iter_0e45a617.jsonl
qa_integration-tests-reorganize_iter_14ac3dc3.jsonl
qa_integration-tests-reorganize_iter_3c31320c.jsonl
qa_integration-tests-reorganize_iter_6778f9db.jsonl
qa_integration-tests-reorganize_iter_8a5764fc.jsonl
qa_integration-tests-reorganize_iter_8a5764fc.jsonl_backup
qa_layout-module_iter_0e58246e.jsonl
qa_lexer-module_iter_ada67f56.jsonl
qa_parser-module_iter_c973a78c.jsonl
qa_project-scaffold_iter_0ccbc2eb.jsonl
qa_project-scaffold_iter_2ca6d2c8.jsonl
qa_smoke-test-core-components_iter_ed649a92.jsonl
qa_svg-renderer_iter_6bae9210.jsonl
qa_types-module_iter_eeb4c3f8.jsonl
qa_validator-module_iter_c76dce00.jsonl
replanner_0_raw_0.txt
replanner_0.jsonl
reviewer_app-module_iter_8216949a.jsonl
reviewer_app-module_iter_c106435e.jsonl
reviewer_ascii-renderer_iter_fc338177.jsonl
reviewer_cli-module_iter_ad7f2057.jsonl
reviewer_documentation-and-polish_iter_0d9c9c5d.jsonl
reviewer_error-module_iter_5e7c9fcc.jsonl
reviewer_final-acceptance-verification_iter_85f28a4b.jsonl
reviewer_final-acceptance-verification_iter_cafb0856.jsonl
reviewer_final-acceptance-verification_iter_cf64e5c5.jsonl
reviewer_integration-tests_iter_99ea7272.jsonl
reviewer_integration-tests_iter_afcf9773.jsonl
reviewer_integration-tests-reorganize_iter_0e45a617.jsonl
reviewer_integration-tests-reorganize_iter_14ac3dc3.jsonl
reviewer_integration-tests-reorganize_iter_3c31320c.jsonl
reviewer_integration-tests-reorganize_iter_6778f9db.jsonl
reviewer_integration-tests-reorganize_iter_8a5764fc.jsonl
reviewer_layout-module_iter_0e58246e.jsonl
reviewer_lexer-module_iter_ada67f56.jsonl
reviewer_parser-module_iter_c973a78c.jsonl
reviewer_project-scaffold_iter_0ccbc2eb.jsonl
reviewer_project-scaffold_iter_2ca6d2c8.jsonl
reviewer_smoke-test-core-components_iter_ed649a92.jsonl
reviewer_svg-renderer_iter_6bae9210.jsonl
reviewer_types-module_iter_eeb4c3f8.jsonl
reviewer_validator-module_iter_c76dce00.jsonl
sprint_planner.jsonl
synthesizer_app-module_iter_8216949a.jsonl
synthesizer_app-module_iter_c106435e.jsonl
synthesizer_ascii-renderer_iter_fc338177.jsonl
synthesizer_cli-module_iter_ad7f2057.jsonl
synthesizer_documentation-and-polish_iter_0d9c9c5d.jsonl
synthesizer_error-module_iter_5e7c9fcc.jsonl
synthesizer_final-acceptance-verification_iter_85f28a4b.jsonl
synthesizer_final-acceptance-verification_iter_cafb0856.jsonl
synthesizer_final-acceptance-verification_iter_cf64e5c5.jsonl
synthesizer_integration-tests_iter_99ea7272.jsonl
synthesizer_integration-tests_iter_afcf9773.jsonl
synthesizer_integration-tests-reorganize_iter_0e45a617.jsonl
synthesizer_integration-tests-reorganize_iter_14ac3dc3.jsonl
synthesizer_integration-tests-reorganize_iter_3c31320c.jsonl
synthesizer_integration-tests-reorganize_iter_6778f9db.jsonl
synthesizer_integration-tests-reorganize_iter_8a5764fc.jsonl
synthesizer_layout-module_iter_0e58246e.jsonl
synthesizer_lexer-module_iter_ada67f56.jsonl
synthesizer_parser-module_iter_c973a78c.jsonl
synthesizer_project-scaffold_iter_0ccbc2eb.jsonl
synthesizer_project-scaffold_iter_2ca6d2c8.jsonl
synthesizer_smoke-test-core-components_iter_ed649a92.jsonl
synthesizer_svg-renderer_iter_6bae9210.jsonl
synthesizer_types-module_iter_eeb4c3f8.jsonl
synthesizer_validator-module_iter_c76dce00.jsonl
tech_lead.jsonl
workspace_cleanup_level_0.jsonl
workspace_cleanup_level_1.jsonl
workspace_cleanup_level_2.jsonl
workspace_cleanup_level_3.jsonl
workspace_cleanup_level_4.jsonl
workspace_cleanup_level_5.jsonl
workspace_cleanup_level_6.jsonl
workspace_cleanup_level_7.jsonl
workspace_cleanup_level_9.jsonl
workspace_setup_level_0.jsonl
workspace_setup_level_1.jsonl
workspace_setup_level_2.jsonl
workspace_setup_level_3.jsonl
workspace_setup_level_4.jsonl
workspace_setup_level_5.jsonl
workspace_setup_level_6.jsonl
workspace_setup_level_7.jsonl
plan/
architecture.md
issues/
issue-01-project-scaffold.md
issue-02-types-module.md
issue-03-error-module.md
issue-04-layout-module.md
issue-05-lexer-module.md
issue-06-validator-module.md
issue-07-svg-renderer.md
issue-08-ascii-renderer.md
issue-09-parser-module.md
issue-10-smoke-test-core-components.md
issue-11-app-module.md
issue-12-cli-module.md
issue-13-integration-tests.md
issue-14-documentation-and-polish.md
issue-15-final-acceptance-verification.md
issue-16-integration-tests-reorganize.md
prd.md
review.md
rationale.md
.gitignore
analyze_bi.py
analyze_pipeline.py
analyze_v2.py
Cargo.lock
Cargo.toml
charts/
01_cost_allocation.png
01_cost_allocation.svg
02_time_allocation.png
02_time_allocation.svg
03_burn_rate.png
03_burn_rate.svg
04_parallelism.png
04_parallelism.svg
05_cost_efficiency.png
05_cost_efficiency.svg
06_time_heatmap.png
06_time_heatmap.svg
07_cost_heatmap.png
07_cost_heatmap.svg
08_duration_violin.png
08_duration_violin.svg
09_effort_scatter.png
09_effort_scatter.svg
10_pipeline_flow.png
10_pipeline_flow.svg
11_parallelism_ratio.png
11_parallelism_ratio.svg
12_issue_ranking.png
12_issue_ranking.svg
13_rework.png
13_rework.svg
14_dashboard.png
14_dashboard.svg
README.md
render_charts.js
src/
app.rs
ascii.rs
cli.rs
error.rs
layout.rs
lexer.rs
lib.rs
main.rs
parser.rs
svg.rs
types.rs
validator.rs
test_examples/
01_basic.dsl
02_microservices.dsl
03_data_pipeline.dsl
04_comments_only.dsl
... 1483 moreFAQ
swe-af is a Claude Code plugin with 1 hand-picked skill for automation work, indexed on Flowy. Install it with the command on its page. It includes delegate-issue. Its skills do not fire on their own yet. Request auto-invocation to have Flowy route them as you prompt. Free and open source.