execute
Skill0 starsChanged 28 days agoApache-2.0View on GitHub
Drive a finished plan to ready pull requests with passing CI, merging them only when run with `--merge`, without stopping between issues: take the next unblocked one, hand it to `/work-on`, land it, repeat, across one repo or several. Use it when the plan exists and the next thing is doing it — "we have the plan, go", "build everything in the plan", "ship the whole milestone", "start on the plugin-system work" — and for "pick up where we left off", since a run already in flight resumes from its own recorded state rather than from wherever the working tree happens to sit. An agent that opens a PLAN and starts implementing issue one by hand is the failure this exists to prevent. A `multi-pr` plan is the exception: those run through `/work-on` instead. Do NOT use it to work out a feature that has no plan yet (`/scope`), to write the plan (`/plan`), or to do a single issue (`/work-on`).
- Commits and pushes
57 other projects use a version of this.
Adopted by
Most recently taken up by
- LeonardiFranco/skillstheir own version, first seen Nov 8, 2026
- pfangueiro/claude-code-agentstheir own version, first seen Nov 8, 2026
- Yeachan-Heo/oh-my-claudecodetheir own version, first seen Nov 8, 2026
- crbnos/carbontheir own version, first seen Nov 7, 2026
- afaraha8403/balakittheir own version, first seen Nov 6, 2026
- chrislacey89/skillstheir own version, first seen Nov 4, 2026
Used with
Projects with it also use context-optimize, ralplan and 8 more.
Other files people use alongside this one.
Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
ibahgatSkillcontext-optimize
Improve context efficiency and cache stability for long or complex sessions.
Also in 3 projects that use this
ibahgatSkillralplan
Create a strict, quality-first execution plan with explicit gates and rollback-ready sequencing.
Also in 5 projects that use this
Yeachan-HeoSkillultragoal
Create and execute durable repo-native multi-goal plans over Codex goal mode artifacts.
Also in 4 projects that use this
buddyhSkilldeep-dive
Deep dive on any topic. Decomposes into subtopics, researches each in parallel with thorough source gathering, then synthesizes into a comprehensive report (4,000-10,000+ words, 40-100+ sources). Scales depth dynamically based on topic complexity. Use when asked for a deep dive, deep research, comprehensive analysis, or thorough investigation of a topic.
Also in 4 projects that use this
mukcoSkillprinciples
General software engineering principles — DRY, SOLID, YAGNI, KISS, naming, code smells, and refactoring. Language-agnostic. Use alongside language-specific skills.
Also in 3 projects that use this
team-attentionSkillcompound
This skill should be used when the user says "/compound", "compound this", "document learnings", "save what we learned", or after completing a PR. Extracts knowledge from PR context and saves to docs/learnings/.
Also in 3 projects that use this
- +1 more from ibahgat
Other versions57 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 57
- Yeachan-Heo/oh-my-claude-sisyphus★ 41ksame name
- Yeachan-Heo/oh-my-claudecode★ 41ksame name
- crbnos/carbon★ 2.8ksame name
- zaxbysauce/opencode-swarm★ 519same name
- ZaxbyHub/opencode-swarm★ 518same name
- Joonghyun-Lee-Frieren/oh-my-antigravity★ 214same name
- Joonghyun-Lee-Frieren/oh-my-gemini-cli★ 214same name
- team-attention/hoyeon★ 173same name
- Adrian333Dev/flow★ 39same name
- shipshitdev/skills★ 39same name
47 more not listed
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository23 other files it gives its agents.
- AGENTS.mdAGENTS.md
- CLAUDE.mdCLAUDE.md
- briefSkill
- charterSkill
- compSkill
- coordinateSkill
- decisionSkill
- deliverSkill
- designSkill
- exploreSkill
- inflightSkill
- planSkill
- prdSkill
- private-contentSkill
- public-contentSkill
- releaseSkill
- review-planSkill
- roadmapSkill
- scopeSkill
- strategySkill
- visionSkill
- work-onSkill
- writing-styleSkill
The file
We split this skill into the rules it gives an agent
6 rules. 0 are common, 1 is distinctive, and 5 are very specific to this project.
0
Common
Most of the 55 edited versions we read keep these.
1
Distinctive
This author's own choices. Worth a look.
5
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 136
Before any child is spawned, assert the cross-skill /work-on child template resolves:
- Very specific: line 151
Every invocation, fresh or resumed, enters the same way: write this invocation's tokens to a file outside the work tree and hand it to …
- Distinctive: line 182
Stop and direct the user there.
- Very specific: line 292
Ownership and the write set: Every PR number read from the index and every head-branch lookup goes through owned-pr.sh with the run's …
- Very specific: line 313
The pause: When a node can't start because a predecessor's PR is unmerged, the run ends paused_awaiting_merges.
- Very specific: line 330
When a coordinated effort is abandoned mid-flight — the loop reaches a genuine blocker and the operator elects to abandon rather than …
“Common” is measured: kept by at least 6 in 10 of the 55 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
!${CLAUDE_PLUGIN_ROOT}/scripts/skill-preflight.sh execute 2>&1 || true
Execute
Input Modes
From $ARGUMENTS:
- Path to a PLAN doc (
docs/plans/PLAN-*.md, or any.mdwhose frontmatter hasschema: plan/v1) — read the PLAN'sexecution_mode:single-pr— run the single-pr execution path below.coordinated— run the coordinated execution path below.multi-pr— out of scope for/execute; multi-pr plans run one issue at a time through/work-onagainst the repo-persisted PLAN. Direct the user to/work-on.
- Empty — ask which PLAN to execute.
The PLAN's execution_mode is an enum-typed input surface; re-validate it against
{single-pr, coordinated, multi-pr} before it selects an execution path or is
interpolated into any branch name or emitted shell (see Security Considerations).
/execute is the first untrusted-enum consumer; the /work-on dispatcher is the
second, and re-validates the same enum independently.
When the enum resolves to coordinated, verify the mode-scoped
prerequisites before the coordinated path starts. skills/execute/requires.tsv
declares one mode:coordinated record — shirabe validate with
--coordination-body and --merge-gate, the two modes a single-pr plan never
reaches. It was not checked when this skill loaded: the load-time check
evaluates always records only, because the PLAN had not been read yet and
reporting on a record it never evaluated would be a claim it can't support.
Field four of the declaration is where the deferral is visible. Run, right
after the enum re-validation passes and before the loop drives anything:
${CLAUDE_PLUGIN_ROOT}/scripts/skill-preflight.sh execute --mode coordinated 2>&1 || trueSilence means the coordinated surface is present. Output means the merge-last
gate this path fails closed on cannot run as declared — surface it before the
first child is dispatched, not at the gate, where a whole cascade has already
landed. Run it with the 2>&1 || true guard as shown, never bare: a missing
script or an unexpanded ${CLAUDE_PLUGIN_ROOT} exits 127, which kills a run
mid-cascade.
The single-pr path makes no such call: the declaration has no mode:single-pr
record, because every tool that path needs is already always.
Execution-Mode Flags
/execute honors an explicit autonomy mode resolved `flag > CLAUDE.md
Execution Mode: header > default interactive`:
--auto— authorized autonomous run; the orchestrator loop drives to the done-signal or a genuine blocker without checkpoint stops (the template'sspawn_and_awaitdirective binds this at every tick).--interactive(default) — the existing approval/checkpoint behavior is unchanged.
A clear author instruction ("run autonomously", "don't stop") resolves to the same
authorized-autonomous mode as --auto. Per the pattern's parent-do-not-extend-child
rule, /execute does not add flags to any /work-on child's $ARGUMENTS; a
child koto materializes receives only the variables its task entry lists.
Two more flags, on both paths:
--merge(boolean, default off) — let this run merge its PR once the merge decision says it may (the template'smerge_readinessthroughmerge_confirmstates); on a coordinated PLAN, each node PR in merge order and then the coordination PR. It becomes the koto variableMERGE, passed explicitly on every invocation (falsewithout the flag) and re-applied by koto on every accepted attach, so it is never remembered across runs: a run resumed without--mergedoes not merge, whatever an earlier invocation asked. Pass it once; a repeated--mergeis refused by koto asduplicate_var, and--merge=<anything but true or false>asinvalid_var, each with exit 2 and no session.--review-floor=<level>and--review-ceiling=<level>(eachlight,standardorfull; default none) — the review-level bound every/work-onchild carries (skills/work-on/references/review-levels.md). They become the koto variablesREVIEW_FLOORandREVIEW_CEILING, passed only when given, and each child task gets them as variables, only when not empty: on a single-pr PLAN through the spawn, on a coordinated one through the dispatch step. Like--mergethey belong to one invocation: a run resumed without them spawns its remaining children unbounded, and children already spawned keep the bound they started with. A value outside the three names is koto'sinvalid_var, a repeat itsduplicate_var, each with exit 2 and no session.--koto-leg=<request-id>:<leg>— attach this run's session to a koto request leg, so its terminal result reaches whoever waits on that leg (/deliverpasses it). The request id must match koto's request-id pattern (^[a-z0-9_][a-z0-9_-]{0,63}$) and the leg must beexecute, the one leg/executeanswers; both are checked before any koto call. It changes nothing but where the result goes: the run, its prints, and its exit lines are the same as without it.
koto is the only judge of the arguments. /execute makes no refusal of its
own before koto init for anything a koto variable can express: the merge flag,
the mode, and the PLAN slug are all constrained variables, so under --koto-leg
every argument refusal is koto's and koto records it on the leg. /execute's own
pre-init refusals are only those where no koto call can be built at all: a
malformed --koto-leg value, an args file inside the work tree, or a missing
koto binary. One routing refusal joins them: a multi-pr PLAN, which
execute-open.sh refuses with error=multi-pr (exit 64) and a message naming
/work-on <PLAN> as the entry point (per
docs/decisions/DECISION-contradiction-multi-pr-plan-routing-2026-09-28.md). None of these makes a koto call, so none
is recorded on a --koto-leg. /deliver never produces them, because it builds the --koto-leg value
and the args itself and hands a multi-pr PLAN off without calling /execute.
Topic-Slug Constraint
The topic slug (derived from the PLAN filename) MUST match ^[a-z0-9-]+$, the
pattern-level regex sourced from
${CLAUDE_PLUGIN_ROOT}/references/parent-skill-state-schema.md
(Topic-Slug Regex). The slug keys the session name and every emitted write path,
so it is re-validated before any interpolation (see Security Considerations).
Single-PR Execution Path
Step 1 — Assert the child template (cross-skill coupling)
Before any child is spawned, assert the cross-skill /work-on child template
resolves:
${CLAUDE_PLUGIN_ROOT}/skills/execute/scripts/assert-child-template.shA non-zero exit halts the run with a clear message. This is the load-bearing
cross-skill reference: /execute spawns per-issue children with /work-on's
work-on.md, referenced relatively from the lifted template as
../../work-on/koto-templates/work-on.md (canonically
${CLAUDE_PLUGIN_ROOT}/skills/work-on/koto-templates/work-on.md).
Step 2 — Initialize the plan-level orchestrator
Every invocation, fresh or resumed, enters the same way: write this invocation's
tokens to a file outside the work tree and hand it to execute-open.sh, which
maps them to the session's variables with jq (never eval) and makes the one
koto init call through the shared scripts/koto-open.sh:
# A private directory outside the work tree for the args file.
ARGS_DIR=$(${CLAUDE_PLUGIN_ROOT}/scripts/koto-open.sh --alloc-dir)
# The invocation's tokens, one JSON string each, in order: the PLAN path and any
# of --auto, --interactive, --merge, --review-floor=<level>,
# --review-ceiling=<level>, --koto-leg=<request-id>:execute.
jq -n '$ARGS.positional' --args -- <token> <token> ... > "$ARGS_DIR/tokens.json"
${CLAUDE_PLUGIN_ROOT}/skills/execute/scripts/execute-open.sh "$ARGS_DIR/tokens.json"The script prints koto-open's result line and nothing else you need to parse:
opened=new— a fresh session;opened=attached— this run's live session, with the rebind variables re-applied;opened=replaced— a finished session (a retaineddone_blockedorpaused_for_review) replaced by a fresh one, with its old result on thereplaced_result=line, which you may print. Each is followed bysession=execute-<plan-slug>; drive that session (Step 3).refused=<code>— koto refused the invocation: a bad or repeated argument, a liveexecute-<plan-slug>session built from another template (execute-coordinated.md), or one belonging to another worktree or session store. koto's refusal is on stderr in/execute's wording, and the script follows it withoutcome=errorandstep=execute:refused. The session, and itsMERGE, is untouched, and under--koto-legkoto has recorded the refusal on the leg. Stop there.error=multi-pr(exit 64) — the PLAN ismulti-pr, which/executedoesn't run; stderr names/work-on <PLAN>as the entry point. No koto call was made. Stop and direct the user there.
Step 3 — Drive the orchestrator loop
How each state runs is its directive in skills/execute/koto-templates/execute.md, which koto returns with every tick; read the template for a state's gates and routes.
Every koto next on the orchestrator session carries --no-cleanup:
koto next execute-<plan-slug> --with-data @"$TMP" --no-cleanupWithout it, the tick that reaches a success terminal disposes of the session
and every context key it holds. At paused_for_review that costs what a resume reads, which is
the worst loss, since the pause is solicited; at merged,
ready_awaiting_merge and done it costs the run's record. koto keeps
done_blocked, a failure terminal, either way. The rule and its reasoning are
in references/koto-session-retention.md.
The same reference explains why a tick does not stop at the state it routes to:
one tick can chain through several states, merge_route included, to a
terminal, so a run may already be past a state you meant to act at. koto
status shows where it landed.
You don't report what a script or a lookup already answered. koto reads
those answers through gates and routes on them itself: which PR the run owns
(orchestrator_setup, pr_finalization, plan_completion and ci_monitor
each look it up through check-pr-output.sh --owned-pr), whether the PR body,
the shared branch's commits and its docs/ visibility pass
(pr_finalization), the cascade's verdict (plan_completion, from the
cascade_result.json that run-cascade.sh --session records), the CI and merge
state (ci_monitor), and the pause (PAUSE_BEFORE_FINALIZE). A failing output
check holds the run in its state with findings naming the rule; fix the output
and tick again. The evidence a state still takes is the agent's own account:
completed (the setup steps ran), override and blocked at setup,
updated (you wrote the PR body; the checks then judge it) and
update_failed, cascade_detail, and the CI repair outcomes. The routes are tested in
scripts/execute-output-gates-routing_test.sh.
The per-issue /work-on children carry it too. /work-on's own rule is
every tick, root or child. On a child the flag only keeps the session: its
result still reaches this skill's children-complete gate on the tick that
arrives at its terminal. A child that ends at done_blocked is kept whether or
not it carried the flag, so the per-child record a needs_attention batch most
wants is readable afterwards: koto status <child> for where it stopped, and
koto context get <child> failure_reason for why.
Coordinated Execution Path
A coordinated PLAN spans one or more repositories. Its work is split into PR
nodes, one per (repo, pr_group), and the PR node is the unit of branching:
two groups in one repository get two branches and two PRs, and a PLAN spread over
several repositories whose items all carry Group: default gets one node per
repository. The run is a
loop over those nodes whose decisions live in scripts, not prose, inside a thin
koto envelope, skills/execute/koto-templates/execute-coordinated.md, so it ends
in the same result-declaring terminals as a single-pr run. The contract it binds
to (the coordination PR, its PR index and merge-order block, the two-node DAG,
the merge step and the pause, the done-signal, and the F1/F2/F4 rules) is
canonical in
${CLAUDE_PLUGIN_ROOT}/references/coordination-strategy.md;
this section binds to it rather than restating it. The shirabe validate modes
(--coordination-body, --merge-gate) and their fail-closed behavior are owned
by the CLI; the merge-last gate treats any PR it can't resolve as not-merged, and
the evaluate-coordination and merge-coordination actions in
execute-coordinated.md's coord_loop directive are where the run invokes it.
The loop reads work items and PR status and the merge-gate result, never a
child PR's body. It runs against an existing coordination PR, found by an
ownership-filtered head-branch lookup on the coordination branch (never by title)
and required to carry the This is a **coordination PR** marker; creating it
stays /scope's job. The PLAN comes from plan-to-tasks.sh, which gives every PR
node its REPO, PR_GROUP, ISSUES, and ISSUE_SOURCE, so /execute never
re-parses the PLAN. A coordinated PLAN at tracking_level: none carries no GitHub
issue at all: its work items are outlines, and the run makes no gh issue call.
Nothing lands on the coordination branch except the scoping documents and the
finalization cascade. A node branch is cut from the default branch, never from
the coordination branch, a predecessor's branch, or HEAD, so no node PR carries
the PLAN to the default branch ahead of the coordination PR.
Step 1 — Assert the child template
Assert the same cross-skill work-on.md child template resolves (each node's
work items dispatch to it):
${CLAUDE_PLUGIN_ROOT}/skills/execute/scripts/assert-child-template.shA non-zero exit halts the run.
Step 2 — Enter the envelope
Enter exactly as the single-pr path does (Single-PR Execution Path, Step 2):
write this invocation's tokens to a file outside the work tree and run
execute-open.sh. It reads the PLAN's execution_mode, and for coordinated it
opens execute-<plan-slug> from execute-coordinated.md through
scripts/koto-open.sh with --attach-live --replace-terminal (plus
--koto-leg=<request-id>:execute when given), passing PLAN_DOC, PLAN_SLUG,
PLUGIN_ROOT, MERGE from this invocation's --merge,
PAUSE_BEFORE_FINALIZE, and REVIEW_FLOOR/REVIEW_CEILING when given. The session stays a root, and every koto next on it
carries --no-cleanup, as on the single-pr path.
The two templates share the execute-<plan-slug> name. A live session of that
name built from execute.md is refused by koto (template_mismatch), the
session is left as it was, and the run prints outcome=error and
step=execute:refused through print-exit.sh; under --koto-leg koto records
the refusal on the leg with source refused. A finished (retained terminal)
session of either template is replaced.
Ownership and the write set. Every PR number read from the index and every
head-branch lookup goes through owned-pr.sh with the run's --run-id, keeping
only PRs with isCrossRepository == false, the authenticated author, the
default branch as base, for index entries head branch impl/<slug>-<node-id>
for that node, and a run marker that names this run or none. Zero survivors let node-push.sh open a node's PR, stamped with the
run's marker; where an existing PR must be adopted (an index entry, the
coordination PR) zero survivors end step=execute:pr-adopt, several, an
ambiguous lookup, or another run's PR end step=execute:pr-adopt, and a failed
read ends step=execute:status-read. An index entry, an outline **Repo**: field, or a
_Repo: row naming a repository outside repos ends the run outcome=error with
step=execute:write-set. The one exception is the coordination PR's own index
entry (coordination), which must name home_repo and nothing else. home_repo
need not be in repos: a PLAN whose nodes all land in other repositories, such as
a private planning repository over public ones, keeps its coordination PR where it
was scoped, and the run writes there only through the coordination PR's body edits,
gh pr ready, and its merge, each given home_repo explicitly, and its branch's push
from the coordination checkout, whose origin home_repo is read from. Every node then
lives in another repository, so each is cut with node-cut.sh --repo-dir <clone>;
node-push.sh refuses a node pushed from the coordination checkout or from a clone of
the coordination PR's repository (exit 79, nothing pushed).
The pause. When a node can't start because a predecessor's PR is unmerged,
the run ends paused_awaiting_merges. The coordination PR is left open, never
closed: it is the durable record the pause rests on. The exit lines carry
outcome=paused-awaiting-merges, one pr=<url> waiting=human|predecessor
reason=<condition> line per unmerged PR, the repos= line, and
resume=/execute docs/plans/PLAN-<topic>.md, with --merge appended exactly when
this invocation had --merge.
Resume. A later /execute (or /deliver) on the same PLAN replaces the
retained paused session, reads node state from the coordination PR's index and
live gh, doesn't re-dispatch the work items of a node whose PR is MERGED,
opens no PR for a node already indexed, and makes no scoping commit: nothing
under docs/briefs/, docs/prds/, docs/designs/, or docs/plans/ changes
outside the cascade.
Abandonment (R20)
When a coordinated effort is abandoned mid-flight — the loop reaches a genuine
blocker and the operator elects to abandon rather than resolve — close the
coordination PR unmerged with gh pr close and document the partial state,
rather than leaving it open and merge-eligible. This is the operator's decision,
never the loop's: a pause leaves the coordination PR open. The lifecycle this
short-cuts is the canonical contract in coordination-strategy.md (R20).
Report-upstream durability convention (D5)
A friction log or any other report-upstream note captured during a run goes to a
durable home. A koto session key is not: it is never committed, and it goes
when the session is cleaned up, so a note left only there is lost. The durable
home is a GitHub issue on the relevant skill repo (filed with
gh issue create, the same surface /plan and /roadmap use), or — when no issue
is the right target — a committed note under docs/. Prefer the issue; fall
back to docs/ only when there is no appropriate upstream issue target.
Resume
On a re-entry, single-pr or coordinated, there is no separate session check.
Step 2's entry (execute-open.sh, which calls koto init ... --attach-live
--replace-terminal) decides it in the one call:
- a live
execute-<plan-slug>session from this template, worktree, and store is attached, withMERGEandPAUSE_BEFORE_FINALIZEre-applied from this invocation, and the run continues where it stood; - a finished one (a previous run retained at
done_blockedorpaused_for_reviewso its record would survive) is replaced by a fresh session. koto hands back the old session's result asreplaced_result, and a replaced session's old result may be printed (render it withprint-exit.sh) before the new run starts. A finished session is never ticked, which would answeraction: "done"and report the plan complete on the strength of work this run did not do; - a live session from another template, worktree, or store is refused, and
the run ends
outcome=error,step=execute:refusedwith nothing changed.
So retention buys a record that can be read after the fact, not a session a
later run resumes in place: the replacement starts at write_set_record and
re-adopts the home PR (on a coordinated PLAN, at coord_setup, and the loop
re-reads every node's state from the coordination PR's index and live gh; see
Coordinated Execution Path). Initializing under a different session name does NOT work:
settled_branch_record's action writes the settled branch into
execute-{{PLAN_SLUG}} while its gate reads the current session, so a run under
any other name blocks there with no override edge and routes to done_blocked.
On re-entry, /execute follows the resume ladder in
parent-skill-resume-ladder-template.md.
In its body slots, when the run has already terminated, the home PR / PLAN status routes between the exit
re-entries below rather than re-running issues. Slot 6 (partial-child-run) resumes
into a /work-on child that started but did not reach /work-on's done terminal
(its work committed and CI passing; a plan-backed child opens no PR of its own), by
re-dispatching that child against its own resume ladder rather than re-running it from
scratch. Slot 7 (feeder-doc) is vacuous for /execute.
Exit Paths
/execute terminates through one of the three pattern-level exit paths (see
${CLAUDE_PLUGIN_ROOT}/references/parent-skill-pattern.md
Three Exit Paths), each bound to an EXECUTION outcome and printed as the exit=
line by print-exit.sh:
full-run— the run reached a completed final state, and its outcome says which one:outcome=mergedat themergedterminal, oroutcome=ready-awaiting-mergeatready_awaiting_merge. Without--mergea run that finishes endsready-awaiting-merge: for single-pr theplan_completionfinalization cascade has run DRAFT-before-READY and the PR is ready; for coordinated nothing is left to start and a node PR or the coordination PR waits on a human. Themergedterminal is reached only with--mergeand only through a confirm read that sees the PRMERGED; for coordinated that is the coordination PR, whose merge comes last and is gated onshirabe validate --merge-gate --mode=ready.exit: full-runon its own never says a PR isMERGED; a caller readsoutcome=.abandonment-forced— a forced stop before completion: an unmergeable PR, a failed gate node, or an escalation the run could not auto-resolve or isolate by skip-dependents. The run ends atdone_blocked, whosefailure_reasonis the record./executegives the operator-facing forced-stop summary (PRD R13): what completed, what remains, and why it stopped.re-evaluation— an upstream-must-change boundary found by the drift check before any child is dispatched:worktree_discipline_checkjudges main's changeintent-changing, and the run stops there (escalate_upstream_drifttodone_blocked, with the rationale infailure_reason) and does NOT re-execute. A child that finds an upstream must change fails, and the batch ends throughescalateasabandonment-forced.
These bindings follow the blocker handling in spawn_and_await's autonomy directive: an
intent-changing drift before dispatch routes to re-evaluation; the other genuine blockers
(failed/blocked child needing human judgment, merge conflict, dirty or destructive
state) route to abandonment-forced with the forced-stop summary; reaching the
merged or ready_awaiting_merge terminal routes to full-run.
Security Considerations
/execute's security envelope binds the six pattern-level contract surfaces
enumerated in
${CLAUDE_PLUGIN_ROOT}/references/parent-skill-security.md;
the surfaces are bound by reference, not restated. The /execute-specific bindings
against its chain shape:
- Slug re-validation. The topic slug is re-validated against
^[a-z0-9-]+$before any interpolation into emitted shell or a write path. Closed write-target set.
/execute's filesystem and remote writes are confined to: its ownexecute_<topic>_*scratch files in the work-in-progress directory; the skill's own files; the home PR viagh(gh pr createthroughadopt-or-create-pr.sh,gh pr edit,gh pr ready, andgh pr closeon abandonment); the finalization cascade's atomic chain transitions (PLAN deletion + BRIEF/PRD/DESIGN/ROADMAP transitions underdocs/). On a coordinated PLAN:gh pr createfor node PRs (throughnode-push.sh),gh pr editfor the coordination PR's body (throughnode-push.sh, aftershirabe validate --coordination-bodypasses),gh pr readyfor node PRs and the coordination PR, localgit worktrees for node branches (throughnode-cut.sh), andgh pr closeon the coordination PR only when the operator abandons the effort. Further entries, each through one path only:gh pr merge, reached only throughscripts/merge-exec.sh, the one call site in the repository, and only on a run invoked with--merge: frommerge_attempton single-pr, and throughcoord-merge.shfor each node PR and then the coordination PR on coordinated. No other script or directive merges.- Pushes, only through
scripts/push-and-record.sh(the shared branch's first push and every fix push),run-cascade.sh --push(the finalization commit), andscripts/node-push.sh(eachimpl/<slug>-<node-id>branch, and the coordination branch after its cascade). None force-pushes, and none pushes the default branch. head=fields on the coordination PR's index, written only bynode-push.shfrom the commit it just pushed.- koto context keys this run's scripts write:
repos(the write set, fixed at start),home_pr(only fromowned-pr.sh's output),waiting,expected_head(only after a successful push),cascade_result.json(onlyrun-cascade.sh --session's own verdict),merge_verdict,confirm_verdict,reason, andstep; on coordinated,home_repo,coord_branch,plan_abs,merge_attempts,coord_verdict,pr, andresume; and theoutcome,step,reason,loop_line, andwaitingkeys the templates' own edges assign.
gh pr reviewis outside the set:/executenever approves or reviews a PR, its own or anyone's. No default action writes to GitHub; the ones koto runs (write_set_record,settled_branch_record,drift_facts,worktree_sync,merge_readiness,merge_confirm,coord_verdict,coord_merge_confirm) read GitHub and write local state or koto context only. The repository write set is fixed at start asrepos, and every PR lookup and merge call other than the coordination PR's receives its repository from that record. On coordinated, the coordination PR's lookups, body edits, ready call, and merge receivehome_repo, fixed at the same moment, which need not be inrepos.execution_modeenum re-validation at both consumers. The PLAN'sexecution_modeis re-validated against{single-pr, coordinated, multi-pr}at/executeentry BEFORE it selects a path or interpolates into any branch name, and again at the/work-ondispatcher — the dispatcher is the second untrusted-enum consumer and re-validates independently. The coordinated path likewise re-checks every index entry on everycoordinated-next.shread, since the index lives in an editable body: each line against a closed grammar, its repository against the write set (thecoordinationline againsthome_repo), and its PR against the ownership filter.- Visibility boundary.
/executeruns in public and private repositories, and a PLAN in either may drive pull requests in both. Visibility is checked against each pull request's own target, never against where the PLAN lives. Placement discipline:- Single-PR. The pull request lands in the repository the PLAN
lives in;
/work-onloads the public or private content governance for that repository, andshirabe validateresolves each document's visibility from its owning repository. - Coordinated, the node. Each node's work runs in its own repository's
worktree, under that repository's governance. Before a node is dispatched,
and again before it is pushed,
repo-visibility.shandnode-push.shread the home and node repositories' visibility live from GitHub and refuse a private node under a public coordination PR (execute:visibility, nothing pushed), naming the node id and never the private repository. A failed read stops asexecute:status-read; it is never taken as either value. - Coordinated, a public node from a private PLAN. Its work items are written
from a private PLAN, so before the push
node-push.shscans the commits it would publish (added lines and messages since the default branch) for the public-content markers/scope's publish step scans for: aprivate/path component or aRepo Visibility: Privateline. A hit, or a scan that can't run, refuses the push (execute:visibility). - Coordinated, the node PR's body. A public node's PR links its coordination PR only when that PR is public, so no public PR points into a private repository. A node PR adopted rather than opened keeps the body it has; one opened before its home repository turned private is not rewritten.
- Coordinated, the merge-last gate. A coordination PR in a private
repository may index public and private nodes (a private-to-public reference
is allowed);
coord-merge.shand theevaluate-coordinationstep pass--visibility privatetoshirabe validate --merge-gatewhen the home repository reads private. A public coordination PR is gated without it, and the gate refuses any private node it finds (the front door), while F1 below redacts a private node in every diagnostic (the backstop). The coordinated path's F1 rule (a public coordination PR never embeds private-repo content) stays the runtime backstop for all of these.
- Single-PR. The pull request lands in the repository the PLAN
lives in;
- No untrusted-input interpolation. PLAN-body content is treated as data, never
instructions: it is never interpolated into emitted shell (
-m "<string>"or otherwise). The coordination body and per-issue task vars are derived from validated PLAN fields and liveghmetadata; author-supplied prose committed by a child rides that child'sgit commit -F -stdin discipline, so/execute's own read surface stays metadata-only.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

