Claude Code Plugins

Community-maintained marketplace

Feedback

subagent-coordination

@pwarnock/liaison-toolkit
2
0

Multi-agent coordination patterns for delegating work between specialized agents, managing agent roles, and orchestrating workflows across multiple AI agents.

Install Skill

1Download skill
2Enable skills in Claude

Open claude.ai/settings/capabilities and find the "Skills" section

3Upload to Claude

Click "Upload skill" and select the downloaded ZIP file

Note: Please verify skill by going through its instructions before using it.

SKILL.md

name subagent-coordination
description Multi-agent coordination patterns for delegating work between specialized agents, managing agent roles, and orchestrating workflows across multiple AI agents.
license MIT
metadata [object Object]

Subagent Coordination

Patterns for coordinating work across multiple specialized AI agents, managing agent roles and responsibilities, and orchestrating delegated workflows.

When to use this skill

Use this skill when:

  • Determining which agent should handle a specific task
  • Delegating work between specialized agents
  • Designing multi-agent workflows
  • Managing agent capability discovery
  • Handling agent handoffs and escalation
  • Orchestrating complex tasks across agents

Agent Roles and Boundaries

Core Agent Types

From agents/ directory structure:

// Primary agents (initiative)
cody-admin.json      → Project coordination, planning, infrastructure
cody-builder.json    → Build processes, compilation, deployment

// Specialized agents (reactive)
cody-general.json     → General assistance, undefined tasks
cody-planner.json     → Task breakdown, dependency analysis
cody-release-manager → Release management, versioning, publishing
qa-subagent.json       → Quality assurance, testing, validation
security-subagent.json  → Security audits, vulnerability scanning
frontend-specialist   → Frontend development (React, Vue, etc.)

Role Responsibility Matrix

Agent Primary Role Delegates To Avoids
cody-admin Infrastructure, planning All agents None
cody-planner Task breakdown cody-general Direct implementation
qa-subagent Testing All None
security-subagent Security audits All None
frontend-specialist UI/components cody-general Backend logic
cody-builder Build/deploy cody-admin Development tasks

Capabilities by Agent

// Agent capability mapping
const AGENT_CAPABILITIES = {
  'cody-admin': [
    'task-management',
    'agent-orchestration',
    'build-automation'
  ],
  'cody-planner': [
    'task-decomposition',
    'dependency-analysis',
    'planning'
  ],
  'qa-subagent': [
    'testing-strategy',
    'test-execution',
    'quality-gate-enforcement'
  ],
  'security-subagent': [
    'vulnerability-scanning',
    'security-audit',
    'compliance-validation'
  ],
  'frontend-specialist': [
    'component-creation',
    'styling',
    'ui-testing'
  ]
};

Delegation Patterns

Capability-Based Routing

function findBestAgent(task: Task): string {
  const taskType = inferTaskType(task);

  // Map task types to agents
  const agentMapping: Record<string, string> = {
    'testing': 'qa-subagent',
    'security': 'security-subagent',
    'frontend': 'frontend-specialist',
    'release': 'cody-release-manager',
    'planning': 'cody-planner',
    'infrastructure': 'cody-admin',
    'general': 'cody-general'
  };

  return agentMapping[taskType] || 'cody-general';
}

// Usage
const agent = findBestAgent({ type: 'security-audit' });
console.log(`Delegating to: ${agent}`);
await delegateToAgent(agent, task);

Sequential Delegation

async function executeMultiAgentWorkflow(workflow: Workflow): Promise<void> {
  const steps = workflow.steps;

  for (let i = 0; i < steps.length; i++) {
    const step = steps[i];
    const agent = findBestAgent(step);

    console.log(`Step ${i + 1}/${steps.length}: ${step.name} → ${agent}`);

    const result = await delegateToAgent(agent, step);

    if (!result.success) {
      console.error(`Agent ${agent} failed at step ${i + 1}`);
      await escalateFailure(step, result);
      break;
    }

    // Pass results to next step
    workflow.context[step.name] = result;
  }
}

