Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,14 @@
},
"metadata": {
"description": "Self-hosted marketplace for the flow plugin — opinionated multi-step development workflow.",
"version": "0.8.0"
"version": "0.9.0"
},
"plugins": [
{
"name": "flow",
"source": "./",
"description": "Multi-step development workflow: prep → research → plan → plan-review → develop → deploy → code-review. Atomic commits, TDD-first, multi-LLM review.",
"version": "0.8.0",
"description": "Multi-step development workflow: prep → research → brainstorm → plan → plan-review → develop → deploy → code-review. Atomic commits, TDD-first, multi-LLM review.",
"version": "0.9.0",
"author": {
"name": "wjh",
"email": "gitgitWi@gmail.com"
Expand Down
5 changes: 3 additions & 2 deletions .claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "flow",
"version": "0.8.0",
"description": "Opinionated multi-step development workflow: prep → research → plan → plan-review → develop → deploy → code-review. Atomic commits, TDD-first, Multi-LLM review.",
"version": "0.9.0",
"description": "Opinionated multi-step development workflow: prep → research → brainstorm → plan → plan-review → develop → deploy → code-review. Atomic commits, TDD-first, Multi-LLM review.",
"author": {
"name": "wjh",
"email": "gitgitWi@gmail.com"
Expand All @@ -20,6 +20,7 @@
"skills": [
"./skills/prep/",
"./skills/research/",
"./skills/brainstorm/",
"./skills/plan/",
"./skills/plan-review/",
"./skills/develop/",
Expand Down
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
An opinionated multi-step development workflow for Claude Code — a small "council" of LLMs (Claude as orchestrator + Gemini + OpenCode/Kimi + OpenCode/DeepSeek) plans, reviews, and ships your changes together.

```
prep → (research) → plan → (plan-review) → develop → deploy
prep → (research) → (brainstorm) → plan → (plan-review) → develop → deploy
```

Atomic commits. TDD-first. `.planning/<date>-<task>/` as the working memory. Multi-LLM review (Gemini, OpenCode/Kimi, OpenCode/DeepSeek) at plan time and review time.
Expand All @@ -14,6 +14,7 @@ Atomic commits. TDD-first. `.planning/<date>-<task>/` as the working memory. Mul
|---|---|
| `flow:prep` | Create worktree, branch, `.planning/<date>-<task>/` folder, size estimate |
| `flow:research` | Optional pre-plan investigation, writes `research.md` |
| `flow:brainstorm` | Optional multi-LLM option-generation, writes `brainstorm.md`; standalone or sub-phase of `flow:research`/`flow:plan` |
| `flow:plan` | One-pager `plan.md` + GWT `tasks.md` |
| `flow:plan-review` | Multi-LLM critique of the plan, Korean summary, version bump on changes |
| `flow:develop` | TDD cycle per `tasks.md` checkbox, atomic conventional commits |
Expand Down
8 changes: 5 additions & 3 deletions references/directory-structure.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,10 @@ All flow skills read and write to a single per-task directory. Predictable paths
├── plan.v1.md # previous plan version, kept only if plan-review supersedes
├── tasks.md # GWT checkbox list — single source of truth for progress
├── research.md # optional, written by `flow:research`
├── brainstorm.md # optional, multi-LLM brainstorming synthesis (size L always,
│ # size M when cross-module / security-sensitive / public-surface)
├── brainstorms/ # raw per-model brainstorming outputs, written by `flow:plan`
├── brainstorm.md # optional, multi-LLM brainstorming synthesis, written by
│ # `flow:brainstorm` (direct invocation or sub-phase of
│ # `flow:research` / `flow:plan`)
├── brainstorms/ # raw per-model brainstorming outputs, written by `flow:brainstorm`
│ ├── architecture-gemini.md
│ ├── risk-kimi.md
│ └── security-deepseek.md # size L only by default
Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[MINOR] 트리 코멘트 # size L only by default가 brainstorm skill의 실제 트리거와 불일치

security-deepseek.md 옆 코멘트는 size L 전용으로 표기. 그런데 skills/brainstorm/SKILL.md:38-39와 plan의 트리거 매트릭스는 "size L, or size M with security-sensitive surface"로 명시. M+security-sensitive 케이스가 누락됨.

수정 방향: # size L, or M with security-sensitive surface로 갱신.

— signed: opencode-go/deepseek-v4-pro

Expand All @@ -32,6 +33,7 @@ All flow skills read and write to a single per-task directory. Predictable paths
- **Date prefix**: `yyyy-mm-dd` reflecting when prep ran. Local timezone is fine.
- **Task name**: kebab-case, derived from the task goal. Match the branch's name-portion (e.g. branch `feature/add-google-login` → task name `add-google-login`).
- **Standalone PR review variant**: when `flow:code-review` runs on a PR that was not created through this workflow (no matching task directory), it creates `<repo-root>/.planning/<yyyy-mm-dd>-pr<N>-review/code-reviews/` instead. Same internal layout (reviewer files + `code-summary.md`); the directory name encodes the PR number rather than a kebab task name. No `meta.md`, `plan.md`, or `tasks.md` is required in this variant.
- **Standalone brainstorm variant**: when `flow:brainstorm` is invoked directly (no `flow:prep` ran) on an inline task brief, it creates `<repo-root>/.planning/<yyyy-mm-dd>-brainstorm-<slug>/` instead. `<slug>` is a kebab-cased 4–6 word condensation of the brief (collisions get `-2`, `-3`). Same internal layout for `brainstorm.md` + `brainstorms/`; a minimal `meta.md` is generated from the inline brief.
- **Versioning**: `plan-review` only renames the old plan to `plan.v1.md` when it makes substantive changes. If it just confirms the plan, no version bump.

## Frontmatter
Expand Down
4 changes: 2 additions & 2 deletions references/frontmatter.md
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ external_llm_outputs: # only when used_external_llm is true
- ./code-reviews/research-gemini.md
```

### `brainstorm` (multi-LLM brainstorming synthesis, authored by `flow:plan`)
### `brainstorm` (multi-LLM brainstorming synthesis, authored by `flow:brainstorm` — invoked directly or as a sub-phase from `flow:research` / `flow:plan`)

```yaml
contributors: # models whose raw output is folded in
Expand All @@ -114,7 +114,7 @@ contributors: # models whose raw output is folded in
missing_contributors: [] # models that failed (mirrors plan-summary pattern)
```

### `brainstorm-contribution` (per-model raw output under `brainstorms/`)
### `brainstorm-contribution` (per-model raw output under `brainstorms/`, authored by `flow:brainstorm`)

```yaml
contributor: gemini-3.1-pro # CLI-facing model id
Expand Down
272 changes: 272 additions & 0 deletions skills/brainstorm/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,272 @@
---
name: brainstorm
description: Run a multi-LLM brainstorming round and synthesize a single `brainstorm.md` (plus per-model raw outputs under `brainstorms/`) surfacing architecture options, hidden risks, and security/correctness angles for an upcoming change. Use this whenever the user wants to weigh "options", "alternatives", "다각도로 보자", a "second opinion before planning", or whenever a non-trivial change benefits from diverse perspectives BEFORE the planner commits to a shape. Invoked directly by the user (`/flow:brainstorm`), or as an optional sub-phase from `flow:research` / `flow:plan`. Runs without any prior `.planning/` directory — accepts an inline task brief when needed.
Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[MINOR] Frontmatter description이 너무 넓어 over-fire 위험

"whenever a non-trivial change benefits from diverse perspectives BEFORE the planner commits to a shape" 문구는 Claude Code 자동 invoke 휴리스틱에서 size-M 작업 다수에 매칭될 수 있음. 본 skill의 "plain M은 default-no" 의도(:18)와 충돌.

수정 방향: 명시적 트리거에 가까운 표현으로 좁힘 — "explicitly asks for options/alternatives/다각도/second opinion, or a cross-module / security-sensitive / public-surface change" 정도.

— signed: gemini-3.1-pro-preview

---

# flow:brainstorm — Multi-LLM option-generation

Brainstorm is **option-generation, not decision-making**. The point is to surface
architecture shapes, risks, and security angles BEFORE the planner commits — not
to second-guess a plan after it lands (that's `flow:plan-review`). The output is
`brainstorm.md`, a single synthesized file the planner consults while drafting
`plan.md`. Raw per-model outputs live under `brainstorms/` for audit; the planner
should never read them directly.

## When to run

This skill is callable in three contexts; the triggers differ.

### As a sub-phase of `flow:plan` (most common)

- **Size L** — always run.
- **Size M** — run when any of:
- The change touches **multiple modules** (cross-module impact flagged in
`meta.md` or surfaced from `research.md`).
- **Security-sensitive surface**: auth, payments, PII, cryptography, file
uploads, anything user-controlled landing in a privileged context.
- **Public surface area** (a new external API endpoint, a published SDK, a
webhook contract).
- The user explicitly asks for "options" / "alternatives" / "다각도로 보자"
before planning.
- **Size S** — skip. One perspective is fine for an atomic edit.

If unsure for an M task, ask the user one short question. Default-no for plain M,
default-yes for L.

### As a sub-phase of `flow:research`

Research suggests brainstorming when its *Candidate approaches* list has 3+
viable shapes with comparable risk, or when the user explicitly asks for
option-generation. Research itself does not auto-dispatch; the suggestion lands
in `research.md` and the user (or `flow:orchestrate`) decides.

### Standalone (`/flow:brainstorm`, no prior pipeline)

The user wants to weigh options on a sketch without committing to a plan yet. No
`.planning/` dir exists. The skill accepts a one-paragraph **inline task brief**
from the user, creates an ad-hoc working directory (see *Input precedence*
below), and runs the same dispatch + synthesis flow.

## Input precedence

Resolved at the start of every invocation, in this order:

1. **`research.md` + `meta.md` exist** in the current
`.planning/<date>-<task>/`. Richest context — read both, dispatch
contributors with both paths.
2. **Only `meta.md` exists.** Same as today's plan-internal flow — dispatch
contributors with `meta.md` only.
3. **Neither exists** (standalone invocation, no `.planning/` dir at all).
Prompt the user inline:
- "I don't see a `.planning/` task directory. Give me a one-paragraph task
brief — what change are you weighing options on?"
- Derive a **slug** from the brief: first 4–6 content words, kebab-cased,
stopwords (`a`, `the`, `for`, `to`, `with`, `and`, `or`) stripped, ASCII
only. Example brief: "Should we move auth tokens out of localStorage into
httpOnly cookies?" → `auth-tokens-localstorage-cookies`.
Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[NIT] Slug 도출 예시가 명시된 stopword 리스트와 일치하지 않음

규칙은 stopwords로 a, the, for, to, with, and, or만 나열. 예시 brief "Should we move auth tokens out of localStorage into httpOnly cookies?"auth-tokens-localstorage-cookies 결과는 out, of, into, httpOnly를 떨궜는데 이 중 stopword 리스트에 있는 건 하나도 없음.

수정 방향: (a) stopword 리스트에 흔한 전치사(of, out, into, on, in) 추가, 또는 (b) 예시를 규칙대로 동작했을 때의 결과로 교체. 둘 중 어느 쪽이든 사용자가 일관된 slug를 만들 수 있게 해야 함.

— signed: opencode-go/kimi-k2.6

- Create
`<repo-root>/.planning/<yyyy-mm-dd>-brainstorm-<slug>/` (today's date,
local timezone). If the directory already exists for the same date+slug,
append `-2`, `-3` until unique. This mirrors the existing
Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[MAJOR] Slug 충돌 시 -2, -3 무조건 append → idempotency 체크가 영원히 작동 안 함

standalone 모드에서 동일 brief를 같은 날 재실행하면, <slug> 디렉토리가 이미 있을 때 무조건 <slug>-2 같은 새 디렉토리를 만들고 $TASK_DIR을 그쪽으로 잡음. 직후의 Idempotency precondition 체크(:81-89)는 비어 있는 새 디렉토리에서 brainstorm.md를 찾지 못해 결국 항상 새로 dispatch — 사용자에게 keep/regenerate/abort를 물어볼 기회 없이 매번 중복 실행되고 audit trail이 분산됨.

수정 방향:

- 기존 `<repo-root>/.planning/<yyyy-mm-dd>-brainstorm-<slug>/`가 있으면 그것을 `$TASK_DIR`로 채택 (idempotency 체크가 이어서 처리). `-2`, `-3` 접미는 사용자가 동일 slug의 별도 세션을 명시적으로 원할 때만.

— signed: gemini-3.1-pro-preview

`.planning/<yyyy-mm-dd>-pr<N>-review/` ad-hoc variant
(`../../references/directory-structure.md#naming-rules`).
- Write a minimal `meta.md` to that directory with `type: meta`,
`size: M` (default — bump to L if the brief clearly warrants), and the
brief copied verbatim under `goal:`. This becomes the input contributors
read.

`$TASK_DIR` below refers to whichever directory was resolved.

## Idempotency precondition

Before dispatching anything, check whether the brainstorm has already run:

```bash
BRAINSTORM="$TASK_DIR/brainstorm.md"
if [[ -f "$BRAINSTORM" ]] && grep -q '^status: active' "$BRAINSTORM"; then
echo "brainstorm.md already exists (status: active)"
fi
```

If it does, **do not silently re-dispatch.** Ask the user: (a) keep the
existing synthesis and exit, (b) regenerate (the existing `brainstorm.md` and
`brainstorms/` files are moved to `brainstorm.v<N>.md` / `brainstorms.v<N>/`,
Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[MINOR] brainstorm.v<N>.md 버전 컨벤션에 대응되는 frontmatter type이 없음

idempotency 섹션은 regenerate 시 기존 brainstorm.mdbrainstorm.v<N>.md로 리네임하라고 안내(plan.v.md 미러). 그런데 references/frontmatter.md에는 plan-version, tasks-version 타입은 있지만 brainstorm-version이 없음. 버전된 brainstorm 파일이 만들어지면 type: 필드의 canonical 값이 없는 상태.

발생 빈도는 낮지만 명시적 갭. 수정 방향: (a) frontmatter.md 타입 표에 brainstorm-version 추가, 또는 (b) 버전 안내를 type: brainstorm + status: superseded + superseded_by로 바꿈.

— signed: opencode-go/deepseek-v4-pro

mirroring the `plan.v<N>.md` versioning convention), or (c) abort. The most
common path after an interrupted session is (a) — re-running the brainstorm
doubles cost and clobbers the audit trail.

## Provider roles

Two providers minimum (the `../../references/multi-llm.md` ≥2 quorum); three
when size is L or the user requested a security lens. Each model gets a
**focused lens** so outputs are differentiated, not duplicated.

- **`gemini-3.1-pro` — Architecture & alternatives.** Surface 2–3 distinct
Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[MAJOR] Provider role과 synthesis frontmatter가 references/models.md에 없는 모델 ID를 씀

이 줄의 provider role 라벨은 gemini-3.1-pro, 같은 파일 :210 synthesis frontmatter의 contributors:gemini-3.1-pro. 그러나 references/models.md:10gemini-3.1-pro-preview만 등록하고, 실제 dispatch 스니펫 :144--model gemini-3.1-pro-preview. 같은 파일 안에서 라벨/실행 ID가 어긋남 → "Model IDs come from references/models.md"라는 본인 명시(:114-115)와 모순. plan/SKILL.md에서 옮겨온 기존 문제지만, standalone skill로 분리된 지금이 정리 적기.

수정 방향: provider role과 frontmatter 예시 모두 gemini-3.1-pro-preview로 통일하거나, references/models.mdgemini-3.1-pro를 alias로 명시. 후자는 추가 작업이 필요하므로 전자 권장.

— signed: gpt-5.5, opencode-go/kimi-k2.6, opencode-go/deepseek-v4-pro

architectural shapes for the change. Name load-bearing tradeoffs (cost /
blast radius / reversibility). Bring ecosystem analogues.
- **`opencode-go/kimi-k2.6` — Risk & failure modes.** Enumerate what could go
wrong: race conditions, partial states, rollback paths, observability gaps,
regressions in adjacent modules. Be concrete.
- **`opencode-go/deepseek-v4-pro` — Security & correctness** *(size L, or M
with security-sensitive surface)*. Threat-model the change: auth/authz,
injection, data exposure, dependency surface, secrets handling.

Model IDs come from `../../references/models.md` — if they move, edit there,
not here.

## How to dispatch

Follow the full dispatch + verification + quorum pattern in
`../../references/multi-llm.md`. Key points specific to brainstorming:

- **File-write contract.** Each contributor uses its native Write tool to
write its output to a specific absolute path. The orchestrator captures
stdout to a **runlog** file (diagnostic only — not the review). See
`../../references/multi-llm.md` "Dispatch contract."
- **Sentinel.** Every contributor file must end with
`<!-- council-flow:review-complete -->`. Absent sentinel = treat as failed
even if file size looks reasonable.
- **Heartbeat.** Run `watch_review` (defined in `../../references/multi-llm.md`)
in parallel with each dispatch so progress is visible at 1-minute
resolution. A dispatch without a heartbeat is indistinguishable from a hung
one for 10+ minutes.

```bash
mkdir -p "$TASK_DIR/brainstorms"

REVIEW_ARCH="$TASK_DIR/brainstorms/architecture-gemini.md"
RUNLOG_ARCH="$TASK_DIR/brainstorms/_runlog-architecture-gemini.txt"

# Build the read-list for the contributor prompt. research.md is optional.
READ_LIST="$TASK_DIR/meta.md"
Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[MINOR] READ_LIST가 상대 경로 그대로 contributor에게 전달됨

원본 plan/SKILL.md의 dispatch prompt는 <abs>/meta.md, <abs>/research.md라는 placeholder로 "절대 경로를 쓰라"는 신호를 명시했음. 새 코드는 $TASK_DIR/meta.md를 그대로 넘기는데, pipeline 케이스에서 $TASK_DIR.planning/<date>-<task>/ 같은 상대 경로 → contributor CLI가 다른 CWD에서 호출되는 환경에서 silent fail.

현재는 gemini --yolo가 orchestrator의 CWD를 그대로 상속해 작동하지만, future contributor가 다른 CWD를 가지면 깨짐. 수정 방향: input precedence 해석기에서 $TASK_DIRrealpath로 절대화하거나, prompt 안에서 명시적으로 절대 경로화 단계 추가.

— signed: opencode-go/deepseek-v4-pro

[[ -f "$TASK_DIR/research.md" ]] && READ_LIST="$READ_LIST and $TASK_DIR/research.md"

( timeout 600 gemini --model gemini-3.1-pro-preview --yolo --skip-trust \
--prompt "$(cat <<PROMPT
You are a non-interactive reviewer. Use Read and Write tools. Do not ask questions.

TASK:
1. Read the task brief at: $READ_LIST
2. Write your brainstorm using the Write tool to: $REVIEW_ARCH
3. The LAST LINE of the file MUST be exactly:
<!-- council-flow:review-complete -->
4. Print only: "wrote architecture-gemini.md"

Your lens: ARCHITECTURE & ALTERNATIVES.
- Propose 2–3 distinct architectural shapes for this change.
- For each: the shape in 2 sentences, and load-bearing tradeoffs (cost / blast radius / reversibility).
- Name relevant ecosystem analogues.
- Surface non-obvious design constraints the planner should know.

Output format inside the file (Markdown, no preamble):
## Option A — <name>
- Shape: ...
- Tradeoffs: ...
## Option B — <name>
...
## Constraints surfaced
- ...
PROMPT
)" > "$RUNLOG_ARCH" 2> "$RUNLOG_ARCH.stderr"; \
echo $? > "$RUNLOG_ARCH.exit" ) || true &

# Run watch_review (from multi-llm.md) in parallel so progress is visible at 1-min resolution.
Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[MINOR] watch_review 호출이 exit sidecar를 빠뜨려 위치 인자가 어긋남

dispatch 래퍼는 $RUNLOG_ARCH.exit를 정확히 작성하지만(:171), watcher는 watch_review "$REVIEW_ARCH" 25 &로 호출됨. references/multi-llm.md:170, 228의 시그니처는 watch_review <review-file> [<exit-file>] [<max-checks>] — 즉 두 번째 위치 인자가 exit-file. 현재 호출은 25가 exit-file 인자로 해석되어 max_checks 기본값 25가 그대로 쓰이고, CLI가 일찍 죽었을 때 즉시 종료하지 못함.

수정 방향: watch_review "$REVIEW_ARCH" "$RUNLOG_ARCH.exit" 25 &

— signed: gpt-5.5

watch_review "$REVIEW_ARCH" 25 &

# Same wrapping for risk lens (kimi) — file-write to brainstorms/risk-kimi.md
# Same wrapping for security lens (deepseek) — size L or security-sensitive only

wait
```

Apply the full post-call verification (exit code, non-empty, **sentinel
present**, **structural content present**, no failure signature) and quorum
policy from `../../references/multi-llm.md`. If only one contributor
succeeds, stop and ask the user (re-auth, swap, or proceed labeled
"single-perspective").

## Synthesis — `brainstorm.md`

Read each raw output **once**, extract load-bearing ideas, and write a single
English `brainstorm.md` at `$TASK_DIR/brainstorm.md`. This is what the planner
(or the user, in standalone mode) consults next.

```markdown
---
title: "Brainstorm — <task name>"
type: brainstorm
task: <kebab task name>
task_date: <YYYY-MM-DD>
created: <today>
last_updated: <today>
status: active
size: <M|L>
parent: ./meta.md
related:
- ./research.md (if exists)
- ./brainstorms/architecture-gemini.md
- ./brainstorms/risk-kimi.md
contributors:
- gemini-3.1-pro
- opencode-go/kimi-k2.6
missing_contributors: []
---

# Brainstorm — <task>

## Architecture options
- 2–3 shapes the planner should weigh. One-line tradeoff each.

## Risks worth designing against
- Concrete failure modes raised by the brainstorm. Short and actionable.

## Security / correctness angles
- Threat-model bullets that should shape the plan or land as explicit non-goals.
(Omit this section entirely when no security lens was run.)

## Convergence
- Where models agreed. These are usually safe assumptions for the plan.

## Divergence (most valuable section)
- Where models disagreed. Each entry: which model said what, and the planner's
current lean — or "open question — needs user" when unresolved.

## Open questions for the user
- Anything the brainstorm could not resolve. Surface these before drafting the plan.
```

## What NOT to do

- **Don't run brainstorming for size S.** It's noise.
- **Don't paste raw model output into the conversation.** Files only — that's
the whole point of `../../references/multi-llm.md`.
- **Don't let the brainstorm become the plan.** The planner still drafts
`plan.md`. Brainstorm is option-generation; plan is decision. In standalone
mode, `brainstorm.md` is the final artifact — but it still presents options,
Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[QUESTION] "brainstorm과 plan-review 동시 실행 금지" 안티패턴이 pre-plan sketch 케이스를 다루지 않음

brainstorm-then-plan-review의 round-trip 케이스는 명확. 그런데 세 번째 시나리오 — 사용자가 sketch 단계에서 standalone brainstorm을 돌리고, 이후 flow:prep + flow:plan + flow:plan-review를 같은 주제로 새로 돌리는 — 가 있음. 이 경우 brainstorm과 plan-review는 서로 다른 artifact(sketch vs drafted plan)에 적용되어 안티패턴이 해당 안 되는데, 본문엔 그 nuance가 없음.

버그는 아니나 reviewer가 헷갈릴 수 있음. "sketch에 대한 brainstorm ≠ drafted plan에 대한 brainstorm; 안티패턴은 후자에만 적용" 정도의 한 줄 추가 검토.

— signed: opencode-go/deepseek-v4-pro

not a chosen direction.
- **Don't run brainstorm *and* `flow:plan-review` on the same plan as a
default.** They serve different stages — brainstorm before drafting,
plan-review after. Doubling up is justified only when plan-review surfaces
re-architecting questions that need fresh brainstorming.
- **Don't auto-dispatch from `flow:research`.** Research *suggests*; the user
or orchestrate decides.

## Handoff

- **Sub-phase mode**: when invoked from `flow:plan` or `flow:research`, return
to the caller after `brainstorm.md` is written. The caller continues from
where it paused (typically: planner reads `brainstorm.md` and drafts
`plan.md`).
- **Standalone mode**: print the path to `brainstorm.md` and a one-line summary
of the divergence section. The user decides whether to next invoke
`flow:prep` + `flow:plan`, iterate on the brief, or stop here.

## Reference

- Multi-LLM dispatch & quorum: `../../references/multi-llm.md`
- Model registry (lenses + IDs): `../../references/models.md`
- Directory layout (including `.planning/<date>-brainstorm-<slug>/` variant):
`../../references/directory-structure.md`
- Frontmatter schema (`brainstorm` + `brainstorm-contribution` types):
`../../references/frontmatter.md`
- Doc style (prefer lists over tables): `../../references/doc-style.md`
Loading