Compatibility & migration
spec is the canonical vocabulary and repo-local .flow/ state migrates forward without losing tracked work. This page records the changes that need something from you.
What still holds
Section titled “What still holds”specis the canonical term across the CLI, the skills, and these docs.- R-ID semantics are stable: ids never change, removed criteria leave gaps, new criteria append.
- Spec and task ids never change. Linking a tracker adds an alias; it never renames.
- Pure docs and agent-guidance changes do not require a plugin version bump.
8.0: RepoPrompt removed, every reviewer gets the same panel
Section titled “8.0: RepoPrompt removed, every reviewer gets the same panel”A major release. Nothing under .flow/ migrates, review.backend keeps its meaning, and you don’t need to re-run setup.
- RepoPrompt is removed. The
rpreview backend, theflowctl rpcommands,/flow-next:export-contextand plan review’s--review=exportmode are gone. A project that still namesrporexport(inreview.backend,FLOW_REVIEW_BACKEND, a spec’s or task’s review setting, or--review=) gets a one-line notice and continues with no reviewer until you pick one:flowctl config set review.backend codex(orhost,claude,copilot,cursor). Re-run the Codex, OpenCode or Cursor installer to drop the removed skill. review.backendstays. 7.1.0 announced its removal for 8.0.0. That was reversed: the reviewer is still chosen withreview.backend, a spec’s or task’s review setting, or--review=.flowctl review-rounds recordneeds--backend. It no longer defaults torp; host workflows pass--backend host.- A plan review can read
stale. A spec rewritten after its plan-review SHIP readsstale. Anything that readsplan_review_statusshould treat it likeneeds_work. - QA receipts record mode
receiptwhere a receipt-driven pass used to writerp. Receipts already on disk withmode: "rp"still read.
Behaviour you will notice, with nothing to change on your side:
- The same review panel on every reviewer. Claude, Copilot and Cursor reviews size the first round like Codex and host reviews: one reviewer for a small change in one area, three for anything larger, merged into one fix pass.
- A one-task spec has its standing criteria checked by its implementation review.
- The stall check reviews your latest fix first. It ends a loop only after three consecutive
not-fixedrounds on the same finding. - A usage or credit limit stops the review with the CLI’s own message instead of a retry.
- Land reports
QUEUEDwhen its merge call only added the pull request to a merge queue.
7.0: Ralph and the HTML lenses removed
Section titled “7.0: Ralph and the HTML lenses removed”A major release. /flow-next:flow --auto (with --until=merge or --tick) is the one unattended mode. Nothing under .flow/ migrates, and you don’t need to re-run setup.
- Ralph is removed.
/flow-next:ralph-init, thescripts/ralph/harness andralphctl, theralph-guardhooks, setup’s Ralph question, theFLOW_RALPH,RALPH_ITERATIONandFLOW_RALPH_NO_TRIAGEvariables, the Ralph-run probe inflowctl status, and theflow-next-tuirun monitor are gone. To keep running Ralph, pin flow-next 6.7.x. Otherwise deletescripts/ralph/and anyralph-guardhook entries from your project settings, and use/flow-next:flow --autofor unattended runs (Flow —auto). - The HTML render lenses are removed. Capture, plan and make-pr no longer write HTML pages under
.flow/artifacts/<spec-id>/, and setup no longer asks about them. A config that still setsartifacts.html.enabledkeeps working: flowctl ignores the key and prints a one-line note.flowctl pr-cognitive-aid html-inputis gone. Oldspec.htmlandpr.htmlfiles stay where they are; delete them, along with theHTML render lens:link line a lens added near the top of each spec. For a visual view of a spec, a plan or a diff, run/flow-next:visual, or ask the agent for an HTML page. - The optional Jev judge no longer routes or gates QA.
flowctl judge --preset routeis decided in code and sends no request, key or no key; theqa-gatepreset andjudge --explainare gone. Scripts that called them need updating. A run with a key and one without now take the same route. - Unattended merges wait 10 minutes by default.
land.patienceMinutesdefaults to 10 (was 30). Set the key if your review bots take longer to post. pipeline.chainStagesis removed. A config that still sets it keeps working: flowctl ignores the key and prints a one-line note. Underflow --auto --tick, make-pr runs on the next tick. Delete the key from.flow/config.json.- The pilot and interview skill stubs are gone. Use
/flow-next:flow --autoand/flow-next:refine. - The Copilot reviewer is read-only. It runs without write and shell tools, like the Claude reviewer.
Behaviour you will notice, with nothing to change on your side:
- Pull requests open ready for review unless they carry open items; a human call that blocks nothing else becomes an open item on a draft PR. Unattended runs used to open a draft every time.
- Review goes by risk. A change that touches persisted or shared state, concurrency, security or data layout, or a multi-file feature, is reviewed; a small local fix to output, wording or display is not, and the skip is recorded with its reason.
- Attended runs hand the result back first and run the review in the background, then one scoped re-review of the fixes.
- Plan-review and completion review fix once and re-review once, instead of looping to the round cap.
- Unattended runs loop fix and re-review until SHIP, and write a Decisions list into the PR: each default chosen, finding declined and review skipped, with the evidence.
6.5: refine is one interview, two flowctl surfaces removed
Section titled “6.5: refine is one interview, two flowctl surfaces removed”A minor release. Nothing under .flow/ migrates, no config key changed, and setup does not need a re-run. The work is in scripts and in a copied spec template.
flowctl scopeis gone. Itsresolve,bankandwrite-policysubcommands served refine’s per-scope passes, which are now one interview. Scripts that called them need updating;--scope,--bizand--techon/flow-next:refinestill work as a lens.flowctl done --resolved-featureis gone. Passing it fails as an unrecognized argument. QA receipts no longer carryresolved_feature; existing task evidence and QA payloads that carry it still load, and the key is ignored.- A copied spec template keeps working. A repo-root
SPEC.mdorspec.mdcopied from an older bundled template still resolves, and its<!-- scope: ... -->comments are now ignored. Re-copy the bundled template and re-apply your edits to pick up the cleaner version. - Refine no longer asks which interview to run. Pass a lens (
--scope=<anything>,--biz,--tech) or say which audience you want when you want one.
6.1: pilot and interview commands removed, agents invoke skills by id
Section titled “6.1: pilot and interview commands removed, agents invoke skills by id”A minor release. Nothing under .flow/ migrates, no config key changed, and setup does not need a re-run. The work is in loop recipes, prompts, and scripts that read flowctl JSON.
/flow-next:pilotand/flow-next:intervieware gone. Replace them with/flow-next:flow --auto --tickand/flow-next:refine. Look in/loopand/goalprompts, Ralph recipes, scripts, andCLAUDE.mdorAGENTS.mdparagraphs. Pilot’s arguments map as shown on Migrating from pilot. The hidden skill stubs behind them go in a later release.- Agents invoke skills by id. Every
/flow-next:*command is now typed-only, so the skill listing shows each skill once. You type slash commands as before. A prompt or instruction file that tells an agent to run a skill should name it by id, for exampleflow-next:flow-next-work. flowctl show <spec> --jsondrops two ledgers. Read review attempts withflowctl review-rounds attempts <spec> --kind plan|impl --review-type plan|impl|completionand the tracker link state withflowctl sync get-state <spec>.- A tracker push can refuse. A body-writing push on a linked spec whose tracker body changed since the last sync returns a
conflictwith subtypetracker_divergedand writes nothing. Reconcile to merge both sides, or rerun the push with--overwrite-divergedafter a human confirms (details). flowctl donechecks evidence. Evidence with none ofcommits,tests, orprsis refused; unknown keys print a warning.- A malformed
.flow/config.jsonis reported instead of reset. Readers name the file (line and column for a syntax error),config setrefuses to overwrite it, andvalidatereports a root error. Fix the file by hand. - Not renamed.
pilot.autonomy,pilot.gateClasses,pipeline.chainStages(removed in 7.0),tracker.perEvent.interview, theflowctl pilotverbs,.flow/pilot-runs/, and thePILOT_VERDICTname keep their spelling.
6.0: land takes one named pull request, make-pr closes the spec
Section titled “6.0: land takes one named pull request, make-pr closes the spec”A major release. Nothing under .flow/ migrates, and existing config files load. The work is in your landing recipes and in anything that parses a pull request body.
- Land needs a pull request.
/flow-next:land <PR>handles the one pull request you name. A bare or scheduled/flow-next:landfinds nothing and stopsNEEDS_HUMAN. Replace it with the land loop: list the pull requests, call land on each. - Merging needs authorization from the current session. An explicit request to land that pull request, or
flow --auto <spec> --until=merge. Without it land repairs the pull request and stops atAWAITING_REVIEWwith reasonmerge-ready; authorization required. A fresh headless session needs the instruction in its prompt. - The default review gate changed. Green checks, a nonblocking GitHub review decision and zero unresolved threads allow an authorized merge, even when nobody reviewed and no review is required. Bot comments no longer gate a merge. If you relied on
land.reviewSignal, tighten the gate in your instruction file, with branch protection, or withland.mergeVerdictCommand(the merge gate). - Eight
land.*keys are retired:release,reviewSignal,automatedReviewers,reviewTrigger,ciFixBudget,cleanReviewCommentPattern,requestReviewers,patienceMinutesAfterReview. They load with one notice and are ignored.land.patienceMinutesandland.mergeVerdictCommandremain. Replacements. - Land no longer releases, requests reviewers, or summons reviewer bots. Run releases from your project’s release instructions after
LAND_VERDICT=MERGED.RELEASEDstays in the verdict vocabulary for parsers and is never emitted. - No ledger, no labels, no tick claim. Old land files under
.git/are inert. Theflow-next:needs-humanlabel is no longer set or read. TheFLOW_PR_MERGE_CMDoverride is gone; land uses the authenticated standard merge API. - make-pr closes the finished spec on the branch, as the last commit before the pull request opens, so the close reaches a protected base through the merge. Land writes nothing to the repository after the merge. Creating or starting a follow-up task reopens a closed spec.
- A conflicted chain child is a manual rebase. Land never rebases, force-pushes or retargets. The steps are on Troubleshooting.
- The pull request body has a new form. One briefing for every diff size (sections). The compact and full forms, the review-plan section and the generated-by footer are gone; artifact id, base and head ride in one HTML comment. Anything that parsed the old sections needs an update. The stored artifact keeps schema version 1.
--no-mermaidis removed from make-pr. Drop it from scripts; an unknown flag is refused.- Aid artifacts stay local. After
flowctl initrefreshes the managed ignore block, new generations are not staged. A repository that already tracks them can untrack them once with the command on the make-pr page.
5.1: pilot deprecated to a one-release alias
Section titled “5.1: pilot deprecated to a one-release alias”One /flow-next:flow --auto [<spec-id>] invocation now carries a ready spec to a draft PR, hop after hop, and --tick runs exactly one hop (what a pilot tick was). Nothing under .flow/ migrates; the work is in your loop recipes.
/flow-next:pilotis an alias for/flow-next:flow --auto --tickfor this release only. It printspilot is now flow --auto --tick; this alias is removed in the next releaseto stderr, rewrites its arguments (--spec <id>becomes the positional id;--backlogand pilot’s old--autobacklog switch become--backlog;--dry-runbecomes--explain;--review,--research, and--depthpass through), and behaves byte-for-byte as a pilot tick. The release after 5.1.0 removes the shim, the command entry, the Codex mirror, and the conduct page.- Recipes to update now. Replace
/loop 30m /flow-next:pilotwith/loop 30m /flow-next:flow --auto --tick, and a/goalobjective that names pilot with one that namesflow --auto --tickand thePILOT_VERDICTgrammar. The default recipe needs no loop: one/flow-next:flow --autoinvocation per item, run again for the next item. Land recipes changed in a later major; see the section above. pipeline.chainStagesis deprecated (removed in 7.0).flow --auto --tick(and the alias) still honours it as theqa+make-prtick; a long-horizon run ignores it with one stderr notice, because its hop loop already runsmake-pras the hop afterqa.pipeline.qa=autonow takes effect unattended.flow --autoreads it through the same gate-selection reference attended flow reads.onandoffare unchanged.- Attended
flowrefuses under every autonomy marker withNEEDS_HUMAN: /flow-next:flow is attended - run /flow-next:flow --auto for unattended runs;--autorefuses only under Ralph (FLOW_RALPH,REVIEW_RECEIPT_PATH). - Not renamed.
pilot.autonomy,pilot.gateClasses,pipeline.qa,pipeline.chainStages(removed in 7.0),flowctl pilot strikes list|clear,flowctl pilot-log, the ledger path under the git common dir,.flow/pilot-runs/, and thePILOT_VERDICTname keep their spelling. A rename is a separate break for a later major.
5.0: guide removed, interview renamed to refine
Section titled “5.0: guide removed, interview renamed to refine”Two command names changed. Nothing under .flow/ migrates; the work is in your prompts and docs.
/flow-next:guideis gone, with no alias. Replace it with/flow-next:flow --explain <the same words>where you wanted a recommendation, or plain/flow-next:flow <the same words>where you want the route run. Look in scripts,/loopand/goalprompts,CLAUDE.mdorAGENTS.mdpolicy paragraphs, and team docs. On this release a/flow-next:guideinvocation is an unknown command on every host./flow-next:interviewis now/flow-next:refine. Same scopes (business,technical,both), same flags, plus the new--scope=research. The old name keeps working for this release as a deprecated alias that prints one line (Deprecated: /flow-next:interview is now /flow-next:refine) and forwards your arguments unchanged. The alias is removed in the next release, so replace the name before then. The config keytracker.perEvent.interviewkeeps its name.pipeline.qagainsauto. Existingoffandonvalues behave as before. In 5.0 only the attended flow skill judgedauto; since 5.1.0flow --autoreads it too (see the 5.1 section above).- Pilot and land invocations were unchanged in 5.0. Since 5.1.0
/flow-next:pilotis the one-release alias forflow --auto --tick, so a/loop 30m /flow-next:pilotrecipe now needs the edit named above.
The routing rules behind capture’s, plan’s, and work’s recommendations now live in the flow skill’s reference files; the recommendation you read and the route flow runs are the same rule. See the changelog for the full 5.0.0 story.
4.11: pilot’s --no-plan flag removed
Section titled “4.11: pilot’s --no-plan flag removed”The no-plan decision moved onto the spec record. /flow-next:pilot --no-plan no longer exists; a stray flag gets the unknown-flag notice and the run proceeds. In 4.11 an affected zero-task spec routed through plan, the safe default then; since 5.1.0 flow --auto (which has no --no-plan flag either) applies the plan-versus-no-plan rule to a ready zero-task spec with no recorded route and records the result on the spec before any mint. Nothing breaks, but scripts or loop drivers passing the flag should migrate to marking the spec itself:
flowctl spec set-no-plan fn-N # durable per-spec consent; refused once tasks existflowctl spec clear-no-plan fn-N # undo/flow-next:capture ... --no-plan # record it at capture time/flow-next:work fn-N --no-plan is unchanged; the direct flag stays for interactive use, and work now also honors the spec field. See the no-plan route.
4.0: installs became copy-less
Section titled “4.0: installs became copy-less”Your repos need no flowctl copies. Every host resolves flowctl from the plugin install itself, so updating the plugin is the whole update.
If an older install left .flow/bin/, .flow/templates/spec.md, or .flow/usage.md behind, delete them (git rm if tracked), or let /flow-next:setup offer it. Nothing depends on them, and a stale copied flowctl can shadow the current one. Customized .flow/templates/spec.md? Copy it to a repo-root SPEC.md first, which is tier one of the template cascade; setup’s offer detects a customized template and never deletes it.
4.0: packaged delegation and model config removed
Section titled “4.0: packaged delegation and model config removed”The work.delegate* subsystem and the models.* keys are gone. Leftover keys in .flow/config.json are inert. flowctl names them once in a non-blocking advisory and otherwise ignores them.
The replacement is prose, not config. Name an implementer tier in your CLAUDE.md / AGENTS.md routing block and drive the other CLI through a headless bridge. Run /flow-next:setup, accept the routing-block scaffold, and use the bridge recipes in flowctl usage. Full model: Model routing & steering.
3.0: epic aliases removed
Section titled “3.0: epic aliases removed”epic became spec in 1.0, with aliases that emitted deprecation warnings through 2.x:
flowctl epic *aliasedflowctl spec *flowctl epicsaliasedflowctl specs--epicaliased--spec/flow-next:epic-reviewaliased/flow-next:spec-completion-review
All of them are gone since 3.0, leaving canonical spec forms only. External consumers reading legacy dual-emit JSON keys (epics, epic_id, and friends) or forwarding --epic flags must migrate before upgrading.
The on-disk depends_on_epics field is canonical schema, not an alias, and is unchanged. It is the one place the older word survives on purpose, and it is easy to get wrong when grepping for leftovers.
3.0: migrate verbs removed
Section titled “3.0: migrate verbs removed”The migrate-rename and migrate-rollback commands are gone. Port a pre-1.0 repo by hand in three steps, listed in flowctl usage under “Pre-1.0 layout porting”: rename .flow/epics/ to .flow/specs/, rewrite the legacy keys, then run flowctl validate --all.
The interactive path is:
/flow-next:setup3.0: Ralph hooks became per-project
Section titled “3.0: Ralph hooks became per-project”The plugin ships zero hooks. Registration was agent-driven by /flow-next:ralph-init (removed in 7.0). Upgrading from 2.x with an existing Ralph setup meant re-running ralph-init once. The old plugin-level hooks are gone and the guard will not fire without re-registration.
Where the release history lives
Section titled “Where the release history lives”Per-release detail, including everything that did not need a migration step, is in the changelog.