flow
Skill10 starsChanged 30 days agoApache-2.0View on GitHub
MANDATORY first step for ALL development work — invoke BEFORE starting any code change, feature, fix, or free-text dev request, and before any commit. Skipping it leaves the commit unclassified and the commit gate blocks it.
- Deletes or force-pushes
- Commits and pushes
33 other projects use a version of this.
Adopted by
Most recently taken up by
- phuthuycoding/kanban-flowtheir own version, first seen Nov 8, 2026
- baodhg/FLOWtheir own version, first seen Nov 8, 2026
- jocarrd/crux-agentstheir own version, first seen Nov 8, 2026
- cofin/flowtheir own version, first seen Nov 7, 2026
- retospect/precis-mcptheir own version, first seen Nov 6, 2026
- luckys/agent-skillstheir own version, first seen Nov 1, 2026
Used with
Projects with it also use grill, implement and 5 more.
Other files people use alongside this one.
Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
renatorozasSkillgrill
Adversarial code review. Don't let me ship until the changes pass your scrutiny.
Also in 3 projects that use this
Hugging FaceSkillimplement
Make tests pass. Invoke after /write-tests produces failing tests.
Also in 5 projects that use this
SentrySkillreview
Fixture review skill.
Also in 6 projects that use this
AnthropicSkillstatus
Case status summary by audience — client-facing (plain language), internal (for the professor), or court-ready (formal caption format per local rules). Same facts, different framing and depth. Use when a student needs to update the client, brief the professor, or prepare a court status report.
Also in 3 projects that use this
BlockSkillplan
Draft a TDD, PRD, or lightweight plan in the conversation without committing it.
Also in 3 projects that use this
AWSSkillship
Finalize dev work on an issue branch — update docs, push, and open a PR.
Also in 3 projects that use this
Other versions33 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 33
- react/react★ 252ksame name
- facebook/react★ 252ksame name
- software-mansion/react-native-audio-api★ 856same name
- simota/agent-skills★ 96same name
- panayiotism/claude-harness★ 79same name
- rainday/smart-blog-skills★ 35same name
- cofin/flow★ 19same name
- basezh/agent-skills-on-base★ 15same name
- retospect/precis-mcp★ 11same name
- manhquydev/flow-skill★ 9same name
23 more not listed
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository21 other files it gives its agents.
- .claude/CLAUDE.mdCLAUDE.md
- commitSkill
- design-apiSkill
- design-architectureSkill
- design-erdSkill
- design-sdsSkill
- design-srsSkill
- design-tableSkill
- doc-syncSkill
- flow-initSkill
- flow-uninstallSkill
- harness-authoringSkill
- harness-deploymentsSkill
- harness-initSkill
- harness-insightSkill
- integrationSkill
- performanceSkill
- playwright-scaffoldSkill
- prose-reviewSkill
- release-commitSkill
- wiki-initSkill
The file
We split this skill into the rules it gives an agent
5 rules. 0 are common, 2 are distinctive, and 3 are very specific to this project.
0
Common
Most of the 26 edited versions we read keep these.
2
Distinctive
This author's own choices. Worth a look.
3
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 80
Ask the user (structured choice) to confirm the tier, allowing an override.
- Very specific: line 156
Commit through the commit skill — invoke skill commit with the tier and what changed.
- Very specific: line 161
When flow-config.merge_workflow.pull_request includes daily, open a PR instead of merging: rebase → integration-test human gate (unchanged) …
- Very specific: line 177
When that produces nothing — no wiki, or no node owns the paths — read docs/sds/README.md and docs/srs/README.md directly if they exist …
- Distinctive: line 277
After the commit/merge completes, clear the flow state.
“Common” is measured: kept by at least 6 in 10 of the 26 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Flow — Risk-Tiered Workflow Router
Classify the incoming work by risk, confirm the tier, run the matching workflow,
and record gate evidence under .claude/harness-tier/.flow/ so the git commit hook
enforces the tier's required gates.
Source of truth: risk-tiers.md (criteria, skill
gate, gates) and flow-tiers.yaml (tier→gates the
commit hook enforces). risk-tiers.md is already in context — the SessionStart hook
injects it — but read flow-tiers.yaml, which is not injected and carries the
gate list you must report in Phase 1. On a promotion also read
promotion.md, the promotion-only half of the rule,
which nothing injects either.
Branch names referenced below come from flow-config.branches
(integration / staging / production). Domain-review items come from
flow-config.review_checklist and per-module pre-checks from flow-config.modules.
Interaction. Wherever this skill asks the user something, use the host's blocking question tool already in your tool list, matched by capability rather than by a host-specific name; if it is listed but not loaded, load it first with the host's tool-discovery primitive; only when no such tool is listed, or a question call errors, offer numbered options in chat and end your turn to wait for the reply — never answer the question yourself or skip it.
Four tiers, two axes:
- Day-to-day task (this skill's main job): Docs (no code) or Dev (any code).
- Promotion (run when cutting a release): Staging (integration → staging) and Release (staging → production) — see "Promotion" below.
Input
- $ARGUMENTS — a free-text request. If empty, ask the user what the task is.
- Carry that request text forward as the task for every later phase — the task Phase 3
hands to
superpowers:using-superpowers, and the reference for the commit scope.
Phase 1 — Classify the task (Docs or Dev)
A promotion is not a day-to-day task. A request to promote a branch, cut a release
candidate, or release — integration → staging, staging → production — has no tier to
classify: the target branch decides it. Invoke skill release-commit and stop here.
The rubric below is the wrong instrument for that ask.
The line is simple: code, or no code. Inspect the real change, do not guess:
git diff --name-only HEAD # already-changed files
git ls-files --others --exclude-standard # new files- No source code (
.md/ docs / comments / pure config-text only) → Docs. - Any change to
.py/.js/.ts… (however small), or new feature / DB schema / cross-service shared package / business logic·node·workflow·validator / dependency change / 2+ services → Dev. (Full rubric inrisk-tiers.md.)
Output the verdict — tier, reason, gates (from flow-tiers.yaml):
## Tier Classification
- Tier: DEV
- Reason: changes src/*.py (source code)
- Gates: precommit, review, doc-sync, wiki, doc-stylePhase 2 — Confirm the tier & switch to a work branch (human gate)
Ask the user (structured choice) to confirm the tier, allowing an override. Do not start before confirmation. When uncertain, default one tier up.
Then ensure you are on a work branch — before writing the marker. Day-to-day
work (Docs and Dev) lives on feature/* / fix/*, never directly on an
integration/staging/production branch (flow-config.branches):
cur=$(git branch --show-current)
case "$cur" in
feature/*|fix/*|hotfix/*) ;; # already a work branch — stay (idempotent)
*)
# On integration/staging/production → cut a work branch. Prefix follows the
# Conventional type (feat → feature/, fix → fix/); <slug> from the task, English.
# Confirm the branch name with the user first.
if git diff --quiet && git diff --cached --quiet; then
git fetch origin # clean tree → branch off fresh integration
git switch -c <feature|fix>/<slug> "origin/<integration-branch>"
else
git switch -c <feature|fix>/<slug> # uncommitted changes → carry them off current HEAD
fi
;;
esacRecord the tier marker after switching, so it binds to the work branch (the
commit gate is branch-bound). When the work lives in a git worktree, the gate reads every
marker from that worktree, while this marker, each .done and every relative path below land
in the shell's directory. A worktree inside the project directory: cd into it first and stay
there. One outside it: the shell returns to the project directory after each call, so put the
worktree's path in front of every marker path and of .gitignore instead.
# Ensure the evidence directory is never exposed to git (idempotent). Safe even
# without running /flow-init first: add the ignore rule *before* writing the tier
# marker to close the untracked-exposure window. `tr` drops the CR a CRLF .gitignore ends
# each line with, which `-x` would otherwise never match, adding the line on every run.
tr -d '\r' 2>/dev/null < .gitignore | grep -qxF '.claude/harness-tier/.flow/' || printf '\n.claude/harness-tier/.flow/\n' >> .gitignore
mkdir -p .claude/harness-tier/.flow
echo "<tier>:$(git branch --show-current)" > .claude/harness-tier/.flow/tier # docs | devOn Codex, the session hooks come first. The Codex plugin carries no lifecycle hook;
/flow-init registers them in .codex/hooks.json. When that file does not name
harness-tier/hooks/invalidate-gate-markers.sh, stop and have the user run $flow-init:
without that hook an edit after a review leaves the review's evidence standing, and the
commit passes on it.
Phase 3 — Dispatch
Record each completed gate as .claude/harness-tier/.flow/<gate>.done. precommit
(every-commit module checks of changed modules) and security-scan (promotion module
checks of all modules) are executed by the commit hook itself — no marker (both are
ordinary gates entries and timing buckets over flow-config.modules[].checks, routed
by each check's when; removing one from a tier's list in
flow-tiers.yaml disables it for that tier). wiki and
doc-style are two more gates needing no marker — neither is a timing bucket; the
hook's gate script runs both in-process, wiki_graph.py --verify whenever
flow-config.wiki is enabled and the prose lint whenever flow-config.doc_style is
(each a no-op otherwise). doc-style only ever warns; doc-style.yml in CI holds the
verdict. Do not touch .claude/harness-tier/.flow/wiki.done or doc-style.done, and
do not go looking for a skill behind either — none exists; the hook runs the checks.
Precondition (Dev) — the
superpowersplugin must be installed. Ifsuperpowers:using-superpowersis not among the available skills, STOP: tell the user to install it (superpowers@claude-plugins-official, e.g. via/plugin) and re-run/flow. Do not fall back to manual implementation.
Docs — no code (superpowers OFF)
- Make the edit directly. Do not invoke
superpowers. precommit not needed (no code). - Invoke the
doc-syncskill to harmonize the doc set (indexCLAUDE.md+ per-service docs + rule dirs fromflow-config.doc_sync; also reconciles code↔doc drift). On pass →touch .claude/harness-tier/.flow/doc-sync.done. - Commit through the
commitskill — invoke skillcommitwith the tier and what changed; it stages, picks the type, and applies the 50/72 rule (rule 4). Then merge applyingmerge-strategy.md(rule 3 — not a plain merge). (The commit hook blocks untildoc-sync.doneexists.) Whenflow-config.merge_workflow.pull_requestincludesdaily, open a PR instead of merging: rebase → integration-test human gate (unchanged) → push →gh pr create→ hand over the PR URL and name the merge method it must use — "Squash and merge" from afeature/*branch, "Rebase and merge" fromfix/*(Merge strategy rows 1·2; the integration ruleset allows both and cannot tell them apart, so this one is on you) — then stop. Withoutgh, print the compare URL and let the user create it — never block.
Dev — any code (superpowers ON)
- Load the wiki context first (skip silently when there is no wiki — both
commands print nothing and exit 0): name the files you are about to change to
python3 .claude/harness-tier/scripts/wiki_graph.py --nodes-for <paths…>, then for each printed id runpython3 .claude/harness-tier/scripts/wiki_graph.py --neighbors <id>and read the documents it lists before planning. An empty result is a normal answer (the code is undocumented) — proceed without it. When that produces nothing — no wiki, or no node owns the paths — readdocs/sds/README.mdanddocs/srs/README.mddirectly if they exist (harness-rules.md8 fixes those locations). Neither existing is normal — proceed. Docs tier skips this: reading a design document to change a paragraph is the process-to-risk mismatch the tiers exist to prevent. Record a new requirement in the SRS first — skip silently when
docs/srs/is absent (the command prints nothing and exits 0). This runs only for a new customer requirement; implementing an existing one, a bug, or a refactor skips it. Route withpython3 .claude/harness-tier/scripts/srs_check.py --areas, then take the number from--next-id docs/srs/<area>.md --kind FRand add the FR to that file, plus aC-NNNindocs/srs/README.md(--next-id docs/srs/README.md --kind C) when the request names a customer need the SRS does not yet carry. You judge two things only — whether this is a new requirement, and which area it belongs to; the number comes from--next-id, the integrity from--verify. FAIL-OPEN: a failure here warns and does not block the commit — thesrs-verifyworkflow holds the verdict.A new area file is a wiki node, and only half of that is fail-CLOSED. Where the host has a wiki, give it front matter:
wiki_idfrompython3 .claude/harness-tier/scripts/wiki_graph.py --derive-id docs/srs/<area>.md, atitle, and therelatededge the template leaves commented out — uncomment it oncedocs/srs/README.mdcarries front matter of its own, since an edge to a document that is no node dangles and blocks. Then rebuild withpython3 .claude/harness-tier/scripts/wiki_graph.py --buildand stagegraph.yamlalongside it. Write the front matter and skip the rebuild, and the commit gate's--verifyblocks with a reason naming the graph rather than this step. Omit the front matter and nothing blocks — a file carrying none is no node, so the gate has nothing to compare and the area stays out of the wiki in silence. That is the likelier slip, and it is on you rather than the gate.- Invoke skill
superpowers:using-superpowers— its injected text is a reminder, not execution: the pipeline starts only on the invocation, which picks the entry skill by task and chains the rest. Never openbrainstormingor any other stage yourself before it. Feed the request from Input in as the task. - Apply the project overlays
superpowersdoes not know about:- Spec and plan commit as Docs, the code as Dev — before the first code edit, commit
the spec and plan under a
docs:<branch>marker (doc-sync→commit), then writedev:<branch>back. Underdevthat commit waits on a review of code not yet written. The swap is mechanical, not a reclassification: the Dev tier Phase 2 confirmed still holds, so writedev:<branch>back without asking the user again. - Implementation minimalism — right after the plan, before writing code,
climb the reuse-before-build ladder (YAGNI → codebase → stdlib → native →
dependency → one line → minimum code) and stop at the earliest rung. Detail
and non-negotiable floor in
dev-overlays.md. - Record the design before the code — right after the plan, alongside the reuse
ladder: a new module, an integration-point contract, or a structural change goes
into
docs/sds/now, with itsImplemented requirementslinking the FR anchors it satisfies. This is the structure half;doc-syncreconciles the rest (sources · stale · orphans) after the code. Placed afterdoc-syncinstead, thePostToolUsehook would deletedoc-sync.doneandreview.doneon that edit, so both would have to run again — a loop. - Selective TDD — only business logic / core nodes / validators / workflow
orchestration (see
dev-overlays.md), not every change. - invoke the
doc-syncskill (not part ofsuperpowers) →touch .claude/harness-tier/.flow/doc-sync.done. - Domain review — dispatch subagent (general) as an independent review agent
(separate context; it runs shell commands).
gitis the authority on the changed-file list — every file is reviewed and the count is reported — judged againstflow-config.review_checklist(regression, cross-service contract, DB/migration & transactions, async task idempotency & queue routing, API error conventions), plus the callers of every changed public symbol. Readdev-overlays.mdDomain review before dispatching and hand the reviewer its ① command verbatim —git diff HEADalone misses what is already committed on the branch. On pass →touch .claude/harness-tier/.flow/review.done. Every edit after that pass voids it — the fixes the review itself asked for included. APostToolUsehook deletesreview.doneanddoc-sync.donethe moment a file changes, so passing is a fixpoint: both recorded, nothing edited since. A fix therefore re-runs doc-sync and then this review, over a recomputed changed-file list. An edit the hook never saw (a terminal command, another tool) leaves the markers standing —rm -f .claude/harness-tier/.flow/review.done .claude/harness-tier/.flow/doc-sync.done. A host that setsflow-config.gate_evidence.invalidate_on_edit: falseturns the hook's deletion off, so in its tree an edit after the pass commits unreviewed (dev-overlays.md).
- Spec and plan commit as Docs, the code as Dev — before the first code edit, commit
the spec and plan under a
- Commit through the
commitskill — invoke skillcommitwith the tier and what changed (rule 4) → merge applyingmerge-strategy.md(rule 3 — not a plain merge). (The commit hook blocks untilreview.doneanddoc-sync.done.) Whenflow-config.merge_workflow.pull_requestincludesdaily, open a PR instead of merging: rebase → integration-test human gate (unchanged) → push →gh pr create→ hand over the PR URL and name the merge method it must use — "Squash and merge" from afeature/*branch, "Rebase and merge" fromfix/*(Merge strategy rows 1·2; the integration ruleset allows both and cannot tell them apart, so this one is on you) — then stop. Withoutgh, print the compare URL and let the user create it — never block. Ahotfix/*branch merges into production instead: invoke skillrelease-commitand run its Hotfix procedure, which owns that merge, the release check and the back-merge after it.
Promotion — Staging (integration → staging) / Release (staging → production)
Promotions are gated at the commit on the target branch, so they need no tier marker —
the branch drives it. Read promotion.md first — nothing
injects it. The procedure itself lives in
release-commit: which bump-level mechanism the host's release
CI is on, the gates and their markers, the merge shape each promotion takes, and the end state
the three branches settle into. Invoke skill release-commit rather than restating any of it
here — one fact, one place.
Phase 4 — Finalize
After the commit/merge completes, clear the flow state. The command below removes the
evidence directory whole — every marker in it, never a selected subset. Phase 4 is the
day-to-day task's finalize step, and a promotion never reaches it: those markers are
release-commit's to clear at its own end state, where the post-release back-merges also
happen — production → integration (not optional) and production → staging (fast-forward
only, skipped when refused).
Under PR mode, clear only after the PR is merged. A review-feedback commit pushed to the PR branch is gated like any other, and the gate reads whether the tier marker and each gate's evidence file exists. Clearing at PR-creation time leaves that commit unclassified and blocked.
rm -rf .claude/harness-tier/.flowCritical rules
- Always classify before working — confirm with the user (Phase 2), then write the tier marker.
- Record gate evidence honestly —
touch .claude/harness-tier/.flow/<gate>.doneonly after the gate genuinely passes. A marker is a forcing function, not a stamp. It is a plain file that outlives the commit that used it, so a gate whose subject changed after it passed is no longer recorded honestly. ThePostToolUsehook enforces that forreviewanddoc-sync— any edit deletes both, unless the host turned that off (Dev step 4) — so what is left to you is the edit it cannot see (a terminal command, another tool): delete the marker yourself and earn it again. - Apply the documented Merge strategy — direct commit + merge, but
do not default to a plain /
--no-ffmerge. For every merge, look up its branch-flow row inmerge-strategy.mdand follow it exactly — the required strategy varies by flow (rebase / squash /--no-ffmerge). Commit types & the 50/72 rule live incommit-discipline.md. Several ofmerge-strategy.md's rows are enforced by the hook: a merge whose flags violate its row is blocked (exit 2) naming the flag it wants. That table's Gate column says which rows fire — the rest still depend on you following them. - Every commit goes through the
commitskill — invoke skillcommit, which owns staging, the type choice, and the 50/72 rule so this skill does not restate them. It inherits the pre-commit gate like any other commit: never--no-verify. - Commit from a git worktree with
git -C <worktree> commit …— the-Cnames the tree in the command itself, even with the shell already inside it (Phase 2), since the hook's cwd is only a guess at it.CLAUDE_PROJECT_DIRis fixed at session start, so when the commit runs in a worktree, the gate re-points to it by branch-key (flow_gate_check.py --classify); the explicitgit -C <worktree>is the deterministic signal that keeps that detection unambiguous, and the markers it reads there are the ones Phase 2 wrote into the worktree. (No worktree → no change.) Thecommitskill issues it that way (rule 4), and owns "never--no-verify" and "stage only affected files" with it. - Worker / service-process safety — Dev+ changes touching long-running worker processes: inspect for in-flight tasks and require explicit user approval before restarting.
- On conflict,
risk-tiers.mdandflow-tiers.yamlwin — where this skill disagrees with them, follow them, and tell the user this skill has drifted.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

