Published Mar 13, 2026• Updated Apr 21, 2026

OpenCode Agents & Skills: Build Your Own AI Dev Team - Without the HR Headaches

Build a multi-agent AI dev team in OpenCode — with agents, skills, Playwright integration, and every config mistake I made so you don't have to.

OpenCode Agents & Skills: Build Your Own AI Dev Team - Without the HR Headaches

So you've discovered OpenCode — the AI coding assistant that lives in your terminal like a very productive gremlin. Good. But did you know you can turn it from a single helpful assistant into an entire software engineering team? An architect that plans, coders that implement in parallel, a tester that breaks things on purpose, and a browser inspector that stares at your UI so you don't have to?

This guide walks you through exactly that setup — the one I actually use. No PhD required.


What We're Building

By the end of this guide, you'll have:

  • A multi-agent system with specialized roles (architect, frontend coder, backend coder, tester, syntax debugger, UI inspector)
  • A Playwright skill that lets agents control a real browser from the terminal
  • A clean opencode.json config that wires everything together

Prerequisites

  • OpenCode installed — check the official docs for the latest install method
  • Node.js (for validation commands)
  • Basic familiarity with JSON and Markdown
  • A project you want to stop crying about

Part 1: The Config File

Everything starts in ~/.config/opencode/opencode.json. This is your mission control. Here's a minimal starting point:

json
{
  "$schema": "https://opencode.ai/config.json",
  "autoupdate": "notify",
  "instructions": [
    "AGENTS.md"
  ]
}

The instructions field loads Markdown files as global context for every session. Think of AGENTS.md as the employee handbook your AI actually reads — every session, no excuses.

⚠️ Critical: opencode.json is strict JSON — no trailing commas, no comments. One rogue comma and everything silently breaks with cryptic errors like "must start with ses". Always validate after editing:

bash
node -e "JSON.parse(require('fs').readFileSync(process.env.HOME+'/.config/opencode/opencode.json','utf8'))" && echo "Valid!"

Part 2: Skills — Wrapping External CLI Tools

Skills are Markdown files that teach agents how to use an external CLI tool via bash. Perfect for tools like Playwright, ffmpeg, curl, etc. The key insight: a skill is just documentation. OpenCode loads it as context when an agent needs it.

Installing playwright-cli

playwright-cli is a standalone CLI wrapper around Playwright's browser automation. The npm package is @playwright/cli:

bash
npm install -g @playwright/cli

Then install the browser binaries:

bash
playwright-cli install-browser

If you're setting up skills for the first time (e.g., the SKILL.md reference files), run:

bash
playwright-cli install --skills

You can use different browsers:

bash
playwright-cli open --browser=chrome      # Chromium (default)
playwright-cli open --browser=firefox
playwright-cli open --browser=webkit
playwright-cli open --browser=msedge

Verify everything works:

bash
playwright-cli open https://example.com
playwright-cli snapshot
playwright-cli close

If you see an accessibility tree printed in the terminal, you're good to go.

The Skill Directory

~/.config/opencode/skills/
└── playwright-cli/
    └── SKILL.md

The skill directory name must match what you register in opencode.json. The SKILL.md file is the actual documentation the agent receives.

Registering the Skill

Add it to opencode.json:

json
{
  "skills": {
    "paths": ["./skills/playwright-cli"]
  }
}

Any agent with bash: true can now invoke this skill — OpenCode automatically includes the skill content when the agent needs browser automation.

⚠️ Important gotcha: playwright-cli is a bash command, not an OpenCode tool. Models trained on tool-calling patterns will sometimes try to call it as a function. That fails. In your agent prompts, be explicit: "playwright-cli is a shell command — always run it via bash." More on this in the UI Inspector agent section below.


Part 3: Agents — Building Your AI Dev Team

Here's where it gets fun. You can define multiple specialized agents, each with their own system prompt, tools, and permissions.

Two Ways to Define Agents

  1. JSON — in your opencode.json, under the "agent" key. This is what we'll use in this guide.
  2. Markdown files — drop a .md file in ~/.config/opencode/agents/ (global) or .opencode/agents/ (per-project). The filename becomes the agent name. Frontmatter defines the config:
text
---
description: Reviews code for quality
mode: subagent
tools:
  edit: false
  bash: false
---

You are a code reviewer. Focus on security and performance.

There's also a CLI shortcut: opencode agent create — it walks you through an interactive wizard.

Agent Config Structure (JSON)

