flow-workflows 0.95.0 → 0.95.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.
@@ -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.95.0`.** Compare it once, at the start of the session, against
20
+ **This file belongs to flow `0.95.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
@@ -394,6 +394,7 @@ person asking for changes, a ticket that already has code — is `$flow-work-run
394
394
  | An approved study's branch (`run`, `why = start`, no build or fix begun) | record — fast-forwarded to its base when it holds no commit of its own (`$flow-work-run` §2); the base unreadable or the fast-forward failing → blocked. Not integrating: nothing of the run's is merged |
395
395
  | Integrating the base into the MR/PR's branch (`green`) | on `why = conflict`, record — `git merge origin/<base>` as the orchestrator left it, never rebase, each conflict resolved on its merits (`$flow-work-green` §5.C); on any other `why`, blocked — the orchestrator brings the base in |
396
396
  | 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 |
397
+ | A wait — a suite, a quality gate, anything run in the background (`validate`, `review`) | in the turn, on its condition, with a deadline (§6.5) — never a supervisor, never a fixed-length sleep, never ending the turn to be woken |
397
398
  | 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 |
398
399
  | Anything `auto` already decides on its own (size, flow mechanics, WIP commits, the next command) | as `auto` |
399
400
 
@@ -802,7 +803,7 @@ merge now. Delegating that judgement is how a pipeline ends up declared green by
802
803
  cheapest to ask, which is the one thing `$flow-work-green` exists to forbid. Delegate the waiting
803
804
  and the evidence; the verdict stays here.
804
805
 
805
- **Then end the turn.** Dispatching a supervisor and staying in a poll loop of your own pays both
806
+ **Then end the turn** — except in `unattended`, below. Dispatching a supervisor and staying in a poll loop of your own pays both
806
807
  bills and saves nothing. What wakes you is whatever the harness offers — a background task that
807
808
  re-invokes you when it finishes, a scheduled wake-up, a message back to this thread; where it offers
808
809
  none, the supervisor's evidence file is read at your next stop, and **you say that** rather than
@@ -819,6 +820,21 @@ moving.
819
820
  than to run — the brief, the round trip and the report are the whole of the saving. And anything you
820
821
  must *react to* mid-wait is not a wait at all: it is the work, and it stays here.
821
822
 
823
+ **In `unattended`, the wait stays in the turn** (§2.1). Nobody can bring back a run whose turn
824
+ ended, and whether a headless harness re-invokes a run when its background task finishes is not
825
+ something the run can count on. So no supervisor and no ending the turn: the wait is sat through
826
+ here, on the condition it waits for, with a deadline —
827
+
828
+ - **In the foreground**, when the command fits the harness's own limit for one call.
829
+ - **Otherwise launched with its exit code written to a file**, then waited on by a loop that checks
830
+ for that file every few seconds and stops at the deadline — one tool call per stretch, each under
831
+ that same limit, repeated until the file appears or the deadline passes. The loop runs inside the
832
+ call, so its cycles cost nothing on this thread.
833
+ - **Never a fixed-length sleep.** A guessed duration pays the whole sleep when the suite finished in
834
+ a fraction of it, and wakes before the suite when the guess is short.
835
+
836
+ The deadline reached with nothing back → `blocked`, naming the command and how long it ran.
837
+
822
838
  ### 6.6 — Which agent a role resolves to
823
839
 
824
840
  **The harness already tells you which agents are installed**, each with a line on what it is for,
@@ -41,7 +41,7 @@ Read `~/.claude/flow/CORE.codex.md` first (shared rules: `FLOW.md` step 0, model
41
41
 
42
42
  Then:
43
43
  1. Run only that test with `quality.test_one` from FLOW.md; it must pass.
44
- 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).
44
+ 2. Run the full suite with `quality.test` to rule out collateral regressions (in the background if slow — in `unattended`, waited on in this turn, flow-core §6.5; otherwise, 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).
45
45
  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 without an answer — a schema difference to apply is question
46
46
  `migration`, flow-core §2.1; the orchestrator's *Apply it* relaunches this phase, this site takes the
47
47
  answer just applied and runs it, and `05-validation.md` names that answer beside the migration).
@@ -302,7 +302,7 @@ Not run for XS/S, small diffs, or fewer than 4 ambiguous findings. When skipped,
302
302
 
303
303
  Read `quality.*` from `FLOW.md`. Empty → auto-discover equivalent commands (Makefile, npm/composer scripts, Gradle, dotnet, Xcode, Flutter…) and note what you use.
304
304
 
305
- Launch in parallel (background if slow):
305
+ Launch in parallel (background if slow; in `unattended`, waited on in this turn, flow-core §6.5):
306
306
  - `quality.style_fix`
307
307
  - `quality.static_analysis`
308
308
  - `quality.test_one` (if there are new tests, with the appropriate filter)
@@ -46,7 +46,7 @@ One of the three below writes and two of them read, so they do not all go at onc
46
46
 
47
47
  **A green suite is not a performance result** — a tiny fixture database proves a query's **rows**, never its **plan**. If `$flow-feat-review §3.6` left any query verdict `unresolved`, or an acceptance criterion concerns speed or volume: run the measurement of **`$flow-work-query §4`** with the volumes in `data.volumes` (or a data set shaped like them — the distribution matters more than the total), record plan and timings, and gate on the result. No `data.*` configuration and the criterion cannot be measured → it is `unproven` with the reason, never silently `proven`.
48
48
 
49
- 3. **Full suite**: run `quality.test` from `FLOW.md` in the background; if empty, auto-discover the project's test command and note what you use. **A suite measured in tens of minutes is a wait, not a step**: hand it to a supervisor subagent on `models.supervisors` (flow-core §6.5) — it runs it, times out, and brings back the exit code plus the failing tests' output, never a reading of whether those failures matter. Short suites stay here; delegating ninety seconds costs more than running them. A repo with more than one suite chains them in that one key (`make test && make test-frontend`); when it does not and the diff touches a suite the key misses, run that one too and say so in one line.
49
+ 3. **Full suite**: run `quality.test` from `FLOW.md` in the background (in `unattended`, waited on in this turn, flow-core §6.5); if empty, auto-discover the project's test command and note what you use. **A suite measured in tens of minutes is a wait, not a step**: hand it to a supervisor subagent on `models.supervisors` (flow-core §6.5) — it runs it, times out, and brings back the exit code plus the failing tests' output, never a reading of whether those failures matter. Short suites stay here; delegating ninety seconds costs more than running them. A repo with more than one suite chains them in that one key (`make test && make test-frontend`); when it does not and the diff touches a suite the key misses, run that one too and say so in one line.
50
50
 
51
51
  ## 3. Criteria coverage (S and larger)
52
52
 
@@ -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.95.0`.** Compare it once, at the start of the session, against
19
+ **This file belongs to flow `0.95.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
@@ -393,6 +393,7 @@ person asking for changes, a ticket that already has code — is `/flow:work:run
393
393
  | An approved study's branch (`run`, `why = start`, no build or fix begun) | record — fast-forwarded to its base when it holds no commit of its own (`/flow:work:run` §2); the base unreadable or the fast-forward failing → blocked. Not integrating: nothing of the run's is merged |
