Meta-Delegation How-To Guide¶
Task-focused recipes for common meta-delegation scenarios.
Quick Reference¶
Jump to a specific task:
- Run a Simple Delegation
- Choose the Right Persona
- Pass Context Between Delegations
- Filter and Search Evidence
- Handle Timeouts
- Retry Failed Delegations
- Run on Different Platforms
- Generate Test Scenarios
- Export Evidence as Archive
- Chain Multiple Delegations
Run a Simple Delegation¶
Problem: You need to delegate a task to an AI agent.
Solution:
from amplihack.meta_delegation import run_meta_delegation
result = run_meta_delegation(
goal="Create a function to validate email addresses",
success_criteria="Function exists, handles invalid emails, has tests"
)
print(f"Status: {result.status}")
# Output: Status: SUCCESS
Default behavior:
- Platform:
claude-code - Persona:
guide - Timeout: 30 minutes
Choose the Right Persona¶
Problem: You need to pick the best persona for your task.
Decision Tree:
What is your primary goal?
│
├─ Teaching/Learning
│ └─> Use "guide"
│ • Socratic approach
│ • Explanatory
│ • Best for understanding
│
├─ Thorough Testing/Validation
│ └─> Use "qa_engineer"
│ • Rigorous verification
│ • Comprehensive evidence
│ • Best for quality assurance
│
├─ System Design/Architecture
│ └─> Use "architect"
│ • Strategic planning
│ • High-level overview
│ • Best for specifications
│
└─ Quick Implementation
└─> Use "junior_dev"
• Task-focused
• Gets it done
• Best for straightforward coding
Examples:
# Teaching scenario
run_meta_delegation(
goal="Explain how OAuth2 works and implement a simple example",
success_criteria="Clear explanation, working code, step-by-step guide",
persona_type="guide" # Best for teaching
)
# Testing scenario
run_meta_delegation(
goal="Analyze this API for security vulnerabilities",
success_criteria="Identify issues, test exploits, provide fixes",
persona_type="qa_engineer" # Best for thorough testing
)
# Design scenario
run_meta_delegation(
goal="Design a microservices architecture for an e-commerce platform",
success_criteria="Architecture diagram, service boundaries, API specs",
persona_type="architect" # Best for design
)
# Implementation scenario
run_meta_delegation(
goal="Implement the shopping cart service from this spec",
success_criteria="Working code, follows spec, has basic tests",
persona_type="junior_dev" # Best for implementation
)
Pass Context Between Delegations¶
Problem: You want the second delegation to use results from the first.
Solution:
from amplihack.meta_delegation import run_meta_delegation
# Step 1: Design phase
design = run_meta_delegation(
goal="Design a user authentication system",
success_criteria="Architecture doc, API spec, security considerations",
persona_type="architect"
)
# Step 2: Get design document from evidence
arch_doc = design.get_evidence_by_type("architecture_doc")[0]
# Step 3: Implementation phase with context
implementation = run_meta_delegation(
goal="Implement the authentication system",
success_criteria="Working code following the architecture, tests pass",
persona_type="junior_dev",
context=arch_doc.content # Pass design as context
)
print(f"Design score: {design.success_score}/100")
print(f"Implementation score: {implementation.success_score}/100")
Output:
Tip: Always extract relevant evidence before passing as context to keep it focused.
Filter and Search Evidence¶
Problem: You need to find specific artifacts in the evidence.
Solution:
result = run_meta_delegation(
goal="Create a web scraper for news articles",
success_criteria="Scraper works, handles errors, has tests"
)
# Method 1: Get evidence by type
code_files = result.get_evidence_by_type("code_file")
for code in code_files:
print(f"Code file: {code.path}")
# Output: Code file: scraper.py
# Method 2: Filter evidence with custom logic
test_files = [e for e in result.evidence if e.path.startswith("test_")]
for test in test_files:
print(f"Test file: {test.path}")
# Output: Test file: test_scraper.py
# Method 3: Search evidence content
import re
documentation = [
e for e in result.evidence
if e.type == "documentation" and re.search(r"usage|example", e.content, re.I)
]
for doc in documentation:
print(f"Documentation with examples: {doc.path}")
# Output: Documentation with examples: README.md
# Method 4: Get evidence by filename pattern
import fnmatch
py_files = [
e for e in result.evidence
if fnmatch.fnmatch(e.path, "*.py") and e.type == "code_file"
]
print(f"Found {len(py_files)} Python files")
# Output: Found 2 Python files
Handle Timeouts¶
Problem: Your delegation is taking too long and you want to control timeout behavior.
Solution:
from amplihack.meta_delegation import run_meta_delegation, DelegationTimeout
# Set custom timeout
try:
result = run_meta_delegation(
goal="Perform comprehensive security audit",
success_criteria="Check all OWASP Top 10, generate report",
timeout_minutes=60 # Allow 1 hour
)
except DelegationTimeout as e:
print(f"Delegation timed out after {e.elapsed_minutes} minutes")
print(f"Partial results: {e.partial_result}")
# Access what was completed
if e.partial_result:
print(f"Evidence collected before timeout: {len(e.partial_result.evidence)}")
for item in e.partial_result.evidence:
print(f" - {item.path}")
Output:
Delegation timed out after 60 minutes
Partial results: MetaDelegationResult(status='PARTIAL', success_score=55)
Evidence collected before timeout: 8
- security_scan_partial.md
- vulnerability_report_incomplete.md
- test_results.log
- [... 5 more items ...]
Best Practices:
- Default timeout (30 min) works for most tasks
- Use 60+ minutes for complex analyses
- Always catch
DelegationTimeoutfor long-running tasks - Partial results are still valuable
Retry Failed Delegations¶
Problem: A delegation failed, and you want to retry with adjustments.
Solution:
from amplihack.meta_delegation import run_meta_delegation
goal = "Implement a Redis cache wrapper"
success_criteria = "Wrapper works, handles connection errors, has tests"
# First attempt
result = run_meta_delegation(goal=goal, success_criteria=success_criteria)
if result.status == "FAILURE":
print(f"Failed with score {result.success_score}/100")
print(f"Reason: {result.failure_reason}")
# Strategy 1: Simplify success criteria
simpler_criteria = "Wrapper works for basic get/set, has minimal tests"
result = run_meta_delegation(goal=goal, success_criteria=simpler_criteria)
if result.status == "PARTIAL":
print(f"Partial success: {result.success_score}/100")
# Strategy 2: Change persona (try qa_engineer for thoroughness)
result = run_meta_delegation(
goal=goal,
success_criteria=success_criteria,
persona_type="qa_engineer"
)
if result.status == "SUCCESS":
print(f"Success on retry: {result.success_score}/100")
Retry Strategies:
- Simplify criteria: Remove optional requirements
- Change persona: Try
qa_engineerifjunior_devfailed - Break into steps: Multiple smaller delegations
- Increase timeout: Allow more time for complex tasks
- Add context: Provide more background information
Run on Different Platforms¶
Problem: You want to run the same task on multiple platforms to compare results.
Solution:
from amplihack.meta_delegation import run_meta_delegation
goal = "Create a markdown to HTML converter"
success_criteria = "Converts basic markdown, handles headers/links/lists, has tests"
platforms = ["claude-code", "copilot", "amplifier"]
results = {}
for platform in platforms:
print(f"\nRunning on {platform}...")
result = run_meta_delegation(
goal=goal,
success_criteria=success_criteria,
platform=platform
)
results[platform] = result
# Compare results
print("\n" + "="*70)
print("PLATFORM COMPARISON")
print("="*70)
print(f"{'Platform':<15} | {'Status':<10} | {'Score':>5} | {'Evidence':>8} | {'Time':>8}")
print("-"*70)
for platform, result in results.items():
print(
f"{platform:<15} | "
f"{result.status:<10} | "
f"{result.success_score:>5}/100 | "
f"{len(result.evidence):>8} items | "
f"{result.duration_seconds:>8.1f}s"
)
Output:
======================================================================
PLATFORM COMPARISON
======================================================================
Platform | Status | Score | Evidence | Time
----------------------------------------------------------------------
claude-code | SUCCESS | 92/100 | 10 items | 38.5s
copilot | SUCCESS | 88/100 | 8 items | 42.3s
amplifier | SUCCESS | 90/100 | 9 items | 35.7s
Generate Test Scenarios¶
Problem: You want to use Gadugi to generate comprehensive test scenarios.
Solution:
from amplihack.meta_delegation import run_meta_delegation
# Enable scenario generation
result = run_meta_delegation(
goal="Create a payment processing module",
success_criteria="""
- Handles credit card, PayPal, and bank transfer
- Validates payment data
- Has comprehensive tests covering edge cases
""",
persona_type="qa_engineer",
enable_scenarios=True # Activates Gadugi
)
# Access generated scenarios
if hasattr(result, 'test_scenarios'):
print(f"Generated {len(result.test_scenarios)} test scenarios:")
for scenario in result.test_scenarios:
print(f"\n{scenario.name}")
print(f" Category: {scenario.category}")
print(f" Description: {scenario.description}")
print(f" Expected: {scenario.expected_outcome}")
Output:
Generated 12 test scenarios:
Valid Credit Card Payment
Category: happy_path
Description: Process a valid credit card payment with correct CVV and expiry
Expected: Payment succeeds, transaction ID returned
Expired Credit Card
Category: error_handling
Description: Attempt payment with expired credit card
Expected: ValidationError raised with clear message
Invalid CVV Code
Category: error_handling
Description: Credit card with incorrect CVV length
Expected: ValidationError with CVV validation message
[... 9 more scenarios ...]
Gadugi Scenario Categories:
happy_path: Normal successful operationserror_handling: Invalid inputs and edge casesboundary_conditions: Limits and extremessecurity: Potential vulnerabilitiesperformance: Load and stress scenarios
Export Evidence as Archive¶
Problem: You want to save all evidence to disk for review.
Solution:
from amplihack.meta_delegation import run_meta_delegation
import os
import shutil
result = run_meta_delegation(
goal="Create a REST API for todo items",
success_criteria="CRUD endpoints, validation, tests"
)
# Create archive directory
archive_dir = "evidence_archive_20260120_103045"
os.makedirs(archive_dir, exist_ok=True)
# Export all evidence
for item in result.evidence:
# Create subdirectories by type
type_dir = os.path.join(archive_dir, item.type)
os.makedirs(type_dir, exist_ok=True)
# Write evidence file
file_path = os.path.join(type_dir, os.path.basename(item.path))
with open(file_path, 'w') as f:
f.write(item.content)
print(f"Exported: {file_path}")
# Create summary report
summary_path = os.path.join(archive_dir, "SUMMARY.md")
with open(summary_path, 'w') as f:
f.write(f"# Meta-Delegation Evidence Archive\n\n")
f.write(f"**Status**: {result.status}\n")
f.write(f"**Success Score**: {result.success_score}/100\n")
f.write(f"**Duration**: {result.duration_seconds}s\n\n")
f.write(f"## Evidence Collected\n\n")
# Group by type
by_type = {}
for item in result.evidence:
by_type.setdefault(item.type, []).append(item)
for evidence_type, items in sorted(by_type.items()):
f.write(f"### {evidence_type.replace('_', ' ').title()}\n\n")
for item in items:
f.write(f"- [{item.path}](./{evidence_type}/{os.path.basename(item.path)})\n")
f.write("\n")
print(f"\nArchive created: {archive_dir}/")
print(f"Summary: {summary_path}")
Output:
Exported: evidence_archive_20260120_103045/code_file/todo_api.py
Exported: evidence_archive_20260120_103045/code_file/models.py
Exported: evidence_archive_20260120_103045/test_file/test_todo_api.py
Exported: evidence_archive_20260120_103045/documentation/README.md
Exported: evidence_archive_20260120_103045/documentation/API_SPEC.md
Exported: evidence_archive_20260120_103045/execution_log/subprocess_output.log
Archive created: evidence_archive_20260120_103045/
Summary: evidence_archive_20260120_103045/SUMMARY.md
Directory Structure:
evidence_archive_20260120_103045/
├── SUMMARY.md
├── code_file/
│ ├── todo_api.py
│ └── models.py
├── test_file/
│ └── test_todo_api.py
├── documentation/
│ ├── README.md
│ └── API_SPEC.md
└── execution_log/
└── subprocess_output.log
Chain Multiple Delegations¶
Problem: You need to run a sequence of delegations where each builds on the previous.
Solution:
from amplihack.meta_delegation import run_meta_delegation
# Pipeline configuration
pipeline = [
{
"name": "Architecture",
"goal": "Design a blog platform backend",
"success_criteria": "Architecture doc, API spec, data model",
"persona": "architect"
},
{
"name": "Implementation",
"goal": "Implement the blog platform following the architecture",
"success_criteria": "Working code, follows design, basic tests",
"persona": "junior_dev",
"use_context_from": "Architecture" # Use previous result
},
{
"name": "Testing",
"goal": "Perform comprehensive testing of the blog platform",
"success_criteria": "Test coverage >85%, edge cases covered, report generated",
"persona": "qa_engineer",
"use_context_from": "Implementation"
}
]
# Execute pipeline
results = {}
context = None
for stage in pipeline:
print(f"\n{'='*60}")
print(f"Stage: {stage['name']}")
print('='*60)
# Build delegation parameters
params = {
"goal": stage["goal"],
"success_criteria": stage["success_criteria"],
"persona_type": stage["persona"]
}
# Add context from previous stage if specified
if "use_context_from" in stage and stage["use_context_from"] in results:
prev_result = results[stage["use_context_from"]]
# Combine relevant evidence as context
context_parts = []
for evidence_type in ["architecture_doc", "code_file", "api_spec"]:
items = prev_result.get_evidence_by_type(evidence_type)
if items:
context_parts.append(f"## {evidence_type}\n\n{items[0].content}")
params["context"] = "\n\n".join(context_parts)
# Run delegation
result = run_meta_delegation(**params)
results[stage["name"]] = result
print(f"Status: {result.status}")
print(f"Score: {result.success_score}/100")
print(f"Evidence: {len(result.evidence)} items")
# Stop pipeline if stage fails
if result.status == "FAILURE":
print(f"\n⚠ Pipeline halted at stage: {stage['name']}")
break
# Pipeline summary
print("\n" + "="*60)
print("PIPELINE SUMMARY")
print("="*60)
total_score = sum(r.success_score for r in results.values())
avg_score = total_score / len(results) if results else 0
for stage_name, result in results.items():
status_symbol = "✓" if result.status == "SUCCESS" else "✗"
print(f"{status_symbol} {stage_name:<20} | Score: {result.success_score:3}/100")
print(f"\nOverall Pipeline Score: {avg_score:.1f}/100")
Output:
============================================================
Stage: Architecture
============================================================
Status: SUCCESS
Score: 95/100
Evidence: 8 items
============================================================
Stage: Implementation
============================================================
Status: SUCCESS
Score: 88/100
Evidence: 12 items
============================================================
Stage: Testing
============================================================
Status: SUCCESS
Score: 92/100
Evidence: 15 items
============================================================
PIPELINE SUMMARY
============================================================
✓ Architecture | Score: 95/100
✓ Implementation | Score: 88/100
✓ Testing | Score: 92/100
Overall Pipeline Score: 91.7/100
Advanced: Custom Success Evaluation¶
Problem: You want custom logic to evaluate success beyond the standard criteria.
Solution:
from amplihack.meta_delegation import run_meta_delegation
# Standard delegation
result = run_meta_delegation(
goal="Create a database migration tool",
success_criteria="Tool can migrate up/down, handles errors, has tests"
)
# Custom evaluation logic
def custom_evaluate(result):
"""Apply custom success criteria."""
score = result.success_score # Start with standard score
# Bonus: Check for specific files
if result.get_evidence_by_type("architecture_doc"):
score += 5
print(" +5 points: Architecture document found")
# Bonus: Check test coverage in logs
test_results = result.get_evidence_by_type("test_results")
if test_results and "100% coverage" in test_results[0].content:
score += 10
print(" +10 points: Perfect test coverage")
# Penalty: Too much code (over-engineering)
code_files = result.get_evidence_by_type("code_file")
total_lines = sum(c.content.count('\n') for c in code_files)
if total_lines > 500:
score -= 5
print(f" -5 points: Too much code ({total_lines} lines)")
return min(100, score) # Cap at 100
# Apply custom evaluation
custom_score = custom_evaluate(result)
print(f"\nStandard score: {result.success_score}/100")
print(f"Custom score: {custom_score}/100")
Output:
+5 points: Architecture document found
+10 points: Perfect test coverage
Standard score: 85/100
Custom score: 100/100
Related Documentation¶
- Tutorial - Learn the basics step-by-step
- Reference - Complete API documentation
- Concepts - Architecture and design
- Troubleshooting - Fix common issues
Status: [PLANNED - Implementation Pending]
This how-to guide describes the intended usage patterns once the meta-delegation system is implemented.