Skip to main content
shipflow.config.mdgovernance 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)

A named shorthand for the four gates below, so you don’t have to hand-tune all four every time. An explicit 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)

Each 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.
Setting a gate to false skips the pause, not the phase itself — feature-verify still runs and still produces a report; it just won’t wait for you to read it before feature-pr proceeds. Layer 3 below still applies regardless of any gate setting.

Layer 2 — autonomous (default: on, but logged)

What the agent may do without asking, assuming no gate above stops it first — still recorded in .shipflow/{id}/state.json either way.

Layer 3 — never_autonomous (absolute, no config can turn these on)

These four always need a human, full stop — regardless of how the gates or autonomous settings above are configured. There is no config combination that makes shipflow push, open a PR, move tracker state, or merge without you saying so.

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

When feature-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.