394
394
  | Integrating the base into the MR/PR's branch (`green`) | on `why = conflict`, record — `git merge origin/<base>` as the orchestrator left it, never rebase, each conflict resolved on its merits (`/flow:work:green` §5.C); on any other `why`, blocked — the orchestrator brings the base in |
395
395
  | 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 |
396
+ | A wait — a suite, a quality gate, anything run in the background (`validate`, `review`) | in the turn, on its condition, with a deadline (§6.5) — never a supervisor, never a fixed-length sleep, never ending the turn to be woken |
396
397
  | 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 |
397
398
  | Anything `auto` already decides on its own (size, flow mechanics, WIP commits, the next command) | as `auto` |
398
399
 
@@ -801,7 +802,7 @@ merge now. Delegating that judgement is how a pipeline ends up declared green by
801
802
  cheapest to ask, which is the one thing `/flow:work:green` exists to forbid. Delegate the waiting
802
803
  and the evidence; the verdict stays here.
803
804
 
804
- **Then end the turn.** Dispatching a supervisor and staying in a poll loop of your own pays both
805
+ **Then end the turn** — except in `unattended`, below. Dispatching a supervisor and staying in a poll loop of your own pays both
805
806
  bills and saves nothing. What wakes you is whatever the harness offers — a background task that