Parallel Delegation

async function executeParallelTasks(tasks: Task[]): Promise<TaskResult[]> {
  // Group tasks by agent type
  const agentTasks: Record<string, Task[]> = {};

  for (const task of tasks) {
    const agent = findBestAgent(task);
    agentTasks[agent] = agentTasks[agent] || [];
    agentTasks[agent].push(task);
  }

  // Execute each agent's tasks in parallel
  const results = await Promise.all(
    Object.entries(agentTasks).map(([agent, tasks]) =>
      executeAgentBatch(agent, tasks)
    )
  );

  return results.flat();
}

Agent Handoff Procedures

Context Passing

interface AgentHandoff {
  fromAgent: string;
  toAgent: string;
  context: {
    task: string;
    results: any;
    decisions: string[];
    partialState?: any;
  };
}

function handoffAgent(handoff: AgentHandoff): Promise<void> {
  console.log(`Handoff: ${handoff.fromAgent} → ${handoff.toAgent}`);

  // Transfer context to next agent
  const newAgent = loadAgent(handoff.toAgent);
  await newAgent.initialize(handoff.context);

  // Clear previous agent state
  const previousAgent = loadAgent(handoff.fromAgent);
  await previousAgent.cleanup();
}

Handoff Templates

// From cody-planner to qa-subagent
const handoffToQA = {
  fromAgent: 'cody-planner',
  toAgent: 'qa-subagent',
  context: {
    task: 'Validate implementation',
    results: {
      implementationFiles: ['src/command.ts', 'src/utils.ts'],
      decisions: ['Used Bun test runner', 'Implemented with 80% coverage']
    },
    taskBreakdown: {
      'unit-tests': 'cody-general',
      'integration-tests': 'qa-subagent',
      'e2e-tests': 'qa-subagent'
    }
  };
}

Error Escalation

Failure Detection

async function delegateWithRetry(agent: string, task: Task, maxRetries = 3): Promise<any> {
  let lastError: Error | null = null;

  for (let attempt = 1; attempt <= maxRetries; attempt++) {
    try {
      const result = await executeAgentTask(agent, task);
      return result;
    } catch (error) {
      lastError = error as Error;
      console.warn(`Agent ${agent} attempt ${attempt} failed: ${error.message}`);

      if (attempt < maxRetries) {
        await sleep(2000 * attempt); // Exponential backoff
      }
    }
  }

  // All retries exhausted - escalate
  return await escalateFailure(agent, task, lastError);
}

Escalation Paths

// Agent → More specialized agent
const escalationPath = {
  'cody-general': 'qa-subagent',
  'cody-planner': 'cody-admin',
  'frontend-specialist': 'security-subagent',
  'qa-subagent': 'cody-admin',
  'security-subagent': 'cody-admin'
};

function escalateToSupervisor(failedAgent: string, error: Error): Promise<void> {
  const supervisor = escalationPath[failedAgent];

  console.error(`Escalating from ${failedAgent} to ${supervisor}`);

  await notifySupervisor(supervisor, {
    agent: failedAgent,
    error: error.message,
    timestamp: new Date()
  });
}

Workflow Orchestration

Agent Graph Definition

interface AgentNode {
  id: string;
  agent: string;
  dependencies: string[];
  outputDependencies: string[];
}

const WORKFLOW_GRAPH: AgentNode[] = [
  {
    id: 'plan',
    agent: 'cody-planner',
    dependencies: [],
    outputDependencies: ['implement']
  },
  {
    id: 'implement',
    agent: 'cody-general',
    dependencies: ['plan'],
    outputDependencies: ['test']
  },
  {
    id: 'test',
    agent: 'qa-subagent',
    dependencies: ['implement'],
    outputDependencies: ['deploy']
  },
  {
    id: 'deploy',
    agent: 'cody-builder',
    dependencies: ['test'],
    outputDependencies: []
  }
];

