N coordinated agents on shared task list using tmux-based orchestration
$team is the tmux-based parallel execution mode for OMX. It starts real worker Codex and/or Claude CLI sessions in split panes and coordinates them through .omx/state/team/... files plus CLI team interop (omx team api ...) and state files.
This skill is operationally sensitive. Treat it as an operator workflow, not a generic prompt pattern.
omx team when you need durable tmux workers, shared task state, mailbox/dispatch coordination, worktrees, explicit lifecycle control, or long-running parallel execution that must survive beyond one local reasoning burst.When user triggers $team, the agent must:
omx team ...spawn_agent fanoutIf omx team is unavailable, stop with a hard error.
omx team [N:agent-type] "<task description>"
Examples:
omx team 3:executor "analyze feature X and report flaws"
omx team "debug flaky integration tests"
omx team "ship end-to-end fix with verification"
omx team ... is now the canonical launch path for coordinated execution.
Team mode should carry its own parallel delivery + verification lanes without
requiring a separate linked Ralph launch up front.
omx team ... / $team ... for coordinated workers.omx ralph ... / $ralph ... only when a later manual follow-up still needs a persistent single-owner fix/verification loop.omx team ralph ... has been removed. Use plain omx team ... for team execution or run omx ralph ... separately when you explicitly want a later Ralph loop.Important: N:agent-type (for example 2:executor) selects the worker role prompt, not the worker CLI (codex vs claude).
To launch Claude teammates, use the team worker CLI env vars:
# Force all teammates to Claude CLI
OMX_TEAM_WORKER_CLI=claude omx team 2:executor "update docs and report"
# Mixed team (worker 1 = Codex, worker 2 = Claude)
OMX_TEAM_WORKER_CLI_MAP=codex,claude omx team 2:executor "split doc/code tasks"
# Auto mode: Claude is selected when worker launch args/model contains 'claude'
OMX_TEAM_WORKER_CLI=auto OMX_TEAM_WORKER_LAUNCH_ARGS="--model claude-..." omx team 2:executor "run mixed validation"
Before running $team, confirm:
tmux installed (tmux -V)$TMUX is set)omx command resolves to the intended install/buildnode bin/omx.js ..., run npm run build after src changeshud --watch panes before splitSuggested preflight:
tmux list-panes -F '#{pane_id}\t#{pane_start_command}' | rg 'hud --watch' || true
If duplicates exist, remove extras before omx team to prevent HUD ending up in worker stack.
Before launching omx team, require a grounded context snapshot:
.omx/context/{slug}-*.md when available..omx/context/{slug}-{timestamp}.md (UTC YYYYMMDDTHHMMSSZ) with:
explore first for brownfield facts, then run $deep-interview --quick <task> before team launch.Do not start worker panes until this gate is satisfied; if forced to proceed quickly, state explicit scope/risk limitations in the launch report.
For simple read-only brownfield lookups during intake, follow active session guidance: when USE_OMX_EXPLORE_CMD is enabled, prefer omx explore with narrow, concrete prompts; otherwise use the richer normal explore path and fall back normally if omx explore is unavailable.
When $team is used as a follow-up mode from ralplan, carry forward the approved plan's explicit available-agent-types roster and convert it into concrete staffing guidance before launch:
omx team N "<task>" / $team N "<task>") for the coordinated team run; mention a later separate Ralph follow-up only when genuinely neededomx team currently performs:
N, agent-type, task).omx/state/team/<team>/config.json.omx/state/team/<team>/manifest.v2.json.omx/state/team/<team>/tasks/task-<id>.json.omx/state/team/<team>/worker-agents.mdAGENTS.md content (if present) + worker overlay, without mutating project AGENTS.md<leader-cwd>/.omx/state)OMX_TEAM_WORKER=<team>/worker-<n>OMX_TEAM_STATE_ROOT=<leader-cwd>/.omx/stateOMX_TEAM_LEADER_CWD=<leader-cwd>OMX_TEAM_WORKER_CLI / OMX_TEAM_WORKER_CLI_MAP (codex or claude)--worktree is usedcapture-pane polling)inbox.md and trigger via tmux send-keysstatus / resume / shutdownIf coarse active team mode state is missing while canonical team runtime state exists, restore/sync the active team mode state before relying on hook/mode-aware behavior.
Important:
omx team --worktree[=<name>]) while sharing one team state rootmailbox/leader-fixed.jsonOMX_TEAM_WORKER_CLI_MAP entry for that worker index,OMX_TEAM_WORKER_CLI / auto detection.Tab on busy panes (strategy-dependent).C-m) rounds (never queue-first Tab).Team mode resolves worker model flags from one shared launch-arg set (not per-worker model selection).
Model precedence (highest to lowest):
OMX_TEAM_WORKER_LAUNCH_ARGS--model flagOMX_DEFAULT_SPARK_MODEL (legacy alias: OMX_SPARK_MODEL) when 1+2 are absent and team agentType is low-complexityDefault-model rule:
OMX_DEFAULT_FRONTIER_MODEL for frontier-default guidance.OMX_DEFAULT_SPARK_MODEL for spark/low-complexity worker-default guidance.Thinking-level rule (critical):
model_reasoning_effort from model-name substrings (e.g., spark, high-capability, mini).low, medium, high).OMX_TEAM_WORKER_LAUNCH_ARGS already includes -c model_reasoning_effort=..., that explicit value overrides dynamic allocation for every worker.Normalization requirements:
--model <value> and --model=<value>--model <value>-c model_reasoning_effort="<level>"; otherwise inject the worker role's default reasoning levelFollow this exact lifecycle when running $team:
omx team status <team>, omx team resume <team>, mailbox/state files)pending=0in_progress=0failed=0 (or explicitly acknowledged failure path)omx team shutdown <team>Do not run shutdown while workers are actively writing updates unless user explicitly requested abort/cancel.
Do not treat ad-hoc pane typing as primary control flow when runtime/state evidence is available.
While a team is ON/running, the leader must not go blind. Keep checking live team state until terminal completion.
Minimum acceptable loop:
sleep 30 && omx team status <team-name>
Repeat that check while the team stays active, or use omx team await <team-name> --timeout-ms 30000 --json when event-driven waiting is a better fit.
If the leader gets a stale/team-stalled nudge, immediately run omx team status <team-name> before taking any manual intervention.
To avoid brittle behavior, message/task delivery must not be driven by ad-hoc tmux typing.
Required default path:
omx team ... runtime lifecycle commands for orchestration.omx team api ... --json for mailbox/task mutations.mailbox/*.json, task status, omx team status).Strict rules:
tmux send-keys as the primary mechanism to deliver instructions/messages.dispatch/requests.json, mailbox, inbox).worker_notify_failed:<worker>) or explicit user request (for example “press enter”).omx team status <team-name>
omx team resume <team-name>
omx team shutdown <team-name>
Semantics:
status: reads team snapshot (task counts, dead/non-reporting workers)resume: reconnects to live team session if presentshutdown: graceful shutdown request, then cleanup (deletes .omx/state/team/<team>)OMX_TEAM_WORKER per worker)tmux display-message.omx/state/team/<team>/... files.omx/state/team/<team>/mailbox/leader-fixed.json.omx/state/team/<team>/mailbox/worker-<n>.json.omx/state/team/<team>/dispatch/requests.json (durable dispatch queue; hook-preferred, fallback-aware).omx/state/team/<team>/config.json.omx/state/team/<team>/manifest.v2.json.omx/state/team/<team>/tasks/task-<id>.json.omx/state/team/<team>/workers/worker-<n>/identity.json.omx/state/team/<team>/workers/worker-<n>/inbox.md.omx/state/team/<team>/workers/worker-<n>/heartbeat.json.omx/state/team/<team>/workers/worker-<n>/status.json.omx/state/team-leader-nudge.jsonUse omx team api for machine-readable mutation/reads instead of legacy team_* MCP tools.
omx team api <operation> --input '{"team_name":"my-team",...}' --json
Examples:
omx team api send-message --input '{"team_name":"my-team","from_worker":"worker-1","to_worker":"leader-fixed","body":"ACK"}' --json
omx team api claim-task --input '{"team_name":"my-team","task_id":"1","worker":"worker-1"}' --json
omx team api transition-task-status --input '{"team_name":"my-team","task_id":"1","from":"in_progress","to":"completed","claim_token":"<token>"}' --json
--json responses include stable metadata for automation:
schema_versiontimestampcommandokoperationdata or errorLeader-to-worker:
inbox.mdtmux send-keysWorker-to-leader:
leader-fixed mailbox via omx team api send-message --jsonomx team api <operation> --jsonWorker commit protocol (critical for incremental integration):
git add -A && git commit -m "task: <task-subject>"Task ID rule (critical):
task-<id>.json (example task-1.json)task_id uses bare id (example "1", not "task-1")tasks/{id}.jsonUseful runtime env vars:
OMX_TEAM_READY_TIMEOUT_MS
OMX_TEAM_SKIP_READY_WAIT=1
OMX_TEAM_AUTO_TRUST=0
OMX_TEAM_AUTO_ACCEPT_BYPASS=0
2 + Enter)OMX_TEAM_WORKER_LAUNCH_ARGS
OMX_TEAM_WORKER_CLI
auto|codex|claude (default: auto)auto chooses claude when worker --model contains claude, otherwise codexclaude mode, workers launch with exactly one --dangerously-skip-permissions
and ignore explicit model/config/effort launch overrides (uses default settings.json)OMX_TEAM_WORKER_CLI_MAP
auto|codex|claude)1 (broadcast) or exactly the team worker countOMX_TEAM_WORKER_CLI_MAP=codex,codex,claude,claudeOMX_TEAM_WORKER_CLIOMX_TEAM_AUTO_INTERRUPT_RETRY
0 disables adaptive queue->resend escalationOMX_TEAM_LEADER_NUDGE_MS
OMX_TEAM_STRICT_SUBMIT=1
Operator note (important for Claude panes):
tmux send-keys ... C-m) can appear to "do nothing" when a worker is actively processing; Enter may be queued by the pane/task flow.Use only after checking omx team status <team> and mailbox/state evidence:
tmux capture-pane -t %<worker-pane> -p -S -120omx sparkshell --tmux-pane %<worker-pane> --tail-lines 400 before improvising extra tmux commands.C-c or escape flow (CLI-specific) once, then re-check pane capturetmux send-keys -t %<worker-pane> "ack + continue current task; report status" C-mcapture-panemailbox/leader-fixed.json or worker mailbox)omx team status <team>worker_notify_failed:<worker>Meaning:
Checks:
tmux list-panes -F '#{pane_id}\t#{pane_start_command}'tmux capture-pane -t %<worker-pane> -p -S -120npm run build)Checks:
.omx/state/team/<team>/mailbox/leader-fixed.json existsomx team api send-message --json calledomx team api ... ENOENT (or legacy team_send_message ENOENT / team_update_task ENOENT)Meaning:
omx team shutdown <team> (or removed .omx/state/team/<team>) before worker finished.Checks:
omx team status <team> and confirm whether tasks were still in_progress when shutdown occurred.omx/state/team/<team>/ existsrm -rf .omx/state/team/<team>) happened during executionPrevention:
shutdown only for terminal completion or explicit abortCause:
Fix:
Run from leader pane:
# 1) Inspect panes
tmux list-panes -F '#{pane_id}\t#{pane_current_command}\t#{pane_start_command}'
# 2) Kill stale worker panes only (examples)
tmux kill-pane -t %450
tmux kill-pane -t %451
# 3) Remove stale team state (example)
rm -rf .omx/state/team/<team-name>
# 4) Retry
omx team 1:executor "fresh retry"
Guidelines:
omx hud --watch) unless intentionally restarting HUDWhen operating this skill, provide concrete progress evidence:
Team started: <name>)Do not claim success without file/pane evidence.
Do not claim clean completion if shutdown occurred with in_progress>0.
Use omx sparkshell --tmux-pane ... as an explicit opt-in operator aid for pane inspection and summaries; keep raw tmux capture-pane evidence available for manual intervention and proof.
Use the omx team ... CLI as the supported team-launch surface. For automation, drive the same CLI flow from scripts or supervising agents rather than relying on a separate MCP runner.
omx team ... CLI — Primary method for interactive or automated team orchestration. Use this when you want direct tmux-pane visibility or a scriptable launch path..omx/state/team/<team>/ when you need status, task, or mailbox evidence after launch.Two cleanup paths exist and must not be confused:
team_cleanup (state-server): Deletes team state files on disk (.omx/state/team/<team>/). Use after a team run is fully complete.omx team shutdown / cleanup flow when you need to stop worker panes or clean up an interrupted run.1. omx team 1:executor "fix bugs"
2. omx team status <team-name>
3. omx team shutdown <team-name>
4. Clean up the finished team state for <team-name>
Good: The user says continue after the workflow already has a clear next step. Continue the current branch of work instead of restarting or re-asking the same question.
Good: The user changes only the output shape or downstream delivery step (for example make a PR). Preserve earlier non-conflicting workflow constraints and apply the update locally.
Bad: The user says continue, and the workflow restarts discovery or stops before the missing verification/evidence is gathered.