806
807
  re-invokes you when it finishes, a scheduled wake-up, a message back to this thread; where it offers
807
808
  none, the supervisor's evidence file is read at your next stop, and **you say that** rather than
@@ -818,6 +819,21 @@ moving.
818
819
  than to run — the brief, the round trip and the report are the whole of the saving. And anything you
819
820
  must *react to* mid-wait is not a wait at all: it is the work, and it stays here.
820
821
 
822
+ **In `unattended`, the wait stays in the turn** (§2.1). Nobody can bring back a run whose turn
823
+ ended, and whether a headless harness re-invokes a run when its background task finishes is not
824
+ something the run can count on. So no supervisor and no ending the turn: the wait is sat through
825
+ here, on the condition it waits for, with a deadline —
826
+
827
+ - **In the foreground**, when the command fits the harness's own limit for one call.
828
+ - **Otherwise launched with its exit code written to a file**, then waited on by a loop that checks
829
+ for that file every few seconds and stops at the deadline — one tool call per stretch, each under
830
+ that same limit, repeated until the file appears or the deadline passes. The loop runs inside the
831
+ call, so its cycles cost nothing on this thread.
832
+ - **Never a fixed-length sleep.** A guessed duration pays the whole sleep when the suite finished in
833
+ a fraction of it, and wakes before the suite when the guess is short.
834
+
835
+ The deadline reached with nothing back → `blocked`, naming the command and how long it ran.
836
+
821
837
  ### 6.6 — Which agent a role resolves to
822
838
 
823
839
  **The harness already tells you which agents are installed**, each with a line on what it is for,
@@ -37,7 +37,7 @@ Read `~/.claude/flow/CORE.gemini.md` first (shared rules: `FLOW.md` step 0, mode
37
37
 
38
38
  Then:
39
39
  1. Run only that test with `quality.test_one` from FLOW.md; it must pass.
40
- 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).
40
+ 2. Run the full suite with `quality.test` to rule out collateral regressions (in the background if slow — in `unattended`, waited on in this turn, flow-core §6.5; otherwise, 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).
41
41
  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 without an answer — a schema difference to apply is question
42
42
  `migration`, flow-core §2.1; the orchestrator's *Apply it* relaunches this phase, this site takes the
43
43
  answer just applied and runs it, and `05-validation.md` names that answer beside the migration).
@@ -298,7 +298,7 @@ Not run for XS/S, small diffs, or fewer than 4 ambiguous findings. When skipped,
298
298
 
299
299
  Read `quality.*` from `FLOW.md`. Empty → auto-discover equivalent commands (Makefile, npm/composer scripts, Gradle, dotnet, Xcode, Flutter…) and note what you use.
300
300
 
301
- Launch in parallel (background if slow):
301
+ Launch in parallel (background if slow; in `unattended`, waited on in this turn, flow-core §6.5):
302
302
  - `quality.style_fix`
303
303
  - `quality.static_analysis`
304
304
  - `quality.test_one` (if there are new tests, with the appropriate filter)
@@ -42,7 +42,7 @@ One of the three below writes and two of them read, so they do not all go at onc
42
42
 
43
43
  **A green suite is not a performance result** — a tiny fixture database proves a query's **rows**, never its **plan**. If `/flow:feat:review §3.6` left any query verdict `unresolved`, or an acceptance criterion concerns speed or volume: run the measurement of **`/flow:work:query §4`** with the volumes in `data.volumes` (or a data set shaped like them — the distribution matters more than the total), record plan and timings, and gate on the result. No `data.*` configuration and the criterion cannot be measured → it is `unproven` with the reason, never silently `proven`.