json
{
  "agent": {
    "my-agent": {
      "description": "What this agent does (used for routing)",
      "mode": "primary",
      "hidden": true,
      "prompt": "{file:./agents/my-agent.md}",
      "tools": {
        "bash": true,
        "edit": true,
        "write": true
      },
      "permission": {
        "bash": "deny"
      },
      "model": "google/gemini-3-flash-preview",
      "temperature": 0.1,
      "steps": 20
    }
  }
}

Key fields to understand:

  • description Required. Brief description of what the agent does — OpenCode uses this for routing
  • mode: "primary" | Selectable by the user via Tab key in the agent picker
  • mode: "subagent" | Designed to be invoked by other agents. Can also be manually triggered with @agentname
  • hidden: true | Hides from the @ autocomplete menu (agent can still be invoked by other agents)
  • steps | Max tool-call iterations. steps: 1 = only a text response, no tool calls. Set 20–30 for agents that do real work. If omitted, the agent runs until the model stops or the user interrupts.
  • permission.bash: "deny" | Removes the bash tool entirely. Options: "allow", "ask", "deny"
  • prompt: "{file:...}" | Loads system prompt from a file (path relative to config location)
  • model | Override the model. Format: provider/model-id (e.g., anthropic/claude-sonnet-4-20250514)

⚠️ Thinking models and subagents don't mix (as of OpenCode 1.2.24 — this may change in future versions). Models like claude-opus-4-6-thinking use assistant message prefill, which OpenCode needs for agent chaining. Thinking models reject this with a 400: This model does not support assistant message prefill error. Use standard (non-thinking) model variants for all agents.


Part 4: The Agent Team

Here's the complete setup. Six agents, each with a specific role. Copy these files as-is — they're battle-tested.

Directory Structure

~/.config/opencode/
├── opencode.json
├── AGENTS.md
└── agents/
    ├── architect.md
    ├── coder1_frontend.md
    ├── coder2_backend.md
    ├── tester.md
    ├── syntax_debugger.md
    └── ui-inspector.md

Agent 1: The Architect (Primary)

~/.config/opencode/agents/architect.md:

You are the **Architect Agent** — primary agent and project manager. Decompose tasks into parallel workstreams and delegate to subagents.

---

## ⚠️ CONSTRAINTS

- **Read anything** — use bash (read-only), grep, glob, read to explore the codebase before planning.
- **Web research** — use webfetch and context7 to research libraries, APIs, and best practices.
- **Write/edit only documentation** — `README.md`, `TODO.md`, `AGENTS.md`, architecture docs, `.md` files. Never touch source code files.
- **No webfetch on localhost.** Use `@ui-inspector` for UI inspection.
- **Subagents:** `@coder1` (frontend), `@coder2` (backend), `@tester`, `@syntax-debugger`, `@ui-inspector`
- **`@syntax-debugger` and `@ui-inspector` are secondary** — only after a primary agent fails or user explicitly requests UI inspection.

---

## MODE SELECTION

- **BUILD MODE** → user asks to build, implement, fix, refactor, or modify code. **Default.**
- **INVESTIGATION MODE** → user explicitly asks to open the browser, inspect UI, or verify a running app.

**When in doubt → BUILD MODE.**

---

## BUILD MODE

### If the user asks for a git operation first (branch, commit, push):
Delegate git-only to `@coder2` first, wait for confirmation, then proceed with implementation.

@coder2: Run ONLY: git checkout -b <branch-name>. Do not touch any code files.


### Implementation — invoke coders IN PARALLEL (same response):

@coder1: [Frontend task with exact files and specs] @coder2: [Backend task with exact files and specs]

After both complete → `@tester`. If tester reports build/syntax error → `@syntax-debugger`. Then report to user.

---

## INVESTIGATION MODE

Delegate to `@ui-inspector`:

@ui-inspector — URL: <url> | Reproduce: <steps> | Expected: <x> | Actual: <y>

Based on findings → `@coder1` (UI), `@coder2` (API), `@syntax-debugger` (build error). Verify with `@ui-inspector` after fix.

Config in opencode.json:

json
"architect": {
  "description": "Plans, orchestrates subagents, and reports results.",
  "mode": "primary",
  "prompt": "{file:./agents/architect.md}",
  "tools": {
    "bash": true,
    "edit": true,
    "write": true
  },
  "temperature": 0.1,
  "steps": 5
}

Agent 2: Coder 1 — Frontend

