Migration Guide: From Claude Code to Provider-Agnostic Orchestration
What Claude Code Does Well (and what we keep)
- Agent specialization — domain experts (backend, frontend, devops)
- Team-lead pattern — one coordinator, many specialists
- Anti-stall protocol — retry limits, step caps, timeout enforcement
- Skills as tools — reusable capabilities agents can invoke
- Memory across sessions — persistent context store
- Hooks/guards — automated checks on agent actions
What We Change
Provider coupling → Provider interface
Before (Claude Code):
# .claude/agents/backend.md
name: backend
model: sonnet # locked to Claude
After (Orchestrator):
# agents/backend.yaml
name: backend
provider: default # resolved at runtime
min_capability: coding # minimum model capability needed
Markdown agents → Structured config
agents/
├── backend.yaml # config: provider, tools, limits
├── backend.prompt.md # system prompt (portable)
└── backend.tools.yaml # tool/skill allowlist
Claude-specific tools → Skill registry
class FileReadSkill(Skill):
name = "file_read"
async def execute(self, params):
return Path(params["file_path"]).read_text()
The orchestrator translates to each provider's tool format automatically.
CLAUDE.md → project.yaml
name: "My Project"
agents:
team-lead:
provider: claude-sonnet
tools: [file_read, file_write, shell_exec, delegate]
routing:
strategy: cost-optimized
rules:
- complexity: low → provider: gemini-flash
- complexity: high → provider: claude-opus
Migration Steps
- Install the orchestrator
- Convert agent
.mdfiles to.yaml+.prompt.mdpairs - Replace
CLAUDE.mdwithproject.yaml - Configure providers (start with Anthropic, add others later)
- Test with same provider to verify identical behavior
- Gradually add providers — route simple tasks to cheaper models
- Monitor costs with built-in tracking