shipflow.config.md → governance controls exactly how much shipflow does before checking in with
you. There are three independent layers, and they don’t override each other — the strictest
applicable rule always wins.
Layer 0 — profile (a preset for Layer 1)
gates block always wins over profile — set profile for the default, or gates
for full control.
No profile ever touches Layer 3 (
never_autonomous) — push, open-PR, update-state, and merge
always need a human, at every profile.
Layer 1 — gates (pause and wait)
true gate makes the orchestrator stop and summarize, waiting for your explicit approval
before continuing. A vague or silent reply is never treated as approval for a side-effecting phase.
Layer 2 — autonomous (default: on, but logged)
.shipflow/{id}/state.json either way.
Layer 3 — never_autonomous (absolute, no config can turn these on)
Where each layer shows up
Merging is never in scope for any phase — shipflow opens the pull request; humans review and merge
it, every time.
NOT READY isn’t a dead end
Whenfeature-verify grades any AC PARTIAL or MISSING, the orchestrator does not silently stop —
it offers you a choice: run feature-repair (a scoped fix targeting only the cited gaps, then a
re-test and a full re-verify), defer the item, or fix it yourself. feature-repair never touches
an AC already graded MET, and if its own re-verify is still NOT READY on the same AC after one
attempt, it surfaces that as a blocker rather than retrying silently.
Resuming
.shipflow/{id}/state.json (per workspace.files.state) records phase, status, and — per touched
repo in polyrepo — branch, commit progress, test result, and PR URL. If it exists when you invoke
/shipflow again, that’s a resume: the orchestrator continues from the last incomplete phase
rather than redoing completed work. Run /feature-status any time — with or without a work-item
id — to see exactly where things stand before deciding to resume.