flow-workflows 0.81.0 → 0.82.1

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.
Files changed (76) hide show
  1. package/adapters/codex/CORE.md +120 -6
  2. package/adapters/codex/skills/flow-bug-fix/SKILL.md +8 -2
  3. package/adapters/codex/skills/flow-bug-investigate/SKILL.md +5 -0
  4. package/adapters/codex/skills/flow-bug-postmortem/SKILL.md +1 -1
  5. package/adapters/codex/skills/flow-bug-review/SKILL.md +1 -1
  6. package/adapters/codex/skills/flow-bug-ship/SKILL.md +15 -2
  7. package/adapters/codex/skills/flow-bug-start/SKILL.md +9 -0
  8. package/adapters/codex/skills/flow-bug-validate/SKILL.md +2 -2
  9. package/adapters/codex/skills/flow-doctor/SKILL.md +11 -3
  10. package/adapters/codex/skills/flow-feat-build/SKILL.md +12 -6
  11. package/adapters/codex/skills/flow-feat-design/SKILL.md +6 -0
  12. package/adapters/codex/skills/flow-feat-review/SKILL.md +4 -1
  13. package/adapters/codex/skills/flow-feat-ship/SKILL.md +43 -3
  14. package/adapters/codex/skills/flow-feat-start/SKILL.md +14 -0
  15. package/adapters/codex/skills/flow-feat-validate/SKILL.md +16 -5
  16. package/adapters/codex/skills/flow-init/SKILL.md +4 -3
  17. package/adapters/codex/skills/flow-work-query/SKILL.md +1 -1
  18. package/adapters/codex/skills/flow-work-resume/SKILL.md +7 -1
  19. package/adapters/gemini/CORE.md +120 -6
  20. package/adapters/gemini/commands/flow/bug/fix.toml +8 -2
  21. package/adapters/gemini/commands/flow/bug/investigate.toml +5 -0
  22. package/adapters/gemini/commands/flow/bug/postmortem.toml +1 -1
  23. package/adapters/gemini/commands/flow/bug/review.toml +1 -1
  24. package/adapters/gemini/commands/flow/bug/ship.toml +15 -2
  25. package/adapters/gemini/commands/flow/bug/start.toml +9 -0
  26. package/adapters/gemini/commands/flow/bug/validate.toml +2 -2
  27. package/adapters/gemini/commands/flow/doctor.toml +11 -3
  28. package/adapters/gemini/commands/flow/feat/build.toml +12 -6
  29. package/adapters/gemini/commands/flow/feat/design.toml +6 -0
  30. package/adapters/gemini/commands/flow/feat/review.toml +4 -1
  31. package/adapters/gemini/commands/flow/feat/ship.toml +43 -3
  32. package/adapters/gemini/commands/flow/feat/start.toml +14 -0
  33. package/adapters/gemini/commands/flow/feat/validate.toml +16 -5
  34. package/adapters/gemini/commands/flow/init.toml +4 -3
  35. package/adapters/gemini/commands/flow/work/query.toml +1 -1
  36. package/adapters/gemini/commands/flow/work/resume.toml +7 -1
  37. package/adapters/hermes/CORE.md +120 -6
  38. package/adapters/hermes/skills/flow-bug-fix/SKILL.md +8 -2
  39. package/adapters/hermes/skills/flow-bug-investigate/SKILL.md +5 -0
  40. package/adapters/hermes/skills/flow-bug-postmortem/SKILL.md +1 -1
  41. package/adapters/hermes/skills/flow-bug-review/SKILL.md +1 -1
  42. package/adapters/hermes/skills/flow-bug-ship/SKILL.md +15 -2
  43. package/adapters/hermes/skills/flow-bug-start/SKILL.md +9 -0
  44. package/adapters/hermes/skills/flow-bug-validate/SKILL.md +2 -2
  45. package/adapters/hermes/skills/flow-doctor/SKILL.md +11 -3
  46. package/adapters/hermes/skills/flow-feat-build/SKILL.md +12 -6
  47. package/adapters/hermes/skills/flow-feat-design/SKILL.md +6 -0
  48. package/adapters/hermes/skills/flow-feat-review/SKILL.md +4 -1
  49. package/adapters/hermes/skills/flow-feat-ship/SKILL.md +43 -3
  50. package/adapters/hermes/skills/flow-feat-start/SKILL.md +14 -0
  51. package/adapters/hermes/skills/flow-feat-validate/SKILL.md +16 -5
  52. package/adapters/hermes/skills/flow-init/SKILL.md +4 -3
  53. package/adapters/hermes/skills/flow-work-query/SKILL.md +1 -1
  54. package/adapters/hermes/skills/flow-work-resume/SKILL.md +7 -1
  55. package/adapters/opencode/CORE.md +120 -6
  56. package/adapters/opencode/commands/flow-bug-fix.md +8 -2
  57. package/adapters/opencode/commands/flow-bug-investigate.md +5 -0
  58. package/adapters/opencode/commands/flow-bug-postmortem.md +1 -1
  59. package/adapters/opencode/commands/flow-bug-review.md +1 -1
  60. package/adapters/opencode/commands/flow-bug-ship.md +15 -2
  61. package/adapters/opencode/commands/flow-bug-start.md +9 -0
  62. package/adapters/opencode/commands/flow-bug-validate.md +2 -2
  63. package/adapters/opencode/commands/flow-doctor.md +11 -3
  64. package/adapters/opencode/commands/flow-feat-build.md +12 -6
  65. package/adapters/opencode/commands/flow-feat-design.md +6 -0
  66. package/adapters/opencode/commands/flow-feat-review.md +4 -1
  67. package/adapters/opencode/commands/flow-feat-ship.md +43 -3
  68. package/adapters/opencode/commands/flow-feat-start.md +14 -0
  69. package/adapters/opencode/commands/flow-feat-validate.md +16 -5
  70. package/adapters/opencode/commands/flow-init.md +4 -3
  71. package/adapters/opencode/commands/flow-work-query.md +1 -1
  72. package/adapters/opencode/commands/flow-work-resume.md +7 -1
  73. package/package.json +1 -1
  74. package/plugins/flow/.claude-plugin/plugin.json +1 -1
  75. package/plugins/flow/CHANGELOG.md +36 -0
  76. package/plugins/flow/examples/FLOW.template.md +12 -3
