Oh-my-codex worker
Team worker protocol (ACK, mailbox, task lifecycle) for tmux-based OMX teams
git clone https://github.com/Yeachan-Heo/oh-my-codex
T=$(mktemp -d) && git clone --depth=1 https://github.com/Yeachan-Heo/oh-my-codex "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/worker" ~/.claude/skills/yeachan-heo-oh-my-codex-worker && rm -rf "$T"
skills/worker/SKILL.mdWorker Skill
This skill is for a Codex session that was started as an OMX Team worker (a tmux pane spawned by
$team).
Identity
You MUST be running with
OMX_TEAM_WORKER set. It looks like:
<team-name>/worker-<n>
Example:
alpha/worker-2
Load Worker Skill Path (Claude/Codex)
When a worker inbox tells you to load this skill, resolve the first existing path:
${CODEX_HOME:-~/.codex}/skills/worker/SKILL.md~/.codex/skills/worker/SKILL.md<leader_cwd>/.codex/skills/worker/SKILL.md
(repo fallback)<leader_cwd>/skills/worker/SKILL.md
Startup Protocol (ACK)
- Parse
into:OMX_TEAM_WORKER
(before theteamName
)/
(after theworkerName
, usually/
)worker-<n>
- Send a startup ACK to the lead mailbox before task work:
- Recipient worker id:
leader-fixed - Body: one short deterministic line (recommended:
).ACK: <workerName> initialized
- Recipient worker id:
- After ACK, proceed to your inbox instructions.
The lead will see your message in:
<team_state_root>/team/<teamName>/mailbox/leader-fixed.json
Use CLI interop:
withomx team api send-message --input <json> --json{team_name, from_worker, to_worker:"leader-fixed", body}
Copy/paste template:
omx team api send-message --input "{\"team_name\":\"<teamName>\",\"from_worker\":\"<workerName>\",\"to_worker\":\"leader-fixed\",\"body\":\"ACK: <workerName> initialized\"}" --json
Inbox + Tasks
- Resolve canonical team state root in this order:
envOMX_TEAM_STATE_ROOT- worker identity
team_state_root - team config/manifest
team_state_root - local cwd fallback (
).omx/state
- Read your inbox:
<team_state_root>/team/<teamName>/workers/<workerName>/inbox.md - Pick the first unblocked task assigned to you.
- Read the task file:
(example:<team_state_root>/team/<teamName>/tasks/task-<id>.json
)task-1.json - Task id format:
- The MCP/state API uses the numeric id (
), not"1"
."task-1" - Never use legacy
wording.tasks/{id}.json
- The MCP/state API uses the numeric id (
- Claim the task (do NOT start work without a claim) using claim-safe lifecycle CLI interop (
).omx team api claim-task --json - Do the work.
- Complete/fail the task via lifecycle transition CLI interop (
) fromomx team api transition-task-status --json
toin_progress
orcompleted
.failed- Do NOT directly write lifecycle fields (
,status
,owner
,result
) in task files.error
- Do NOT directly write lifecycle fields (
- Use
only for rollback/requeue toomx team api release-task-claim --json
(not for completion).pending - Update your worker status:
with<team_state_root>/team/<teamName>/workers/<workerName>/status.json{"state":"idle", ...}
Mailbox
Check your mailbox for messages:
<team_state_root>/team/<teamName>/mailbox/<workerName>.json
When notified, read messages and follow any instructions. Use short ACK replies when appropriate.
Note: leader dispatch is state-first. The durable queue lives at:
<team_state_root>/team/<teamName>/dispatch/requests.json
Hooks/watchers may nudge you after mailbox/inbox state is already written.
Use CLI interop:
to readomx team api mailbox-list --json
to acknowledge deliveryomx team api mailbox-mark-delivered --json
Copy/paste templates:
omx team api mailbox-list --input "{\"team_name\":\"<teamName>\",\"worker\":\"<workerName>\"}" --json omx team api mailbox-mark-delivered --input "{\"team_name\":\"<teamName>\",\"worker\":\"<workerName>\",\"message_id\":\"<MESSAGE_ID>\"}" --json
Dispatch Discipline (state-first)
Worker sessions should treat team state + CLI interop as the source of truth.
- Prefer inbox/mailbox/task state and
operations.omx team api ... --json - Do not rely on ad-hoc tmux keystrokes as a primary delivery channel.
- If a manual trigger arrives (for example
nudge), treat it only as a prompt to re-check state and continue through the normal claim-safe lifecycle.tmux send-keys
Shutdown
If the lead sends a shutdown request, follow the shutdown inbox instructions exactly, write your shutdown ack file, then exit the Codex session.