Handoff protocol for Rust multi-agent development system. Use when working as rust-architect, rust-developer, rust-testing-engineer, rust-performance-engineer, rust-security-maintenance, rust-code-reviewer, rust-cicd-devops, rust-debugger, or rust-critic. ALWAYS read on agent startup.
Coordinates Rust development agents by managing structured handoff files to maintain workflow context between specialized subagents.
npx claudepluginhub bug-ops/claude-pluginsThis skill inherits all available tools. When active, it can use any tool Claude has access to.
references/architect.mdreferences/cicd.mdreferences/critic.mdreferences/debug.mdreferences/developer.mdreferences/performance.mdreferences/review.mdreferences/security.mdreferences/testing.mdSubagents work in isolated context — they cannot see each other's conversations. This protocol enables structured communication through flat YAML files.
.local/
└── handoff/
├── 2025-01-09T14-30-45-architect.yaml
├── 2025-01-09T15-00-00-developer.yaml
└── ...
[!IMPORTANT] Filename MUST equal
{id}.yaml- The handoff file name must exactly match theidfield inside the YAML file.
Format: {id}.yaml where id = {timestamp}-{agent}
Example:
2025-01-09T14-30-45-architect2025-01-09T14-30-45-architect.yaml| Agent | Agent suffix in id |
|---|---|
| rust-architect | architect |
| rust-developer | developer |
| rust-testing-engineer | testing |
| rust-performance-engineer | performance |
| rust-security-maintenance | security |
| rust-code-reviewer | review |
| rust-cicd-devops | cicd |
| rust-debugger | debug |
| rust-critic | critic |
Parent Agent (or User)
│
├── Task(rust-architect): "Design system"
│ ↓
│ rust-architect executes
│ - reads handoff if path provided
│ - does work
│ - writes handoff file
│ - RETURNS result with handoff path
│ ↓
├── receives result, reads handoff path
│
├── Task(rust-developer): "Implement. Handoff: <path>"
│ ↓
│ rust-developer executes
│ ...
Key point: Subagents cannot call each other directly. They return results to parent, who orchestrates the next call.
If handoff file path(s) provided in task description:
Single handoff:
cat <provided-path>
Multiple handoffs (when merging contexts):
cat <path1>
cat <path2>
# ...
Reading parent context (recommended):
After reading the provided handoff, read its parent reports to understand the full context chain:
# Extract parent ID(s) from the handoff file
# If parent is a single value:
PARENT_ID=$(grep '^parent:' <provided-path> | awk '{print $2}' | tr -d '"')
if [ "$PARENT_ID" != "null" ]; then
cat ".local/handoff/${PARENT_ID}.yaml"
fi
# If parent is an array, you may need to read multiple files
# Repeat recursively to understand the full chain
This helps you understand decisions made by previous agents in the workflow chain.
If no handoff provided: Start fresh — this is a new task.
[!IMPORTANT] Filename MUST equal
{id}.yaml- Use$TSfrom startup to construct both the id and filename.
# Ensure TS variable is set (get new timestamp if empty)
if [ -z "$TS" ]; then
TS=$(date +%Y-%m-%dT%H-%M-%S)
echo "⚠️ TS was empty, generated new timestamp: $TS"
fi
# Construct handoff id (used BOTH as id field AND filename prefix)
HANDOFF_ID="${TS}-<agent>" # e.g., "2025-01-09T14-30-45-architect"
# Write handoff file: filename = {id}.yaml
mkdir -p .local/handoff
cat > ".local/handoff/${HANDOFF_ID}.yaml" << EOF
id: ${HANDOFF_ID}
parent: <parent-id-or-null>
agent: <agent>
timestamp: "$(date -u +%Y-%m-%dT%H:%M:%S)"
status: completed
# ... rest of YAML content
EOF
Key points:
.local/handoff/{id}.yaml{id} (exact same value, no .yaml extension)2025-01-09T14-30-45-architect.yaml contains id: 2025-01-09T14-30-45-architectEnd your response with clear handoff information:
## Handoff
**Status:** completed
**Handoff file:** `.local/handoff/2025-01-09T14-30-45-architect.yaml`
**Recommended next:** rust-developer
**Task for next agent:** Implement Email and User types per architecture spec
The parent agent will use this to orchestrate the next step.
[!NOTE] For file
.local/handoff/2025-01-09T14-30-45-architect.yaml, theidfield MUST be2025-01-09T14-30-45-architect(filename without.yamlextension)
id: 2025-01-09T14-30-45-architect # MUST match filename (without .yaml)
parent: 2025-01-09T14-00-00-developer # Single source, or null if fresh start
# parent: [2025-01-09T14-00-00-developer, 2025-01-09T13-30-00-architect] # Multiple sources (array)
agent: architect # architect | developer | testing | performance | security | review | cicd | debug | critic
timestamp: "2025-01-09T14:30:45"
status: completed # completed | blocked | needs_discussion
context:
task: "Original task description"
phase: "01" # optional phase number
output:
# Agent-specific output (see schemas below)
next: # Recommendation for parent agent
agent: rust-developer # suggested next agent, or null if done
task: "Task description for next agent"
priority: high # high | medium | low
acceptance_criteria:
- "Criterion 1"
- "Criterion 2"
Each agent has a specific output schema. Read the references file for your agent:
| Agent | references File |
|---|---|
| rust-architect | references/architect.md |
| rust-developer | references/developer.md |
| rust-testing-engineer | references/testing.md |
| rust-performance-engineer | references/performance.md |
| rust-security-maintenance | references/security.md |
| rust-code-reviewer | references/review.md |
| rust-cicd-devops | references/cicd.md |
| rust-debugger | references/debug.md |
| rust-critic | references/critic.md |
Get timestamp immediately (use this for handoff filename later):
TS=$(date +%Y-%m-%dT%H-%M-%S)
echo "Timestamp: $TS"
Read your agent-specific schema from reference/<agent>.md
If handoff path provided:
parent field and read those files recursively)Then proceed with task
Parent Agent
│
├─► Task(rust-architect): "Design user system"
│ └─► returns: handoff A
│
├─► Task(rust-developer): "Implement. Handoff: A"
│ └─► returns: handoff B
│
├─► Task(rust-testing-engineer): "Add tests. Handoff: B"
│ └─► returns: handoff C
│
├─► Task(rust-code-reviewer): "Review. Handoff: C"
│ └─► returns: handoff D (approved)
│
└─► Task(rust-cicd-devops): "Setup CI. Handoff: D"
└─► returns: handoff E (done)
Parent Agent
│
├─► Task(rust-debugger): "Investigate crash"
│ └─► returns: handoff with root cause
│
├─► Task(rust-developer): "Fix bug. Handoff: ..."
│ └─► returns: handoff with fix
│
├─► Task(rust-testing-engineer): "Add regression test. Handoff: ..."
│ └─► returns: handoff with tests
│
└─► Task(rust-code-reviewer): "Review fix. Handoff: ..."
└─► returns: approved
Parent Agent
│
├─► Task(rust-code-reviewer): "Review PR"
│ └─► returns: changes_requested, issues list
│
├─► Task(rust-developer): "Fix review issues. Handoff: ..."
│ └─► returns: fixes applied
│
└─► Task(rust-code-reviewer): "Re-review. Handoff: ..."
└─► returns: approved
Parent Agent
│
├─► Task(rust-architect): "Design API"
│ └─► returns: handoff A
│
├─► [Parallel] Task(rust-developer): "Implement API. Handoff: A"
│ │ Task(rust-testing-engineer): "Design test strategy. Handoff: A"
│ │
│ └─► returns: handoff B (implementation)
│ returns: handoff C (test strategy)
│
└─► Task(rust-testing-engineer): "Implement tests. Handoff: [B, C]"
└─► parent: [handoff-B-id, handoff-C-id]
When finishing, structure your response so parent can easily extract handoff info:
## Summary
[Brief description of what was done]
## Work Completed
- [Item 1]
- [Item 2]
## Handoff
| Field | Value |
|-------|-------|
| Status | `completed` / `blocked` / `needs_discussion` |
| Handoff file | `.local/handoff/2025-01-09T14-30-45-developer.yaml` |
| Recommended next | `rust-testing-engineer` (or `none` if done) |
| Task for next | Add unit tests for Email and User types |
Parent agent parses this to decide next step.
| Status | Meaning | Next Action |
|---|---|---|
completed | Work done successfully | Proceed to next agent |
blocked | Cannot proceed | Return to caller with blocker |
needs_discussion | Decisions needed | Return to user for input |
# Read the provided handoff
CURRENT_HANDOFF=".local/handoff/2025-01-09T15-00-00-developer.yaml"
cat "$CURRENT_HANDOFF"
# Extract and read parent (simple approach)
PARENT_ID=$(grep '^parent:' "$CURRENT_HANDOFF" | awk '{print $2}' | tr -d '" ')
if [ "$PARENT_ID" != "null" ] && [ -n "$PARENT_ID" ]; then
echo "Reading parent context..."
cat ".local/handoff/${PARENT_ID}.yaml"
# Can continue recursively if needed
GRANDPARENT_ID=$(grep '^parent:' ".local/handoff/${PARENT_ID}.yaml" | awk '{print $2}' | tr -d '" ')
if [ "$GRANDPARENT_ID" != "null" ] && [ -n "$GRANDPARENT_ID" ]; then
cat ".local/handoff/${GRANDPARENT_ID}.yaml"
fi
fi
This helps you understand the full decision chain and context from previous agents.
Search, retrieve, and install Agent Skills from the prompts.chat registry using MCP tools. Use when the user asks to find skills, browse skill catalogs, install a skill for Claude, or extend Claude's capabilities with reusable AI agent components.
Activates when the user asks about AI prompts, needs prompt templates, wants to search for prompts, or mentions prompts.chat. Use for discovering, retrieving, and improving prompts.
Creating algorithmic art using p5.js with seeded randomness and interactive parameter exploration. Use this when users request creating art using code, generative art, algorithmic art, flow fields, or particle systems. Create original algorithmic art rather than copying existing artists' work to avoid copyright violations.