Execute
You are executing one phase of planned work.
Inputs:
- the active runtime phase sheet (
state/.../phases/phase-NN.md)
plan.toml / plan.md
design.md (canonical design reference)
slice-nnn.md (scope)
Process
- Confirm the phase's entrance criteria (
EN-) are met for the active phase.
- Read
design.md + plan.toml + the runtime phase sheet before coding. If the sheet
is not yet filled, run /phase-plan first; use /preflight if confirmed
inputs, assumptions, and tensions are not yet surfaced.
- Identify the concrete files or components you expect to touch first and run
/retrieve-memory against those paths before deep reading or editing, so any
scope-bound gotchas or patterns surface early.
- Ensure status matches reality before implementation proceeds:
- first phase starting → move the slice:
doctrine slice status <id> started
(bare number), if not already there.
- flip the phase to
in_progress with doctrine slice phase (see
using-doctrine.md). This auto-records the conformance boundary — the
handler stamps code_start_oid = HEAD into the phase sheet. No extra call;
the binding rides the transition you already issue (design D5). (It self-skips
in a dispatch coordination context, where the funnel beat is the recorder
instead.)
- Implement phase tasks in small coherent units, TDD red/green/refactor
write a failing test, make it pass, then refactor. Test behaviour, not
trivial implementation. Build and improve test helpers and fixtures as you go.
- After each meaningful unit, run
/harvest.
- If that unit produced a durable gotcha, pattern, or subsystem fact worth
future retrieval, run
/record-memory before moving on.
- Lint as you go (
cargo clippy, zero warnings) and keep the tree buildable.
- Follow the repo's commit policy: frequent, small conventional commits scoped
with the slice id (e.g.
feat(SL-009): …). Bias toward a clean tree; don't
let .doctrine/** workflow edits drift in a stale uncommitted pile.
- If
/preflight or implementation reveals unresolved design ambiguity,
unexpected obstacles, tradeoffs, or policy ambiguity, stop and /consult
before improvising past it.
- Keep the runtime phase sheet current as work progresses — never record progress in
authored
plan.toml / plan.md (the storage rule).
- Before declaring the phase ready, run the verification gate —
doctrine check gate (lint + test + format) — and review the touched subsystems and
notes once
more for missed memory-capture candidates. At phase wrap, weigh a
per-phase review per the code-review skill's ## Cadence — default on
below the adherence bar, mandatory on any tripwire.
- When exit criteria (
EX-) and verification (VT-, plus any agent/human
VA-/VH- modes) are satisfied, flip the
phase to completed with doctrine slice phase. This closes the conformance
boundary — the handler captures code_end_oid = HEAD, applies the F-6
ancestor/non-merge guard, and upserts the phase's row into the slice's
arm-neutral registry. Deterministic, on the critical path — not a
"remember to also record" step; slice record-delta is only the manual
fallback (correct a range, or bootstrap a pre-binding phase). Then hand off:
/phase-plan for the next phase, or — when the slice's phases are all done —
doctrine slice status <id> audit and /audit.
Optional: solo isolation (opt-in)
Default execution runs in-tree — the path above is unchanged unless isolation
is requested.
Opt-in only — never automatic. Run the phase on its own worktree fork only
when the user or the plan explicitly asks for isolation. Absent that annotation,
implement in-tree.
When isolation is requested, before implementing (i.e. before step 5) invoke
/worktree with:
mode = solo, allow_work_in_place = true (solo MAY degrade to in-tree on
sandbox denial);
branch = slice/SL-NNN-slug (the slice id is in scope — e.g.
slice/SL-029-dispatch-worktree-creation), worktree dir keyed by the durable id
(.worktrees/SL-029).
/worktree handles detection, the creation ladder (doctrine worktree fork),
provisioning, the spawn guards, and the green baseline; the fork branch it
returns is the deliverable.
Assert a clean direct-writer entry. Solo /execute is its own orchestrator —
worker mode is never used here (that is /dispatch's path). Worker-ness is a
property of the process: if DOCTRINE_WORKER is set in this shell, every
doctrine-mediated authored write refuses mid-work. Confirm it is unset before the
TDD loop (doctrine worktree status prints the resolved mode); if it is set,
unset it — there is no stale on-disk state to clear.
Carry out the TDD loop (steps 5–12) inside the fork. When green, land the fork
onto the coordination branch — /execute is the sole caller of land:
doctrine worktree land --fork slice/SL-NNN-slug # merge --no-ff, ancestry preserved (NEVER squash)
doctrine worktree gc --fork slice/SL-NNN-slug # reap the spent fork once the oracle proves it landed
land preserves the multi-commit TDD history via git merge --no-ff (it cannot
express a squash); gc deletes only after the two-leg landed oracle certifies the
fork (§8.1) — both fail closed with a distinct token, never auto-merge.
Outcomes
- Phase objectives are implemented with traceable evidence, ending green.
- Phase status matches reality during implementation, not only at closure.
- Notes and durable memory stay current throughout execution.
1---2name: execute3description: Use to implement one planned, approved phase of a slice — once its design and plan exist and its runtime phase sheet is ready. Move the phase to in_progress, build it TDD red/green/refactor, keep notes current, end green, and surface blockers early.4---56# Execute78You are executing one phase of planned work.910Inputs:1112- the active runtime phase sheet (`state/.../phases/phase-NN.md`)13- `plan.toml` / `plan.md`14- `design.md` (canonical design reference)15- `slice-nnn.md` (scope)1617## Process18191. Confirm the phase's entrance criteria (`EN-`) are met for the active phase.202. Read `design.md` + `plan.toml` + the runtime phase sheet before coding. If the sheet21 is not yet filled, run `/phase-plan` first; use `/preflight` if confirmed22 inputs, assumptions, and tensions are not yet surfaced.233. Identify the concrete files or components you expect to touch first and run24 `/retrieve-memory` against those paths before deep reading or editing, so any25 scope-bound gotchas or patterns surface early.264. Ensure status matches reality before implementation proceeds:27 - first phase starting → move the slice: `doctrine slice status <id> started`28 (bare number), if not already there.29 - flip the phase to `in_progress` with `doctrine slice phase` (see30 `using-doctrine.md`). **This auto-records the conformance boundary** — the31 handler stamps `code_start_oid = HEAD` into the phase sheet. No extra call;32 the binding rides the transition you already issue (design D5). (It self-skips33 in a dispatch coordination context, where the funnel beat is the recorder34 instead.)355. Implement phase tasks in small coherent units, **TDD red/green/refactor**36 write a failing test, make it pass, then refactor. Test behaviour, not37 trivial implementation. Build and improve test helpers and fixtures as you go.386. After each meaningful unit, run `/harvest`.397. If that unit produced a durable gotcha, pattern, or subsystem fact worth40 future retrieval, run `/record-memory` before moving on.418. Lint as you go (`cargo clippy`, zero warnings) and keep the tree buildable.429. Follow the repo's commit policy: frequent, small conventional commits scoped43 with the slice id (e.g. `feat(SL-009): …`). Bias toward a clean tree; don't44 let `.doctrine/**` workflow edits drift in a stale uncommitted pile.4510. If `/preflight` or implementation reveals unresolved design ambiguity,46 unexpected obstacles, tradeoffs, or policy ambiguity, stop and `/consult`47 before improvising past it.4811. Keep the runtime phase sheet current as work progresses — never record progress in49 authored `plan.toml` / `plan.md` (the storage rule).5012. Before declaring the phase ready, run the verification gate — `doctrine51 check gate` (lint + test + format) — and review the touched subsystems and52 notes once53 more for missed memory-capture candidates. At phase wrap, weigh a54 **per-phase review** per the code-review skill's `## Cadence` — default on55 below the adherence bar, mandatory on any tripwire.5613. When exit criteria (`EX-`) and verification (`VT-`, plus any agent/human57 `VA-`/`VH-` modes) are satisfied, flip the58 phase to `completed` with `doctrine slice phase`. **This closes the conformance59 boundary** — the handler captures `code_end_oid = HEAD`, applies the F-660 ancestor/non-merge guard, and upserts the phase's row into the slice's61 arm-neutral registry. Deterministic, on the critical path — **not** a62 "remember to also record" step; `slice record-delta` is only the manual63 fallback (correct a range, or bootstrap a pre-binding phase). Then hand off:64 `/phase-plan` for the next phase, or — when the slice's phases are all done —65 `doctrine slice status <id> audit` and `/audit`.6667## Optional: solo isolation (opt-in)6869Default execution runs **in-tree** — the path above is unchanged unless isolation70is requested.7172**Opt-in only — never automatic.** Run the phase on its own worktree fork *only*73when the user or the plan explicitly asks for isolation. Absent that annotation,74implement in-tree.7576When isolation is requested, before implementing (i.e. before step 5) invoke77`/worktree` with:7879- `mode = solo`, `allow_work_in_place = true` (solo MAY degrade to in-tree on80 sandbox denial);81- `branch = slice/SL-NNN-slug` (the slice id is in scope — e.g.82 `slice/SL-029-dispatch-worktree-creation`), worktree dir keyed by the durable id83 (`.worktrees/SL-029`).8485`/worktree` handles detection, the creation ladder (`doctrine worktree fork`),86provisioning, the spawn guards, and the green baseline; the **fork branch it87returns is the deliverable**.8889**Assert a clean direct-writer entry.** Solo `/execute` is its own orchestrator —90worker mode is **never** used here (that is `/dispatch`'s path). Worker-ness is a91property of the *process*: if `DOCTRINE_WORKER` is set in this shell, every92doctrine-mediated authored write refuses mid-work. Confirm it is unset before the93TDD loop (`doctrine worktree status` prints the resolved mode); if it is set,94unset it — there is no stale on-disk state to clear.9596Carry out the TDD loop (steps 5–12) inside the fork. When green, **land the fork97onto the coordination branch** — `/execute` is the sole caller of `land`:9899```bash100doctrine worktree land --fork slice/SL-NNN-slug # merge --no-ff, ancestry preserved (NEVER squash)101doctrine worktree gc --fork slice/SL-NNN-slug # reap the spent fork once the oracle proves it landed102```103104`land` preserves the multi-commit TDD history via `git merge --no-ff` (it cannot105express a squash); `gc` deletes only after the two-leg landed oracle certifies the106fork (§8.1) — both fail closed with a distinct token, never auto-merge.107108## Outcomes109110- Phase objectives are implemented with traceable evidence, ending green.111- Phase status matches reality during implementation, not only at closure.112- Notes and durable memory stay current throughout execution.