447 lines
13 KiB
Markdown
447 lines
13 KiB
Markdown
# Module 4: Multi-Agent Orchestration
|
||
|
||
## Lesson 4.1: Why One Agent Is Not Enough
|
||
|
||
A single agent, no matter how smart, hits three ceilings:
|
||
|
||
1. **Context ceiling** — One agent doing everything means one context window holding everything. File contents, database schemas, business logic, deployment configs — it all competes for space.
|
||
|
||
2. **Capability ceiling** — A generalist agent is mediocre at everything. A specialized agent (backend dev, security reviewer, UI designer) outperforms the generalist at its domain.
|
||
|
||
3. **Reliability ceiling** — One agent failing = everything fails. Multi-agent systems degrade gracefully — one team's failure doesn't take down the whole system.
|
||
|
||
### The Stacking Insight
|
||
|
||
```
|
||
Single smart model < Two specialized agents < Orchestrator + 3 teams
|
||
```
|
||
|
||
Benchmarks measure single models. Production wins with multi-agent orchestration.
|
||
|
||
---
|
||
|
||
## Lesson 4.2: Orchestration Patterns
|
||
|
||
### Pattern 1: Dispatcher (Hub-and-Spoke)
|
||
|
||
```
|
||
User → Orchestrator → dispatches to:
|
||
├── Specialist A (parallel)
|
||
├── Specialist B (parallel)
|
||
└── Specialist C (parallel)
|
||
← synthesizes results
|
||
```
|
||
|
||
**Best for**: Tasks that need multiple perspectives or parallel work. The orchestrator doesn't work — it delegates, then synthesizes.
|
||
|
||
**Implementation**: `agent-team` extension. Teams defined in `teams.yaml`. Orchestrator uses `dispatch_agent` tool.
|
||
|
||
### Pattern 2: Pipeline (Sequential)
|
||
|
||
```
|
||
Step 1: Planner → Step 2: Builder (gets $INPUT=plan) → Step 3: Reviewer (gets $INPUT=code)
|
||
```
|
||
|
||
**Best for**: Workflows with clear stages where each depends on the previous.
|
||
|
||
**Implementation**: `agent-chain` extension. Pipelines in `agent-chain.yaml`. `$INPUT` carries forward, `$ORIGINAL` preserves user prompt.
|
||
|
||
### Pattern 3: Peer-to-Peer (Flat)
|
||
|
||
```
|
||
Agent A ←→ Agent B ←→ Agent C
|
||
(no orchestrator, all peers)
|
||
```
|
||
|
||
**Best for**: Cross-device work, heterogeneous model teams, flat information flow.
|
||
|
||
**Implementation**: `coms` / `coms-net` extensions. 4 tools: list, send, get, await.
|
||
|
||
---
|
||
|
||
## Lesson 4.2b: P-Threads — Parallel Agent Execution
|
||
|
||
**Concept**: Run N agents simultaneously on the same task. Each agent works independently. Pick the best result.
|
||
|
||
### Pattern
|
||
|
||
```
|
||
User prompt
|
||
│
|
||
├── Agent 1 (Claude Opus) ──► output_1
|
||
├── Agent 2 (Gemini Pro) ──► output_2
|
||
├── Agent 3 (DeepSeek V3) ──► output_3
|
||
└── Agent 4 (Qwen) ──► output_4
|
||
│
|
||
▼
|
||
Judge (or human) picks best
|
||
```
|
||
|
||
### When to Use P-Threads
|
||
- Creative work (UI generation, content writing, architecture design)
|
||
- Benchmarking (compare models side-by-side on same task)
|
||
- High-stakes decisions (multiple perspectives reduce blind spots)
|
||
- Exploration (try N approaches, pick the winner)
|
||
|
||
### Implementation with mprocs
|
||
|
||
```yaml
|
||
# mprocs-teams.yaml
|
||
procs:
|
||
claude-lead:
|
||
cmd: ["claude", "-p", "{{PROMPT}}"]
|
||
gemini:
|
||
cmd: ["gemini", "-p", "{{PROMPT}}"]
|
||
opencode:
|
||
cmd: ["opencode", "--model", "opencode-go/deepseek-v4-flash", "-p", "{{PROMPT}}"]
|
||
```
|
||
|
||
Run all three simultaneously, collect outputs, pick best.
|
||
|
||
### Implementation with agent-mux
|
||
|
||
Your Tauri UI (`agent-mux`) is a P-thread controller: it spawns agents into panes, monitors progress, and presents results for comparison.
|
||
|
||
### Key Design Rules
|
||
- Each agent gets the **same prompt** (fair comparison)
|
||
- Agents are **isolated** (no cross-contamination)
|
||
- Results are **collected and compared** by a judge or human
|
||
- Cost = N × single-agent cost (budget accordingly)
|
||
|
||
---
|
||
|
||
## Lesson 4.2c: F-Threads — Fusion (N Agents, One Winner)
|
||
|
||
**Concept**: N agents produce outputs. A synthetic judge (or rubric) selects the winner. More sophisticated than P-threads — includes evaluation.
|
||
|
||
### Pattern
|
||
|
||
```
|
||
Agent 1 ──► Output 1 ──┐
|
||
Agent 2 ──► Output 2 ──┤
|
||
Agent 3 ──► Output 3 ──┤──► Judge → Winner
|
||
Agent 4 ──► Output 4 ──┤
|
||
Agent 5 ──► Output 5 ──┘
|
||
```
|
||
|
||
### When to Use F-Threads
|
||
- Code generation (generate N variants, pick best compiled/tested)
|
||
- UI generation (your UI Agents system uses this — 3 Vue generators, 1 winner)
|
||
- Architecture decisions (N proposals, judge evaluates against criteria)
|
||
- Bug fixes (N approaches, pick the one that passes tests)
|
||
|
||
### Your UI Agents System as F-Thread Example
|
||
|
||
Your `ui-agents` project uses F-threads natively:
|
||
- 3 UI Generation agents (Sonnet + open source variants)
|
||
- Validation team screenshots + checks each
|
||
- Lead picks the best result
|
||
- Loser outputs are discarded (or logged for learning)
|
||
|
||
### Judge Criteria Template
|
||
|
||
```json
|
||
{
|
||
"criteria": [
|
||
{"name": "correctness", "weight": 0.4},
|
||
{"name": "efficiency", "weight": 0.2},
|
||
{"name": "maintainability", "weight": 0.2},
|
||
{"name": "completeness", "weight": 0.2}
|
||
]
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## Lesson 4.3: Depth-2 Delegation
|
||
|
||
The production-proven hierarchy from lead-agents and ui-agents:
|
||
|
||
```
|
||
User
|
||
│
|
||
v
|
||
Orchestrator (Opus-level, thinking only)
|
||
│
|
||
├── Planning Team Lead (synthesizes, delegates)
|
||
│ ├── Product Manager (domain worker)
|
||
│ └── UX Researcher (domain worker)
|
||
│
|
||
├── Engineering Team Lead (synthesizes, delegates)
|
||
│ ├── Frontend Dev (domain worker)
|
||
│ └── Backend Dev (domain worker)
|
||
│
|
||
└── Validation Team Lead (synthesizes, delegates)
|
||
├── QA Engineer (domain worker)
|
||
└── Security Reviewer (domain worker)
|
||
```
|
||
|
||
### The Rule
|
||
|
||
**Leads and orchestrators are thinkers, planners, and managers. They are not doers.** They delegate to workers who write files and make changes. Workers don't make strategic decisions.
|
||
|
||
---
|
||
|
||
## Lesson 4.4: Agent Experts That Remember
|
||
|
||
### Mental Models
|
||
|
||
Every agent maintains its own expertise file:
|
||
|
||
```yaml
|
||
# engineering-lead-mental-model.yaml
|
||
observations:
|
||
- type: architectural_pattern
|
||
observation: "We use vertical slice architecture for new features"
|
||
evidence: "PR #142, PR #156"
|
||
- type: common_failure
|
||
observation: "WebSocket reconnection logic needs retry with backoff"
|
||
evidence: "Incident log 2026-03-15"
|
||
```
|
||
|
||
### Self-Improve Commands
|
||
|
||
Agents periodically run self-improve commands that:
|
||
1. Read the mental model
|
||
2. Compare against actual codebase (grep, read files)
|
||
3. Update stale entries
|
||
4. Add new findings
|
||
|
||
### Compounding Knowledge
|
||
|
||
Session 1: Agent learns project structure
|
||
Session 2: Agent learns common patterns
|
||
Session 3: Agent learns failure modes
|
||
Session N: Agent operates at senior engineer level for this codebase
|
||
|
||
---
|
||
|
||
## Lesson 4.5: Domain Locking
|
||
|
||
Every agent has explicit domain permissions:
|
||
|
||
```yaml
|
||
# Engineering Lead domain
|
||
domain:
|
||
- path: .pi/multi-team/
|
||
read: true
|
||
upsert: true
|
||
delete: false
|
||
- path: src/
|
||
read: true
|
||
upsert: true
|
||
delete: false
|
||
- path: .
|
||
read: true
|
||
upsert: false
|
||
delete: false # Can't delete anything at root
|
||
```
|
||
|
||
Three levels:
|
||
- `read: false` — can't even see the files
|
||
- `upsert: false` — can read, can't write
|
||
- `delete: false` — can read+write, can't delete
|
||
|
||
---
|
||
|
||
## Lesson 4.6: TillDone Task Discipline
|
||
|
||
### The Pattern
|
||
|
||
1. Orchestrator creates task list before delegating
|
||
2. Tasks are assigned to specific agents
|
||
3. Agents mark tasks in progress → done
|
||
4. Footer shows live progress
|
||
5. If turn ends with incomplete tasks, agent is nudged to continue
|
||
|
||
### Why It Matters
|
||
|
||
Prevents the #1 multi-agent failure mode: an orchestrator that delegates, gets results, and then wanders off without completing the plan. The task list is the forcing function.
|
||
|
||
---
|
||
|
||
## Lesson 4.7: Agent Chains
|
||
|
||
### YAML-Defined Pipelines
|
||
|
||
```yaml
|
||
# agent-chain.yaml
|
||
steps:
|
||
- agent: planner
|
||
prompt: "Create a detailed plan for: $INPUT"
|
||
- agent: builder
|
||
prompt: "Implement the following plan: $INPUT"
|
||
- agent: reviewer
|
||
prompt: "Review this code: $INPUT"
|
||
```
|
||
|
||
### Variables
|
||
|
||
- `$INPUT` — Output of the previous step
|
||
- `$ORIGINAL` — The user's original prompt (always accessible)
|
||
|
||
---
|
||
|
||
## Lesson 4.8: Pi-to-Pi Communication
|
||
|
||
### The Shift: Hierarchy → Flat
|
||
|
||
Traditional agent communication is top-down:
|
||
```
|
||
Orchestrator → Team Lead → Worker → (result goes back up)
|
||
```
|
||
|
||
Peer-to-peer flips this. Agents are equals:
|
||
|
||
```
|
||
Agent A ←→ Agent B
|
||
↕ ↕
|
||
Agent C ←→ Agent D
|
||
```
|
||
|
||
### Reference Implementation: MCP Agent Mail (Jeff Emanuel, 1,955★)
|
||
|
||
Jeff's MCP Agent Mail provides a more formal coordination layer:
|
||
- **Agent identities**: Each agent has a registered identity
|
||
- **Inboxes**: Messages are delivered to agent inboxes
|
||
- **Searchable threads**: Full thread history with search
|
||
- **Advisory file leases**: Agents can reserve files to prevent conflicts
|
||
|
||
This complements our simpler P2P approach. Use direct coms for speed, MCP Agent Mail for audit trails.
|
||
|
||
### Four Tools
|
||
|
||
| Tool | What It Does |
|
||
|------|-------------|
|
||
| `*_list` | List peer agents (name, model, context usage) |
|
||
| `*_send` | Send a prompt; returns msg_id |
|
||
| `*_get` | Non-blocking poll on msg_id |
|
||
| `*_await` | Block until reply or timeout |
|
||
|
||
### Safety
|
||
|
||
- Max 5 hops (prevents A→B→A→B loops)
|
||
- Audit log (msg_id, sender, hops — never prompt bodies)
|
||
- Self-healing (stale sockets pruned, heartbeats every 10s)
|
||
|
||
---
|
||
|
||
## Lesson 4.9: Conversation Awareness
|
||
|
||
Every agent reads a shared JSONL conversation log before responding:
|
||
|
||
```
|
||
.pi/multi-team/sessions/<session-id>/conversation.jsonl
|
||
```
|
||
|
||
This means:
|
||
- Agents know what's already been discussed
|
||
- Agents don't repeat work
|
||
- Full audit trail of every interaction
|
||
|
||
## Lesson 4.9b: Service Connectors
|
||
|
||
Agents need to interact with external services: Twitter, GitHub, Linear, Slack, email.
|
||
|
||
### The Pattern
|
||
|
||
Each service gets an MCP connector:
|
||
|
||
```
|
||
Agent → MCP Client → Service Connector → External API
|
||
├── twitter-connector: post, search, DM, timeline
|
||
├── github-connector: PRs, issues, actions, code search
|
||
├── linear-connector: issues, comments, projects, cycles
|
||
├── slack-connector: messages, channels, threads, search
|
||
├── email-connector: send, read, search, folders
|
||
└── custom: build your own via connector SDK
|
||
```
|
||
|
||
### Design Rules
|
||
|
||
1. **One connector per service** — composable, not monolithic
|
||
2. **MCP protocol** — standard interface for all connectors
|
||
3. **Scoped credentials** — each connector has its own auth (no shared tokens)
|
||
4. **Rate-limited** — connectors enforce service rate limits
|
||
5. **Audit-logged** — every external action is logged
|
||
|
||
### Reference Implementation
|
||
|
||
Jeff Emanuel's `flywheel_connectors` (79★) provides a mesh-native protocol for this. His approach:
|
||
- Each connector is a standalone Rust binary
|
||
- Connectors communicate via a shared mesh protocol
|
||
- Agents discover connectors dynamically
|
||
- Built-in connectors for Twitter, Linear, GitHub
|
||
|
||
### Integration with Agent Teams
|
||
|
||
```
|
||
Orchestrator → delegates to agent
|
||
Agent → calls service connector via MCP
|
||
Connector → authenticates → calls API → returns result
|
||
Agent → processes result → continues work
|
||
Orchestrator → synthesizes final output
|
||
```
|
||
|
||
---
|
||
|
||
## Lesson 4.10: The CEO Board System
|
||
|
||
8 specialist agents for strategic decision-making:
|
||
|
||
| Board Member | Focus | Time Horizon |
|
||
|-------------|-------|--------------|
|
||
| Revenue | Cash flow, short-term wins | 30-90 days |
|
||
| Compounder | Trust, long-term value | 6-24 months |
|
||
| Contrarian | Assumptions, blind spots | 3x weight on dissent |
|
||
| Technical Architect | System durability | Ongoing |
|
||
| Product Strategist | Problem selection | Quarterly |
|
||
| Customer Oracle | User behavior | Ongoing |
|
||
| Market Strategist | Positioning | Quarterly |
|
||
| Moonshot | Asymmetric upside | 1-5 years |
|
||
|
||
### Flow
|
||
1. CEO frames the decision
|
||
2. Board debates (sources required, no "I think")
|
||
3. Verifier checks facts (2+ sources per claim)
|
||
4. Executor creates execution plan
|
||
5. Tracker logs for quarterly review
|
||
|
||
---
|
||
|
||
## Lesson 4.11: UI Agents System
|
||
|
||
12 agents across 4 teams for brand-consistent UI generation:
|
||
|
||
```
|
||
Brand → Product → Tree → Branch → Leaf
|
||
```
|
||
|
||
Each level has its own `brand.yaml` with CSS custom properties. Zero hardcoded values. Agents generate Vue components that use only CSS custom properties from the brand config.
|
||
|
||
## Lab 4.12: Build an Agent Chain
|
||
|
||
**Objective**: Create a plan→build→review pipeline in YAML.
|
||
|
||
**Starter**: `course/labs/L4-agent-chain/starter.yaml`
|
||
**Solution**: `course/labs/L4-agent-chain/solution.yaml`
|
||
|
||
**Checkpoints**:
|
||
1. Planner produces structured plan with tasks and file paths
|
||
2. Builder creates code matching the plan
|
||
3. Reviewer identifies issues with severity (critical/major/minor)
|
||
4. Verifier confirms each claim with file:line evidence
|
||
|
||
## Lab 4.13: Deploy a Multi-Team System
|
||
|
||
**Objective**: Set up orchestrator + 2 teams with domain locking.
|
||
|
||
**Starter**: `course/labs/L4-multi-team/starter-config.yaml`
|
||
**Solution**: `course/labs/L4-multi-team/solution-config.yaml`
|
||
|
||
**Checkpoints**:
|
||
1. Orchestrator delegates, never executes
|
||
2. Each team has lead + members with distinct roles
|
||
3. Domain permissions restrict each agent to its scope
|
||
4. Mental model files exist for each agent
|