flow-workflows 0.80.0 → 0.82.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/adapters/codex/CORE.md +141 -43
- package/adapters/codex/skills/flow-bug-fix/SKILL.md +8 -2
- package/adapters/codex/skills/flow-bug-investigate/SKILL.md +6 -6
- package/adapters/codex/skills/flow-bug-postmortem/SKILL.md +1 -1
- package/adapters/codex/skills/flow-bug-review/SKILL.md +4 -4
- package/adapters/codex/skills/flow-bug-ship/SKILL.md +15 -2
- package/adapters/codex/skills/flow-bug-start/SKILL.md +9 -0
- package/adapters/codex/skills/flow-bug-validate/SKILL.md +2 -2
- package/adapters/codex/skills/flow-doctor/SKILL.md +11 -6
- package/adapters/codex/skills/flow-feat-build/SKILL.md +12 -6
- package/adapters/codex/skills/flow-feat-design/SKILL.md +7 -4
- package/adapters/codex/skills/flow-feat-review/SKILL.md +18 -16
- package/adapters/codex/skills/flow-feat-ship/SKILL.md +41 -3
- package/adapters/codex/skills/flow-feat-start/SKILL.md +14 -0
- package/adapters/codex/skills/flow-feat-validate/SKILL.md +12 -4
- package/adapters/codex/skills/flow-init/SKILL.md +4 -3
- package/adapters/codex/skills/flow-work-README/SKILL.md +2 -3
- package/adapters/codex/skills/flow-work-query/SKILL.md +1 -1
- package/adapters/codex/skills/flow-work-resume/SKILL.md +7 -2
- package/adapters/gemini/CORE.md +141 -43
- package/adapters/gemini/commands/flow/bug/fix.toml +8 -2
- package/adapters/gemini/commands/flow/bug/investigate.toml +6 -6
- package/adapters/gemini/commands/flow/bug/postmortem.toml +1 -1
- package/adapters/gemini/commands/flow/bug/review.toml +4 -4
- package/adapters/gemini/commands/flow/bug/ship.toml +15 -2
- package/adapters/gemini/commands/flow/bug/start.toml +9 -0
- package/adapters/gemini/commands/flow/bug/validate.toml +2 -2
- package/adapters/gemini/commands/flow/doctor.toml +11 -6
- package/adapters/gemini/commands/flow/feat/build.toml +12 -6
- package/adapters/gemini/commands/flow/feat/design.toml +7 -4
- package/adapters/gemini/commands/flow/feat/review.toml +18 -16
- package/adapters/gemini/commands/flow/feat/ship.toml +41 -3
- package/adapters/gemini/commands/flow/feat/start.toml +14 -0
- package/adapters/gemini/commands/flow/feat/validate.toml +12 -4
- package/adapters/gemini/commands/flow/init.toml +4 -3
- package/adapters/gemini/commands/flow/work/README.toml +2 -3
- package/adapters/gemini/commands/flow/work/query.toml +1 -1
- package/adapters/gemini/commands/flow/work/resume.toml +7 -2
- package/adapters/hermes/CORE.md +141 -43
- package/adapters/hermes/skills/flow-bug-fix/SKILL.md +8 -2
- package/adapters/hermes/skills/flow-bug-investigate/SKILL.md +6 -6
- package/adapters/hermes/skills/flow-bug-postmortem/SKILL.md +1 -1
- package/adapters/hermes/skills/flow-bug-review/SKILL.md +4 -4
- package/adapters/hermes/skills/flow-bug-ship/SKILL.md +15 -2
- package/adapters/hermes/skills/flow-bug-start/SKILL.md +9 -0
- package/adapters/hermes/skills/flow-bug-validate/SKILL.md +2 -2
- package/adapters/hermes/skills/flow-doctor/SKILL.md +11 -6
- package/adapters/hermes/skills/flow-feat-build/SKILL.md +12 -6
- package/adapters/hermes/skills/flow-feat-design/SKILL.md +7 -4
- package/adapters/hermes/skills/flow-feat-review/SKILL.md +18 -16
- package/adapters/hermes/skills/flow-feat-ship/SKILL.md +41 -3
- package/adapters/hermes/skills/flow-feat-start/SKILL.md +14 -0
- package/adapters/hermes/skills/flow-feat-validate/SKILL.md +12 -4
- package/adapters/hermes/skills/flow-init/SKILL.md +4 -3
- package/adapters/hermes/skills/flow-work-README/SKILL.md +2 -3
- package/adapters/hermes/skills/flow-work-query/SKILL.md +1 -1
- package/adapters/hermes/skills/flow-work-resume/SKILL.md +7 -2
- package/adapters/opencode/CORE.md +141 -43
- package/adapters/opencode/commands/flow-bug-fix.md +8 -2
- package/adapters/opencode/commands/flow-bug-investigate.md +6 -6
- package/adapters/opencode/commands/flow-bug-postmortem.md +1 -1
- package/adapters/opencode/commands/flow-bug-review.md +4 -4
- package/adapters/opencode/commands/flow-bug-ship.md +15 -2
- package/adapters/opencode/commands/flow-bug-start.md +9 -0
- package/adapters/opencode/commands/flow-bug-validate.md +2 -2
- package/adapters/opencode/commands/flow-doctor.md +11 -6
- package/adapters/opencode/commands/flow-feat-build.md +12 -6
- package/adapters/opencode/commands/flow-feat-design.md +7 -4
- package/adapters/opencode/commands/flow-feat-review.md +18 -16
- package/adapters/opencode/commands/flow-feat-ship.md +41 -3
- package/adapters/opencode/commands/flow-feat-start.md +14 -0
- package/adapters/opencode/commands/flow-feat-validate.md +12 -4
- package/adapters/opencode/commands/flow-init.md +4 -3
- package/adapters/opencode/commands/flow-work-README.md +2 -3
- package/adapters/opencode/commands/flow-work-query.md +1 -1
- package/adapters/opencode/commands/flow-work-resume.md +7 -2
- package/package.json +1 -1
- package/plugins/flow/.claude-plugin/plugin.json +1 -1
- package/plugins/flow/CHANGELOG.md +39 -0
- package/plugins/flow/examples/FLOW.template.md +12 -3
package/adapters/hermes/CORE.md
CHANGED
|
@@ -17,7 +17,7 @@ Every `/flow-*` command assumes these rules. They are stated once, here, so a co
|
|
|
17
17
|
carries what is specific to its phase. Read this once per session; a command that says "load
|
|
18
18
|
`flow-core`" means this file.
|
|
19
19
|
|
|
20
|
-
**This file belongs to flow `0.
|
|
20
|
+
**This file belongs to flow `0.82.0`.** Compare it once, at the start of the session, against
|
|
21
21
|
`version` in `~/.claude/flow/.claude-plugin/plugin.json`. The two differing means the session
|
|
22
22
|
is running a **mixture** — the commands from one copy of the plugin, these shared rules from another
|
|
23
23
|
— which is exactly what happens when a branch or a release candidate is loaded over an installed
|
|
@@ -30,12 +30,9 @@ a command relies on is simply absent in that session, and nothing else will repo
|
|
|
30
30
|
- **Look before you read.** The first thing a phase does about configuration is list what is there:
|
|
31
31
|
`ls <root>/FLOW*.md` (the root being the one the next bullet resolves). One call, and it is not
|
|
32
32
|
optional — **an overlay you did not list is an overlay you did not read**, and nothing downstream
|
|
33
|
-
will notice.
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
looking for the overlay sitting beside it — the models it set were silently the defaults, and
|
|
37
|
-
both runs reported the keys as unset with no way to tell that apart from a repo that never set
|
|
38
|
-
them. **Name the files this listing found the first time a phase reports any configured value**,
|
|
33
|
+
will notice. Every command and artifact calls the effective configuration "`FLOW.md`", a file that
|
|
34
|
+
exists, so reading it and stopping feels finished — and a missed overlay reports its keys as unset,
|
|
35
|
+
indistinguishable from a repo that never set them. **Name the files this listing found the first time a phase reports any configured value**,
|
|
39
36
|
so a missed overlay is visible in the artifact rather than invisible everywhere.
|
|
40
37
|
- Read `FLOW.md` at the repo root as the base, then the optional overlay for the harness running
|
|
41
38
|
this command: `FLOW.claude.md`, `FLOW.codex.md`, `FLOW.opencode.md`, `FLOW.gemini.md`,
|
|
@@ -68,11 +65,8 @@ a command relies on is simply absent in that session, and nothing else will repo
|
|
|
68
65
|
- **A fenced block in a FLOW file is an example, and an example is not configuration.** These
|
|
69
66
|
files are prose with keys in them, and the rule that decides what a key *is* — a `- key:` line
|
|
70
67
|
under a `## section` — knows nothing about triple backticks. So a block written to be pasted
|
|
71
|
-
("add this to try it once")
|
|
72
|
-
|
|
73
|
-
prose argued at length that it was deliberately unset, and every review round took the one-shot
|
|
74
|
-
path that prose warned against — with nothing anywhere to say so, because the file and the
|
|
75
|
-
configuration disagreed while both looked right. **Skip fenced regions when you read a FLOW
|
|
68
|
+
("add this to try it once") would be read as the configuration it illustrates, while the prose
|
|
69
|
+
around it says otherwise and nothing reports the disagreement. **Skip fenced regions when you read a FLOW
|
|
76
70
|
file**; `flow-workflows` does the same, so the two of you resolve the same config.
|
|
77
71
|
- Merge by section and key. A key present in the active overlay replaces the base value; a key
|
|
78
72
|
absent there inherits the base. **A present-but-empty overlay key masks the base** and resolves
|
|
@@ -93,7 +87,7 @@ a command relies on is simply absent in that session, and nothing else will repo
|
|
|
93
87
|
alongside whatever it was already asking. Resolve the destination by the ownership rule below.
|
|
94
88
|
Never a question of its own, never a key off the list, and at most **one key per work** — the
|
|
95
89
|
second one waits for the next work or for `/flow-init`.
|
|
96
|
-
3. `guided`/`auto` → take the default and **record** it: one line in the phase artifact
|
|
90
|
+
3. `guided`/`auto` → take the default and **record** it: one line in the phase artifact,
|
|
97
91
|
plus an entry in `meta.json.defaults_used[]` — `{ "key": "agents.security", "default":
|
|
98
92
|
"general-purpose", "phase": "review" }`. Asking here would break the never-a-question contract
|
|
99
93
|
(§2); recording keeps the decision readable afterwards, and `/flow-doctor` aggregates it.
|
|
@@ -120,8 +114,7 @@ a command relies on is simply absent in that session, and nothing else will repo
|
|
|
120
114
|
the consolidation appends to `KNOWLEDGE.md` at the repo root. Per-call timeout
|
|
121
115
|
`knowledge.timeout_s` (empty = 2 s); a failure or timeout → continue without it, silently.
|
|
122
116
|
**How a consolidation runs** (`ship`, `postmortem`, `abandon`, and the offer in `/flow-work-status`
|
|
123
|
-
when `read_staging` has entries). No role set at all → say so in one line and stop
|
|
124
|
-
worth a command of its own, which is why there is no longer one:
|
|
117
|
+
when `read_staging` has entries). No role set at all → say so in one line and stop:
|
|
125
118
|
|
|
126
119
|
1. **Read the staging** for this branch with `knowledge.read_staging`; the role empty → the "why"
|
|
127
120
|
findings already written in this work's artifacts (`03-design.md` ADR-light and challenges,
|
|
@@ -185,15 +178,20 @@ line: the wait inherits this thread's model because no key is set. Name the key,
|
|
|
185
178
|
|
|
186
179
|
## 2. Autonomy — `autonomy.mode`
|
|
187
180
|
|
|
188
|
-
`manual` (default) · `guided` · `auto`. Read it once and apply it throughout the command.
|
|
181
|
+
`manual` (default) · `guided` · `auto` · `unattended`. Read it once and apply it throughout the command.
|
|
189
182
|
|
|
190
183
|
| Mode | Decisions | End of the command |
|
|
191
184
|
|---|---|---|
|
|
192
185
|
| `manual` | Stop at every decision point | Propose the next command with one `AskUserQuestion` (recommended step as default). Invoke it only on confirmation. Never make the user type it. |
|
|
193
186
|
| `guided` | Resolve low-risk, unambiguous ones with the recommended default and **record** the choice in the phase artifact. Ask at genuine decision points. | Chain into the recommended next command automatically — the call that starts it first, no closing report before it (§3). |
|
|
194
187
|
| `auto` | As `guided`, plus resolve the remaining decision points with sensible, recorded defaults. | Chain without pausing, same rule. |
|
|
188
|
+
| `unattended` | As `auto`, for a run **nobody is watching** (a script, a container, a headless CLI). Every place `auto` would still stop for a person resolves by §2.1 instead. | Chain as `auto`; the run ends at a **stop file** (§2.1), never at a question. |
|
|
195
189
|
|
|
196
|
-
|
|
190
|
+
`unattended` is never inferred — not from a headless harness, not from a missing terminal. It is
|
|
191
|
+
the value someone wrote in the FLOW config, or it is not in effect.
|
|
192
|
+
|
|
193
|
+
**Hard gates — in `manual`, `guided` and `auto`, stop and ask, no exceptions** (in `unattended`
|
|
194
|
+
each one resolves as §2.1's table says — never approved in silence):
|
|
197
195
|
1. Any push or MR/PR creation (all of `ship`).
|
|
198
196
|
2. Creating or switching a branch when the base is ambiguous (not on a clean main, or a possible train/stacked branch).
|
|
199
197
|
3. DB schema changes or migrations.
|
|
@@ -218,7 +216,112 @@ sensible default and record it.
|
|
|
218
216
|
delegation removes. Take it, record it. What is still asked in `manual` is whatever the evidence
|
|
219
217
|
turns out to call for, once it is back.
|
|
220
218
|
|
|
221
|
-
Asking these anyway is how
|
|
219
|
+
Asking these anyway is how a run in `guided`/`auto` degrades into a manual one.
|
|
220
|
+
|
|
221
|
+
### 2.1 `unattended` — where a person would have been asked
|
|
222
|
+
|
|
223
|
+
Nobody answers a question in this mode. A question tool — `AskUserQuestion`, OpenCode's `question`,
|
|
224
|
+
whatever the harness calls it — either blocks a run that has no one to unblock it or, in print mode,
|
|
225
|
+
ends it with a question nobody reads. So **no question tool is ever called in `unattended`**, and a
|
|
226
|
+
question in prose is not a substitute. The run goes as far as it can without a person, and where it
|
|
227
|
+
needs one it **stops and says exactly what for**. It never answers for them. Each place a command
|
|
228
|
+
would have asked resolves one of three ways:
|
|
229
|
+
|
|
230
|
+
- **record** — take the resolution the table names, write it where the phase keeps its decisions,
|
|
231
|
+
add `{ "key": "unattended:<site>", "default": "<resolution>", "phase": "<phase>" }` to
|
|
232
|
+
`meta.json.defaults_used[]` (the prefix says it is not a FLOW key), and continue.
|
|
233
|
+
- **question** — a decision only a person can take. Write the stop file with `reason: "question"`,
|
|
234
|
+
the question and its options as `AskUserQuestion` would have carried them, set the panel's
|
|
235
|
+
`attention` to `wait`, and **end the run**: no further phase starts. A person picks the work up
|
|
236
|
+
in a session of their own, in any other mode, and the next phase asks them (below).
|
|
237
|
+
- **blocked** — something the run cannot get past (the environment, a tool, a check that keeps
|
|
238
|
+
failing). The stop file with `reason: "blocked"` and a one-line `detail`, `attention: block`, end
|
|
239
|
+
the run.
|
|
240
|
+
|
|
241
|
+
The §3 stop header is still printed at every stop — a log is the only screen that run has.
|
|
242
|
+
|
|
243
|
+
| Where | In `unattended` |
|
|
244
|
+
|---|---|
|
|
245
|
+
| Business brief before code (`build`, `fix`) | record — the brief is written to the phase artifact, marked `recorded (unattended)`, and travels in the MR/PR body |
|
|
246
|
+
| Push and MR/PR creation (`ship`) | `autonomy.unattended_ship: draft` → push the work branch and create the MR/PR **as draft**; never merge, never mark it ready; the forge refusing a draft → blocked, never retried as a normal one. Empty or `stop` → question `ship` |
|
|
247
|
+
| Writing a DB schema change, index or migration — in any phase, a review's own fixes included — or applying one (`validate`) | question `migration`, before the first line of it is written or run |
|
|
248
|
+
| `review` with blockers or high-severity findings | question `high_findings` |
|
|
249
|
+
| `validate` with a red suite or a criterion `unproven` | blocked — the phase does not advance and does not chain |
|
|
250
|
+
| A product decision (§7 `decision`) | question `decision` |
|
|
251
|
+
| Clarifying questions on the ticket (`start`) | question `clarify` — after the branch and the work folder exist, with the questions also written to `01-context.md` |
|
|
252
|
+
| An unanswered high-severity challenge (`design`, `investigate`) | question `design_challenge` / `investigation_challenge` |
|
|
253
|
+
| No ticket, a tracker read that fails, a checkout that is not a clean default base (`start`) | blocked — the runner owns the checkout and the ticket |
|
|
254
|
+
| Below-XS check (`start`) | record — open the work |
|
|
255
|
+
| "Create the branch?" (`start`), the 2–3 line note an XS `build`/`fix` asks for, a contract the design left in prose (`build`) | record — create it · write the note from the ticket · convert it to literal and say so in the artifact |
|
|
256
|
+
| `git.worktree: ask` | record — in place |
|
|
257
|
+
| Cross-repo scope (`start`) | record — only the repos the ticket names |
|
|
258
|
+
| Criteria that need a person to verify (`validate`) | record — `not-verified-unattended`; every later `ship`, in any mode, lists them in the body under "Not verified — needs a human" |
|
|
259
|
+
| The query duel needs a database (`review`, `query`) | record — schema-only verdict; never create or seed a database |
|
|
260
|
+
| "Was it merged?" (`ship` close) | record — not merged |
|
|
261
|
+
| The next MR/PR of a train (`ship` close) | record — not started: one MR/PR per unattended run |
|
|
262
|
+
| `build` with no startable MR/PR (its `depends_on` not `merged` in `meta.json`) | blocked — the detail names what must merge; an unattended `build` never stacks a branch on another, and never creates a remote branch |
|
|
263
|
+
| The parent of a stacked MR/PR merged — rebase and force-push | blocked — never force-push unattended |
|
|
264
|
+
| Any offer about the work's own bookkeeping — a tracker issue, the first `KNOWLEDGE.md` or a knowledge save, a FLOW convention, an agent lesson or a saved specialist, the follow-up survey, carrying files over from the main checkout, a contract handoff, archiving the work | record — `Later`; nothing written outside the work folder |
|
|
265
|
+
| A step the command cannot complete (a red suite it cannot fix, a tool missing, auth failing, the same check failing a second time) | blocked |
|
|
266
|
+
| Anything `auto` already decides on its own (size, flow mechanics, WIP commits, the next command) | as `auto` |
|
|
267
|
+
|
|
268
|
+
A place where `auto` would still ask and this table does not name is a **question** — the
|
|
269
|
+
conservative reading, never a guess dressed as a default.
|
|
270
|
+
|
|
271
|
+
**The stop file** — `.claude/work/stop.json`, at the root of the main checkout (§0: the repo root is
|
|
272
|
+
the main checkout's, whichever worktree the phase runs in). One fixed path, so a runner finds it
|
|
273
|
+
without knowing the work's folder, and `start` can write it before that folder exists. Written
|
|
274
|
+
whole, every time, with every field — by unattended runs, and outside that mode only to mark it
|
|
275
|
+
`picked_up` (below). **One unattended run per repository**: its
|
|
276
|
+
worktrees all share this file. A clean-tree check never counts `.claude/work/` — the flow's own
|
|
277
|
+
folder.
|
|
278
|
+
|
|
279
|
+
```json
|
|
280
|
+
{"reason": "question",
|
|
281
|
+
"phase": "build",
|
|
282
|
+
"gate": "migration",
|
|
283
|
+
"ticket": "168",
|
|
284
|
+
"work": "168-unattended-autonomy-mode",
|
|
285
|
+
"branch": "168-unattended-autonomy-mode",
|
|
286
|
+
"worktree": null,
|
|
287
|
+
"question": "The design adds a nullable column `mails.opened_at` and its migration. Write and apply it?",
|
|
288
|
+
"options": [{"label": "Write and apply it", "recommended": true}, {"label": "Change the design first"}],
|
|
289
|
+
"mr_url": null,
|
|
290
|
+
"detail": null,
|
|
291
|
+
"at": "2026-09-29T14:30:00+02:00"}
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
- `reason`: `running` · `question` · `blocked` · `done` · `picked_up`. It mirrors the panel's `attention` (§4.2):
|
|
295
|
+
`question` ↔ `wait`, `blocked` ↔ `block`, `done` ↔ `done`, `running` and `picked_up` ↔ absent.
|
|
296
|
+
Set both in the same step.
|
|
297
|
+
- `work`, `branch`, `worktree`: where the person picks it up — `null` for the ones that do not exist
|
|
298
|
+
yet when `start` stops early.
|
|
299
|
+
- `gate`: the site's id from the table, or `null`. `question` and `options` carry the whole question,
|
|
300
|
+
the recommended option first — whoever reads it has not seen this session.
|
|
301
|
+
- `done` is written when the run's work is over: the MR/PR created (`mr_url` set; with a train,
|
|
302
|
+
`detail` says which MR/PR comes next and what it waits on), or a phase that finds nothing to do
|
|
303
|
+
(every MR/PR merged, a work already shipped) — `detail` says which. **No unattended phase ends
|
|
304
|
+
with `running` in the file**: every ending is one of `question`, `blocked` or `done`.
|
|
305
|
+
- `at` from the real clock (`date -Iseconds`).
|
|
306
|
+
|
|
307
|
+
**Every phase that starts in this mode writes `reason: "running"` first** — the whole file, `work`,
|
|
308
|
+
`branch` and `worktree` included — unless it holds a `question`, for this work or any other: no
|
|
309
|
+
person has answered it yet, and the file is the only record of it, so say so and end the run,
|
|
310
|
+
touching nothing. One question at a time per repository. (A `blocked` is overwritten: running
|
|
311
|
+
again *is* its retry, once the runner has fixed what it named.) A run that dies therefore leaves
|
|
312
|
+
`running` behind. For the runner: `running` at exit is a crash; a `question` older than the run's
|
|
313
|
+
own start is the earlier stop, still waiting, and the run refused to go past it.
|
|
314
|
+
|
|
315
|
+
**A person picks it up in any other mode.** `/flow-work-resume` names the pending stop in its
|
|
316
|
+
recap, and **the next phase that runs on that work** (`stop.json.work` is this one — never another
|
|
317
|
+
work's) **asks it first** — the question, verbatim, with its options — before doing anything else,
|
|
318
|
+
then overwrites the file with `reason: "picked_up"`. The answer decides what happens next, as any
|
|
319
|
+
answer does: *go on* → the phase goes on; *change the design*, *fix them* → the phase does that
|
|
320
|
+
instead (back to `design`, fix and review again). A `ship` question is not replayed: `ship`'s own
|
|
321
|
+
preview asks it, fresh. **The person's session must not itself be `unattended`**: set the mode where
|
|
322
|
+
only the runner reads it — a FLOW file the runner's own environment writes (its container, its CI
|
|
323
|
+
checkout), or the overlay of a harness only the runner uses. `/flow-doctor` says which file the
|
|
324
|
+
mode came from.
|
|
222
325
|
|
|
223
326
|
## 3. Reporting — how every stop reads
|
|
224
327
|
|
|
@@ -241,6 +344,9 @@ terminal by construction, the turn is over before you notice.
|
|
|
241
344
|
the answer arrives, before the work resumes (§4.4e).
|
|
242
345
|
- **Stopping? Then say so.** `I need:` names the decision or the action you are waiting on. It
|
|
243
346
|
never announces that you are continuing — if you were, you would not be writing this header.
|
|
347
|
+
- **In `unattended`, the stop is the stop file** (§2.1): write it, set the panel's `attention`,
|
|
348
|
+
end the run. The header below is still printed — a log is the only screen that run has — but
|
|
349
|
+
nothing in it is asked.
|
|
244
350
|
|
|
245
351
|
The user comes back to a screen they walked away from, often with other works in other panes.
|
|
246
352
|
They have read none of your tool calls, subagent reports or artifacts. So every stop **opens with
|
|
@@ -259,7 +365,7 @@ I need: <one line — the decision or action you are waiting on>
|
|
|
259
365
|
- **Short lines.** One or two lines of headline, then two to five bullets, one idea each. No "for context", no restating an earlier stop. When the user asks a technical question, answer it in full.
|
|
260
366
|
- **Out of the chat, into the artifact:** your own process, your mistakes, corrections to subagent reports, bookkeeping. Subagent completion or idle notifications never earn a turn of their own.
|
|
261
367
|
- **Zero-context rule.** First mention of an identifier carries 4–6 words of what it is. Never cite a section number without naming what it is. No jargon the user has not used first.
|
|
262
|
-
- **If it is a question, it is `AskUserQuestion
|
|
368
|
+
- **If it is a question, it is `AskUserQuestion`** — in `unattended`, the stop file (§2.1). Never end a message with a question in prose. If it does not deserve the menu, it is a decision you take and record.
|
|
263
369
|
- **What the question is about travels with the question.** A brief, an MR/PR body, a plan, a finding: put it where the user answers it — in the question text and its options — and not only in the prose above. **Nothing runs between the two**: a tool call after that prose is what makes a terminal fold it away, and the last thing a chat UI collapses is exactly the thing they were asked to read. A gate answered without seeing what it was about is not a gate; "it is in `05-implementation.md`" is not showing it, because the answer then costs opening an editor and finding the file. Too long for the harness's question → print it as the **last** thing before asking, tool calls already done.
|
|
264
370
|
|
|
265
371
|
## 4. Live panel — over the terminal's MCP, or `panel.json`
|
|
@@ -271,7 +377,7 @@ right now. **Any progress line you were about to type into the chat is a panel u
|
|
|
271
377
|
**Two transports, one document.** When the tools `panel_set` / `panel_patch` / `panel_get` are
|
|
272
378
|
available, this console is a pane of agent-terminal: publish the panel through them (§4.2) and
|
|
273
379
|
**stop writing `.claude/work/<work>/panel.json`** — while a pane is claimed, its file is not read at
|
|
274
|
-
all. When they are not there, write the file
|
|
380
|
+
all. When they are not there, write the file (§4.3). No work folder (lightweight
|
|
275
381
|
`respond`/`green`) → nothing to publish, either way.
|
|
276
382
|
|
|
277
383
|
**Look for them before you conclude they are missing**, once per session, in pre-flight. A harness
|
|
@@ -414,8 +520,7 @@ single largest token cost of a work, so every work carries a short handoff:
|
|
|
414
520
|
MR/PR of `04-mr-plan.md`; `review` opens the design's contracts and the implementation log;
|
|
415
521
|
`ship` opens the brief and the review verdict. A summary that does not answer the question you
|
|
416
522
|
have is the cue to open the artifact — never a licence to guess.
|
|
417
|
-
- Missing summary
|
|
418
|
-
summary at your Close.
|
|
523
|
+
- Missing summary → read the artifacts, write the summary at your Close.
|
|
419
524
|
- **Name the phase, never the command.** An artifact outlives the session that wrote it and may be
|
|
420
525
|
resumed from a different agent, where the same phase is invoked under another name. Write the
|
|
421
526
|
phase — `validate`, `review`, `ship #2` — not the invocation. Applies to `00-summary.md`,
|
|
@@ -450,7 +555,7 @@ around each of its own findings to work out which changes are its doing, and how
|
|
|
450
555
|
looks clean is clean by luck. **The parent thread is a writer too**: applying a round's fixes while
|
|
451
556
|
its agents are still reading is the same collision, from the side nobody counts.
|
|
452
557
|
|
|
453
|
-
So a round that contains a writer is not one round. Readers fan out freely
|
|
558
|
+
So a round that contains a writer is not one round. Readers fan out freely;
|
|
454
559
|
writers go one at a time, each either alone or in a worktree of its own, and the readers sit
|
|
455
560
|
entirely before them or entirely after them. The parent's own edits wait until the round is
|
|
456
561
|
consolidated. Ordering costs wall clock and the phase says so in one line — a reading nobody can
|
|
@@ -492,8 +597,7 @@ Dropping a silent agent is always allowed, and always reported (`N/M` reported).
|
|
|
492
597
|
no deadline is what costs a session.
|
|
493
598
|
|
|
494
599
|
**The budget belongs to the command, not to the round.** `agents.fanout_max` caps *one* parallel
|
|
495
|
-
round
|
|
496
|
-
compose: a review can run a panel, then area reinforcements, then a coverage sweep that relaunches
|
|
600
|
+
round, and the phases that fan out compose: a review can run a panel, then area reinforcements, then a coverage sweep that relaunches
|
|
497
601
|
the panel, then one skeptic per finding — each round inside its own cap and the command an order of
|
|
498
602
|
magnitude over what anyone intended.
|
|
499
603
|
|
|
@@ -558,15 +662,13 @@ must *react to* mid-wait is not a wait at all: it is the work, and it stays here
|
|
|
558
662
|
### 6.6 — Which agent a role resolves to
|
|
559
663
|
|
|
560
664
|
**The harness already tells you which agents are installed**, each with a line on what it is for,
|
|
561
|
-
and choosing the one that fits a piece of work is something you do well without being told.
|
|
562
|
-
that answers every empty role with `general-purpose` throws that away: a repo with a frontend
|
|
563
|
-
specialist installed and no `agents.frontend` got a generalist told to act like one. So wherever a
|
|
665
|
+
and choosing the one that fits a piece of work is something you do well without being told. Answering every empty role with `general-purpose` throws that away. So wherever a
|
|
564
666
|
command says *"`agents.<role>`, empty → `Agent general-purpose` with the role"*, it means this:
|
|
565
667
|
|
|
566
|
-
1. **`agents.<role>` names an agent** → that agent
|
|
668
|
+
1. **`agents.<role>` names an agent** → that agent.
|
|
567
669
|
2. **Empty** → the installed agent whose description fits the role **and this work's stack** best —
|
|
568
670
|
read the list your harness gives you, never a guess at a name. None fits clearly →
|
|
569
|
-
`general-purpose` with the role in the prompt
|
|
671
|
+
`general-purpose` with the role in the prompt. An agent that fits the role but not the
|
|
570
672
|
stack (a PHP reviewer on a React diff) does not fit.
|
|
571
673
|
|
|
572
674
|
**`agents.selection`** decides how far your judgement reaches:
|
|
@@ -712,11 +814,11 @@ one more thing the user has to decide about.
|
|
|
712
814
|
"title": "one line, what would be done",
|
|
713
815
|
"why": "one line, why it was parked and why it still matters",
|
|
714
816
|
"source": "design" | "plan" | "build" | "validate" | "fix" | "postmortem",
|
|
715
|
-
"status": "proposed" | "accepted" | "declined" | "logged" | "done",
|
|
817
|
+
"status": "proposed" | "accepted" | "in_progress" | "declined" | "logged" | "done",
|
|
716
818
|
"ticket": null, "work": null, "note": "" }
|
|
717
819
|
```
|
|
718
820
|
|
|
719
|
-
The artifact keeps its human-readable section
|
|
821
|
+
The artifact keeps its human-readable section, with the `F<n>` id in front of each
|
|
720
822
|
row so the prose and the record never drift. **The record is the addition, not a replacement**: a
|
|
721
823
|
reader of `05-implementation.md` still sees the ideas in context.
|
|
722
824
|
|
|
@@ -735,7 +837,8 @@ reader of `05-implementation.md` still sees the ideas in context.
|
|
|
735
837
|
ships, gets reviewed, and comes back as a ticket that costs a whole work to answer what was two
|
|
736
838
|
minutes of the user's. The test is one line: **if the answer changes what the code being written
|
|
737
839
|
does now, ask now; if it changes what someone builds later, record it.** Asked now means one
|
|
738
|
-
`AskUserQuestion` the moment it surfaces, **in every `autonomy.mode`, `auto` included**
|
|
840
|
+
`AskUserQuestion` the moment it surfaces, **in every `autonomy.mode`, `auto` included** (in
|
|
841
|
+
`unattended`, a `decision` question in the stop file, §2.1) — the
|
|
739
842
|
never-ask list of §2 is about flow mechanics, and a product decision is the opposite of mechanics —
|
|
740
843
|
phrased as the question itself with the options that were on the table, recommended one first. The
|
|
741
844
|
answer goes where the phase keeps its decisions (the brief in `04-fix.md`, the ADR-light in
|
|
@@ -751,8 +854,8 @@ at `ship`'s Close, when the work is done and the user can see the whole set.
|
|
|
751
854
|
|
|
752
855
|
**A skeptic sorts them before the user sees them.** `/flow-*-review` already refuses to hand over an
|
|
753
856
|
unverified finding: its §6 gives each ambiguous one to a skeptic whose job is to *refute* it, burden
|
|
754
|
-
of proof on the finding. Deferred work
|
|
755
|
-
|
|
857
|
+
of proof on the finding. Deferred work needs the same filter: the phase that parked it is the one party that cannot judge
|
|
858
|
+
it, having just found it. So at Close, when
|
|
756
859
|
**3 or more** entries are still `proposed`, they go to a skeptic first (grouped into at most
|
|
757
860
|
`agents.fanout_max` briefs, the ceilings of §6 unchanged; **fewer than 3 → no agent**, the command
|
|
758
861
|
applies the bar itself):
|
|
@@ -779,15 +882,10 @@ Then, and only then, the survey:
|
|
|
779
882
|
**Not worth it** · **Later**. The `title` and `why` are the entire prompt. **`decision` entries
|
|
780
883
|
are asked as their product question** — they never go to the skeptic, a question's value not being
|
|
781
884
|
a thing to refute — and sit outside the ceiling.
|
|
782
|
-
- **`tooling` asks nothing.** `logged`, and a count on screen.
|
|
783
|
-
with slack in it was one question too many.
|
|
885
|
+
- **`tooling` asks nothing.** `logged`, and a count on screen.
|
|
784
886
|
- **Not worth it** → `declined`, with the reason if given. Never asked again.
|
|
785
887
|
- **`logged` is a status, not a destination.** The entry stays exactly where it already is — in
|
|
786
|
-
`meta.json.followups[]` and in its artifact section — and no file is written anywhere.
|
|
787
|
-
to append a line to a versioned debt log, one per repo; **that file is gone**. No command read it,
|
|
788
|
-
`status` and `daily` excluded it on purpose, and it duplicated a record the work already keeps
|
|
789
|
-
forever, so it grew without ever being triaged. A note nobody reads is not a lighter obligation
|
|
790
|
-
than a ticket, it is the same obligation with the reader removed. If a gap in the machinery is
|
|
888
|
+
`meta.json.followups[]` and in its artifact section — and no file is written anywhere. If a gap in the machinery is
|
|
791
889
|
worth someone's time, it is worth a ticket; if it is not, the record in the work is where it ends.
|
|
792
890
|
- **A `decision` answered** → the answer is written into the artifact that owns it and the entry
|
|
793
891
|
becomes `done` with the answer in `note`. Deferred again → stays `proposed`.
|
|
@@ -879,7 +977,7 @@ largest saving the review has.
|
|
|
879
977
|
|
|
880
978
|
**What follows from that is a temptation, and it belongs to the diff, not to the plan.** A threshold
|
|
881
979
|
that buys a lighter review pays whoever lands just under it: twelve lines below 150 is a review at
|
|
882
|
-
`medium
|
|
980
|
+
`medium`, twelve above it is one at `high`; at 600 the project panel joins. So, in every phase:
|
|
883
981
|
|
|
884
982
|
**The diff reports the change; the change is never shaped to fit the number.** Never delete a
|
|
885
983
|
comment, a test, a blank line or a log line, never compress readable code into fewer statements,
|
|
@@ -52,6 +52,12 @@ What is NOT touched:
|
|
|
52
52
|
|
|
53
53
|
In `auto` this is one of the only two stops of the whole flow (this one and `ship`; `guided` adds the plan of §2.0bis on a fix of more than two steps): open with the **full stop header** (flow-core §3), then the brief.
|
|
54
54
|
|
|
55
|
+
In `unattended` (flow-core §2.1) nobody is there to answer: write the brief, mark it
|
|
56
|
+
`recorded (unattended)` under its heading, record the site in `meta.json.defaults_used[]`, and fix.
|
|
57
|
+
The gate's purpose moves to the draft MR/PR, whose body carries the brief for the person who reads it.
|
|
58
|
+
**A schema change or migration is still a question** (`migration`): before writing the first line
|
|
59
|
+
of one → stop file, end the run. A person continues from there.
|
|
60
|
+
|
|
55
61
|
**The brief travels inside the question** (flow-core §3) — read in the prompt being answered, not by opening `04-fix.md` — and **nothing runs between the brief and the question**: a tool call after it is what lets a terminal fold it away. Options:
|
|
56
62
|
- **Yes, go ahead** → apply the fix.
|
|
57
63
|
- **No, something is missing or wrong** → adjust the brief, ask again. No code until confirmed.
|
|
@@ -118,13 +124,13 @@ the fix is minimal precisely because it trusts that. When the fix depends on X b
|
|
|
118
124
|
cause and the investigation's evidence does not close that — one reproduction, a correlation, a
|
|
119
125
|
`git blame` that fits the story — that is the premise, and one skeptic on it costs less than the
|
|
120
126
|
second regression. **Refuted** → back to `/flow-bug-investigate`, never a second patch layered on
|
|
121
|
-
the first. **Unsettled** → recorded in `04-fix.md` under "Premises the fix depends on" and carried
|
|
127
|
+
the first (in `unattended`, the run ends `blocked` there, flow-core §2.1). **Unsettled** → recorded in `04-fix.md` under "Premises the fix depends on" and carried
|
|
122
128
|
into the stop, because `/flow-bug-validate` writes a regression test against the cause the fix
|
|
123
129
|
assumed.
|
|
124
130
|
|
|
125
131
|
## 2.3 Something outside the brief comes up?
|
|
126
132
|
|
|
127
|
-
Anything **not in the §2 brief** ("while I'm at it, I'll also fix X", "this rename fits here", "this extra test covers another case"): **pause before touching it** and ask with `AskUserQuestion`:
|
|
133
|
+
Anything **not in the §2 brief** ("while I'm at it, I'll also fix X", "this rename fits here", "this extra test covers another case"): **pause before touching it** and ask with `AskUserQuestion` (in `unattended`: *No, leave it out*, recorded):
|
|
128
134
|
- **Yes, add it to the brief** — update the brief in `04-fix.md`, continue.
|
|
129
135
|
- **No, leave it out** — note it under "Areas with similar risk" (a risk from the same pattern) or under "Ideas for separate tickets" in `04-fix.md`, **and append it to `meta.json.followups[]`** as `kind: "audit"` (similar risk) or `kind: "out-of-scope"`, `source: "fix"` (flow-core §7). **Only when it clears the bar of flow-core §7** — a named subject, a path that has actually been seen, and waiting costing more than doing it now; short of that the artifact section keeps it and `followups[]` never sees it.
|
|
130
136
|
|
|
@@ -20,6 +20,11 @@ description: "Find the root cause of the bug (not just the symptom)"
|
|
|
20
20
|
|
|
21
21
|
Investigation phase: reproduce the failure, then find **why it happened** — not just what is failing.
|
|
22
22
|
|
|
23
|
+
**In `unattended`** (flow-core §2.1) this command asks nothing. The hypothesis sweep runs as in
|
|
24
|
+
`auto` · a size that no longer fits → record the new size · a `high` challenge with no response →
|
|
25
|
+
question `investigation_challenge`, the findings and their options in the stop file · a bug that
|
|
26
|
+
cannot be reproduced and needs a person to try → blocked.
|
|
27
|
+
|
|
23
28
|
## 1. Pre-flight
|
|
24
29
|
|
|
25
30
|
Read `~/.claude/flow/CORE.hermes.md` first (shared rules: `FLOW.md` step 0, models, autonomy modes and hard gates, how a stop reads, the live panel, `00-summary.md`) — skip if you already read it in this session. **Models: the subagents it launches take `models.agents`; its parallel rounds take `models.workers`.**
|
|
@@ -28,9 +33,7 @@ Read `~/.claude/flow/CORE.hermes.md` first (shared rules: `FLOW.md` step 0, mode
|
|
|
28
33
|
|
|
29
34
|
- Read `meta.json` and `00-summary.md`; open in full only `01-context.md`. (flow-core §5)
|
|
30
35
|
- `type` is not `bug` → refuse. `size` is `XS` → suggest `/flow-bug-fix` and stop.
|
|
31
|
-
- Require `context` in `phases_done`.
|
|
32
|
-
v0.53.0) is treated as having finished §1.5: read its `02-diagnose.md`, carry it into
|
|
33
|
-
`03-investigation.md`, and go straight to §3.
|
|
36
|
+
- Require `context` in `phases_done`.
|
|
34
37
|
|
|
35
38
|
## 1.5 Reproduce — what is failing, before why
|
|
36
39
|
|
|
@@ -38,9 +41,6 @@ Isolate **what** fails before looking for **why**. On **S** this is the whole of
|
|
|
38
41
|
first half and the chain is `start → investigate (reproduce only) → fix → …`; on **M/L** it is the
|
|
39
42
|
ground §3 stands on. **XS** skips straight to `/flow-bug-fix`.
|
|
40
43
|
|
|
41
|
-
*(This was the `bug:diagnose` command until v0.53.0. Reproducing and finding the cause were two commands
|
|
42
|
-
sharing five headings, and the S-size chain already ran them back to back.)*
|
|
43
|
-
|
|
44
44
|
1. **Focused knowledge query on the symptom.** `knowledge.search` set → 2-3 parallel queries about
|
|
45
45
|
the **suspected component** (handler, worker, endpoint, module): the same root cause often
|
|
46
46
|
returns wearing a different symptom. Dead-letter queue → `"DLX <handler-name>"`, `"retry policy
|
|
@@ -97,4 +97,4 @@ Neither role set → skip this block silently.
|
|
|
97
97
|
- Overwrite `00-summary.md` whole (≤15 lines, flow-core §5).
|
|
98
98
|
- **Write every prevention action and similar-risk area to `meta.json.followups[]`** (flow-core §7), ids matching the tables above. This is the whole point of the phase: an action that lives only in `99-postmortem.md` is archived with the work and read by nobody, which is how the incident repeats.
|
|
99
99
|
- Suggest `/flow-bug-ship`. Say how many follow-ups it will ask about at its Close — **do not triage them here**: mid-postmortem is the wrong moment to judge what is worth a ticket, and `ship` asks once with the whole set in view.
|
|
100
|
-
- **Autonomy handoff — stops in every mode, `auto` included.** `ship` pushes and opens the MR/PR, a hard gate in every mode: do **not** chain into it; stop here and propose `/flow-bug-ship` with a single `AskUserQuestion` (recommended option by default).
|
|
100
|
+
- **Autonomy handoff — stops in every mode, `auto` included.** `ship` pushes and opens the MR/PR, a hard gate in every mode: do **not** chain into it; stop here and propose `/flow-bug-ship` with a single `AskUserQuestion` (recommended option by default). In `unattended` (flow-core §2.1), chain into `/flow-bug-ship`: it decides between a draft and a question.
|
|
@@ -37,7 +37,7 @@ Read `~/.claude/flow/CORE.hermes.md` first (shared rules: `FLOW.md` step 0, mode
|
|
|
37
37
|
member runs its own `git diff` and opens the same files pays for that material once per agent, and
|
|
38
38
|
a reviewer that spends its turns exploring has fewer left to review. **Any non-zero exit is a
|
|
39
39
|
fallback, not a failure** — no CLI on the machine, a base that does not resolve, a network that
|
|
40
|
-
cannot reach it: read the diff from git
|
|
40
|
+
cannot reach it: read the diff from git and carry on, once, without retrying variants.
|
|
41
41
|
What is not optional is the `Review path` line of §7: a round that skipped the pack and one that
|
|
42
42
|
used it are indistinguishable from the artifact otherwise, which is how a phase quietly stops
|
|
43
43
|
paying for itself.
|
|
@@ -72,7 +72,7 @@ Read `~/.claude/flow/CORE.hermes.md` first (shared rules: `FLOW.md` step 0, mode
|
|
|
72
72
|
- **Review base**: the previous `reviewed_sha` when it is non-empty and an ancestor of the candidate, otherwise `git.default_base`, with the reason in one line. `--full` forces the whole branch.
|
|
73
73
|
- **Then**: `bundle --rev <candidate_sha> --base <review base>`, and every brief names that range rather than the live tree.
|
|
74
74
|
|
|
75
|
-
A fix is usually small enough that the delta and the branch are the same thing — which is exactly why the freeze matters more here than the scoping: a one-file fix whose round applies its own correction is the case where `
|
|
75
|
+
A fix is usually small enough that the delta and the branch are the same thing — which is exactly why the freeze matters more here than the scoping: a one-file fix whose round applies its own correction is the case where recording `HEAD` as reviewed would describe a tree nobody read.
|
|
76
76
|
|
|
77
77
|
## 2. Run the code reviews
|
|
78
78
|
|
|
@@ -235,7 +235,7 @@ Cost line: count every subagent this command launched — reviewers = §2.1 buil
|
|
|
235
235
|
- **Record *what* you reviewed, and separately what you changed after reading it** — `/flow-feat-review` §9, unchanged: `reviewed_sha` = the **candidate** of §1.5 (the revision the reviewers read, never `git rev-parse HEAD`, which by now holds this round's own fixes), and `fixed_sha` = `git rev-parse HEAD` after those fixes, empty when the round applied none. `phases_done` says a review happened; these two say on which tree and what moved afterwards, and `/flow-bug-ship §0` reads both against what is being pushed. Only when the phase advances: a review that ended in blockers reviewed nothing that stands.
|
|
236
236
|
- **Record which pass found what** — `/flow-feat-review §9`, unchanged: one `meta.json.review_findings[]` entry per finding **per source** (`{ round, origin, severity, file, discarded_by_skeptic }`, no finding text), written by `flow review --record` when the CLI ran the panel and by this Close when the agentic panel did. `flow cost` reads them back per origin, and the retirement rule is the same: a pass with no exclusive surviving finding across twenty reviews comes out of the command.
|
|
237
237
|
- **Record what the agents missed** — `/flow-feat-review §9`, unchanged: surviving findings in a category a panel member or named `agents.<role>` owns and did not report → `meta.json.agent_lessons[]` rows (flow-core §6.7), asking nothing. A fix is where this pays most: the defect already reached production once, and the reviewer that owns its category let it.
|
|
238
|
-
- **Stage what the review taught** (`knowledge.stage` set; silence by default). Review is where a project teaches the most and
|
|
238
|
+
- **Stage what the review taught** (`knowledge.stage` set; silence by default). Review is where a project teaches the most, and this is the only moment its findings are in context. Candidates are findings about the **domain or the codebase's real behaviour**, not about this diff: a library that does other than its name says, a test disguise that kept the suite green over a live defect, a module rule the reviewers had to cite from its own prose, a measurement. A blocker fixed here is not knowledge; *why it was written wrong* may be. Same evidence rule as `/flow-feat-design` §8 — one line of evidence per finding or it is not staged. One call per finding, one line to the user («Staged N finding(s) for `postmortem`/`ship`»). Never `knowledge.save` here.
|
|
239
239
|
- Overwrite `00-summary.md` whole (≤15 lines, flow-core §5).
|
|
240
240
|
- Stop body (after the flow-core §3 header): the findings that survived and what you did with each, plus the same Cost line as the Summary: "- Cost: <n>/<budget_max> subagents launched (<k> reviewers · <m> reinforcements · <s> skeptics), tier <light|proportional|full>".
|
|
241
|
-
- **Autonomy handoff.** Only without blockers — with blockers, stop in every mode. **M/L**: `manual` → propose `/flow-bug-postmortem` with a single `AskUserQuestion`; `guided`/`auto` → chain into it in this same turn. **XS/S**: the next step is `ship`, which pushes and opens the MR/PR — a hard gate in **every** mode: stop here and propose `/flow-bug-ship` with a single `AskUserQuestion`, never chaining into it.
|
|
241
|
+
- **Autonomy handoff.** Only without blockers — with blockers, stop in every mode (in `unattended`, question `high_findings` and the run ends, flow-core §2.1). **M/L**: `manual` → propose `/flow-bug-postmortem` with a single `AskUserQuestion`; `guided`/`auto` → chain into it in this same turn. **XS/S**: the next step is `ship`, which pushes and opens the MR/PR — a hard gate in **every** mode: stop here and propose `/flow-bug-ship` with a single `AskUserQuestion`, never chaining into it. In `unattended`, chain into `/flow-bug-ship`: it decides between a draft and a question.
|
|
@@ -23,6 +23,17 @@ Close the bug flow: commit, push, MR/PR. Same mechanics as `/flow-feat-ship`, wi
|
|
|
23
23
|
1. If `99-postmortem.md` exists, **include the link or the executive summary** in the MR/PR description.
|
|
24
24
|
2. The knowledge-consolidation offer was already made in `/flow-bug-postmortem` — do not ask again here.
|
|
25
25
|
|
|
26
|
+
**In `unattended`** (flow-core §2.1) this command asks nothing — the same resolutions as
|
|
27
|
+
`/flow-feat-ship`'s unattended paragraph, and its "In every mode" paragraph too, applied to the
|
|
28
|
+
sections here: the MR/PR (§2–§3) is a draft only with `autonomy.unattended_ship: draft`, created as
|
|
29
|
+
§3.1 says for a draft; otherwise question `ship` and the run ends; pre-deploy SQL → question
|
|
30
|
+
`migration`. The tree check (§0) re-runs what is behind `HEAD` once per MR/PR, recorded as
|
|
31
|
+
`/flow-feat-ship` says — here `validate` first, since it ran before the review, then the review on
|
|
32
|
+
the delta — and is `blocked` after that. The
|
|
33
|
+
performance comment (§3.3) is not posted; every offer and survey at Close (§4) — follow-ups,
|
|
34
|
+
conventions, archiving — is `Later`; "was it merged?" is not merged; and Close writes the stop file
|
|
35
|
+
with `reason: "done"` and `mr_url`.
|
|
36
|
+
|
|
26
37
|
## 0. Pre-flight
|
|
27
38
|
|
|
28
39
|
Read `~/.claude/flow/CORE.hermes.md` first (shared rules: `FLOW.md` step 0, models, autonomy modes and hard gates, how a stop reads, the live panel, `00-summary.md`) — skip if you already read it in this session. **Models: this command runs with the model it was launched with; the wait it delegates takes `models.supervisors`.**
|
|
@@ -122,7 +133,7 @@ Determine whether the fix modifies the database (migrations, mappings/schema, or
|
|
|
122
133
|
|
|
123
134
|
## 2. Show to user and wait for confirmation (REQUIRED)
|
|
124
135
|
|
|
125
|
-
**Never skip this step** — hard gate: the user approves what will be published before anything is created. Print in this exact format:
|
|
136
|
+
**Never skip this step** — hard gate: the user approves what will be published before anything is created (in `unattended`, the unattended paragraph above decides it). Print in this exact format:
|
|
126
137
|
|
|
127
138
|
```
|
|
128
139
|
─── Preview of {MR or PR, per git.host} (fix) ──────────────────────────────────
|
|
@@ -156,7 +167,9 @@ Same as `/flow-feat-ship` §4.0: `git rev-parse --abbrev-ref HEAD` must not be t
|
|
|
156
167
|
|
|
157
168
|
### 3.1 Create MR/PR
|
|
158
169
|
|
|
159
|
-
|
|
170
|
+
**A draft (`unattended`) — read this first:** exactly as `/flow-feat-ship §4.1` says for a draft — never `commit-push-pr`, never the plain CLI; the forge CLI with its draft flag; a refused draft → `blocked`.
|
|
171
|
+
|
|
172
|
+
Otherwise, only here — with the content approved in §2 — invoke `Skill commit-commands:commit-push-pr` passing **the final title and description**. The skill must not re-ask; if it does, answer with what was confirmed. If it pushes, it uses `git push -u origin HEAD`, never to the main base.
|
|
160
173
|
|
|
161
174
|
Assign to `git.assignee` from FLOW.md (empty → unassigned). Squash per `git.squash`.
|
|
162
175
|
|
|
@@ -23,6 +23,15 @@ Start a bug. `$ARGUMENTS` is **optional**:
|
|
|
23
23
|
- **Given** — a ticket (format `tracker.prefix` from FLOW.md) → *ticket mode*: start from it (§1 reads it).
|
|
24
24
|
- **Empty** — *ticket-less mode*: do **not** stop. Synthesize the bug from the conversation just held with the user (§1.5). Ask for a one-line symptom only if there is no conversation to draft from.
|
|
25
25
|
|
|
26
|
+
**In `unattended`** (flow-core §2.1) this command asks nothing; each place it would ask resolves as
|
|
27
|
+
that table says. Here: a ticket is required — empty, or a tracker read that fails, ends the run
|
|
28
|
+
`blocked` · uncommitted changes or a branch other than the main one (§3) → `blocked`: the runner
|
|
29
|
+
owns the checkout · cross-repo scope (§1.6) → only the repos the ticket names · `git.worktree: ask`
|
|
30
|
+
→ in place · a linked remote branch → skipped, nothing is pushed before `ship` · the tracker
|
|
31
|
+
transition (§4.5) → as `auto`. **A thread that changes what the bug *is* (§1.1 precedence) waits
|
|
32
|
+
until the branch and the work folder exist** — create them (§3, §4) first, write it into
|
|
33
|
+
`01-context.md` as open, then question `clarify`; the next phase asks it first (flow-core §2.1).
|
|
34
|
+
|
|
26
35
|
## 0. Pre-flight
|
|
27
36
|
|
|
28
37
|
Read `~/.claude/flow/CORE.hermes.md` first (shared rules: `FLOW.md` step 0, models, autonomy modes and hard gates, how a stop reads, the live panel, `00-summary.md`) — skip if you already read it in this session. **Models: this command runs with the model it was launched with (no `models` key).**
|
|
@@ -40,7 +40,7 @@ Read `~/.claude/flow/CORE.hermes.md` first (shared rules: `FLOW.md` step 0, mode
|
|
|
40
40
|
Then:
|
|
41
41
|
1. Run only that test with `quality.test_one` from FLOW.md; it must pass.
|
|
42
42
|
2. Run the full suite with `quality.test` to rule out collateral regressions (in the background if slow; measured in tens of minutes → delegate it as a wait to a supervisor subagent on `models.supervisors`, flow-core §6.5 — it returns the exit code and the failing output, and the reading of them stays here).
|
|
43
|
-
3. DB touched → verify the schema has no unexpected differences (`quality.db_update` or the FLOW.md equivalent, if defined).
|
|
43
|
+
3. DB touched → verify the schema has no unexpected differences (`quality.db_update` or the FLOW.md equivalent, if defined; in `unattended` it is never run — a schema difference to apply is question `migration`, flow-core §2.1).
|
|
44
44
|
4. Security or authentication touched → launch the `agents.security` agent from FLOW.md in parallel over the fix files (empty → `Agent general-purpose` with a security role).
|
|
45
45
|
|
|
46
46
|
## 2.5 Reproduce the original symptom against the running app
|
|
@@ -93,7 +93,7 @@ this is the same gate as a red test.
|
|
|
93
93
|
|
|
94
94
|
## 5. Close
|
|
95
95
|
|
|
96
|
-
- Red test, regressions, **or the original symptom still reproducible in §2.5** → `phase` stays at `fix`; the user iterates. A red gate stops in every mode.
|
|
96
|
+
- Red test, regressions, **or the original symptom still reproducible in §2.5** → `phase` stays at `fix`; the user iterates. A red gate stops in every mode (in `unattended`, the run ends `blocked` with the failing test named, flow-core §2.1).
|
|
97
97
|
- Green → `phase = "validate"`, add to `phases_done`; in the same write record `validated_sha` = `git rev-parse HEAD` — the tree the regression test passed on, which `/flow-bug-ship §0` reads. Suggest `/flow-bug-review`.
|
|
98
98
|
- **Other bugs detected become `followups[]` entries** (flow-core §7) when they clear its bar — a reproducible symptom with someone who suffers it, not «this looks fragile» — per the output template.
|
|
99
99
|
- **Stage what the validation taught** (`knowledge.stage` set; silence by default): a mutation that stayed green, a disguise the scenario wore, a fixture that could not produce the case — findings about how this codebase is tested, not about this diff. Same rule and evidence line as the review's Close.
|
|
@@ -47,9 +47,6 @@ Print this **before** the environment checks: a key nobody set is the commonest
|
|
|
47
47
|
below looks broken. Read against `examples/FLOW.template.md` — do not invent keys, and do report
|
|
48
48
|
documented keys absent from the effective configuration (the "empty → fallback" rows).
|
|
49
49
|
|
|
50
|
-
**This was the `config` command until v0.53.0.** One question — *what will the flow do in this repo* —
|
|
51
|
-
had two commands answering different halves of it.
|
|
52
|
-
|
|
53
50
|
### 1.5.1 Effective config, per section
|
|
54
51
|
|
|
55
52
|
For **every** documented key in `examples/FLOW.template.md`, one row:
|
|
@@ -105,7 +102,9 @@ supervisors (empty) → the delegated waits (running pipeline, pending deploy
|
|
|
105
102
|
empty key in `guided`/`auto` records it rather than asking. This block is where that record is read
|
|
106
103
|
back.
|
|
107
104
|
|
|
108
|
-
Aggregate `defaults_used[]` from every `.claude/work/*/meta.json`, **`_archive/` included
|
|
105
|
+
Aggregate `defaults_used[]` from every `.claude/work/*/meta.json`, **`_archive/` included**, leaving
|
|
106
|
+
out keys prefixed `unattended:` — those record how an unattended run resolved a stop, not a FLOW key
|
|
107
|
+
with a line to paste. One row
|
|
109
108
|
per key: the key, the default that was used, in how many works, and the last phase that used it.
|
|
110
109
|
Sort by count, most-used first, and cap the block at the ten busiest keys with a count of the rest.
|
|
111
110
|
|
|
@@ -168,9 +167,15 @@ base branch resolvable — is §2 below; flag the key here, check the world ther
|
|
|
168
167
|
run against a development or throwaway database, never a live one.
|
|
169
168
|
- **Autonomy**: `autonomy.mode` empty → note it defaults to `manual` (every phase stops and, at the
|
|
170
169
|
end, proposes the next command as a one-click confirmation — never runs it unconfirmed). Set →
|
|
171
|
-
echo the mode and remind that the hard gates stop and ask in
|
|
170
|
+
echo the mode and remind that the hard gates stop and ask in `manual`/`guided`/`auto` and that `guided`/`auto`
|
|
172
171
|
never ask about the flow's own mechanics or anything already decided (both lists: `flow:flow-core`
|
|
173
|
-
skill §2). Unrecognized value → flag, `manual` assumed.
|
|
172
|
+
skill §2). Unrecognized value → flag, `manual` assumed. `unattended` → say what it does instead of
|
|
173
|
+
the gates (flow-core §2.1): nothing is asked, questions end the run in `.claude/work/stop.json` for a runner,
|
|
174
|
+
and `ship` is a draft only when `autonomy.unattended_ship` is `draft` — echo that value, or that it
|
|
175
|
+
is empty and ship will stop on a question. Say which file set it: every session that reads that file
|
|
176
|
+
— a person's included, when they share the checkout and the harness — stops asking too, so it
|
|
177
|
+
belongs in a FLOW file only the runner's environment has. `unattended_ship` set with any other mode → note it is ignored; a
|
|
178
|
+
value other than `draft`/`stop` → flag, `stop` assumed.
|
|
174
179
|
|
|
175
180
|
## 2. Checks
|
|
176
181
|
|