44
44
 
45
- 3. **Full suite**: run `quality.test` from `FLOW.md` in the background; if empty, auto-discover the project's test command and note what you use. **A suite measured in tens of minutes is a wait, not a step**: hand it to a supervisor subagent on `models.supervisors` (flow-core §6.5) — it runs it, times out, and brings back the exit code plus the failing tests' output, never a reading of whether those failures matter. Short suites stay here; delegating ninety seconds costs more than running them. A repo with more than one suite chains them in that one key (`make test && make test-frontend`); when it does not and the diff touches a suite the key misses, run that one too and say so in one line.
45
+ 3. **Full suite**: run `quality.test` from `FLOW.md` in the background (in `unattended`, waited on in this turn, flow-core §6.5); if empty, auto-discover the project's test command and note what you use. **A suite measured in tens of minutes is a wait, not a step**: hand it to a supervisor subagent on `models.supervisors` (flow-core §6.5) — it runs it, times out, and brings back the exit code plus the failing tests' output, never a reading of whether those failures matter. Short suites stay here; delegating ninety seconds costs more than running them. A repo with more than one suite chains them in that one key (`make test && make test-frontend`); when it does not and the diff touches a suite the key misses, run that one too and say so in one line.
46
46
 
47
47
  ## 3. Criteria coverage (S and larger)
48
48
 
