a2a-executor-patterns
Agent-to-Agent (A2A) executor implementation patterns for task handling, execution management, and agent coordination. Use when building A2A executors, implementing task handlers, creating agent execution flows, or when user mentions A2A protocol, task execution, agent executors, task handlers, or agent coordination.
What this skill does
# A2A Executor Patterns
**Purpose:** Provide production-ready executor patterns for implementing Agent-to-Agent (A2A) protocol task handlers with proper error handling, retry logic, and execution flows.
**Activation Triggers:**
- Implementing A2A protocol executors
- Building task handler functions
- Creating agent execution flows
- Managing task lifecycle and state
- Implementing retry and error recovery
- Building executor middleware
- Task validation and sanitization
**Key Resources:**
- `templates/basic-executor.ts` - Simple synchronous executor
- `templates/basic-executor.py` - Python synchronous executor
- `templates/async-executor.ts` - Asynchronous task executor
- `templates/async-executor.py` - Python async executor
- `templates/streaming-executor.ts` - Streaming result executor
- `templates/streaming-executor.py` - Python streaming executor
- `templates/batch-executor.ts` - Batch task processing
- `scripts/validate-executor.sh` - Validate executor implementation
- `scripts/test-executor.sh` - Test executor against A2A spec
- `examples/` - Production executor implementations
## Core Executor Patterns
### 1. Basic Executor (Synchronous)
**When to use:** Simple, fast tasks with immediate results
**Template:** `templates/basic-executor.ts` or `templates/basic-executor.py`
**Pattern:**
```typescript
async function executeTask(task: A2ATask): Promise<A2AResult> {
// 1. Validate input
validateTask(task)
// 2. Execute task
const result = await processTask(task)
// 3. Return result
return {
status: 'completed',
result,
taskId: task.id
}
}
```
**Best for:** Quick operations, validation tasks, simple transformations
### 2. Async Executor (Long-Running)
**When to use:** Tasks that take time and need status updates
**Template:** `templates/async-executor.ts` or `templates/async-executor.py`
**Pattern:**
- Accept task and return task ID immediately
- Process task asynchronously
- Provide status endpoint
- Send completion callback
**Best for:** LLM inference, file processing, data analysis
### 3. Streaming Executor
**When to use:** Results should be delivered incrementally
**Template:** `templates/streaming-executor.ts` or `templates/streaming-executor.py`
**Pattern:**
- Open stream connection
- Send partial results as available
- Close stream on completion
- Handle backpressure
**Best for:** Text generation, real-time data, progressive results
### 4. Batch Executor
**When to use:** Processing multiple related tasks efficiently
**Template:** `templates/batch-executor.ts`
**Pattern:**
- Accept multiple tasks
- Group by similarity
- Process in parallel batches
- Return aggregated results
**Best for:** Bulk operations, parallel processing, resource optimization
## Execution Flow Components
### 1. Task Validation
```typescript
function validateTask(task: A2ATask): void {
// Validate required fields
if (!task.id) throw new ValidationError('Task ID required')
if (!task.type) throw new ValidationError('Task type required')
// Validate task parameters
validateParameters(task.parameters)
// Check executor capabilities
if (!supportsTaskType(task.type)) {
throw new UnsupportedTaskError(task.type)
}
}
```
**Purpose:** Catch errors early, provide clear feedback
### 2. Error Handling
```typescript
async function executeWithErrorHandling(task: A2ATask) {
try {
return await executeTask(task)
} catch (error) {
if (error instanceof ValidationError) {
return { status: 'failed', error: error.message }
}
if (error instanceof RetryableError) {
return scheduleRetry(task)
}
// Log and return generic error
logger.error('Task execution failed', { taskId: task.id, error })
return { status: 'failed', error: 'Internal error' }
}
}
```
**Error Types:**
- `ValidationError` - Invalid input, don't retry
- `RetryableError` - Temporary failure, safe to retry
- `FatalError` - Permanent failure, abort
### 3. Retry Logic
```typescript
const retryConfig = {
maxAttempts: 3,
backoff: 'exponential', // or 'linear', 'fixed'
initialDelay: 1000, // ms
maxDelay: 30000
}
async function executeWithRetry(
task: A2ATask,
attempt: number = 1
): Promise<A2AResult> {
try {
return await executeTask(task)
} catch (error) {
if (attempt >= retryConfig.maxAttempts) {
throw new MaxRetriesExceededError(task.id)
}
if (error instanceof RetryableError) {
const delay = calculateBackoff(attempt)
await sleep(delay)
return executeWithRetry(task, attempt + 1)
}
throw error
}
}
```
**Retry Strategies:**
- Exponential backoff: `delay = initialDelay * (2 ^ attempt)`
- Linear backoff: `delay = initialDelay * attempt`
- Fixed delay: `delay = initialDelay`
### 4. Task State Management
```typescript
interface TaskState {
id: string
status: 'pending' | 'running' | 'completed' | 'failed'
result?: any
error?: string
startTime: Date
endTime?: Date
attempts: number
}
class TaskStore {
private tasks = new Map<string, TaskState>()
createTask(id: string): TaskState {
const state: TaskState = {
id,
status: 'pending',
startTime: new Date(),
attempts: 0
}
this.tasks.set(id, state)
return state
}
updateTask(id: string, update: Partial<TaskState>): void {
const state = this.tasks.get(id)
if (state) {
Object.assign(state, update)
}
}
getTask(id: string): TaskState | undefined {
return this.tasks.get(id)
}
}
```
## Executor Middleware
### 1. Logging Middleware
```typescript
function loggingMiddleware(
executor: Executor
): Executor {
return async (task) => {
logger.info('Task started', { taskId: task.id })
const start = Date.now()
try {
const result = await executor(task)
const duration = Date.now() - start
logger.info('Task completed', { taskId: task.id, duration })
return result
} catch (error) {
const duration = Date.now() - start
logger.error('Task failed', { taskId: task.id, duration, error })
throw error
}
}
}
```
### 2. Metrics Middleware
```typescript
function metricsMiddleware(
executor: Executor
): Executor {
return async (task) => {
metrics.increment('tasks.started', { type: task.type })
const start = Date.now()
try {
const result = await executor(task)
const duration = Date.now() - start
metrics.timing('tasks.duration', duration, { type: task.type })
metrics.increment('tasks.completed', { type: task.type })
return result
} catch (error) {
metrics.increment('tasks.failed', { type: task.type })
throw error
}
}
}
```
### 3. Rate Limiting Middleware
```typescript
function rateLimitMiddleware(
executor: Executor,
limit: { requests: number, window: number }
): Executor {
const limiter = new RateLimiter(limit.requests, limit.window)
return async (task) => {
await limiter.acquire()
try {
return await executor(task)
} finally {
limiter.release()
}
}
}
```
## Production Best Practices
### 1. Timeouts
```typescript
async function executeWithTimeout(
task: A2ATask,
timeoutMs: number
): Promise<A2AResult> {
return Promise.race([
executeTask(task),
new Promise((_, reject) =>
setTimeout(() => reject(new TimeoutError()), timeoutMs)
)
])
}
```
### 2. Resource Cleanup
```typescript
async function executeWithCleanup(task: A2ATask) {
const resources = []
try {
const resource = await allocateResource()
resources.push(resource)
return await executeTask(task, resource)
} finally {
// Always cleanup, even on error
await Promise.all(
resources.map(r => r.cleanup())
)
}
}
```
### 3. Graceful Shutdown
```typescript
class GracefulExecutor {
private activeTasks = new Set<string>()
private shuttingDown = false
async execute(task: A2ATask): Promise<A2AResult> {
if (this.shuttingDown) {
throw new ERelated in AI Agents
skill-development
IncludedComprehensive meta-skill for creating, managing, validating, auditing, and distributing Claude Code skills and slash commands (unified in v2.1.3+). Provides skill templates, creation workflows, validation patterns, audit checklists, naming conventions, YAML frontmatter guidance, progressive disclosure examples, and best practices lookup. Use when creating new skills, validating existing skills, auditing skill quality, understanding skill architecture, needing skill templates, learning about YAML frontmatter requirements, progressive disclosure patterns, tool restrictions (allowed-tools), skill composition, skill naming conventions, troubleshooting skill activation issues, creating custom slash commands, configuring command frontmatter, using command arguments ($ARGUMENTS, $1, $2), bash execution in commands, file references in commands, command namespacing, plugin commands, MCP slash commands, Skill tool configuration, or deciding between skills vs slash commands. Delegates to docs-management skill for official documentation.
reprompter
IncludedTransform messy prompts into well-structured, effective prompts — single or multi-agent. Use when: "reprompt", "reprompt this", "clean up this prompt", "structure my prompt", rough text needing XML tags and best practices, "reprompter teams", "repromptception", "run with quality", "smart run", "smart agents", multi-agent tasks, audits, parallel work, anything going to agent teams. Don't use when: simple Q&A, pure chat, immediate execution-only tasks. See "Don't Use When" section for details. Outputs: Structured XML/Markdown prompt, quality score (before/after), optional team brief + per-agent sub-prompts, agent team output files. Success criteria: Single mode quality score ≥ 7/10; Repromptception per-agent prompt quality score 8+/10; all required sections present, actionable and specific.
adaptive-compaction
IncludedAdaptive add-on policy and recovery layer that decides WHEN to compact, prune, snapshot, or fork -- replacing fixed-percent auto-compaction across Claude Code, Codex, and MCP-capable hosts. Trigger on auto-compact timing or damage: "when should I compact", "is it safe to compact now or start a fresh session", "auto-compact fires too early/mid-task", "switching to an unrelated task but the window still has space", "context rot", "answers get worse the longer the session runs", "the agent forgot the plan or my decisions after it summarized", "add a layer on top that manages context without changing the agent", raising autoCompactWindow to give the policy room, or installing/tuning a cross-tool compaction policy or PreCompact hook -- even when "compaction" is never said but the problem is context-window pressure or post-summarization memory loss. Do NOT use to summarize a conversation, build RAG, write a summarization prompt (decides WHEN not HOW), or answer max-context-length trivia.
agent-skill-creator
IncludedCreate cross-platform agent skills from workflow descriptions. Activates when users ask to create an agent, automate a repetitive workflow, create a custom skill, or need advanced agent creation. Triggers on phrases like create agent for, automate workflow, create skill for, every day I have to, daily I need to, turn process into agent, need to automate, create a cross-platform skill, validate this skill, export this skill, migrate this skill. Supports single skills, multi-agent suites, transcript processing, template-based creation, interactive configuration, cross-platform export, and spec validation.
llm-wiki
IncludedUse when building or maintaining a persistent personal knowledge base (second brain) in Obsidian where an LLM incrementally ingests sources, updates entity/concept pages, maintains cross-references, and keeps a synthesis current. Triggers include "second brain", "Obsidian wiki", "personal knowledge management", "ingest this paper/article/book", "build a research wiki", "compound knowledge", "Memex", or whenever the user wants knowledge to accumulate across sessions instead of being re-derived by RAG on every query.
skill-master
IncludedAgent Skills authoring, evaluation, and optimization. Create, edit, validate, benchmark, and improve skills following the agentskills.io specification. Use when designing SKILL.md files, structuring skill folders (references, scripts, assets), ingesting external documentation into skills, running trigger evals, benchmarking skill quality, optimizing descriptions, or performing blind A/B comparisons. Keywords: agentskills.io, SKILL.md, skill authoring, eval, benchmark, trigger optimization.