Agent skill
subagent-coordination
Multi-agent coordination patterns for delegating work between specialized agents, managing agent roles, and orchestrating workflows across multiple AI agents.
Install this agent skill to your Project
npx add-skill https://github.com/pwarnock/liaison-toolkit/tree/main/.skills/subagent-coordination
Metadata
Additional technical details for this skill
- author
- liaison-toolkit
- version
- 1.0
- keywords
- agents, coordination, delegation, orchestration, workflows, multi-agent
SKILL.md
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
Recommended Agent Skills
Expand your agent's capabilities with these related and highly-rated skills.
security-scanning
Security scanning with dependency audits, secret detection, static analysis, and vulnerability management. Use when checking for vulnerabilities, scanning dependencies, or enforcing security gates.
bun-development
Bun build system, development workflow, and TypeScript patterns. Use when working with Bun projects, setting up development environment, or managing dependencies with Bun package manager.
library-research
Research library documentation and API references using Context7 integration. Use when users ask about libraries, frameworks, packages, APIs, or need documentation for third-party code.
release-publishing
Release workflow with changesets, version bumping, changelog generation, and npm publishing. Use when preparing releases, managing versions, or publishing to npm.
liaison-workflows
Task management and workflow patterns using liaison. Use when managing tasks, creating workflows, or working with task-driven automation.
cli-development
CLI development patterns with Commander.js, argument parsing, and user experience best practices. Use when creating commands, handling options, formatting output, or building CLI tools.
Didn't find tool you were looking for?