@@ -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.95.0`.** Compare it once, at the start of the session, against
20
+ **This file belongs to flow `0.95.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
@@ -394,6 +394,7 @@ person asking for changes, a ticket that already has code — is `/flow-work-run
394
394
  | An approved study's branch (`run`, `why = start`, no build or fix begun) | record — fast-forwarded to its base when it holds no commit of its own (`/flow-work-run` §2); the base unreadable or the fast-forward failing → blocked. Not integrating: nothing of the run's is merged |
395
395
  | Integrating the base into the MR/PR's branch (`green`) | on `why = conflict`, record — `git merge origin/<base>` as the orchestrator left it, never rebase, each conflict resolved on its merits (`/flow-work-green` §5.C); on any other `why`, blocked — the orchestrator brings the base in |
396
396
  | 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 |
397
+ | A wait — a suite, a quality gate, anything run in the background (`validate`, `review`) | in the turn, on its condition, with a deadline (§6.5) — never a supervisor, never a fixed-length sleep, never ending the turn to be woken |
397
398
  | 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 |
398
399
  | Anything `auto` already decides on its own (size, flow mechanics, WIP commits, the next command) | as `auto` |
399
400
 
@@ -802,7 +803,7 @@ merge now. Delegating that judgement is how a pipeline ends up declared green by
802
803
  cheapest to ask, which is the one thing `/flow-work-green` exists to forbid. Delegate the waiting
803
804
  and the evidence; the verdict stays here.
804
805
 
805
- **Then end the turn.** Dispatching a supervisor and staying in a poll loop of your own pays both
806
+ **Then end the turn** — except in `unattended`, below. Dispatching a supervisor and staying in a poll loop of your own pays both
806
807
  bills and saves nothing. What wakes you is whatever the harness offers — a background task that
807
808
  re-invokes you when it finishes, a scheduled wake-up, a message back to this thread; where it offers
808
809
  none, the supervisor's evidence file is read at your next stop, and **you say that** rather than
@@ -819,6 +820,21 @@ moving.
819
820
  than to run — the brief, the round trip and the report are the whole of the saving. And anything you
820
821
  must *react to* mid-wait is not a wait at all: it is the work, and it stays here.
821
822
 
823
+ **In `unattended`, the wait stays in the turn** (§2.1). Nobody can bring back a run whose turn
824
+ ended, and whether a headless harness re-invokes a run when its background task finishes is not
825
+ something the run can count on. So no supervisor and no ending the turn: the wait is sat through
826
+ here, on the condition it waits for, with a deadline —
827
+
828
+ - **In the foreground**, when the command fits the harness's own limit for one call.
829
+ - **Otherwise launched with its exit code written to a file**, then waited on by a loop that checks
830
+ for that file every few seconds and stops at the deadline — one tool call per stretch, each under
831
+ that same limit, repeated until the file appears or the deadline passes. The loop runs inside the
832
+ call, so its cycles cost nothing on this thread.
833
+ - **Never a fixed-length sleep.** A guessed duration pays the whole sleep when the suite finished in
834
+ a fraction of it, and wakes before the suite when the guess is short.
835
+
836
+ The deadline reached with nothing back → `blocked`, naming the command and how long it ran.
837
+
822
838
  ### 6.6 — Which agent a role resolves to
823
839
 
824
840
  **The harness already tells you which agents are installed**, each with a line on what it is for,
@@ -41,7 +41,7 @@ Read `~/.claude/flow/CORE.hermes.md` first (shared rules: `FLOW.md` step 0, mode
41
41
 
42
42
  Then:
43
43
  1. Run only that test with `quality.test_one` from FLOW.md; it must pass.
44
- 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).
44
+ 2. Run the full suite with `quality.test` to rule out collateral regressions (in the background if slow — in `unattended`, waited on in this turn, flow-core §6.5; otherwise, 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).
45
45
  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 without an answer — a schema difference to apply is question
46
46
  `migration`, flow-core §2.1; the orchestrator's *Apply it* relaunches this phase, this site takes the
47
47
  answer just applied and runs it, and `05-validation.md` names that answer beside the migration).
@@ -302,7 +302,7 @@ Not run for XS/S, small diffs, or fewer than 4 ambiguous findings. When skipped,
302
302
 
303
303
  Read `quality.*` from `FLOW.md`. Empty → auto-discover equivalent commands (Makefile, npm/composer scripts, Gradle, dotnet, Xcode, Flutter…) and note what you use.
304
304
 
305
- Launch in parallel (background if slow):
305
+ Launch in parallel (background if slow; in `unattended`, waited on in this turn, flow-core §6.5):
306
306
  - `quality.style_fix`
307
307
  - `quality.static_analysis`
308
308
  - `quality.test_one` (if there are new tests, with the appropriate filter)
@@ -46,7 +46,7 @@ One of the three below writes and two of them read, so they do not all go at onc
46
46
 
47
47
  **A green suite is not a performance result** — a tiny fixture database proves a query's **rows**, never its **plan**. If `/flow-feat-review §3.6` left any query verdict `unresolved`, or an acceptance criterion concerns speed or volume: run the measurement of **`/flow-work-query §4`** with the volumes in `data.volumes` (or a data set shaped like them — the distribution matters more than the total), record plan and timings, and gate on the result. No `data.*` configuration and the criterion cannot be measured → it is `unproven` with the reason, never silently `proven`.
48
48
 
49
- 3. **Full suite**: run `quality.test` from `FLOW.md` in the background; if empty, auto-discover the project's test command and note what you use. **A suite measured in tens of minutes is a wait, not a step**: hand it to a supervisor subagent on `models.supervisors` (flow-core §6.5) — it runs it, times out, and brings back the exit code plus the failing tests' output, never a reading of whether those failures matter. Short suites stay here; delegating ninety seconds costs more than running them. A repo with more than one suite chains them in that one key (`make test && make test-frontend`); when it does not and the diff touches a suite the key misses, run that one too and say so in one line.
49
+ 3. **Full suite**: run `quality.test` from `FLOW.md` in the background (in `unattended`, waited on in this turn, flow-core §6.5); if empty, auto-discover the project's test command and note what you use. **A suite measured in tens of minutes is a wait, not a step**: hand it to a supervisor subagent on `models.supervisors` (flow-core §6.5) — it runs it, times out, and brings back the exit code plus the failing tests' output, never a reading of whether those failures matter. Short suites stay here; delegating ninety seconds costs more than running them. A repo with more than one suite chains them in that one key (`make test && make test-frontend`); when it does not and the diff touches a suite the key misses, run that one too and say so in one line.
50
50
 
51
51
  ## 3. Criteria coverage (S and larger)
52
52
 
@@ -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.95.0`.** Compare it once, at the start of the session, against
19
+ **This file belongs to flow `0.95.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
@@ -393,6 +393,7 @@ person asking for changes, a ticket that already has code — is `/flow-work-run
393
393
  | An approved study's branch (`run`, `why = start`, no build or fix begun) | record — fast-forwarded to its base when it holds no commit of its own (`/flow-work-run` §2); the base unreadable or the fast-forward failing → blocked. Not integrating: nothing of the run's is merged |
