Skip to main content
Compendium / AI Collaboration / Composition / Multi-Agent Composition
#052

Multi-Agent Composition

A planner → coder → reviewer pipeline, with each agent's scope and hand-off explicit.

STABLE CO
#list #real-content #dark-mode-tested
Live

composition · SPEC-019

3 agents

A1

Planner

decomposes

→ task graph
A2

Coder

implements

→ diff
A3

Reviewer

gates

→ verdict

human · sign-off at exit

Spec

Intent

A non-trivial task is decomposed across specialised agents. Each agent has a narrow role, a scoped tool surface, and is accountable to the next. The diagram makes the composition (and its seams) inspectable so a human can intervene at any node.

Acceptance Criteria

  • [ ] Three role-specialised agent nodes
  • [ ] Directed flow between them
  • [ ] Each node names its single output
  • [ ] Visually distinguishes roles (colour + role label)

Constraints

  • Fits in compendium preview area
// multi-agent-composition.astro
---
import type { CompendiumMeta } from '../../../data/types';

export const meta: CompendiumMeta = {
  id: 52,
  slug: 'multi-agent-composition',
  name: 'Multi-Agent Composition',
  category: 'ai-collaboration',
  subcategory: 'composition',
  pillar: 'co',
  description: 'A planner → coder → reviewer pipeline, with each agent\'s scope and hand-off explicit.',
  spec: `## Intent
A non-trivial task is decomposed across specialised agents. Each agent has a narrow role, a scoped tool surface, and is accountable to the next. The diagram makes the composition (and its seams) inspectable so a human can intervene at any node.

## Acceptance Criteria
- [ ] Three role-specialised agent nodes
- [ ] Directed flow between them
- [ ] Each node names its single output
- [ ] Visually distinguishes roles (colour + role label)

## Constraints
- Fits in compendium preview area`,
  tags: ['list', 'real-content', 'dark-mode-tested'],
  status: 'stable',
  health: { ics: 83, a11y: 'aa', themed: true, animated: false },
};

const agents = [
  { role: 'Planner',  out: 'task graph',  tint: 'bg-do',      hint: 'decomposes' },
  { role: 'Coder',    out: 'diff',        tint: 'bg-co',      hint: 'implements' },
  { role: 'Reviewer', out: 'verdict',     tint: 'bg-go',      hint: 'gates'      },
];
---

<div data-this-component class="w-full bg-paper text-black border-4 border-black shadow-nb-sm p-3 overflow-hidden">
  <div class="flex items-baseline justify-between mb-3">
    <p class="font-mono text-[10px] uppercase tracking-widest opacity-60">composition · SPEC-019</p>
    <p class="font-mono text-[10px] uppercase tracking-widest opacity-60">3 agents</p>
  </div>

  <div class="flex flex-col gap-1">
    {agents.map((a, i) => (
      <>
        <div class="flex items-stretch border-2 border-black">
          <div class:list={['px-2 py-1.5 border-e-2 border-black flex items-center font-mono text-[9px] uppercase tracking-widest w-16 shrink-0', a.tint]}>
            {`A${i + 1}`}
          </div>
          <div class="px-2 py-1.5 flex-1 min-w-0">
            <p class="text-[11px] font-black uppercase leading-none tracking-tight">{a.role}</p>
            <p class="text-[10px] opacity-70 leading-tight mt-0.5 truncate">{a.hint}</p>
          </div>
          <div class="px-2 py-1.5 border-s-2 border-black flex items-center font-mono text-[9px] uppercase tracking-widest opacity-70">
            → {a.out}
          </div>
        </div>
        {i < agents.length - 1 && (
          <div class="flex justify-center font-black text-base leading-none select-none" aria-hidden="true">↓</div>
        )}
      </>
    ))}
  </div>

  <p class="mt-3 font-mono text-[9px] uppercase tracking-widest opacity-60 text-end">
    human · sign-off at exit
  </p>
</div>