claude-project-flow
releasev3.2.2A Claude Code plugin that carries a project from a rough idea to shipped code through six approval-gated phases
README Snapshot
claude-project-flow
A Claude Code plugin that carries a project from "I have a rough idea" to working code through six approval-gated phases — and refuses to write a line of application code until the first five are done.
The problem it solves is the pair of failure modes an AI assistant falls into on a new project: it starts building on a guess, or it asks questions forever. This fixes both with a bounded checklist, evidence from real research instead of recall, and a set of documents that hold the memory so the conversation does not have to.
Install
/plugin install project-flow --marketplace voyvodka/claude-plugins
That adds the catalog and installs the plugin in one command, on Claude Code 2.1.275 or later (from the
shell, claude plugin install project-flow --marketplace voyvodka/claude-plugins needs 2.1.292).
On an older version, register the catalog first:
/plugin marketplace add voyvodka/claude-plugins
/plugin install project-flow@voyvodka
The plugin is listed in a small catalog marketplace
rather than being one itself, so a single registration covers every plugin from the same author and
/plugin marketplace update voyvodka refreshes all of them at once.
The owner/repo shorthand clones over SSH when your key authenticates to GitHub and over HTTPS
when it does not; CLAUDE_CODE_PLUGIN_PREFER_HTTPS=1 skips the SSH check.
Then, in any project folder:
/project # start, or resume wherever the folder left off
/project a tool that does X # start with a rough idea
Always the same command. It reads docs/product/00-state.md to work out whether this is a new
project, a resumption, or a request to advance — an empty folder, a half-finished plan, and an
existing codebase all route correctly.
The six phases
| Phase | Does | Writes code |
|---|---|---|
| 0 · Detect | Classifies the folder, reports where things stand | No |
| 1 · Discover | Bounded question rounds against a fixed checklist | No |
| 2 · Research | Subagent fan-out: market, tech, dev environment | No |
| 3 · Decide | Findings become owned decisions and an MVP scope | No |
| 4 · Scaffold | CLAUDE.md, AGENTS.md, right-sized AI tooling |
No |
| 5 · Build | Implements the roadmap in approved increments | Yes |
Every boundary is a gate the user opens. A phase can be skipped when it does not apply — but never silently: it says what it is skipping, why, and writes that into the state file.
What it leaves behind
<project>/
├── CLAUDE.md main context source
├── AGENTS.md pointer for non-Claude tools
├── docs/
│ ├── README.md index of everything under docs/
│ ├── product/ 00-state · 01-brief · 02-decisions · 03-mvp · 04-roadmap
│ └── research/ market · tech · devenv
└── .claude/
├── agents/ project-specific subagents — few, or none, read-only
├── skills/ only for genuinely repeated work
├── rules/ area rules loaded by path, once CLAUDE.md outgrows its budget
└── settings.json, hooks/ checks that must run every time — often none
All of it is committed by default; the publication decision in Phase 3 can keep the AI tooling
(CLAUDE.md, AGENTS.md, .claude/) on your machine only. Someone who clones the repo — using
Claude Code, opencode, or anything else — reads CLAUDE.md and docs/product/00-state.md and
continues from the same line of thought. That handover is the point of the whole thing.
The ideas it is built on
- No application code before Phase 5 is approved. If you ask for code earlier, it names what is still unknown and offers to fast-track the remaining phases rather than silently starting.
- Documents are the memory, the conversation is not. Anything confirmed is written down before moving on, as if the chat will be lost mid-sentence.
- Ask, but bounded. A fixed checklist with a round limit. Remaining unknowns become marked assumptions, raised again at the moment code depends on one — never more rounds of questions.
- Research runs in subagents. Each branch digs deep in its own context, writes straight to its own file, and returns ten lines. That is what keeps one long chat viable.
- Right-size everything. A weekend script gets a weekend-sized plan, two doc files and zero custom subagents. Preventing over-engineering is the reason this exists.
- Never invent a fact. Market numbers, competitor names, library versions and pricing come from research with a source, or they are written down as assumptions. Never from memory presented as fact.
- Decisions are updated in place. Git holds the history; the file always reads as current truth. A reversal is a sweep through everything that encoded the old choice, not a paragraph added below it.
The developer profile
plugins/project-flow/skills/project-flow/profile/ is the part you are meant to edit. It records what
you already know and reach for by default, one file per stack, so a project reads only what it
touches.
With it filled in, Phase 2 stops asking "which stack?" and starts asking "is there a reason to deviate from the default here?" — faster, and a better question, because it forces a candidate to beat the default on something the project actually needs.
The files in this repository are one developer's answers, kept as a worked example rather than as advice. Replace them. A profile describing someone else is worse than an empty one, because it will be trusted.
Keeping your real profile out of git
profile/local/ is gitignored, and any file placed there is read instead of the file with the
same name one directory up:
profile/infrastructure.md committed — the template
profile/local/infrastructure.md ignored — the real one, read in preference
That is where hostnames, machine limits, git identity and repository paths belong. Two files
ship as templates for exactly this reason — infrastructure.md and local-environment.md — and
until one is filled in or overridden, the plugin treats its subject as genuinely open and asks
rather than assuming.
This requires running the plugin from a copy you own. A marketplace install is copied into a
versioned plugin cache, and that breaks the override in both directions: the clone it was built
from never contained local/, and a local/ you create inside the cache is deleted by the next
update. Nothing errors when it fails — the templates are read instead, and the tool proceeds
trusting answers that describe a different developer, which is exactly the outcome the profile
warns about.
Two ways to have a real profile:
# clone it, and point a skills directory at the plugin — discovered in place, no cache copy
git clone https://github.com/voyvodka/claude-project-flow.git
ln -s "$PWD/claude-project-flow/plugins/project-flow" ~/.claude/skills/project-flow
or install from the marketplace and edit the committed profile/ files directly, accepting that
an update overwrites them. If you do neither, treat every default in profile/ as someone else's
and expect Phase 1 to confirm each one with you.
It reviews itself
At every phase gate the tool asks whether anything went wrong because of how it is written, separates structural failures from circumstantial ones, and logs them. The bar for acting is evidence from a real project, not taste, and the preferred fix is to remove the cause rather than add a reminder. It proposes changes; it never applies them to itself without approval.
plugins/project-flow/skills/project-flow/feedback/observations.md is that ledger.
CHANGELOG.md records what changed in each version from 2.7.0 on, and each pull
request carries the reasoning behind its change; the frozen Status section of
plugins/project-flow/README.md keeps the reasoning behind earlier versions. The ledger and that
section include the findings that were rejected, and one that shipped and had to be reverted,
because the reason a plausible rule was wrong is the only thing that stops it coming back.
Language
Conversation and everything under docs/ follow the user's language. CLAUDE.md, AGENTS.md,
.claude/**, all code and all commit messages are always English.
Repository layout
plugins/project-flow/ the plugin — see its own README for detail
Licence
MIT — see LICENSE.
Changelog
Changelog
All notable changes to the project-flow plugin are documented here.
The format follows Keep a Changelog, and this project
adheres to Semantic Versioning.
This file records what changed in each release; the reasoning behind a change is in its pull
request. For releases before 2.7.0 the reasoning is in the frozen Status section of
the plugin README, and the entries below for them are summarised
from it and from git history.
Unreleased
Changed
- Phase 2 research branches run on an explicit
model: "sonnet"(opus only for a large stack-choice brief) and no longer spawn subagents or verifiers of their own.
3.2.2 - 2026-10-25
Changed
- Profile examples trimmed back to worked-example scope: version notes, licence advice and dated citations removed from the .NET, Next.js, Astro and avoid files (#19).
- Plugin README notes that
evals/ships with the plugin on purpose (#19).
3.2.1 - 2026-10-25
Added
evals/stale-state: fails when a session corrects a stale state file before the user approves it (#17).
3.2.0 - 2026-10-24
Added
profile/macos-swift.md: defaults and known traps for macOS-only native tools, indexed in the profile README (#14).evals/: sixclaude plugin evalcases covering detection, refusing early code, re-entry, phase announcement, skill triggering and staying out of unrelated requests (#15).
Changed
- A project whose MVP or round has closed now routes to a re-entry step that checks the record and sends new work to an increment, a new round or maintenance (#14).
00-state.mdand02-decisions.mdtemplates carry size limits; history moves toarchive/, and a large decision record splits by topic (#14).- A compact project that outgrows its two files is promoted to the five-file layout (#14).
- The tool never proposes waiving its own gates; a standing approval is recorded verbatim with its scope and expiry (#14).
- Routing announces the project's phase on every invocation, including when it opens with a concrete task (#14).
- The active phase reference is re-read after a context compaction (#14).
/projectpre-approves only theSkilltool (#14).- Phase 5 lists increment steps in the reply when the task tools are unavailable (#14).
- Phase 4 notes that git worktrees lack local-only tooling and suggests a
.worktreeinclude(#14). - A state file that disagrees with the documents or the code is reported and corrected only on approval; a conflict with what the user said is still fixed at once (#15).
- A compact project's
Belge düzeniline carries where decisions and the roadmap live (#15). - Profile defaults updated: React Router 8, .NET application-part discovery, CSS-in-JS nonces, AutoMapper's licence, Next.js private folders and Astro hosting, each with source and date (#15).
- READMEs say the AI tooling can stay local and list
docs/README.mdin the produced tree (#15).
3.1.1 - 2026-10-14
Changed
/projectis a skill now, not a command file. It moved fromcommands/project.mdtoskills/project/SKILL.mdwithdisable-model-invocation: true; its name, arguments and tool grants are unchanged.- READMEs lead with the one-step install,
/plugin install project-flow --marketplace voyvodka/claude-plugins(Claude Code 2.1.275 or later), and keep the two-step form for older versions.
Fixed
- Phase 4 now says a rule file with broken frontmatter loads into every session, not that it is dropped, and that path-scoped rules also load when a matching file is written or edited.
3.1.0 - 2026-09-25
Added
- Phase 4 wires verification into hooks instead of prose. A settled fast check becomes a Stop
hook in
.claude/settings.json, the slow suite a git pre-push hook, andCLAUDE.mdgains an optional Verification section. CLAUDE.mdhas a budget of roughly 150 lines, and area rules go to.claude/rules/with apaths:list, loading only for matching files. Phase 5 points new area rules there too.- The publication decision now covers the AI tooling. Phase 3 asks whether
CLAUDE.md,AGENTS.mdand.claude/ship; if not, Phase 4 keeps them out through.git/info/exclude.
Changed
- Proposed subagents are read-only, on the cheapest model that does the job. An advisory agent
gets
Read,Grep,GlobandBashonly when it must run a check.
3.0.3 - 2026-09-25
Added
- CI checks the changelog's link footer and every
profile/*.mdpath thatSKILL.mdor a phase reference names.
Fixed
- The plugin-cache check could not fire. It moved from
self-improvement.mdintoSKILL.md, where${CLAUDE_PLUGIN_ROOT}is substituted, with the skill's base directory as the fallback. phase-3-decide.mdmatchestemplates/02-decisions.md: five required fields plus an optional Source (Kaynak), with "—" for an entry resting on no assumption.- Phase 1 counts seven blocking items, 1–6 and 6b, instead of six.
- Turkish template literals no longer leak into English projects. Headings and literals such as
Ek bilgilerandElenenlerfollow the document's language. phase-4-scaffold.mdand theAGENTS.mdtemplate describeCLAUDE.mdas a pointer todocs/README.md, which Phase 4 now lists among its outputs.- The profile's safety rails are the named exception to its defaults, and Phase 5 asks before running tests when they forbid it.
00-state.mdgains aBelge düzeniline and says where the other records the phases keep belong.phase-0-detect.mdandSKILL.mdnow agree on when Phase 0 is skipped.- The changelog intro and root README agree on where release reasoning lives; leftover duplicate
blocks in
3.0.1and2.8.0and broken footer links are fixed. - Small corrections in the plugin README title, Phase 4 and
dotnet-api-contracts.md.
Security
/projectno longer pre-approves unscopedBash,Write,EditandWebFetch. Itsallowed-toolscover only reads and read-only git; writes and fetches prompt as usual.
3.0.2 - 2026-09-08
Added
- CI checks the changelog's structure: Keep a Changelog section names, no section twice in a
version, an
[Unreleased]section, and one dated heading per version.
Fixed
- Phase 2 research no longer requires Context7.
phase-2-research.mdprefers a docs tool when the session has one, falls back to registry commands, and still never answers from memory. self-improvement.mdno longer logs observations into the plugin cache that the next update deletes; its Logging section carries the cache check.- Duplicate
### Fixedblocks in3.0.1and2.8.0of this changelog are merged, with every unique entry kept.
3.0.1 - 2026-08-28
Changed
- The README's
Statussection is frozen as pre-2.7.0 history. From 2.7.0 onwardCHANGELOG.mdis the record of each release.
Fixed
phase-3-decide.mddescribes all five decision-record fields, includingKabul edilen bedel/ accepted cost, written as "—" when a decision costs nothing.
3.0.0 - 2026-08-28
Changed
- The plugin is renamed from
projecttoproject-flow. BREAKING: the install key is nowproject-flow@voyvodkaand the skill idproject-flow:project-flow; Claude Code v2.1.193+ updatesenabledPluginsautomatically, and the/projectcommand is unchanged. plugins/project/is nowplugins/project-flow/, matching the plugin name.
Fixed
- The
.gitignorerule protectingprofile/local/is now**/profile/local/, so it keeps matching after the plugin directory is renamed.
2.8.0 - 2026-08-28
Fixed
- Phase 2's Tech research carries conclusions, not transcription, from
profile/local/infrastructure.mdinto the committeddocs/research/tech.md. - Phase 2 records launched research branches in
00-state.mdand marks each done as it returns, so an interrupted fan-out no longer reads as finished. SKILL.mdnames the two self-repair exceptions next to its promise that the tool never edits itself without approval.- "No application code before Phase 5" now reads "no code that ships", with the Phase 3 spike as the one exception.
- The compact "two documents" layout is defined: a table names which file absorbs which, and
the choice is recorded in
00-state.md. - Phase 4 asks before writing over an existing
CLAUDE.md,AGENTS.mdordocs/tree, offering merge, replace or write-alongside. - The
Aktif fazfield carries a parenthesised status that tells a running phase from a finished one. phase-0-detect.md's "Reconstructing state" heading says it runs after approval.phase-1-discover.mdstops after four question rounds; whatever is still open becomes marked assumptions for Phase 2 to research.- Decision-record labels in
phase-3-decide.mdfollow the document's language instead of the hardcoded TurkishKarar/Neden/Elenenler/Bağlı olduğu varsayım. code-style.mdsays to creategotchas.mdon first use, with its three-layer structure.- Two
avoid.mdexclusions, Sentry and API versioning, are marked as unargued weak priors to raise in Phase 1.
2.7.0 - 2026-08-28
Added
.github/workflows/validate.ymlrunsclaude plugin validate --strictand checks that the phase routing inSKILL.md, the references and the templates resolves.$schemainplugin.json.
Removed
- A stray
version: 0.1.0from theSKILL.mdfront matter.
Fixed
self-improvement.mdchecks${CLAUDE_PLUGIN_ROOT}before applying an edit, so an approved change no longer lands in a plugin cache the next update wipes.- The layout trees in
SKILL.mdand the plugin README list the projectREADME.mdthat Phase 5 writes at MVP close. - The README's
Statussection is backfilled through 2.6.0. profile/code-style.mdgives Turkish documentation as a default, not a rule for every project; English for code stays absolute.
[2.6.0] - 2026-08-12
Changed
- The index of
docs/moved fromCLAUDE.mdintodocs/README.md, created in Phase 4 from the newtemplates/docs-README.md;CLAUDE.mdkeeps a pointer.
[2.5.0] - 2026-08-12
Changed
- For projects that already have code, Phase 1 asks the owner's bar for the product being fit to push before any outward goal.
- Phase 0 now asks what the source is silent on: whether its author considers it finished, and what quality bar they want.
[2.4.0] - 2026-07-31
Changed
- First public release. The developer profile split into committed templates carrying the
questions and a gitignored
profile/local/holding the answers, read in preference.
Releases
- v3.2.2Open on GitHub
Changed
- Profile examples trimmed back to worked-example scope: version notes, licence advice and dated citations removed from the .NET, Next.js, Astro and avoid files (#19).
- Plugin README notes that
evals/ships with the plugin on purpose (#19).
- v3.2.1Open on GitHub
Added
evals/stale-state: fails when a session corrects a stale state file before the user approves it (#17).
- v3.2.0Open on GitHub
Added
profile/macos-swift.md: defaults and known traps for macOS-only native tools, indexed in the profile README (#14).evals/: sixclaude plugin evalcases covering detection, refusing early code, re-entry, phase announcement, skill triggering and staying out of unrelated requests (#15).
Changed
- A project whose MVP or round has closed now routes to a re-entry step that checks the record and sends new work to an increment, a new round or maintenance (#14).
00-state.mdand02-decisions.mdtemplates carry size limits; history moves toarchive/, and a large decision record splits by topic (#14).- A compact project that outgrows its two files is promoted to the five-file layout (#14).
- The tool never proposes waiving its own gates; a standing approval is recorded verbatim with its scope and expiry (#14).
- Routing announces the project's phase on every invocation, including when it opens with a concrete task (#14).
- The active phase reference is re-read after a context compaction (#14).
/projectpre-approves only theSkilltool (#14).- Phase 5 lists increment steps in the reply when the task tools are unavailable (#14).
- Phase 4 notes that git worktrees lack local-only tooling and suggests a
.worktreeinclude(#14). - A state file that disagrees with the documents or the code is reported and corrected only on approval; a conflict with what the user said is still fixed at once (#15).
- A compact project's
Belge düzeniline carries where decisions and the roadmap live (#15). - Profile defaults updated: React Router 8, .NET application-part discovery, CSS-in-JS nonces, AutoMapper's licence, Next.js private folders and Astro hosting, each with source and date (#15).
- READMEs say the AI tooling can stay local and list
docs/README.mdin the produced tree (#15).
- v3.1.1Open on GitHub
Changed
/projectis a skill now, not a command file.commands/project.mdmoved toskills/project/SKILL.md; Claude Code documents command files as the older form and skills as the one to use. The command name, arguments and tool grants are unchanged. It also carriesdisable-model-invocation: true: the model reaches the phases through theproject-flowskill, so the entry point only needs to answer the user typing/project. The same field keeps it out of subagent preloads and scheduled tasks.- READMEs lead with the one-step install,
/plugin install project-flow --marketplace voyvodka/claude-plugins(Claude Code 2.1.275 or later), and keep the two-step form for older versions. - CI:
actions/setup-nodepinned to v7.1.0.
Fixed
- Phase 4 said a rule file with broken frontmatter is dropped. It is the opposite: Claude Code
ignores frontmatter that does not parse and loads the rule into every session as if it had no
paths:. A malformed area rule becomes always-on context rather than a gap, which is the cost the CLAUDE.md budget exists to avoid. Path-scoped rules also load when a matching file is written or edited, not only read.
- v3.1.0Open on GitHub
Added
- Phase 4 wires verification into hooks instead of prose. Where a verification command was
settled, the fast part becomes a Stop hook in
.claude/settings.jsonthat checks the changed files and blocks the turn on failure, and the slow suite a git pre-push hook that skips pushes carrying no code.CLAUDE.mdgains an optional Verification section naming what the hooks run. Three projects arrived at this independently after a written "run the checks" instruction; the phase had no place for it. CLAUDE.mdhas a budget of roughly 150 lines, and area rules go to.claude/rules/. A rule that applies to one part of the code is written with apaths:list and loads only when a matching file is read. Two large projects had to cut 300–480-line files by half or more to get there after the fact. Phase 5 points new area rules the same way.- The publication decision now covers the AI tooling. Phase 3 asks whether
CLAUDE.md,AGENTS.mdand.claude/ship; when they do not, Phase 4 keeps them out through.git/info/excluderather than.gitignore, which is committed and would publish the list.
Changed
- Proposed subagents are read-only, on the cheapest model that does the job. The main session
is the only writer; an advisory agent gets
Read,Grep,GlobandBashonly when it must run a check.
- Phase 4 wires verification into hooks instead of prose. Where a verification command was
settled, the fast part becomes a Stop hook in
- v3.0.3Open on GitHub
Added
- CI checks the changelog's link footer:
[Unreleased]compares from the newest version, every tagged version has a ref, and no ref points at a tag that does not exist. The newest version may be untagged, because a release PR adds its heading before the tag. The checkout now fetches full history so the check can see the tags. - The CI routing check also resolves every
profile/*.mdpath a phase reference orSKILL.mdnames, not only the templates.
Fixed
- The cache check could not fire.
self-improvement.mdtold the reader to stop if${CLAUDE_PLUGIN_ROOT}pointed intoplugins/cache/, but Claude Code substitutes that variable only into skill, command and agent bodies as they load. It is not in the Bash environment and not substituted into a reference file read later, so the reader saw the literal string. The check now lives inSKILL.md, where the path is substituted, with the skill's base directory as the fallback, andself-improvement.mdpoints at it. - The decision record had six lines in the template and "five fields" in the reference.
templates/02-decisions.mdcarries aKaynakline thatphase-3-decide.mdnever mentioned, and told the reader to leaveBağlı olduğu varsayımblank where the reference required all five. Phase 3 now says five required fields plus an optional Source, gives the English label for it, and says an entry resting on no assumption writes "—". - Phase 1 counted six blocking items in a table of seven. Item 6b, existing skill, is blocking, and a reader counting to six could close the gate without it. The count now says seven, 1–6 and 6b.
- Turkish template literals leaked into English projects. Only the decision labels had a
translation rule;
Ek bilgiler,yok / uygulanmaz,Belge düzeniand the rest did not, and the English-onlyCLAUDE.mdtemplate quoted the TurkishElenenlerlabel.SKILL.mdnow carries one rule — headings and literals follow the document's language, the section set is what is fixed — and theCLAUDE.mdtemplate names the line by what it holds. phase-4-scaffold.mdand theAGENTS.mdtemplate still describedCLAUDE.mdas holding a map ofdocs/, which 2.6.0 moved intodocs/README.md. Both now say pointer, and Phase 4's table listsdocs/README.mdamong the files it produces.- The profile's safety rails called themselves absolute while
profile/README.mdcalled everything in the profile a default, and Phase 5 said "run it" against a rail forbidding tests unasked. The rails are now the named exception, and Phase 5 asks before running tests when they forbid it, reporting the increment as unverified if the answer is no. 00-state.mdhad nowhere for the records the phases tell it to keep — dispatched research branches, the compact layout, a merge-or-replace choice, tooling built on request — whileSKILL.mdforbids new headings. The template gains aBelge düzeniline and says where the rest go.phase-0-detect.mdsaid never to skip Phase 0, whileSKILL.mdroutes past it whenever a state file exists. Both now say the same thing.- Three statements disagreed about where the reasoning for each version lives. The changelog intro
and the root README now match the plugin README:
CHANGELOG.mdfrom 2.7.0, frozenStatusbefore it. 3.0.1still recorded the frozenStatussection twice, underFixedandChanged, and2.8.0still had a blank line splitting itsFixedlist — both after3.0.2said they were merged.- The changelog footer pointed
[Unreleased]atv3.0.1, had no[3.0.2]ref, and linkedv2.4.0,v2.5.0andv2.6.0, tags that were never created. Those three headings are now plain text. - Leftover
projectnames in the plugin README title and the changelog intro; "the last five phases" in Phase 4, where four come before it; a dangling section reference and a miscounted list indotnet-api-contracts.md; a CI comment that describedset -eo pipefailwhere the runner usesbash -e.
Security
/projectpre-approved unscopedBash,Write,EditandWebFetch.allowed-toolsgrants permission without a prompt for the turn it runs in, sogit commit,git initor a database command could run unasked — against the skill's own rule that git runs only on request. The command now pre-approves only reads and read-only git (git status,git log,git diff,ls); writes and fetches go through the normal permission flow.
- CI checks the changelog's link footer:
- v3.0.2Open on GitHub
Fixed
- The research phase told the subagent to use Context7 and gave it no way to proceed without it.
phase-2-research.mdsaid "use Context7 (resolve-library-id, then query-docs) … Do not answer from memory", but this plugin declares no dependency on Context7 and nothing installs it. On a machine without it the branch had an instruction it could not follow and no stated alternative, against a rule that forbids answering from memory — so the only exit was the one the rule forbids.profile/code-style.mdalready said "Context7 or the registry", so the two files disagreed about whether the tool was required. The rule now leads with what is actually non-negotiable (never answer from memory), prefers a docs tool where the session has one, and names the registry commands to fall back to. self-improvement.mdsent the observation log into a directory the next update deletes. "Where the edit has to land" tells the reader to stop when${CLAUDE_PLUGIN_ROOT}is inside aplugins/cache/path, but the "Logging" section below it said, without qualification, to append tofeedback/observations.md— a file in that same cache. A reader arriving straight at Logging appended an observation that a marketplace update then wiped, silently, having counted it as recorded. The constraint is now restated where the writing happens.- Two release blocks in the changelog held the same fixes twice.
3.0.1and2.8.0each carried two### Fixedheadings, because separate pull requests each appended to[Unreleased]and the release stamped both without merging them. Merged, with every unique entry kept.
Added
- CI checks the changelog's structure: no section heading twice inside one version block, only
Keep a Changelog section names, an
[Unreleased]section that the next change can land in, and one dated heading per version.
Full changelog: https://github.com/voyvodka/claude-project-flow/blob/main/CHANGELOG.md
- The research phase told the subagent to use Context7 and gave it no way to proceed without it.
- v3.0.1Open on GitHub
Follow-ups from a full re-audit. All three are defects introduced or left standing by 3.0.0's own changes.
Fixed
phase-3-decide.mdsaid the decision record has four fields while a paragraph further down describesKabul edilen bedel/ accepted cost as mandatory, down to what to write when there is none. An agent following the explicit instruction drops the field the same file calls required — and it is the one that stops the next reader reopening a settled decision. The template now carries all five.- The plugin README's
Statussection went stale twice in one day — backfilled at 2.7.0, then three releases shipped past it. Resetting it a third time would be the weakest possible fix, so the cause is gone:CHANGELOG.mdis the record from 2.7.0 onward, andStatusis explicitly frozen as pre-2.7.0 reasoning. - The CI routing check aborted opaquely on the condition it exists to report.
grepexits 1 when it matches nothing, and underset -eo pipefailthat killed the step before the annotation printed. It always failed safe, but a gate that cannot say what it caught costs the next person the time it was meant to save.
- v3.0.0Open on GitHub
⚠️ Breaking: the install key changed
The plugin is renamed from
projecttoproject-flow:/plugin install project-flow@voyvodkaThe catalog carries a
renamesentry, so Claude Code v2.1.193+ rewritesenabledPluginsandpluginConfigsin your user, project and local settings automatically and tells you it did. Because the source is remote, expect oneplugin-cache-missand a single/plugin installto pick it up under the new name. On older Claude Code the old name reportsplugin-not-found— install the new one.Unchanged: the repository name, and the
/projectcommand. It still starts, resumes and advances a project exactly as before. What moved is the install key and the skill's namespaced id (project-flow:project-flow).Why
projectis a bare dictionary word standing in for a plugin about phased project delivery, and the plugin name is the install key — the one identifier you cannot disambiguate at install time.cyberswat/claude-plugin-projectsalready occupies the same space. The skill one directory down has been calledproject-flowsince the first release; the plugin now matches it, andplugins/project/becameplugins/project-flow/so the directory does too.Fixed
- The
.gitignorerule protectingprofile/local/was pinned to a literal path and stopped matching the moment the plugin directory was renamed — no error, no warning. It is now**/profile/local/, and CI asserts that nothing underprofile/local/is tracked, so the protection is checked rather than assumed. If you run this plugin from a clone with your ownprofile/local/, this is the release that makes that safe against future moves.
- The
- v2.8.0Open on GitHub
A privacy fix worth upgrading for, plus four contract mismatches.
Fixed — a gitignored file was feeding something that gets committed
phase-2-research.mdtells the Tech branch to pasteprofile/infrastructure.mdinto the subagent prompt. On any real machine that resolves toprofile/local/infrastructure.md— gitignored precisely because it holds hostnames, provider and account names, port lists, domain portfolios and backup schedules. That branch writes intodocs/research/tech.md, a file this tool tells you to commit, in a different repository from the one the profile describes. Nothing distinguished using that content for judgement from transcribing it. Now an explicit rule, worded after the constraint the committedinfrastructure.mdalready places on itself.Fixed — an interrupted research branch looked finished
Branches write straight to their final file, so a session that died mid-fan-out left a file Phase 0 read as complete. Launched branches are now recorded in
00-state.mdat dispatch and marked done as each returns.Fixed — the tool contradicting its own promises
SKILL.mdsaid "never edits itself without the user's approval" whileself-improvement.mddocuments two repair exceptions. The exceptions are now named where the promise is made.- "No application code before Phase 5" vs Phase 3's timeboxed throwaway spike. Now "no code that ships", with the spike named as the one exception.
- "Two documents instead of five" was offered without saying which two, while Phases 3-5 name files the compact shape does not have. There is now a table.
Fixed — Phase 4 overwrote existing context files silently
No merge, diff or approval step existed for a pre-existing
CLAUDE.md,AGENTS.mdordocs/tree. It now stops, says what is there and where it disagrees, and offers merge / replace / write-alongside.Also
The
Aktif fazfield enumerated phases 0-5 while Phase 5 writes "MVP complete" into it, and nothing marked a phase as running or interrupted. It now carries a parenthesised status. - v2.7.0Open on GitHub
Content fixes found by a full re-audit on 2026-08-28, plus the repository's first CI gate. First tagged release — earlier versions are summarised in CHANGELOG.md.
Fixed
- The self-improvement loop could write into a directory that gets deleted.
references/self-improvement.mdwalks through proposing a change and then applying it toSKILL.mdor a phase reference, and allows two classes of repair without asking — but never said where the edit lands. On a marketplace install that is a versioned plugin cache, wiped on the next update, silently, after you approved the change and watched it be written. There is now a check against${CLAUDE_PLUGIN_ROOT}before anything is applied. - Phase 5 wrote a file no layout tree listed. A project
README.mdis written at MVP close, but neitherSKILL.md's target layout nor the plugin README's "What it produces" named it — while Phase 0 treats a rootREADME.mdas a pre-existing signal. - The README's
Statussection had stopped at 2.4.0 while the manifest was at 2.6.0. Backfilled. profile/code-style.mdstated "Documentation is Turkish" as an unconditional rule for every project, against the profile's own default-not-a-rule framing and againstSKILL.md. Reworded. The English-for-code half is unchanged and still absolute.
Removed
- A stray
version: 0.1.0from theSKILL.mdfront matter, which Claude Code does not read and which contradicted the manifest.
Added
- CI that validates the manifest and asserts the phase routing, references and templates all resolve in both directions. This skill's failure mode is routing: a renamed reference breaks a phase at the moment that phase is needed, halfway through someone's project.
- Dependabot,
CHANGELOG.md, and$schemain the manifest.
- The self-improvement loop could write into a directory that gets deleted.