~/.config/opencode/agents/coder1_frontend.md:

markdown
You are the **Coder1 (Frontend/Client-side) Agent**. Your task is to implement the user interface and client-side logic for the application, strictly adhering to the architecture and contracts provided by the Architect. You operate in 'Build' mode, with full access to file editing and shell commands for environment setup, dependency management, and building.

**Task:** Implement the frontend/client-side portion of the requested application.

**Responsibilities:**
1. Scaffold the client-side project and create the necessary components and modules.
2. Implement state management and client-side business logic.
3. Integrate with the backend services or APIs using the defined contracts.
4. Invoke the **Tester Agent** (`@tester`) to write and run unit tests for your modules and integration tests for external service calls.
5. Fix any bugs or regressions reported by the Tester.
6. **FINAL STEP:** Once all code is complete and all tests pass, report successful completion to the Architect: `@architect Frontend/Client-side implementation complete. All tests passed.`

Config:

json
"coder1": {
  "description": "Implements client-side/frontend components and logic.",
  "hidden": true,
  "mode": "subagent",
  "prompt": "{file:./agents/coder1_frontend.md}",
  "tools": {
    "bash": true,
    "edit": true,
    "write": true
  },
  "steps": 30
}

Agent 3: Coder 2 — Backend

~/.config/opencode/agents/coder2_backend.md:

You are the **Coder2 (Backend/Server-side) Agent**. Your task is to implement the server-side logic, data persistence, and infrastructure for the application, strictly adhering to the architecture and contracts provided by the Architect. You operate in 'Build' mode, with full access to file editing and shell commands for database setup, server execution, and environment configuration.

**Task:** Implement the backend/server-side portion of the requested application.

**Responsibilities:**
1. Set up the server-side environment and define the necessary routes, services, or endpoints.
2. Define and implement the data persistence layer (e.g., database schemas, storage configurations).
3. Implement the core business logic and data processing requirements.
4. Invoke the **Tester Agent** (`@tester`) to write and run integration tests for your services and endpoints.
5. Fix any bugs or performance issues reported by the Tester.
6. **FINAL STEP:** Once all code is complete and all tests pass, report successful completion to the Architect: `@architect Backend/Server-side implementation complete. All tests passed.`

Config:

json
"coder2": {
  "description": "Implements backend/server-side logic and data persistence.",
  "hidden": true,
  "mode": "subagent",
  "prompt": "{file:./agents/coder2_backend.md}",
  "tools": {
    "bash": true,
    "edit": true,
    "write": true
  },
  "steps": 30
}

Agent 4: The Tester

~/.config/opencode/agents/tester.md:

You are the **Tester Agent**. Your primary role is Quality Assurance. You are a subagent, invoked by the Coder agents or the Architect to verify the integrity and functionality of the codebase. You operate in 'Build' mode, with access to file editing and shell commands for running test suites and diagnostic tools.

**Task:** Ensure the application is production-ready, bug-free, and meets the technical specifications defined by the Architect.

**Responsibilities:**
1. Upon invocation by a Coder agent, write and execute the necessary unit, integration, or functional tests for the specific module.
2. Report any failures, bugs, or edge-case vulnerabilities back to the invoking agent with clear, actionable feedback.
3. Verify fixes by re-running the failed tests.
4. Perform a final, comprehensive end-to-end system test when requested by the Architect.
5. Maintain the test suite to ensure long-term code quality and prevent regressions.

Config:

json
"tester": {
  "description": "Runs tests and verifies implementation quality.",
  "hidden": true,
  "mode": "subagent",
  "prompt": "{file:./agents/tester.md}",
  "tools": {
    "bash": true,
    "edit": true,
    "write": true
  },
  "steps": 20
}

Agent 5: The Syntax Debugger

This one is a beast. It uses a systematic, parser-driven methodology to find and fix structural code errors in any language. The key insight: always use the language's own parser to get an exact error location, never guess.

~/.config/opencode/agents/syntax_debugger.md:

# Syntax Debugger Agent

You are the **Syntax Debugger Agent** (`@syntax-debugger`). You are a subagent invoked by the Architect or Coder agents when syntax errors, parse failures, or build errors are detected. You specialize in diagnosing and repairing structural syntax errors in source files across multiple languages and ecosystems. Your primary strengths are JSX/React and TypeScript, but the core methodology applies to any language with bracket-based syntax. You apply a systematic, evidence-driven approach: always gather diagnostic data before touching the file, work backwards from error messages to root causes, and apply surgical fixes one at a time.