394
394
  | Integrating the base into the MR/PR's branch (`green`) | on `why = conflict`, record — `git merge origin/<base>` as the orchestrator left it, never rebase, each conflict resolved on its merits (`/flow-work-green` §5.C); on any other `why`, blocked — the orchestrator brings the base in |
395
395
  | 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 |
396
+ | A wait — a suite, a quality gate, anything run in the background (`validate`, `review`) | in the turn, on its condition, with a deadline (§6.5) — never a supervisor, never a fixed-length sleep, never ending the turn to be woken |
396
397
  | 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 |
397
398
  | Anything `auto` already decides on its own (size, flow mechanics, WIP commits, the next command) | as `auto` |
398
399
 
@@ -801,7 +802,7 @@ merge now. Delegating that judgement is how a pipeline ends up declared green by
801
802
  cheapest to ask, which is the one thing `/flow-work-green` exists to forbid. Delegate the waiting
802
803
  and the evidence; the verdict stays here.
803
804
 
804
- **Then end the turn.** Dispatching a supervisor and staying in a poll loop of your own pays both
805
+ **Then end the turn** — except in `unattended`, below. Dispatching a supervisor and staying in a poll loop of your own pays both
805
806
  bills and saves nothing. What wakes you is whatever the harness offers — a background task that
806
807
  re-invokes you when it finishes, a scheduled wake-up, a message back to this thread; where it offers
807
808
  none, the supervisor's evidence file is read at your next stop, and **you say that** rather than
@@ -818,6 +819,21 @@ moving.
818
819
  than to run — the brief, the round trip and the report are the whole of the saving. And anything you
819
820
  must *react to* mid-wait is not a wait at all: it is the work, and it stays here.
820
821
 
822
+ **In `unattended`, the wait stays in the turn** (§2.1). Nobody can bring back a run whose turn
823
+ ended, and whether a headless harness re-invokes a run when its background task finishes is not
824
+ something the run can count on. So no supervisor and no ending the turn: the wait is sat through
825
+ here, on the condition it waits for, with a deadline —
826
+
827
+ - **In the foreground**, when the command fits the harness's own limit for one call.
828
+ - **Otherwise launched with its exit code written to a file**, then waited on by a loop that checks
829
+ for that file every few seconds and stops at the deadline — one tool call per stretch, each under
830
+ that same limit, repeated until the file appears or the deadline passes. The loop runs inside the
831
+ call, so its cycles cost nothing on this thread.
832
+ - **Never a fixed-length sleep.** A guessed duration pays the whole sleep when the suite finished in
833
+ a fraction of it, and wakes before the suite when the guess is short.
834
+
835
+ The deadline reached with nothing back → `blocked`, naming the command and how long it ran.
836
+
821
837
  ### 6.6 — Which agent a role resolves to
822
838
 
823
839
  **The harness already tells you which agents are installed**, each with a line on what it is for,
@@ -39,7 +39,7 @@ Read `~/.claude/flow/CORE.opencode.md` first (shared rules: `FLOW.md` step 0, mo
39
39
 
40
40
  Then:
41
41
  1. Run only that test with `quality.test_one` from FLOW.md; it must pass.
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).
42
+ 2. Run the full suite with `quality.test` to rule out collateral regressions (in the background if slow — in `unattended`, waited on in this turn, flow-core §6.5; otherwise, 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
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 without an answer — a schema difference to apply is question
44
44
  `migration`, flow-core §2.1; the orchestrator's *Apply it* relaunches this phase, this site takes the
45
45
  answer just applied and runs it, and `05-validation.md` names that answer beside the migration).
