v0.3.0
A stop keeps the phase
A session refused for the usage limit, killed, or exited without a sentinel leaves its half-built phase uncommitted in the worktree. The loop now records which session it launched before launching it and a re-run continues that session with claude --resume in the worktree it left. A transcript that is gone falls back to a fresh session told the tree holds a predecessor's work. Only the done path reclaims a worktree the loop created; exits 4 and 5 keep it and say so.
- Builds where it is driven from. From a linked worktree already on the unit's branch, the loop builds in that tree: no second worktree, no checkout, no reclaim. Its state hangs off the main checkout's
.loop/state;loop.envis read from the driver first and the main checkout second. - One loop per unit, several per repository. The lock is
lock/<branch>/, liveness matches the recorded snapshot path, andgit worktree addis serialised on a config lock. - Named, killable session containers under the sandbox, with a cid the teardown kills by; the container sees the common git directory and the unit's own directory only.
- A resumed closing step does not repeat the earlier ones.
/ship: gate 1 is your spoken OK on the spec in the worktree. No spec PR.
A phase names the host skills it builds through
Each phase's ### Phase N section carries a - **Skills:** line naming the host's own skills the phase must use — its scaffolds, test runners, linters — resolved by /spec-writing from the host's skill index (the router table in the root AGENTS.md, else the descriptions under .claude/skills/). parse-ledger.sh --skills "Phase N" reads it, the loop hands the names to the session as a Skills: prompt line and lists them in --dry-run, /implement-spec invokes them before writing, and /pre-implement-spec fails a name that resolves to nothing.
Upgrade
Re-run install.sh in the host. State moves to .loop/state/units/<branch>/; a pre-0.3 repository-wide lock/pid is respected while alive and swept when dead.