Automated multi-agent orchestrator that spawns CLI subagents in parallel, coordinates via MCP Memory, and monitors progress. Use for orchestration, parallel execution, and automated multi-agent workflows.
60
70%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Low
Low-risk findings worth noting
Fix and improve this skill with Tessl
tessl review fix ./.agents/skills/oma-orchestrator/SKILL.mdAutomatically orchestrate multi-agent execution with task decomposition, native/fallback dispatch, memory coordination, progress monitoring, verification, QA cross-review, retry, and result collection.
.agents/oma-config.yaml, .codex/agents/*.toml, .gemini/agents/*.md, or fallback oma agent:spawndomain_tags by matching against the Intent signature block of each installed .agents/skills/oma-*/SKILL.md. Tasks that match no domain confidently inherit the union of their parent feature's tags.exposed_skill_set = skills whose name is in domain_tags. If |exposed_skill_set| < 2 after classification, fall back to the full installed set (flat exposure) and record exposure_fallback: true in the task board.exposed_skill_set and exposure_fallback per task.oma verify, and QA cross-review loop.exposed_skill_set excludes a skill that a recovered failure indicates was needed, re-classify the task and re-dispatch with the expanded set rather than retrying against the original narrow set.| Action | SSL primitive | Evidence |
|---|---|---|
| Read config and task context | READ | oma config, routing, request |
| Classify task into domain tags | INFER | task text vs each skill's Intent signature |
| Compute exposed skill set | SELECT | intersection of domain tags and installed skills |
| Select dispatch path | SELECT | Native vs fallback |
| Write session state | WRITE | task board and memory files |
| Spawn agents | CALL_TOOL | native CLI or oma agent:spawn |
| Poll progress | READ | progress/result files |
| Run verification | CALL_TOOL | oma verify, tests, QA |
| Update retry state | UPDATE_STATE | loop counters and CD metrics |
| Report final result | NOTIFY | compiled summary |
oma agent:spawn <agent-type> "<task>" <session-id> -w <workspace>
oma verify <agent-type> --workspace <workspace> --jsonWhen native runtime dispatch is available, prefer the runtime-specific native path listed in this skill before falling back to oma agent:spawn.
| Scope | Resource target |
|---|---|
LOCAL_FS | Session, task-board, progress, result, config files |
PROCESS | Agent CLI processes and verify scripts |
MEMORY | Session state and clarification debt |
CODEBASE | Workspaces owned by spawned agents |
target_vendor === current_runtime_vendor and the runtime has a verified native path, use native dispatch.oma agent:spawn.exposed_skill_set, but fall back to flat exposure when classification confidence is low rather than starving a task of a required specialist.Current native executor paths:
.claude/agents/{agent}.md definitions (multiple Agent tool calls in one message run in parallel; results return synchronously — no polling)task tool with subagent_type: {agent-id}; do not use oma agent:spawn for same-session OpenCode work because it will not appear as a native child taskcodex exec "@agent ..." using .codex/agents/*.tomlgemini -p "@agent ..." using .gemini/agents/*.mdVendor-specific execution protocols are injected automatically for fallback CLI runs.
| Setting | Default | Description |
|---|---|---|
| MAX_PARALLEL | 3 | Max concurrent subagents |
| MAX_RETRIES | 2 | Retry attempts per failed task |
| POLL_INTERVAL | 30s | Status check interval |
| MAX_TURNS (impl) | 20 | Turn limit for backend/frontend/mobile |
| MAX_TURNS (review) | 15 | Turn limit for qa/debug |
| MAX_TURNS (plan) | 10 | Turn limit for pm |
These are skill-level defaults applied by the orchestrating agent; they are not read from config/cli-config.yaml (which carries only vendor CLI and execution settings such as results_dir and timeout).
Memory provider and tool names are configurable via .agents/mcp.json (not the repo-root .mcp.json, which is the Claude Code MCP server config):
{
"memoryConfig": {
"provider": "file",
"basePath": ".agents/state/memories",
"tools": {
"read": "Read",
"write": "Write",
"edit": "Edit"
}
}
}PHASE 1 - Plan: Analyze request -> decompose tasks -> generate session ID
PHASE 1.5 - Domain gate: For each task, intersect Intent signature matches across installed skills to derive exposed_skill_set. Record exposure_fallback: true when the intersection is too small to be useful and the flat library is used instead.
PHASE 2 - Setup: Use memory write tool to create orchestrator-session.md + task-board.md (include exposed_skill_set per task)
PHASE 3 - Execute: Spawn agents by priority tier (never exceed MAX_PARALLEL); inject only exposed_skill_set into each subagent's available specialist list
PHASE 4 - Monitor: Poll every POLL_INTERVAL; handle completed/failed/crashed agents
PHASE 4.5 - Verify: Run mechanical checks for every completed agent; run oma verify {agent-type} only for backend, frontend, mobile, qa, debug, and pm; then run QA cross-review for every completed implementation
PHASE 5 - Collect: Read all result-{agent}-{sessionId}.md, compile summary, cleanup progress files
See resources/subagent-prompt-template.md for prompt construction.
See resources/memory-schema.md for memory file formats.
| File | Owner | Others |
|---|---|---|
orchestrator-session.md | orchestrator | read-only |
task-board.md | orchestrator | read-only |
progress-{agent}[-{sessionId}].md | that agent | orchestrator reads |
result-{agent}[-{sessionId}].md | that agent | orchestrator reads |
After each agent completes, enter an iterative review loop, not a single-pass verification.
Agent completes work
↓
[1] Mechanical Self-Check: lint, type-check, tests, diff scope
↓
[2] Verify: For supported types, run `oma verify {agent-type} --workspace {workspace}`
Unsupported (`db`, `refactor`, `architecture`, `tf-infra`, `docs`) → record SKIP and continue
↓ FAIL → Agent receives feedback, fixes, back to [1]
↓ PASS
[3] Cross-Review: QA agent reviews the changes
↓ FAIL → Agent receives review feedback, fixes, back to [1]
↓ PASS
Accept result[1] Mechanical Self-Check (formerly "Self-Review"): Before requesting external review, the implementation agent must:
Quality judgment is NOT performed in this step. Design quality, architecture alignment, and acceptance criteria satisfaction are evaluated exclusively in [3] Cross-Review by the QA agent. Reason: Self-evaluation bias causes agents to consistently overrate their own output (ref: Anthropic harness design research).
[2] Automated Verify:
oma verify {agent-type} --workspace {workspace} --jsonbackend, frontend, mobile, qa, debug, and pm.db, refactor, architecture, tf-infra, and docs, record that automated verify is unsupported and continue to QA cross-review after the mechanical checks.[3] Cross-Review: Spawn QA agent to review the changes:
docs/CODE-REVIEW.md exists, QA agent uses it as the review checklist| Counter | Max | On Exceeded |
|---|---|---|
| Self-check + fix cycles | 3 | Escalate to cross-review regardless |
| Cross-review rejections | 2 | Report to user with review history |
| Total loop iterations | 5 | Force-complete with quality warning |
When feeding review results back to the implementation agent:
## Review Feedback (iteration {n}/{max})
**Reviewer**: {self / verify / qa-agent}
**Verdict**: FAIL
**Issues**:
1. {specific issue with file and line reference}
2. {specific issue}
**Fix instruction**: {what to change}This replaces single-pass verification. Most "nitpicking" should happen agent-to-agent. Human review is reserved for final approval, not catching lint errors.
Before starting any retry, check the termination conditions (OR, whichever fires first wins):
loadQuotaCap() from cli/io/session-cost.ts; no cap → skip), call checkCap(sessionId, cap). On exceeded === true, save the agent's partial results, report early termination due to quota, and do not spawn the next retry or any remaining agents in the tier.If neither condition fires:
orchestrate.md Step 5): generate 2-3 alternative hypotheses, spawn the same agent type with different hypothesis prompts in parallel separate workspaces, score with Quality Score when available, keep the highest-scoring approach, and record all experiments in the Experiment Ledger.Track user corrections during session execution. See ../_shared/core/session-metrics.md for full protocol.
When user sends feedback during session:
| CD Score | Action |
|---|---|
| CD >= 50 | RCA Required: QA agent must add entry to lessons-learned.md |
| CD >= 80 | Session Pause: Request user to re-specify requirements |
redo >= 2 | Scope Lock: Request explicit allowlist confirmation before continuing |
After each user correction event:
[EDIT]("session-metrics.md", append event to Events table)At session end, if CD >= 50:
lessons-learned.md with prevention measuresresources/subagent-prompt-template.mdresources/memory-schema.mdconfig/cli-config.yamlscripts/spawn-agent.sh, scripts/parallel-run.sh, scripts/verify.shtemplates/../_shared/core/skill-routing.mdscripts/verify.sh <agent-type>../_shared/core/session-metrics.md../_shared/core/api-contracts/template.md; read generated contracts from .agents/results/api-contracts/ (run artifact) or docs/plans/contracts/ (durable spec)../_shared/core/context-loading.md../_shared/core/difficulty-guide.md../_shared/core/clarification-protocol.md../_shared/core/context-budget.md../_shared/core/lessons-learned.md3021301
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.