From cekernel
Discovers open issues with a target label (default: ready), triages them, and delegates to the Orchestrator for parallel processing. Supports lock filtering, env profiles, and non-interactive execution.
How this skill is triggered — by the user, by Claude, or both
Slash command
/cekernel:dispatch [--yes] [--env profile] [--label label][--yes] [--env profile] [--label label]This skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Discovers open issues labeled `ready`, triages them, and delegates to the Orchestrator agent for parallel processing.
Discovers open issues labeled ready, triages them, and delegates to the Orchestrator agent for parallel processing.
No arguments required — by default, picks up all open issues with the ready label.
Optional flags:
--yes, -y — Skip the user confirmation step (Step 3) and proceed directly to delegation. Required for non-interactive execution (cron, at).--env <profile> — Select an env profile (default: default). Available profiles: default, headless, ci, or any custom profile in .cekernel/envs/.--label <label> — Override the target label (default: ready).Examples:
/dispatch
/dispatch --yes
/dispatch -y --env headless --label sprint-3
/dispatch --env ci --label ready
Note: In plugin mode, /cekernel:dispatch also works.
closes #N which auto-closes the issue--state open, so closed issues are excludedDetect whether cekernel is running as a plugin or locally using file-based detection (ADR-0009).
skills/references/namespace-detection.md from the repository root ($(git rev-parse --show-toplevel)/skills/references/namespace-detection.md). If the Read fails (file not found), you are in plugin mode.CEKERNEL_NS=local: CEKERNEL_AGENT_ORCHESTRATOR=orchestrator, CEKERNEL_AGENT_WORKER=worker, CEKERNEL_AGENT_REVIEWER=reviewerCEKERNEL_NS=plugin: CEKERNEL_AGENT_ORCHESTRATOR=cekernel:orchestrator, CEKERNEL_AGENT_WORKER=cekernel:worker, CEKERNEL_AGENT_REVIEWER=cekernel:reviewerStore these values for use in subsequent steps.
Also resolve the cekernel scripts path for lock checking and Orchestrator propagation:
CEKERNEL_SCRIPTS="$(cd -P "${CLAUDE_SKILL_DIR}/../../scripts" && pwd)"
Fetch all open issues with the target label:
gh issue list --label <label> --state open --json number,title --jq '.[] | "\(.number)\t\(.title)"'
If no issues are found, report to the user and exit — there is nothing to process.
Filter out issues already being processed by an active Worker:
source "${CEKERNEL_SCRIPTS}/shared/issue-lock.sh"
issue_lock_check "$(git rev-parse --show-toplevel)" <issue-number>
# exit 0 = locked (skip), exit 1 = unlocked (proceed)
Remove locked issues from the candidate list before triage. Report skipped issues to the user.
Read skills/references/triage.md from the repository root ($(git rev-parse --show-toplevel)/skills/references/triage.md) and follow the triage protocol for each discovered issue.
If --yes (or -y) was specified, skip the confirmation prompt and proceed directly to Step 4.
Otherwise, present the triaged issue list to the user for confirmation before delegating:
Found N issues with label "ready":
#42 Fix login timeout
#55 Add dark mode support
#61 Update dependencies
Proceed with delegation to Orchestrator? (y/n)
Wait for user confirmation. If the user declines, exit without action.
Before launching the Orchestrator, check the current number of running orchestrators against CEKERNEL_MAX_ORCHESTRATORS:
ORCHCTL="${CEKERNEL_SCRIPTS}/ctl/orchctl.sh"
CURRENT_ORCH=$(bash "$ORCHCTL" count 2>/dev/null)
source "${CEKERNEL_SCRIPTS}/shared/load-env.sh"
MAX_ORCH="${CEKERNEL_MAX_ORCHESTRATORS:-3}"
echo "orchestrators: ${CURRENT_ORCH}/${MAX_ORCH}"
If CURRENT_ORCH >= MAX_ORCH:
/dispatch run.source "${CEKERNEL_SCRIPTS}/shared/desktop-notify.sh"
desktop_notify "cekernel: dispatch stopped" "Orchestrator limit reached (${CURRENT_ORCH}/${MAX_ORCH}). Remaining issues deferred."
If CURRENT_ORCH < MAX_ORCH, proceed to Step 4.
--env, Initialize Session, and Launch Orchestrator ProcessIf --env <profile> was specified, set CEKERNEL_ENV to the given profile name. If not specified, default to default.
Initialize cekernel session — Run the following in a single Bash tool call. This generates CEKERNEL_SESSION_ID (format: {repo}-{hex8}) and writes repo metadata for orchctl ls:
# 1. Generate CEKERNEL_SESSION_ID ({repo}-{hex8} format)
source "${CEKERNEL_SCRIPTS}/shared/load-env.sh"
source "${CEKERNEL_SCRIPTS}/shared/session-id.sh"
mkdir -p "$CEKERNEL_IPC_DIR"
# 2. Write repo metadata for orchctl (org/repo format)
_url="$(git config --get remote.origin.url)"
_path="${_url#*:}"; _path="${_path#*//}"; _path="${_path%.git}"
_REPO_SLUG="${_path#*/}"
echo "$_REPO_SLUG" > "${CEKERNEL_IPC_DIR}/repo"
# 3. Output CEKERNEL_SESSION_ID for prompt construction
echo "CEKERNEL_SESSION_ID=${CEKERNEL_SESSION_ID}"
Capture CEKERNEL_SESSION_ID from the Bash output (the line CEKERNEL_SESSION_ID=...) and use it in the Orchestrator prompt.
Note: Claude Code session ID (orchestrator.claude-session-id) persistence is handled by the Orchestrator itself after startup. The dispatch skill does not persist it because the skill's UUID differs from the Orchestrator's UUID (the Orchestrator runs as a separate claude -p --agent process).
Construct the Orchestrator prompt from the following template. Replace <placeholders> with actual values determined in previous steps:
Process the following issues: <#N title, #M title, ...>
<Execution order if determined in Step 2, otherwise omit this line>
Environment values to propagate in ALL script invocations:
- CEKERNEL_SESSION_ID=<session-id>
- CEKERNEL_ENV=<profile>
- CEKERNEL_SCRIPTS=<scripts-path>
- CEKERNEL_AGENT_WORKER=<worker-agent-name>
- CEKERNEL_AGENT_REVIEWER=<reviewer-agent-name>
IMPORTANT: CEKERNEL_SESSION_ID must be {repo}-{hex8} format from the Bash output above, not the Claude Code session UUID.
MUST NOT: Do not include Agent tool language (subagent_type, Agent(worker), Agent(reviewer), etc.) in the prompt. Workers and Reviewers are spawned by the Orchestrator via spawn-worker.sh / spawn-reviewer.sh (Bash), following its own agent definition.
Launch the Orchestrator as an independent OS process via spawn-orchestrator.sh:
export CEKERNEL_SESSION_ID=<session-id> && \
export CEKERNEL_ENV=<profile> && \
export CEKERNEL_AGENT_ORCHESTRATOR=<agent-name> && \
export CEKERNEL_AGENT_WORKER=<agent-name> && \
export CEKERNEL_AGENT_REVIEWER=<agent-name> && \
"${CEKERNEL_SCRIPTS}/ctl/spawn-orchestrator.sh" "<prompt>"
The script launches the Orchestrator as a background claude -p --agent process that runs independently of the parent session. The Orchestrator PID is returned on stdout.
The Orchestrator autonomously executes:
CEKERNEL_ENV propagated)npx claudepluginhub clonable-eden/plugins --plugin cekernelDelegates GitHub issues to the Orchestrator agent for parallel processing using git worktrees and WezTerm windows, with concurrency guards and issue locking.
Triages GitHub issues assigned to you: fetches via GH CLI with cc-triage-scope label, builds dependency graph, categorizes resolved issues, and applies labels (cc-create-issue, cc-exec-issue, cc-update-issue).
Triage GitHub issues through a configurable label-based state machine. Moves issues between workflow states like triage_pending, awaiting_info, ready_for_agent, and ready_for_human.