@@ -300,7 +300,7 @@ Not run for XS/S, small diffs, or fewer than 4 ambiguous findings. When skipped,
300
300
 
301
301
  Read `quality.*` from `FLOW.md`. Empty → auto-discover equivalent commands (Makefile, npm/composer scripts, Gradle, dotnet, Xcode, Flutter…) and note what you use.
302
302
 
303
- Launch in parallel (background if slow):
303
+ Launch in parallel (background if slow; in `unattended`, waited on in this turn, flow-core §6.5):
304
304
  - `quality.style_fix`
305
305
  - `quality.static_analysis`
306
306
  - `quality.test_one` (if there are new tests, with the appropriate filter)
@@ -44,7 +44,7 @@ One of the three below writes and two of them read, so they do not all go at onc
44
44
 
45
45
  **A green suite is not a performance result** — a tiny fixture database proves a query's **rows**, never its **plan**. If `/flow-feat-review §3.6` left any query verdict `unresolved`, or an acceptance criterion concerns speed or volume: run the measurement of **`/flow-work-query §4`** with the volumes in `data.volumes` (or a data set shaped like them — the distribution matters more than the total), record plan and timings, and gate on the result. No `data.*` configuration and the criterion cannot be measured → it is `unproven` with the reason, never silently `proven`.
46
46
 
47
- 3. **Full suite**: run `quality.test` from `FLOW.md` in the background; if empty, auto-discover the project's test command and note what you use. **A suite measured in tens of minutes is a wait, not a step**: hand it to a supervisor subagent on `models.supervisors` (flow-core §6.5) — it runs it, times out, and brings back the exit code plus the failing tests' output, never a reading of whether those failures matter. Short suites stay here; delegating ninety seconds costs more than running them. A repo with more than one suite chains them in that one key (`make test && make test-frontend`); when it does not and the diff touches a suite the key misses, run that one too and say so in one line.
47
+ 3. **Full suite**: run `quality.test` from `FLOW.md` in the background (in `unattended`, waited on in this turn, flow-core §6.5); if empty, auto-discover the project's test command and note what you use. **A suite measured in tens of minutes is a wait, not a step**: hand it to a supervisor subagent on `models.supervisors` (flow-core §6.5) — it runs it, times out, and brings back the exit code plus the failing tests' output, never a reading of whether those failures matter. Short suites stay here; delegating ninety seconds costs more than running them. A repo with more than one suite chains them in that one key (`make test && make test-frontend`); when it does not and the diff touches a suite the key misses, run that one too and say so in one line.
48
48
 
49
49
  ## 3. Criteria coverage (S and larger)
50
50
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "flow-workflows",
3
- "version": "0.95.0",
3
+ "version": "0.95.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.95.0",
6
+ "version": "0.95.1",
7
7
  "author": {
8
8
  "name": "Alberto Vioque",
9
9
  "email": "mashware@gmail.com"
@@ -5,6 +5,22 @@ 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.95.1 — An unattended run waits for its tests instead of sleeping a guess · 2026-10-15
9
+
10
+ **In short**
11
+ - **In `unattended`, a wait happens in the turn.** A suite or a quality gate run in the background
12
+ is waited on by a loop that ends when it finishes, with a deadline. No supervisor, and the turn
13
+ does not end to be woken.
14
+ - **Never a fixed-length sleep.** Unattended runs were guessing one — seven minutes for a suite
15
+ that took three — and losing up to half an hour per run.
16
+ - Nothing changes outside `unattended`.
17
+
18
+ The rule for waits told every run to hand the wait off and end the turn, trusting the harness to
19
+ wake it. A headless run cannot rely on that, so the model kept itself alive with a sleep of its
20
+ own choosing. flow-core §6.5 now says how an unattended run waits, the §2.1 table names the case,
21
+ and `validate` and `review` point to it where they launch something in the background. The
22
+ deadline reached with nothing back ends the run as `blocked`.
23
+
8
24
  ## v0.95.0 — One repo can study some works for handoff and build others here · 2026-10-15
9
25
 
10
26
  **In short**