flow-workflows 0.82.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.
- package/adapters/codex/CORE.md +2 -2
- package/adapters/codex/skills/flow-bug-validate/SKILL.md +1 -1
- package/adapters/codex/skills/flow-feat-ship/SKILL.md +3 -1
- package/adapters/codex/skills/flow-feat-validate/SKILL.md +4 -1
- package/adapters/gemini/CORE.md +2 -2
- package/adapters/gemini/commands/flow/bug/validate.toml +1 -1
- package/adapters/gemini/commands/flow/feat/ship.toml +3 -1
- package/adapters/gemini/commands/flow/feat/validate.toml +4 -1
- package/adapters/hermes/CORE.md +2 -2
- package/adapters/hermes/skills/flow-bug-validate/SKILL.md +1 -1
- package/adapters/hermes/skills/flow-feat-ship/SKILL.md +3 -1
- package/adapters/hermes/skills/flow-feat-validate/SKILL.md +4 -1
- package/adapters/opencode/CORE.md +2 -2
- package/adapters/opencode/commands/flow-bug-validate.md +1 -1
- package/adapters/opencode/commands/flow-feat-ship.md +3 -1
- package/adapters/opencode/commands/flow-feat-validate.md +4 -1
- package/package.json +1 -1
- package/plugins/flow/.claude-plugin/plugin.json +1 -1
- package/plugins/flow/CHANGELOG.md +14 -0
package/adapters/codex/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.82.
|
|
20
|
+
**This file belongs to flow `0.82.1`.** 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
|
|
@@ -246,7 +246,7 @@ The §3 stop header is still printed at every stop — a log is the only screen
|
|
|
246
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
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
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 |
|
|
249
|
+
| `validate` with a red suite or a criterion `unproven` | blocked — the phase does not advance and does not chain. **One exception, and it is measured, never judged**: every failing test also fails, under the same name, on the base (`git merge-base HEAD <git.default_base>`, run in a detached worktree), none of them lives in a file this diff touches, and none is the test that proves an acceptance criterion → record `{"key":"unattended:validate-red-base","default":"<n> red on HEAD and on base <short sha>: <test names>","phase":"validate"}` and advance; `ship` lists those tests under "Not verified — needs a human". Short of all three — a failure the base does not reproduce, a base that cannot be run, a test this diff touched — blocked |
|
|
250
250
|
| A product decision (§7 `decision`) | question `decision` |
|
|
251
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
252
|
| An unanswered high-severity challenge (`design`, `investigate`) | question `design_challenge` / `investigation_challenge` |
|
|
@@ -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 (in `unattended`, the run ends `blocked` with the failing test named, flow-core §2.1).
|
|
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 — unless every failing test also fails on the base, the one exception that row records; the reproduction test lives in a file this diff touches, so it never qualifies).
|
|
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.
|
|
@@ -52,7 +52,9 @@ pushes. Each place it would ask:
|
|
|
52
52
|
`$flow-feat-build`). It is the last thing the run does.
|
|
53
53
|
|
|
54
54
|
**In every mode**, criteria `07-validation.md` marks `not-verified-unattended` go into the body under
|
|
55
|
-
`## Not verified — needs a human`, with what to do for each
|
|
55
|
+
`## Not verified — needs a human`, with what to do for each — and so do the tests the suite left red
|
|
56
|
+
because they also fail on the base (`unattended:validate-red-base`): each name, and the base sha
|
|
57
|
+
where it failed too. The §3 preview shows that section like
|
|
56
58
|
any other, and the person reading it is the check the run could not do.
|
|
57
59
|
|
|
58
60
|
## 1. Pre-flight
|
|
@@ -225,6 +225,9 @@ Write `.claude/work/<TICKET>/07-validation.md`:
|
|
|
225
225
|
- **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`.
|
|
226
226
|
**In `unattended`** (flow-core §2.1): the phase advanced → chain into `$flow-feat-ship`, which
|
|
227
227
|
decides from `autonomy.unattended_ship` between a draft MR/PR and a question. It did not advance
|
|
228
|
-
(red suite, a criterion `unproven`) → `blocked`, naming what failed; never chain.
|
|
228
|
+
(red suite, a criterion `unproven`) → `blocked`, naming what failed; never chain. A red suite
|
|
229
|
+
advances only under the base exception of flow-core §2.1: run the failing tests on the base, and
|
|
230
|
+
write each name, its result there and the base sha under "Suite results" in `07-validation.md`.
|
|
231
|
+
Calling a failure "pre-existing" without that run is not the exception — it is a red suite.
|
|
229
232
|
|
|
230
233
|
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.
|
package/adapters/gemini/CORE.md
CHANGED
|
@@ -16,7 +16,7 @@ Every `/flow:*` command assumes these rules. They are stated once, here, so a co
|
|
|
16
16
|
carries what is specific to its phase. Read this once per session; a command that says "load
|
|
17
17
|
`flow-core`" means this file.
|
|
18
18
|
|
|
19
|
-
**This file belongs to flow `0.82.
|
|
19
|
+
**This file belongs to flow `0.82.1`.** Compare it once, at the start of the session, against
|
|
20
20
|
`version` in `~/.claude/flow/.claude-plugin/plugin.json`. The two differing means the session
|
|
21
21
|
is running a **mixture** — the commands from one copy of the plugin, these shared rules from another
|
|
22
22
|
— which is exactly what happens when a branch or a release candidate is loaded over an installed
|
|
@@ -245,7 +245,7 @@ The §3 stop header is still printed at every stop — a log is the only screen
|
|
|
245
245
|
| 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` |
|
|
246
246
|
| 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 |
|
|
247
247
|
| `review` with blockers or high-severity findings | question `high_findings` |
|
|
248
|
-
| `validate` with a red suite or a criterion `unproven` | blocked — the phase does not advance and does not chain |
|
|
248
|
+
| `validate` with a red suite or a criterion `unproven` | blocked — the phase does not advance and does not chain. **One exception, and it is measured, never judged**: every failing test also fails, under the same name, on the base (`git merge-base HEAD <git.default_base>`, run in a detached worktree), none of them lives in a file this diff touches, and none is the test that proves an acceptance criterion → record `{"key":"unattended:validate-red-base","default":"<n> red on HEAD and on base <short sha>: <test names>","phase":"validate"}` and advance; `ship` lists those tests under "Not verified — needs a human". Short of all three — a failure the base does not reproduce, a base that cannot be run, a test this diff touched — blocked |
|
|
249
249
|
| A product decision (§7 `decision`) | question `decision` |
|
|
250
250
|
| 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` |
|
|
251
251
|
| An unanswered high-severity challenge (`design`, `investigate`) | question `design_challenge` / `investigation_challenge` |
|
|
@@ -89,7 +89,7 @@ this is the same gate as a red test.
|
|
|
89
89
|
|
|
90
90
|
## 5. Close
|
|
91
91
|
|
|
92
|
-
- 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).
|
|
92
|
+
- 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 — unless every failing test also fails on the base, the one exception that row records; the reproduction test lives in a file this diff touches, so it never qualifies).
|
|
93
93
|
- 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`.
|
|
94
94
|
- **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.
|
|
95
95
|
- **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.
|
|
@@ -48,7 +48,9 @@ pushes. Each place it would ask:
|
|
|
48
48
|
`/flow:feat:build`). It is the last thing the run does.
|
|
49
49
|
|
|
50
50
|
**In every mode**, criteria `07-validation.md` marks `not-verified-unattended` go into the body under
|
|
51
|
-
`## Not verified — needs a human`, with what to do for each
|
|
51
|
+
`## Not verified — needs a human`, with what to do for each — and so do the tests the suite left red
|
|
52
|
+
because they also fail on the base (`unattended:validate-red-base`): each name, and the base sha
|
|
53
|
+
where it failed too. The §3 preview shows that section like
|
|
52
54
|
any other, and the person reading it is the check the run could not do.
|
|
53
55
|
|
|
54
56
|
## 1. Pre-flight
|
|
@@ -221,7 +221,10 @@ Write `.claude/work/<TICKET>/07-validation.md`:
|
|
|
221
221
|
- **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`.
|
|
222
222
|
**In `unattended`** (flow-core §2.1): the phase advanced → chain into `/flow:feat:ship`, which
|
|
223
223
|
decides from `autonomy.unattended_ship` between a draft MR/PR and a question. It did not advance
|
|
224
|
-
(red suite, a criterion `unproven`) → `blocked`, naming what failed; never chain.
|
|
224
|
+
(red suite, a criterion `unproven`) → `blocked`, naming what failed; never chain. A red suite
|
|
225
|
+
advances only under the base exception of flow-core §2.1: run the failing tests on the base, and
|
|
226
|
+
write each name, its result there and the base sha under "Suite results" in `07-validation.md`.
|
|
227
|
+
Calling a failure "pre-existing" without that run is not the exception — it is a red suite.
|
|
225
228
|
|
|
226
229
|
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.
|
|
227
230
|
"""
|
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.82.
|
|
20
|
+
**This file belongs to flow `0.82.1`.** 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
|
|
@@ -246,7 +246,7 @@ The §3 stop header is still printed at every stop — a log is the only screen
|
|
|
246
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
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
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 |
|
|
249
|
+
| `validate` with a red suite or a criterion `unproven` | blocked — the phase does not advance and does not chain. **One exception, and it is measured, never judged**: every failing test also fails, under the same name, on the base (`git merge-base HEAD <git.default_base>`, run in a detached worktree), none of them lives in a file this diff touches, and none is the test that proves an acceptance criterion → record `{"key":"unattended:validate-red-base","default":"<n> red on HEAD and on base <short sha>: <test names>","phase":"validate"}` and advance; `ship` lists those tests under "Not verified — needs a human". Short of all three — a failure the base does not reproduce, a base that cannot be run, a test this diff touched — blocked |
|
|
250
250
|
| A product decision (§7 `decision`) | question `decision` |
|
|
251
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
252
|
| An unanswered high-severity challenge (`design`, `investigate`) | question `design_challenge` / `investigation_challenge` |
|
|
@@ -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 (in `unattended`, the run ends `blocked` with the failing test named, flow-core §2.1).
|
|
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 — unless every failing test also fails on the base, the one exception that row records; the reproduction test lives in a file this diff touches, so it never qualifies).
|
|
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.
|
|
@@ -52,7 +52,9 @@ pushes. Each place it would ask:
|
|
|
52
52
|
`/flow-feat-build`). It is the last thing the run does.
|
|
53
53
|
|
|
54
54
|
**In every mode**, criteria `07-validation.md` marks `not-verified-unattended` go into the body under
|
|
55
|
-
`## Not verified — needs a human`, with what to do for each
|
|
55
|
+
`## Not verified — needs a human`, with what to do for each — and so do the tests the suite left red
|
|
56
|
+
because they also fail on the base (`unattended:validate-red-base`): each name, and the base sha
|
|
57
|
+
where it failed too. The §3 preview shows that section like
|
|
56
58
|
any other, and the person reading it is the check the run could not do.
|
|
57
59
|
|
|
58
60
|
## 1. Pre-flight
|
|
@@ -225,6 +225,9 @@ Write `.claude/work/<TICKET>/07-validation.md`:
|
|
|
225
225
|
- **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`.
|
|
226
226
|
**In `unattended`** (flow-core §2.1): the phase advanced → chain into `/flow-feat-ship`, which
|
|
227
227
|
decides from `autonomy.unattended_ship` between a draft MR/PR and a question. It did not advance
|
|
228
|
-
(red suite, a criterion `unproven`) → `blocked`, naming what failed; never chain.
|
|
228
|
+
(red suite, a criterion `unproven`) → `blocked`, naming what failed; never chain. A red suite
|
|
229
|
+
advances only under the base exception of flow-core §2.1: run the failing tests on the base, and
|
|
230
|
+
write each name, its result there and the base sha under "Suite results" in `07-validation.md`.
|
|
231
|
+
Calling a failure "pre-existing" without that run is not the exception — it is a red suite.
|
|
229
232
|
|
|
230
233
|
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.
|
|
@@ -16,7 +16,7 @@ Every `/flow-*` command assumes these rules. They are stated once, here, so a co
|
|
|
16
16
|
carries what is specific to its phase. Read this once per session; a command that says "load
|
|
17
17
|
`flow-core`" means this file.
|
|
18
18
|
|
|
19
|
-
**This file belongs to flow `0.82.
|
|
19
|
+
**This file belongs to flow `0.82.1`.** Compare it once, at the start of the session, against
|
|
20
20
|
`version` in `~/.claude/flow/.claude-plugin/plugin.json`. The two differing means the session
|
|
21
21
|
is running a **mixture** — the commands from one copy of the plugin, these shared rules from another
|
|
22
22
|
— which is exactly what happens when a branch or a release candidate is loaded over an installed
|
|
@@ -245,7 +245,7 @@ The §3 stop header is still printed at every stop — a log is the only screen
|
|
|
245
245
|
| 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` |
|
|
246
246
|
| 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 |
|
|
247
247
|
| `review` with blockers or high-severity findings | question `high_findings` |
|
|
248
|
-
| `validate` with a red suite or a criterion `unproven` | blocked — the phase does not advance and does not chain |
|
|
248
|
+
| `validate` with a red suite or a criterion `unproven` | blocked — the phase does not advance and does not chain. **One exception, and it is measured, never judged**: every failing test also fails, under the same name, on the base (`git merge-base HEAD <git.default_base>`, run in a detached worktree), none of them lives in a file this diff touches, and none is the test that proves an acceptance criterion → record `{"key":"unattended:validate-red-base","default":"<n> red on HEAD and on base <short sha>: <test names>","phase":"validate"}` and advance; `ship` lists those tests under "Not verified — needs a human". Short of all three — a failure the base does not reproduce, a base that cannot be run, a test this diff touched — blocked |
|
|
249
249
|
| A product decision (§7 `decision`) | question `decision` |
|
|
250
250
|
| 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` |
|
|
251
251
|
| An unanswered high-severity challenge (`design`, `investigate`) | question `design_challenge` / `investigation_challenge` |
|
|
@@ -91,7 +91,7 @@ this is the same gate as a red test.
|
|
|
91
91
|
|
|
92
92
|
## 5. Close
|
|
93
93
|
|
|
94
|
-
- 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).
|
|
94
|
+
- 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 — unless every failing test also fails on the base, the one exception that row records; the reproduction test lives in a file this diff touches, so it never qualifies).
|
|
95
95
|
- 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`.
|
|
96
96
|
- **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.
|
|
97
97
|
- **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.
|
|
@@ -50,7 +50,9 @@ pushes. Each place it would ask:
|
|
|
50
50
|
`/flow-feat-build`). It is the last thing the run does.
|
|
51
51
|
|
|
52
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
|
|
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
|
|
54
56
|
any other, and the person reading it is the check the run could not do.
|
|
55
57
|
|
|
56
58
|
## 1. Pre-flight
|
|
@@ -223,6 +223,9 @@ Write `.claude/work/<TICKET>/07-validation.md`:
|
|
|
223
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
224
|
**In `unattended`** (flow-core §2.1): the phase advanced → chain into `/flow-feat-ship`, which
|
|
225
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.
|
|
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.
|
|
227
230
|
|
|
228
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.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "flow-workflows",
|
|
3
|
-
"version": "0.82.
|
|
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.82.
|
|
6
|
+
"version": "0.82.1",
|
|
7
7
|
"author": {
|
|
8
8
|
"name": "Alberto Vioque",
|
|
9
9
|
"email": "mashware@gmail.com"
|
|
@@ -5,6 +5,20 @@ 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
|
+
|
|
8
22
|
## v0.82.0 — Nobody at the terminal, and the run still gets somewhere · 2026-09-29
|
|
9
23
|
|
|
10
24
|
**In short**
|