@@ -29,9 +29,9 @@ Implementation phase. Code is written here.
29
29
  - `size` XS/S: may start without a design — ask the user for a 2-3 line note on what will be done and save it as a minimal `03-design.md`. No MR/PR plan (always 1 MR/PR).
30
30
  - **If `meta.json.mrs` has more than one entry**: pick the **startable** MR/PR — the `pending` one with the **lowest `n` whose `depends_on` are all `merged`**. Dependencies still `pending`/`in_progress` → not startable, even with a low `n`. (No `wave`/`depends_on` — an older plan — → "first pending by `n`".)
31
31
  - **Parallel siblings**: startable `pending` MRs/PRs in the **same `wave`** with no dependency between them can be built in parallel or as a train. `manual`: let the user choose which to take now (default: lowest `n`); `guided`/`auto`: take the lowest `n`, record the choice. Mark the chosen one `in_progress`.
32
- - All `merged` → warn: feature is done, nothing to build.
33
- - Some `pending` but **none** startable → start nothing: tell the user which MR/PR must merge to unlock the next wave, and stop.
34
- - **Train/stacked**: this MR/PR needs its own branch stacked on the previous one — do **not** keep committing on the previous MR/PR's branch. `/flow-feat-ship §6.2` creates and links it when it chains here; if you arrived directly and are still on the previous branch, create it now per `/flow-feat-start §5` (explicit base = the previous MR/PR's branch, `--no-track`, worktree per `git.worktree`) and, for `tracker.tool: gh`, the linked-branch step `/flow-feat-start §5.5`. Record `stacked_on` in `meta.json`. The train does **not** wait for the previous MR/PR to merge.
32
+ - All `merged` → warn: feature is done, nothing to build (in `unattended`: `done`, `detail` saying so).
33
+ - Some `pending` but **none** startable → start nothing: tell the user which MR/PR must merge to unlock the next wave, and stop. In `unattended`: `blocked`, the detail naming it.
34
+ - **Train/stacked** (never in `unattended`: there the startable MR/PR gets a **new branch of its own** from `git.default_base`, created as `/flow-feat-start §5.2` (in place) or `§5.4` (worktree) says — `git.worktree: always` → worktree, `off`/empty/`ask` → in place; base `git.default_base`, already decided, so §5.1 asks nothing; `--no-track`, no linked remote branch — and never commits onto a previous MR/PR's branch; flow-core §2.1): this MR/PR needs its own branch stacked on the previous one — do **not** keep committing on the previous MR/PR's branch. `/flow-feat-ship §6.2` creates and links it when it chains here; if you arrived directly and are still on the previous branch, create it now per `/flow-feat-start §5` (explicit base = the previous MR/PR's branch, `--no-track`, worktree per `git.worktree`) and, for `tracker.tool: gh`, the linked-branch step `/flow-feat-start §5.5`. Record `stacked_on` in `meta.json`. The train does **not** wait for the previous MR/PR to merge.
35
35
 
36
36
  ## 2. Business brief (before typing)
37
37
 
@@ -61,6 +61,12 @@ Rules for writing it:
61
61
 
62
62
  In `auto` this is one of the only two stops per MR/PR (`guided` adds the plan of §2.0ter on a big one), so it carries the **full stop header** (flow-core §3) — ticket, size, phase, `MR #<n> of <N>`, plan state — followed by the brief.
63
63
 
64
+ In `unattended` (flow-core §2.1) nobody is there to answer: write the brief, mark it
65
+ `recorded (unattended)` under its heading, record the site in `meta.json.defaults_used[]`, and build.
66
+ The gate's purpose moves to the draft MR/PR, whose body carries the brief for the person who reads it.
67
+ **A schema change or migration is still a question** (`migration`): before writing the first line
68
+ of one → stop file, end the run. A person continues from there.
69
+
64
70
  **The brief travels inside the question** (flow-core §3): the user reads it in the prompt they are answering, never by opening `05-implementation.md`. Write the file, run whatever you need, and *then* open the gate — **nothing runs between the brief and the question**, because a tool call after it is what lets a terminal fold the brief into one collapsed line, and the gate is answered blind. Options:
65
71
  - **Yes, proceed** → start building.
66
72
  - **No, something is extra or missing** → the user clarifies, adjust the brief, ask again. **Do not touch code** until the brief is confirmed.
@@ -184,7 +190,7 @@ said in one line, never silently skipped. `manual` → offer it with `AskUserQue
184
190
  premise that X before building on it?"). `guided`/`auto` → run it and record it; it is flow
185
191
  machinery, not a decision.
186
192
 
187
- **The verdict, and the rule that makes it worth running.** **Refuted** → the brief or the design is
193
+ **The verdict, and the rule that makes it worth running** (in `unattended`, *Refuted* ends the run as `blocked`, flow-core §2.1). **Refuted** → the brief or the design is
188
194
  wrong, not the code: stop, say what fell, and go back (§2.4 for a brief, `/flow-feat-design` for a
189
195
  contract) rather than patching around it. **Holds** → one row in §3 with what was read. **Unsettled
190
196
  stays unsettled** — the same rule as the query duel's *no number, no win*: it is recorded as an open
@@ -254,7 +260,7 @@ Warning thresholds:
254
260
  - **Real lines > `lines_est * 1.5`**, or
255
261
  - **Real files > `files_est + 2`**.
256
262
 
257
- If either is exceeded, **pause** and ask the user with `AskUserQuestion` (options, in this order):
263
+ If either is exceeded, **pause** and ask the user with `AskUserQuestion` (options, in this order — in `unattended`, take option 2 and record it):
258
264
 
259
265
  1. **Cut here (recommended if the current piece is coherent)**. What is built so far stays as this MR/PR; what remains — the §2.0ter steps still pending, or what is left of `04-mr-plan.md` where that step was skipped — goes into a new one inserted in `meta.json.mrs` right after. Zero code wasted.
260
266
  2. **Continue and record the overrun**. When the cut would be artificial. Note the deviation in `05-implementation.md` to calibrate `/flow-feat-plan` on future tickets.
@@ -281,7 +287,7 @@ slip under a threshold buys itself the review a smaller change had earned.
281
287
 
282
288
  ### 2.4 Does something fall outside the brief?
283
289
 
284
- If during the build the temptation arises to add something **not in the §2 brief** ("while I'm here…", "this test would also cover X…", "this rename would improve Y…"), **pause before doing it** and ask the user with `AskUserQuestion`:
290
+ If during the build the temptation arises to add something **not in the §2 brief** ("while I'm here…", "this test would also cover X…", "this rename would improve Y…"), **pause before doing it** and ask the user with `AskUserQuestion` (in `unattended`: *No, leave it out*, recorded):
285
291
  - **Yes, add it to the brief** — update the brief in `05-implementation.md` and continue. (If the addition is large, consider §2.3: it could trigger a MR/PR cut.)
286
292
  - **No, leave it out** — note it in the "Ideas for separate tickets" section of `05-implementation.md` **and append it to `meta.json.followups[]`** as `kind: "out-of-scope"`, `source: "build"` (flow-core §7): the section keeps it in context, the record is what survives the archive. **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. Continue with the original brief.
287
293
 
@@ -22,6 +22,12 @@ Read `~/.claude/flow/CORE.opencode.md` first (shared rules: `FLOW.md` step 0, mo
22
22
 
23
23
  Technical design phase. **Still no production code is written.** Opens the option space first (M/L), then designs the approach that was chosen. Output: a plan the next step executes.
24
24
 
25
+ **In `unattended`** (flow-core §2.1) this command asks nothing. Panel and approach choice run as in
26
+ `auto` · questions the options surfaced (§1.5.5) or an acceptance criterion that is ambiguous (§9) →
27
+ question `clarify` · a size that no longer fits (§1.5.5, §7) → record the new size · a `high`
28
+ challenge with no response (§6) → question `design_challenge`, the findings and their options in the
29
+ stop file · the design review (§9) → recorded as accepted, as in `auto`.
30
+
25
31
  ## 1. Pre-flight
26
32
 
27
33
  - Load `meta.json` by current branch. Missing → ask the user to start with `/flow-feat-start`.
@@ -386,4 +386,7 @@ Write `.claude/work/<TICKET>/06-review.md`. The `Cost:` line of `## Summary` is
386
386
  - **Record what the agents missed** (flow-core §6.7, `agents.learn` not `off`; asking nothing): for each finding that survived, the panel member or named `agents.<role>` whose category it falls in and who did not report it, and the delegated `build` agent whose code it sits in → one `meta.json.agent_lessons[]` row each, only when the lesson passes the §6.7 test. The origins §2.1 carried are what make this possible — a finding with no origin teaches nobody.
387
387
  - **Configuration this phase earned the right to ask about** (flow-core §0, `manual` only, at most one key per work, as an extra option on this same stop — never a question of its own): a `Cost:` line that went over `agents.budget_max` → `quality.review_depth`. In `guided`/`auto` neither is asked: the default is taken and recorded in `meta.json.defaults_used[]`.
388
388
  - Report findings and next step **following the stop header** (flow-core §3) **when this is a stop**; in `guided`/`auto` with a clean gate the next command runs in this same turn, so this goes to `06-review.md` and the turn opens with the call that chains — the `Cost:` line then travels to the stop the run does reach, added to that phase's own. Include it once. Body: the findings that **survived** verification and what you did with each — a blocker, an applied fix, a rejection with its reason. Corrections to the reviewers' own reports go to `06-review.md`, not here.
389
- - **Autonomy handoff.** Only when there are **no blockers and no unresolved high-severity findings** — with any of those, stop in every mode (hard gate). Clean: in `manual`, propose `/flow-feat-validate` with a single `AskUserQuestion` and invoke it on confirmation; in `guided`/`auto`, **chain into `/flow-feat-validate` automatically** in this same turn. Never chain into `/flow-feat-ship` from here — ship is reached through `validate`.
389
+ - **Autonomy handoff.** Only when there are **no blockers and no unresolved high-severity findings** — with any of those, stop in every mode (hard gate; in `unattended`, see below). Clean: in `manual`, propose `/flow-feat-validate` with a single `AskUserQuestion` and invoke it on confirmation; in `guided`/`auto`, **chain into `/flow-feat-validate` automatically** in this same turn. Never chain into `/flow-feat-ship` from here — ship is reached through `validate`.
390
+ - **In `unattended`** (flow-core §2.1), blockers or unresolved high-severity findings are question
391
+ `high_findings`: the surviving findings in `question`, one line each, and the run ends. A person
392
+ picks it up in a session of their own, where they are fixed and reviewed again.
@@ -22,6 +22,39 @@ Read `~/.claude/flow/CORE.opencode.md` first (shared rules: `FLOW.md` step 0, mo
22
22
 
23
23
  Closes the feature: commit, push, MR/PR (assigned per `git.assignee`, squash per `git.squash`, sections per `git.request_sections`) and an optional offer to consolidate knowledge.
24
24
 
25
+ **In `unattended`** (flow-core §2.1) this command asks nothing, and it is the only place that run
26
+ pushes. Each place it would ask:
27
+
28
+ - **The MR/PR itself (§3–§4)** — `autonomy.unattended_ship: draft` → skip the confirmation and
29
+ create it **as draft** with the §2 content (§4.1 says how); never merge it, never mark it ready.
30
+ The body gains one line saying an unattended run opened it and nobody confirmed its brief.
31
+ Empty or `stop` → nothing is pushed: question `ship`, the §3 preview as the question, and the run
32
+ ends; a person ships it from a session of their own. Pre-deploy SQL in the branch → question
33
+ `migration`, whatever `unattended_ship` says.
34
+ - **The §1 tree check** — `reviewed_sha` or `validated_sha` behind `HEAD` with more than tests →
35
+ re-run what is behind, **once per MR/PR**: the review on the delta, then `validate`. First record
36
+ `{ "key": "unattended:ship-recheck", "default": "mr <n>", "phase": "ship" }` in
37
+ `meta.json.defaults_used[]` — the record, not the context, is what remembers it; an entry with this
38
+ MR/PR's `n` already there → `blocked`, whatever the sha. Tracked changes this run's own phases left uncommitted → commit them
39
+ as WIP first (a WIP commit is `auto`'s to make) and check again · **blocking TODO/FIXME (§1)** →
40
+ continue and list them in the body.
41
+ - **Posting anything else** — the performance comment (§4.3), a contract handoff (§6.3) — → not
42
+ posted; the numbers go in the body, the handoff stays `pending`.
43
+ - **The offers and surveys (§5, §5.1, §5.2, §5.5, §6.4, §6.4bis)** → `Later`; nothing written outside
44
+ the work folder.
45
+ - **"Was it merged?" (§6.1)** → not merged; `meta.json` as §6.1 says for an unmerged MR/PR. **The
46
+ parent merged first (§6.2.1)** → blocked, never force-push. **Train continuation (§6.2)** → not
47
+ started: one MR/PR per unattended run.
48
+ - **At Close** write the stop file with `reason: "done"`, `mr_url`, and — with `mrs` still pending —
49
+ `detail` naming the next MR/PR and what it waits on (its `depends_on` merged, then
50
+ `/flow-feat-build`). It is the last thing the run does.
51
+
52
+ **In every mode**, criteria `07-validation.md` marks `not-verified-unattended` go into the body under
53
+ `## Not verified — needs a human`, with what to do for each — and so do the tests the suite left red
54
+ because they also fail on the base (`unattended:validate-red-base`): each name, and the base sha
55
+ where it failed too. The §3 preview shows that section like
56
+ any other, and the person reading it is the check the run could not do.
57
+
25
58
  ## 1. Pre-flight
26
59
 
27
60
  - Read `meta.json` and `00-summary.md`; open in full only the `Brief MR/PR #N` of `05-implementation.md`, the `## Summary`/blockers of `06-review.md` and `07-validation.md`. (flow-core §5)
@@ -133,7 +166,7 @@ Determine whether the branch modifies the database (migrations, mappings/schema,
133
166
 
134
167
  ## 3. Show the user and wait for confirmation (MANDATORY)
135
168
 
136
- **Never skip this step, even when the content seems obvious.** Hard gate in every mode.
169
+ **Never skip this step, even when the content seems obvious.** Hard gate in every mode — in `unattended`, the unattended paragraph above decides it.
137
170
 
138
171
  Print to the user in this exact format:
139
172
 
@@ -174,7 +207,14 @@ git rev-parse --abbrev-ref --symbolic-full-name @{u} 2>/dev/null # must NOT be
174
207
  - Train mode (`stacked_on` ≠ null) → the MR/PR must target that parent branch, not the main base.
175
208
 
176
209
  ### 4.1 Create MR/PR
177
- Only here — with the content approved in §3 — invoke `Skill commit-commands:commit-push-pr` passing **the final title and description**. The skill must not re-ask for the content; if it does, answer with what was confirmed. Any push it does must be `git push -u origin HEAD` (own branch), never to the base branch.
210
+ **A draft (`unattended`, flow-core §2.1) — read this first: it replaces the invocation below.** Do
211
+ **not** invoke `commit-push-pr`, and do not use the plain CLI fallback below: both open a normal
212
+ MR/PR. Commit, `git push -u origin HEAD`, and create it with the forge CLI and its draft flag
213
+ (`gh pr create --draft`, `glab mr create --draft`, the equivalent elsewhere), assignee and squash as
214
+ below. The forge refusing a draft → `blocked` with its message; never retried without the flag.
215
+ Then record the URL, as the paragraph after the bullets says.
216
+
217
+ Otherwise, only here — with the content approved in §3 — invoke `Skill commit-commands:commit-push-pr` passing **the final title and description**. The skill must not re-ask for the content; if it does, answer with what was confirmed. Any push it does must be `git push -u origin HEAD` (own branch), never to the base branch.
178
218
 
179
219
  - `git.assignee` not empty → assign to that user. `git.squash` `true` → enable squash-before-merge.
180
220
  - `commit-push-pr` skill unavailable → commit and push manually and create the MR/PR with the `git.cli` CLI from `FLOW.md` — always with the content confirmed in §3.
@@ -467,7 +507,7 @@ Read `meta.json.conventions_candidates[]` (flow-core §8). **No entries with `st
467
507
 
468
508
  ### 6.4ter Defaults that were used (one line, no question)
469
509
 
470
- `meta.json.defaults_used[]` non-empty → **one line** in the Close: how many empty `FLOW.md` keys this
510
+ `meta.json.defaults_used[]` non-empty (keys prefixed `unattended:` not counted) → **one line** in the Close: how many empty `FLOW.md` keys this
471
511
  work resolved with their default, and that `/flow-doctor` lists which ones and prints the line to
472
512
  paste. Never a list here, and never a question: in `guided`/`auto` not asking is the contract
473
513
  (flow-core §0, §2), and in `manual` the phases already offered what they were allowed to offer.
@@ -25,6 +25,20 @@ Read `~/.claude/flow/CORE.opencode.md` first (shared rules: `FLOW.md` step 0, mo
25
25
  - **Given** — an identifier in `tracker.prefix` format from `FLOW.md` → *ticket mode* (§2 reads it).
26
26
  - **Empty** — *ticket-less mode*: do **not** stop or demand a ticket. Draft a ticket from the conversation just held (§2.5), as `/flow-feat-ship` builds the MR/PR body from the work log. Ask for a one-liner only if there is no conversation to draft from.
27
27
 
28
+ **In `unattended`** (flow-core §2.1) this command asks nothing; each place it would ask resolves as
29
+ that table says. Here: a ticket is required — empty, or a tracker read that fails, ends the run
30
+ `blocked` (there is no conversation to draft from and nobody to paste it) · uncommitted changes or a
31
+ branch other than the main one (§5.1) → `blocked`: the runner owns the checkout · cross-repo scope
32
+ (§3.5) → only the repos the ticket names · below-XS (§4) → open the work · `git.worktree: ask`
33
+ (§5.0) → in place · §5.5's linked branch → skipped, it pushes a branch and nothing is pushed before
34
+ `ship` · the tracker transition (§6.5) → as `auto`. **Clarifying questions (§2.1 precedence, §3)
35
+ wait until the branch and the work folder exist** — create them (§5, §6) first, write the questions
36
+ into `01-context.md` under "Decisions clarified at start" as open, then question `clarify` with all
37
+ of them in one stop. Whoever picks the work up is asked them by the next phase, first (flow-core
38
+ §2.1).
39
+ A `blocked` before the folder exists still has the stop file: its path does not depend on the folder
40
+ (flow-core §2.1).
41
+
28
42
  ## 1. Pre-flight
29
43
 
30
44
  - Read the effective FLOW configuration per flow-core §0; neither base nor active overlay → each
@@ -151,12 +151,17 @@ Verify `needs-manual` criteria **together with the user**, one or a few at a tim
151
151
  - **Blocked** → status `unproven`; record why. Does not pass the gate.
152
152
  4. Repeat until every `needs-manual` criterion is `proven-manually`, or the user decides to stop (the rest stay `unproven`, which blocks advancing in §7).
153
153
 
154
+ **In `unattended`** there is nobody to run the check (flow-core §2.1): each `needs-manual` criterion
155
+ gets status `not-verified-unattended` with what a person must do to verify it, and that status does
156
+ **not** block §7 — the MR/PR can only be a draft, and `ship` lists these criteria in its body under
157
+ "Not verified — needs a human". A criterion §3.5 could have driven and did not is still `unproven`.
158
+
154
159
  ## 5. Manual edge cases
155
160
 
156
161
  If the feature has UI or critical flows:
157
162
  - Payments → test with the test cards or credentials the provider publishes for its sandbox (and the harness skill for that provider, if installed).
158
163
  - Workers/queues → make sure no jobs are stuck in dead-letter. Stuck jobs that are not yours: do not touch them here.
159
- - Migrations → run `quality.db_update` from `FLOW.md` (if defined); verify no unexpected schema difference with the comparison command the project uses.
164
+ - Migrations → run `quality.db_update` from `FLOW.md` (if defined; in `unattended`, never — a migration to apply is question `migration`, flow-core §2.1); verify no unexpected schema difference with the comparison command the project uses.
160
165
 
161
166
  ## 6. Output
162
167
 
@@ -210,11 +215,17 @@ Write `.claude/work/<TICKET>/07-validation.md`:
210
215
  ## 7. Close
211
216
 
212
217
  - **Do not advance `phase`** if tests are red, regressions are found, or **any acceptance criterion is `unproven`** (no test demonstrably asserts it, and neither §3.5 nor the user confirmed it). The criterion→test mapping is part of the gate — the same "do not advance on red" rule. The user resolves the gap (add the missing test, fix the implementation, or finish the manual verification) and returns to `/flow-feat-validate`.
213
- - Suite green **and** every acceptance criterion `proven-by-test`, `proven-by-agent` or `proven-manually` → `phase = "validate"`, add to `phases_done`. **Multi-MR/PR work** → also add `validate` to the current `in_progress` MR/PR's own `phases_done` (its `mrs[]` entry) — the per-MR/PR marker `/flow-feat-ship §1` gates on. Suggest `/flow-feat-ship`.
218
+ - Suite green **and** every acceptance criterion `proven-by-test`, `proven-by-agent` or `proven-manually` (in `unattended`, also `not-verified-unattended`, §4) → `phase = "validate"`, add to `phases_done`. **Multi-MR/PR work** → also add `validate` to the current `in_progress` MR/PR's own `phases_done` (its `mrs[]` entry) — the per-MR/PR marker `/flow-feat-ship §1` gates on. Suggest `/flow-feat-ship`.
214
219
  - **Record *what* you validated**, in the same write and only when the phase advances: `validated_sha` = `git rev-parse HEAD`, work-level and in this MR/PR's `mrs[]` entry. `/flow-feat-ship §1` reads it to tell "the suite passed here" from "the suite passed on something else".
215
220
  - **Unchecked edge cases and open risks become `followups[]` entries** (flow-core §7) before advancing — see the output template above.
216
221
  - **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.
217
222
  - Overwrite `00-summary.md` whole (≤15 lines, flow-core §5).
218
- - **Autonomy handoff — this one stops in every mode, `auto` included.** `ship` pushes and opens the MR/PR: a hard gate in every mode, so do **not** chain into it. Stop here and propose `/flow-feat-ship` with a single `AskUserQuestion` (recommended option by default), invoking it only when the user confirms. This is the deliberate end of the unattended run.
219
-
220
- In `guided`/`auto` this is, together with the brief in `/flow-feat-build §2`, **the only stop of the whole MR/PR** — everything between them ran unattended. It carries the **full stop header** and the body answers, in this order: what is green, what this MR/PR proves and what it does not, and what shipping it takes. Assume the user has read none of the build and review.
223
+ - **Autonomy handoff — this one stops in every mode, `auto` included.** `ship` pushes and opens the MR/PR: a hard gate in every mode, so do **not** chain into it. Stop here and propose `/flow-feat-ship` with a single `AskUserQuestion` (recommended option by default), invoking it only when the user confirms. This is the deliberate end of a run in `auto`.
224
+ **In `unattended`** (flow-core §2.1): the phase advanced → chain into `/flow-feat-ship`, which
225
+ decides from `autonomy.unattended_ship` between a draft MR/PR and a question. It did not advance
226
+ (red suite, a criterion `unproven`) → `blocked`, naming what failed; never chain. A red suite
227
+ advances only under the base exception of flow-core §2.1: run the failing tests on the base, and
228
+ write each name, its result there and the base sha under "Suite results" in `07-validation.md`.
229
+ Calling a failure "pre-existing" without that run is not the exception — it is a red suite.
230
+
231
+ In `guided`/`auto` this is, together with the brief in `/flow-feat-build §2`, **the only stop of the whole MR/PR** — everything between them ran without a person. It carries the **full stop header** and the body answers, in this order: what is green, what this MR/PR proves and what it does not, and what shipping it takes. Assume the user has read none of the build and review.
@@ -96,9 +96,10 @@ review, not a questionnaire. Then, and only then, five questions:
96
96
  in the confirmation screen, not a question.
97
97
  3. **Autonomy** (`autonomy.mode`): `manual` *(Recommended)* — stops at each decision, only recommends
98
98
  the next command; `guided` — resolves low-risk decisions and chains phases, asks at the real ones;
99
- `auto` — also resolves the rest with recorded defaults. Explain the hard gates that stop in every
100
- mode and the list of what `guided`/`auto` never ask (both in the `~/.claude/flow/CORE.opencode.md` §2), so
101
- `auto` is genuinely unattended between the brief and `ship`. Editable any time. Empty = `manual`.
99
+ `auto` — also resolves the rest with recorded defaults. Explain the hard gates that stop in these
100
+ three modes and the list of what `guided`/`auto` never ask (both in the `~/.claude/flow/CORE.opencode.md` §2),
101
+ so `auto` runs without a stop between the brief and `ship`. Do not offer `unattended`: it is for a
102
+ runner, written by hand where only the runner reads it. Editable any time. Empty = `manual`.
102
103
  4. **The quality commands as one block** (`quality.test`, `test_one`, `static_analysis`, `style_fix`,
103
104
  `db_update`, `db_diff`) — confirm or edit what §2 found, all in one question, each may stay empty
104
105
  (= auto-discover at the moment it is needed). Several suites chain into `test` with `&&`.
@@ -24,7 +24,7 @@ Read `~/.claude/flow/CORE.opencode.md` first (shared rules: `FLOW.md` step 0, mo
24
24
 
25
25
  Invoked by `/flow-feat-review` and `/flow-bug-review` (duel over the diff), `/flow-work-respond` (a reviewer objected to a query), `/flow-feat-design` (access paths), `/flow-feat-build`, `/flow-feat-validate`. Invoke directly for any doubt outside them (chat question, comment on an open MR/PR, a year-old query).
26
26
 
27
- **Autonomy.** Modes as in flow-core §2. The duel, challenger count and whether to measure are flow mechanics — never a question, in any mode. **Hard gates — stop and ask, in every mode:** (1) **creating, seeding or dropping any database, schema or table**, including a throwaway one (§4) — show exact commands and target, never a database the project uses; (2) **any DDL** on a real database (index, column, collation) — the flow's schema gate; (3) editing code (output is a verdict, not a patch); (4) posting anything to an MR/PR or ticket.
27
+ **Autonomy.** Modes as in flow-core §2. The duel, challenger count and whether to measure are flow mechanics — never a question, in any mode. **Hard gates — stop and ask, in every mode:** (1) **creating, seeding or dropping any database, schema or table**, including a throwaway one (§4) — show exact commands and target, never a database the project uses; (2) **any DDL** on a real database (index, column, collation) — the flow's schema gate; (3) editing code (output is a verdict, not a patch); (4) posting anything to an MR/PR or ticket. **In `unattended`** (flow-core §2.1) (1) and (2) are never done: the verdict is schema-only and says so; (3) and (4) do not apply, this command never edits or posts.
28
28
 
29
29
  ## 1. Resolve the subject
30
30
 
@@ -20,7 +20,11 @@ Read `~/.claude/flow/CORE.opencode.md` first (shared rules: `FLOW.md` step 0, au
20
20
 
21
21
  **Panel words are closed** — `mark`: `done` · `current` · `pending` · `wait` · `block` · `info`; `style`: `normal` · `dim` · `title` · `accent` · `ok` · `warn` · `error`. Anything else is dropped by the reader in silence: the panel still paints, and nobody is told.
22
22
 
23
- Use when returning to a work after a break (next morning, another session).
23
+ Use when returning to a work after a break (next morning, another session) — including a work an
24
+ unattended run left waiting on a person (flow-core §2.1).
25
+
26
+ **In `unattended`** this command asks nothing: recap, name the next step, end. It is how a person
27
+ reads where the run got to, not how the run continues.
24
28
 
25
29
  ## 1. Detection
26
30
 
@@ -43,6 +47,7 @@ Last updated: <updated_at>
43
47
  Notes: <meta.notes>
44
48
  Cross-repo: <meta.related_repos entries not "done", as "repo: scope"; or "—">
45
49
  Ticket thread: <new since <updated_at>: <n> comment(s) that change the work — detailed below · or "nothing new" · or "not read"> (line only in ticket mode, from §2.5)
50
+ Unattended: <from `.claude/work/stop.json` when its `work` is this one: `question` → the gate and the question, verbatim, with its options · `blocked` → the detail · `running` → "a run is working in <phase>, or died there, at <at>" · `done` → the MR/PR · `picked_up` → omit the line> (line only when that file names this work)
46
51
  ```
47
52
 
48
53
  - `MR/PRs:` and `Waves:` from `meta.json.mrs` (same format as `/flow-work-status §2`). `∥` = can run in parallel, `→` = waits for the previous wave to merge.
@@ -84,6 +89,7 @@ With what is new (there is already work on disk):
84
89
 
85
90
  ## 4. Next step
86
91
 
92
+ - A pending `question` in the `Unattended:` line → say that the next phase will ask it first (flow-core §2.1); the next step itself comes from `phase` as always.
87
93
  - Suggest the concrete command from `phase` and `size`. Interrupted phase (e.g. `build` with an empty artifact) → suggest rerunning it with `/flow-feat-build` or `/flow-bug-fix`.
88
94
  - §2.5 found something new → let it inform the suggestion (a contract that arrived after you left may mean rerunning `design` rather than continuing `build`); say why in one line.
89
95
  - `meta.json.related_repos` entries not `done` → remind that a **sibling repo still has a pending part** (`<repo>: <scope>`, plus `contract not handed over` when its `contract_handoff` is `pending`); suggest `/flow-feat-start <TICKET>` there. flow only reminds; it never scans or touches the other repo.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "flow-workflows",
3
- "version": "0.81.0",
3
+ "version": "0.82.1",
4
4
  "description": "Guided feat/bug workflows (start→ship), post-deploy monitoring and multi-agent code review, stack-agnostic. Each repo uses a shared FLOW.md plus optional harness overlay.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -3,7 +3,7 @@
3
3
  "name": "flow",
4
4
  "displayName": "Flow — guided dev workflows",
5
5
  "description": "Guided feat/bug workflows (start→ship), post-deploy monitoring and multi-agent code review, stack-agnostic. Each repo uses a shared FLOW.md plus optional harness overlay.",
6
- "version": "0.81.0",
6
+ "version": "0.82.1",
7
7
  "author": {
8
8
  "name": "Alberto Vioque",
9
9
  "email": "mashware@gmail.com"
@@ -5,6 +5,42 @@ plugin and is what `/flow:news` reads to show you what changed since your previo
5
5
 
6
6
  The canonical, richest notes live in the [GitHub Releases](https://github.com/mashware/flow-workflows/releases).
7
7
 
8
+ ## v0.82.1 — A red suite no longer ships because the run called it old · 2026-09-29
9
+
10
+ **In short**
11
+ - **An unattended `validate` could pass a red suite on its own judgement.** It decided the failures
12
+ were "pre-existing", chained into `ship`, recorded nothing, and the draft MR/PR never said the suite
13
+ was red.
14
+ - **Now that call is a measurement.** A red suite advances only when every failing test also fails,
15
+ under the same name, on the base; none of them is in a file the diff touches; and none proves an
16
+ acceptance criterion. Anything short of that ends the run `blocked`.
17
+ - **And it is visible.** The run records it in `meta.json`, `07-validation.md` names each test and
18
+ the base it was checked on, and the MR/PR lists them under "Not verified — needs a human".
19
+
20
+ Reported in #172.
21
+
22
+ ## v0.82.0 — Nobody at the terminal, and the run still gets somewhere · 2026-09-29
23
+
24
+ **In short**
25
+ - **A new autonomy mode, `unattended`, for runs nobody watches** — a script, a container, a headless
26
+ CLI. It behaves like `auto` and never asks. Before, such a run stopped for good at the first hard
27
+ gate: the brief, a serious review finding, `ship`, or any question left in prose for nobody.
28
+ - **It goes as far as it can without a person, and says exactly where it needs one.** The business
29
+ brief is written down and travels in the MR/PR body. `ship` opens a **draft** MR/PR only with
30
+ `autonomy.unattended_ship: draft` — never merged, never marked ready, never force-pushed. A
31
+ migration, serious review findings, a product decision or a doubt about the ticket end the run with
32
+ the question and its options in `.claude/work/stop.json`; a checkout or ticket the run cannot use
33
+ ends it as `blocked`. Nothing that protects the repo is approved in silence.
34
+ - **A runner reads one file.** `.claude/work/stop.json` says `running` while a phase works (left
35
+ behind = the run crashed), then `question`, `blocked` or `done` with the MR/PR. While a question is
36
+ pending no new unattended run goes past it. A person picks the work up in their own session:
37
+ `/flow:work:resume` shows the question, the next phase asks it first, and the file then says
38
+ `picked_up`. Keep `unattended` in a FLOW file only the runner's environment reads.
39
+ - **One MR/PR per run**, and only when written by hand: `unattended` is never inferred from a
40
+ headless harness, `/flow:init` does not offer it, and `manual`, `guided` and `auto` are unchanged.
41
+
42
+ Asked for in #168. Continuing a run automatically from an answer is not in this release.
43
+
8
44
  ## v0.81.0 — The review stopped contradicting itself · 2026-09-26
9
45
 
10
46
  **In short**
@@ -89,7 +89,7 @@ Branch and Pull/Merge Request conventions.
89
89
  ## autonomy
90
90
  How much the flow advances on its own vs. stopping to ask you.
91
91
 
92
- - `mode:` # `manual` (default) | `guided` | `auto`. Empty = `manual`.
92
+ - `mode:` # `manual` (default) | `guided` | `auto` | `unattended`. Empty = `manual`.
93
93
  # manual — every phase stops at each decision point and, at the end, proposes the
94
94
  # next command as a one-click confirmation (you accept to advance, it is
95
95
  # never typed for you and never runs without your confirmation).
@@ -99,7 +99,12 @@ How much the flow advances on its own vs. stopping to ask you.
99
99
  # automatically (no advance confirmation).
100
100
  # auto — as guided, plus auto-resolves the remaining decision points with sensible
101
101
  # (recorded) defaults, chaining phases without pausing.
102
- # HARD GATES stop and ask in EVERY mode, no exceptions: any push or MR/PR (ship),
102
+ # unattended — as auto, for a run nobody watches (script, container, headless CLI):
103
+ # never asks; each hard gate is recorded, becomes a draft MR/PR, or ends
104
+ # the run with a question in .claude/work/stop.json for a runner to
105
+ # post and a person to pick up. One MR/PR per run. Only when set explicitly —
106
+ # in a FLOW file only the runner's environment reads.
107
+ # HARD GATES stop and ask in manual/guided/auto, no exceptions: any push or MR/PR (ship),
103
108
  # branch creation with an ambiguous base, DB schema changes/migrations, a review
104
109
  # with high-severity findings, and the business brief confirmed just before the
105
110
  # first edit in `build`/`fix`.
@@ -107,6 +112,10 @@ How much the flow advances on its own vs. stopping to ask you.
107
112
  # (panels, challengers, how many reviewers), WIP commits, continuing a train when
108
113
  # the train's next MR/PR in `guided`/`auto`, size confirmation, and anything already decided
109
114
  # and recorded — only new contradicting evidence reopens a settled decision.
115
+ - `unattended_ship:` # What `ship` does in `unattended`: `draft` | `stop`. Empty = `stop`.
116
+ # draft — push the work branch and open the MR/PR as draft; never merge, never ready.
117
+ # stop — nothing is pushed; ship ends the run with a question in stop.json.
118
+ # Read only when mode is `unattended`.
110
119
 
111
120
  ## quality
112
121
  Repo commands for quality gates, whatever the stack — `make test`, `./gradlew test`, `dotnet test`,
@@ -256,7 +265,7 @@ subagent ignores the value and the step says so once, in one line.
256
265
  # brings back status plus evidence — job names, exit codes, log tail, run URL — and never
257
266
  # rules on it: triage and the merge verdict stay on the main thread whatever this says.
258
267
  # Empty = falls back to `agents`, then to what the command runs on, and the dispatch says so
259
- # in one line — an unattended wait is the one place an unpriced default runs longest.
268
+ # in one line — an unwatched wait is the one place an unpriced default runs longest.
260
269
 
261
270
  **Three keys, one per kind of subagent — not one per kind of step.** There used to be five —
262
271
  `study`, `code`, `test`, `review` — named after phases. They promised a granularity no harness