Worktree lifecycle
Skill event4u-app/agent-config/dist/agent-src/skills/worktree-lifecycle
Universal AI Agent OS — audited skills, governance rules, replayable state. One contract, every host agent.
npx -y skills add event4u-app/agent-config --skill worktree-lifecycleAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 7 stars7 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Use when governing a worktree across its whole life — scope-lock declaration, merge-readiness status, scoped verification, and safe cleanup that refuses while unique unmerged commits exist.
SKILL.md
8.0 KB, ~2.0k tokens by cl100k_base, as published. Nobody here has run it
worktree-lifecycle
Governance layer for worktrees that already exist (or are about to).
Creation mechanics — directory convention, ignore-safety, clean
baseline — live in using-git-worktrees
and are referenced, never restated here. This skill owns everything
after the spawn: what the worktree is allowed to touch, when it is
merge-ready, and when it may be removed.
When to use
- Deciding whether a task should be isolated in a worktree at all
- Declaring which paths a worktree owns so parallel agents stay disjoint
- Answering "is this worktree merge-ready?" — status, dirty state, ahead/behind, verification evidence
- Running the scoped verification for a worktree's declared change
- Removing a finished worktree without losing commits
Do NOT use when:
- Creating the worktree — that is
using-git-worktrees(Iron Law: no worktree without verified ignore + clean baseline) - Plain branch work (switch, rebase, PR) without worktree isolation —
git-workflow - Picking a subagent-orchestration mode —
subagent-orchestrationselects the mode; this skill governs the worktrees a chosen mode uses
The Iron Law
EVERY GOVERNED WORKTREE DECLARES ITS SCOPE. NO REMOVAL WHILE
UNIQUE UNMERGED COMMITS EXIST. INHERITED COMMITS ARE NEVER DROPPED.
Procedure
1. Decide isolation
Isolate when any holds; otherwise stay on the current branch
(per the Do-NOT list in using-git-worktrees):
- Parallel agents/sessions must not share a working directory
- The current branch is mid-work and a stash/switch would risk state
- The change is exploratory and may be thrown away whole
- A long-running build/test occupies the current worktree
Then create via using-git-worktrees
(or the host primitive — § Host-native mapping below), declare the
scope lock (§ 2), keep status honest (§ 3), and gate removal (§ 4).
2. Scope lock
At worktree start, write a .worktree-scope.md note at the worktree
root and keep it untracked via .git/info/exclude (shared exclude —
one line .worktree-scope.md, no commit needed):
## Scope lock
- branch: <branch-name>
- owns: <path or glob list — the ONLY paths this worktree edits>
- task: <one-line task statement>
- created: <ISO date>
The lock is the disjointness contract between parallel worktrees. A
diff that leaves the owned paths is scope creep — stop and surface,
per scope-control. Check mechanically:
git diff --name-only "$(git merge-base HEAD <base>)"..HEAD
# every path must match an `owns:` entry
3. Status / merge-ready checklist
A worktree is merge-ready only when ALL hold:
- Clean tree —
git status --porcelainis empty. - Scope lock respected — changed files ⊆
owns:paths (command above). - Verification evidence attached — the scoped probe for the
declared change ran fresh and passed (per
verify-before-complete); record command + result tail in the status report. No fresh evidence → not merge-ready, regardless of how the diff looks. - Ahead/behind known —
git fetch origin --quietthengit rev-list --left-right --count HEAD...origin/<base>. Behind → flag; divergent (both sides non-zero on a pushed branch) → route togit-workflow § Divergent-State Recovery. - No inherited-commit drops — commits on the branch that this
session did not author stay on the branch; never rebase-out,
reset-away, or exclude them (rule
git-history-discipline, shared-branch Iron Law).
4. Cleanup discipline
Removal gated by the deterministic helper (edge-case-tested: detached
HEAD, branch without remote, tag-only reachability, deleted remote
branch, untracked files, paths with spaces —
tests/scripts/worktree_cleanup_check.test.ts):
./scripts-run src/scripts/worktree_cleanup_check check <worktree-path>
Exit 0 → removal allowed; exit 1 → refuse, gates in order:
- Detached HEAD — no branch to judge reachability for; resolve manually first.
- Unsaved work —
git status --porcelainnon-empty, untracked files included (never answer with--force). - Unique-commit check — commits reachable from the worktree branch
but from no other ref (branches, remotes, AND tags — a tag counts
as reachability). Non-empty → refuse removal; the branch holds
work that exists nowhere else. Surface the commit list and hand
back — merging or preserving them is the user's call
(
git-history-discipline).
Then: remove, never delete — git worktree remove <path>, then
git worktree prune. Branch deletion is a separate, permission-gated
step (scope-control); never force-delete (-D) as part of cleanup.
Cross-worktree scope-lock overlaps: worktree_cleanup_check scope-overlap
(surfaced by /worktree status).
Host-native mapping
| Host capability | Use |
|---|---|
Claude Code EnterWorktree / ExitWorktree | Enter/leave a governed worktree in-session; scope lock is written right after enter |
Claude Code subagent isolation: "worktree" | Dispatch a slice into its own auto-managed worktree; unchanged worktrees are auto-cleaned by the host — the unique-commit gate still applies to any it leaves behind |
| No worktree primitive (other hosts) | Degrade to plain git worktree add per using-git-worktrees § Procedure — same scope lock, same gates |
The mapping changes only who creates the directory. Scope lock, merge-ready checklist, and cleanup gates are host-independent.
Gotcha
git log <branch> --not --allis always empty —--allincludes the branch itself, so the naive check never fires. The--exclude="refs/heads/<branch>" --allvariant is also unreliable when combined with--not(observed on git 2.39). Use thefor-each-refexpansion above — it enumerates every ref except the branch explicitly.- Scope note committed by accident —
.worktree-scope.mdmust be in.git/info/exclude;.gitignorewould be a tracked change outside the scope lock. - "Unchanged worktree" ≠ "no unique commits" — a host auto-clean only covers worktrees with no changes; a worktree with committed but unmerged work still needs the unique-commit gate.
- Stale ahead/behind — always
git fetchbefore therev-list --left-rightcount; a cached view reports merge-ready on a diverged branch.
Output format
- Worktree — path + branch, and the scope-lock
owns:list - State — clean/dirty, ahead/behind vs base, merge-ready verdict with the failing checklist item named when not ready
- Evidence — verification command(s) run + result tail, or "none attached" stated explicitly
- Next step — merge path, missing verification, or cleanup verdict (allowed / refused with the unique-commit list)
Do NOT
- NEVER remove a worktree whose branch has commits on no other ref
- NEVER
git worktree remove --forcepast a dirty tree - NEVER drop, rebase-out, or reset-away inherited commits (rule
git-history-discipline) - NEVER report merge-ready without fresh verification evidence
- NEVER edit outside the scope-lock
owns:paths without surfacing it
Handover
| Task | Skill / command |
|---|---|
| Creating the worktree (ignore-safety, baseline) | using-git-worktrees |
| Divergence recovery, safe squash, PR flow | git-workflow |
| Finishing the branch | finishing-a-development-branch |
| Day-to-day operations | /worktree create · status · verify · cleanup |
Gives 0 of the 12 instructions most agent orchestration skills give in ~2.0k tokens
Counted across 742 of the 995 authors here whose files we hold, read 2026-08-06
- run the full test suite after integrating changesin 53 of 742, across 20 files
- reference existing artifacts by path or URLin 52 of 742, across 22 files
- dispatch one agent per independent problem domainin 50 of 742, across 17 files
- verify fixes do not conflictin 45 of 742, across 13 files
- include a suggested skills section in the documentin 45 of 742, across 15 files
- redact sensitive informationin 41 of 742, across 11 files
- save to the temporary directory of the operating systemin 39 of 742, across 9 files
- tailor the document to user-provided focus argumentsin 39 of 742, across 9 files
- spot check agent changes for systematic errorsin 34 of 742, across 7 files
- write a handoff document summarising the current conversationin 31 of 742, across 6 files
- assign each agent a specific scopein 23 of 742, across 8 files
- provide specific scope and clear goalin 23 of 742, across 5 files
Said here and by no other author read
- declare owned paths at worktree start
- keep scope lock note untracked
- stop and surface edits outside owned paths
- fetch origin before checking ahead status
- record verification command and result tail
- run the cleanup check before removing
Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once. Length counted with cl100k_base; the agent that loads this file may tokenize it differently.