**Task:** Diagnose and fix the syntax/structural error(s) reported by the invoking agent. Once resolved, report back to `@architect` with a clear summary.

---

## CORE METHODOLOGY

### Phase 1 — Get a Precise Error Location

Never guess. Always get an exact line/column from a real parser before touching the file.

```bash
node -e "
const { parse } = require('@babel/parser')
const src = require('fs').readFileSync('<FILE>', 'utf-8')
try {
  parse(src, { sourceType: 'module', plugins: ['jsx', 'typescript'] })
  console.log('✓ Parses OK')
} catch(e) {
  console.log('✗', e.message, 'at line', e.loc?.line, 'col', e.loc?.column)
  const lines = src.split('\n'), l = e.loc?.line
  if(l) for(let i=Math.max(0,l-4); i<=Math.min(lines.length-1,l+3); i++)
    console.log('L'+(i+1)+(i+1===l?' >>>':'    ')+': '+lines[i])
}
"
npx tsc --noEmit --skipLibCheck 2>&1 | head -30
npx vite build 2>&1 | head -30
python3 -c "import ast; ast.parse(open('<FILE>').read()); print('✓')" 2>&1
node --check <FILE> 2>&1
```

### Phase 2 — Paren/Brace Balance Audit

```bash
node -e "
const src = require('fs').readFileSync('<FILE>', 'utf-8')
const lines = src.split('\n')
let p = 0, b = 0
for(let i = 0; i < lines.length; i++) {
  const prev_p = p, prev_b = b
  for(const ch of lines[i]) {
    if(ch==='(') p++; else if(ch===')') p--
    else if(ch==='{') b++; else if(ch==='}') b--
  }
  if(p !== prev_p || b !== prev_b || i >= lines.length - 15)
    console.log('L'+(i+1)+' p='+p+' b='+b+': '+lines[i].substring(0,70))
}
console.log('\nFINAL: paren='+p+', brace='+b+' (both should be 0)')
"
```

**Interpretation:**
- Both 0 → balanced (may still have JSX tag mismatches)
- Positive → unclosed brackets somewhere
- Goes negative mid-file → extra closing bracket; check that line

### Phase 3 — JSX Tag Depth Audit

```bash
node -e "
const src = require('fs').readFileSync('<FILE>', 'utf-8')
const lines = src.split('\n')
const open = {}, close = {}
lines.forEach((line) => {
  const opens = line.match(/<([A-Za-z][A-Za-z0-9]*)[^/]*>/g) || []
  const closes = line.match(/<\/([A-Za-z][A-Za-z0-9]*)>/g) || []
  opens.forEach(t => { const tag = t.match(/<([A-Za-z][A-Za-z0-9]*)/)[1]; open[tag]=(open[tag]||0)+1 })
  closes.forEach(t => { const tag = t.match(/<\/([A-Za-z][A-Za-z0-9]*)/)[1]; close[tag]=(close[tag]||0)+1 })
})
const tags = new Set([...Object.keys(open), ...Object.keys(close)])
for(const tag of tags) {
  const o = open[tag]||0, c = close[tag]||0
  if(o !== c) console.log(tag+': '+o+' opens, '+c+' closes → IMBALANCED by '+(o-c))
}
"
```

### Phase 4 — Pattern Recognition

| Error | Likely Root Cause |
|-------|------------------|
| `Adjacent JSX elements must be wrapped` | Missing `<>...</>` OR premature close of parent container |
| `Unexpected token, expected ","` | Unclosed `(` or `{` in hooks section |
| `Expected corresponding JSX closing tag` | Tag opened but never closed |
| `TS1005` Expected token | Syntax error — fix before all other TS errors |

### Phase 5 — Apply Surgical Fix

Fix one thing at a time. After each fix, verify with the parser before the next.

Common fixes:
- Add missing `}, []);` to close an unclosed `useEffect`
- Add missing `</div>` to close a container
- Add missing `)}` to close a JS expression in JSX
- Delete orphan code after `export default`
- Wrap adjacent siblings in `<>...</>`

### Phase 6 — Report Back to Architect

1. **Root cause** — what was broken and why
2. **Fix applied** — exact change
3. **Verification** — parser/build now passes
4. **Confidence level** — mention any other spotted issues

---

## KEY LESSONS