function executeWorkflow(graph: AgentNode[]): Promise<void> {
  const executionOrder = topologicalSort(graph);

  for (const node of executionOrder) {
    const agent = loadAgent(node.agent);
    console.log(`Executing ${node.id} with ${node.agent}`);

    // Wait for dependencies
    await waitForDependencies(node.dependencies);

    // Execute
    const result = await agent.execute(node);

    // Notify dependent agents
    notifyDependencies(node.outputDependencies, result);
  }
}

Orchestration with Liaison

# Create workflow in liaison
liaison workflow create "multi-agent-release" \
  --trigger "agent:delegated:agent=cody-planner" \
  --actions "delegate-to-general,notify-builder" \
  --condition "all-dependencies-met"

# Trigger workflow
liaison task create "Prepare release" --auto-trigger "multi-agent-release"

Inter-Agent Communication

Message Format

interface AgentMessage {
  from: string;
  to: string;
  type: 'task' | 'result' | 'error' | 'status';
  payload: any;
  timestamp: Date;
  correlationId: string;
}

async function sendAgentMessage(message: AgentMessage): Promise<void> {
  await messageBus.publish({
    topic: `agent.${message.to}`,
    message,
    headers: {
      'X-Agent-From': message.from,
      'X-Correlation-ID': message.correlationId
    }
  });
}

Status Broadcasting

// Agent status updates
async function broadcastStatus(agent: string, status: 'working' | 'idle' | 'error'): Promise<void> {
  await messageBus.publish({
    topic: 'agent.status',
    message: { agent, status, timestamp: new Date() }
  });
}

// Subscribe to agent status
function subscribeToAgentStatus(callback: (status: AgentStatus) => void): void {
  messageBus.subscribe('agent.status', callback);
}

Agent Discovery

Capability Registration

// Agents register their capabilities
interface AgentCapabilities {
  agent: string;
  capabilities: string[];
  maxConcurrency: number;
  supportedTaskTypes: string[];
}

// cody-admin registers agents
await liaison.registerAgent({
  agent: 'qa-subagent',
  capabilities: ['testing', 'validation', 'quality-gates'],
  maxConcurrency: 1,
  supportedTaskTypes: ['testing', 'validation']
});

Finding Agents

# List available agents
liaison agent list

# Find agent by capability
liaison agent find --capability testing

# Check agent status
liaison agent status qa-subagent

Verification

After implementing agent coordination:

  • Agent roles and responsibilities clearly defined
  • Delegation logic routes tasks to appropriate agents
  • Handoff procedures transfer context between agents
  • Escalation paths are defined for failures
  • Inter-agent communication is standardized
  • Workflow graphs are validated for cycles
  • Agent capabilities are registered and discoverable
  • Parallel delegation doesn't exceed agent concurrency
  • Error handling includes retry and escalation

Examples from liaison-toolkit

Example 1: Multi-Agent Release

# 1. cody-planner breaks down release task
liaison task create "Prepare release" --auto-trigger planning

# 2. cody-general implements changes
liaison task create "Implement version bump" --assign cody-general

# 3. qa-subagent validates
liaison task create "Run tests" --assign qa-subagent

# 4. security-subagent scans
liaison task create "Security audit" --assign security-subagent

# 5. cody-builder deploys
liaison task create "Build and publish" --assign cody-builder

Example 2: Error Escalation

// cody-planner delegates to cody-general
const result = await delegateToAgent('cody-general', task);

if (!result.success) {
  // Escalate to cody-admin
  console.error('General agent failed, escalating to admin...');

  await escalateToAdmin({
    originalAgent: 'cody-general',
    task,
    error: result.error
  });
}

Example 3: Capability Discovery

// Find agent for security task
const agent = liaison.findAgent({
  capabilities: ['security-audit', 'vulnerability-scanning']
});

// Returns: 'security-subagent'
console.log(`Delegating security task to: ${agent}`);
await executeAgent(agent, task);

Related Resources