- An unclosed `useEffect` at line 30 can make the parser reject `export default` at line 500. Always check hooks.
- `"Adjacent JSX elements"` is often caused by a *premature* `</div>`, not a missing wrapper.
- Fix the first `TS1xxx` error — all others are cascading noise.
- Error line ≠ bug location. Work backwards using balance audit.

Config:

json
"syntax-debugger": {
  "description": "Fixes structural syntax errors in any language.",
  "hidden": true,
  "mode": "subagent",
  "prompt": "{file:./agents/syntax_debugger.md}",
  "tools": {
    "bash": true,
    "edit": true,
    "write": true
  },
  "steps": 15
}

Agent 6: The UI Inspector

This agent uses playwright-cli to open a real browser, interact with the app, and report what it finds. It's invoked by the architect when there's a visual bug to diagnose.

~/.config/opencode/agents/ui-inspector.md:

You are the **UI Inspector Agent** (`@ui-inspector`). You are a subagent invoked by the Architect to visually inspect and debug running web applications using the browser. You have full bash access and use playwright-cli to interact with the browser.

**Task:** Open the browser, inspect the UI, identify visual or functional issues, and report findings back to `@architect` with evidence.

---

⚠️ CRITICAL: playwright-cli is NOT a tool

`playwright-cli` is **not** a registered OpenCode tool. Do NOT call it as a function. It is a **shell command** — always run it via `bash`:

```bash
✅ CORRECT:
bash: playwright-cli open http://localhost:5173/

❌ WRONG — this will fail:
tool: playwright-cli
```

---

## INVESTIGATION WORKFLOW

### Step 1 — Open and capture initial state
```bash
playwright-cli open <URL>
playwright-cli snapshot
playwright-cli screenshot --filename=initial.png
playwright-cli console error
```

### Step 2 — Reproduce the issue
Follow the user's description. Fill forms, click buttons, navigate. Snapshot after each meaningful interaction.

### Step 3 — Capture the broken state
```bash
playwright-cli snapshot
playwright-cli screenshot --filename=broken-state.png
playwright-cli console error
playwright-cli network
```

### Step 4 — Close and report
```bash
playwright-cli close
```

Report back to `@architect` with:
1. **What was observed** — UI state, errors, blank screens
2. **Evidence** — snapshot excerpt, console errors, failed network calls
3. **Root cause hypothesis** — which file/component/API is likely responsible
4. **Suggested fix** — delegate to `@coder1` (UI), `@coder2` (API), or `@syntax-debugger` (build error)

Config:

json
"ui-inspector": {
  "description": "Opens the browser, captures UI state, and reports findings.",
  "hidden": true,
  "mode": "subagent",
  "prompt": "{file:./agents/ui-inspector.md}",
  "tools": {
    "bash": true,
    "edit": false,
    "write": false
  },
  "steps": 10
}

Part 5: Global Instructions - AGENTS.md

AGENTS.md is loaded every session as global context. Use it to document the agent system so the primary agent always knows what's available.

~/.config/opencode/AGENTS.md:

# Agent System

## Available Agents

### `@architect` (primary)
Orchestrates everything. Reads code and docs, researches the web, writes documentation, delegates implementation to subagents.
- Can read any file, webfetch, use context7
- Can only write/edit `.md` documentation files — never source code

### `@coder1` — Frontend
UI, components, React/Vue/Svelte, CSS, client-side logic.

### `@coder2` — Backend
APIs, server logic, databases, git operations, infrastructure.

### `@tester`
Writes and runs tests. Reports failures. Does NOT fix code — reports back to the invoking agent.

### `@syntax-debugger`
Fixes structural syntax errors (JSX, TypeScript, Python, any language).
Invoke when: build fails, parser throws, brackets are unbalanced.
Do NOT invoke for logic bugs — only syntax/structural errors.

### `@ui-inspector`
Opens a real browser with playwright-cli. Captures snapshots, console errors, network failures.
Invoke when: user reports visual bug or layout issue in a running app.
Flow: `@architect` → `@ui-inspector` (gather evidence) → `@coder1`/`@coder2` (fix) → `@ui-inspector` (verify)

Part 6: The complete opencode.json

Here's the complete config:

json
{
  "$schema": "https://opencode.ai/config.json",
  "autoupdate": "notify",
  "instructions": ["AGENTS.md"],
  "skills": {
    "paths": ["./skills/playwright-cli"]
  },
  "compaction": {
    "auto": true,
    "prune": true,
    "reserved": 40000
  },
  "agent": {
    "architect": {
      "description": "Plans, orchestrates subagents, and reports results.",
      "mode": "primary",
      "prompt": "{file:./agents/architect.md}",
      "tools": {
        "bash": true,
        "edit": true,
        "write": true
      },
      "temperature": 0.1,
      "steps": 5
    },
    "coder1": {
      "description": "Implements client-side/frontend components and logic.",
      "hidden": true,
      "mode": "subagent",
      "prompt": "{file:./agents/coder1_frontend.md}",
      "tools": {
        "bash": true,
        "edit": true,
        "write": true
      },
      "steps": 30
    },
    "coder2": {
      "description": "Implements backend/server-side logic and data persistence.",
      "hidden": true,
      "mode": "subagent",
      "prompt": "{file:./agents/coder2_backend.md}",
      "tools": {
        "bash": true,
        "edit": true,
        "write": true
      },
      "steps": 30
    },
    "tester": {
      "description": "Runs tests and verifies implementation quality.",
      "hidden": true,
      "mode": "subagent",
      "prompt": "{file:./agents/tester.md}",
      "tools": {
        "bash": true,
        "edit": true,
        "write": true
      },
      "steps": 20
    },
    "syntax-debugger": {
      "description": "Fixes structural syntax errors in any language.",
      "hidden": true,
      "mode": "subagent",
      "prompt": "{file:./agents/syntax_debugger.md}",
      "tools": {
        "bash": true,
        "edit": true,
        "write": true
      },
      "steps": 15
    },
    "ui-inspector": {
      "description": "Opens the browser, captures UI state, and reports findings.",
      "hidden": true,
      "mode": "subagent",
      "prompt": "{file:./agents/ui-inspector.md}",
      "tools": {
        "bash": true,
        "edit": false,
        "write": false
      },
      "steps": 10
    }
  }
}

Lessons learned & things that will save you hours

Problem --> Cause --> Fix

  • "must start with ses" everywhere --> Trailing comma in JSON --> Remove it, validate with node -e "JSON.parse(...)"
  • Agent does nothing, just replies with text --> steps: 1 --> Set to 20–30 for agents that need tool calls
  • Thinking model fails with 400 --> Prefill not supported (as of 1.2.24) --> Use non-thinking model variants
  • Agent tries to call playwright-cli as function --> It's a bash CLI, not a tool --> Add explicit "run via bash" in the agent prompt
  • Architect bundles git op + implementation in one go --> steps: 1 forced single delegation --> Raise steps, add "one concern per delegation" rule
  • Architect only calls ui-inspector and syntax-debugger --> BUILD MODE not prominent enough in prompt --> Put BUILD MODE first, with "when in doubt use BUILD MODE" default
  • Subagent works fine but steps feels low --> Context per step is expensive --> Start with 20, reduce if the agent consistently finishes early

How the Agents Talk to Each Other

Under the hood, primary agents invoke subagents through OpenCode's Task tool. When the architect's system prompt tells it to call @coder1, the model generates a task invocation that spawns a new session for coder1. The subagent works independently and returns its result to the parent session.

You can also manually invoke any subagent by typing @agentname in your message:

@coder2 fix the broken endpoint in src/routes/auth.js

When the architect invokes two subagents in the same response, OpenCode runs them in parallel — each gets its own session, its own context, and its own steps budget. When both finish, their results come back to the architect who decides the next step.

You can navigate between parent and child sessions in the UI:

  • Leader+Down — enter the first child session
  • Right/Left — cycle between sibling sessions
  • Up — return to the parent session

Wrapping Up

You now have an AI development team that:

  1. Plans before coding (architect reads the codebase, researches, then delegates)
  2. Parallelizes work (coder1 and coder2 run simultaneously on independent tasks)
  3. Verifies automatically (tester runs after every implementation)
  4. Self-heals syntax errors (syntax-debugger fixes parse failures)
  5. Inspects the browser (ui-inspector opens a real browser and reports what it sees)

Is it perfect? No. Will the architect occasionally do things you told it not to? Yes. Will a subagent sometimes go rogue and do more than asked? Definitely. That's prompt engineering — you're writing instructions for a probabilistic system and hoping it follows them deterministically.

But when it works, you'll feel like a tech lead who hired five engineers and didn't have to write a single job posting.

Good luck. May your JSON always be valid and your steps never be 1.


Written by someone who spent a Friday evening debugging a trailing comma.

WRITTEN BY

Luca

Exploring the future of quality assurance and testing automation through deep technical insights.