flow-workflows 0.94.0 → 0.94.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.94.0`.** Compare it once, at the start of the session, against
20
+ **This file belongs to flow `0.94.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
@@ -96,9 +96,11 @@ switch" case included, and only while no build or fix has begun (neither `05-imp
96
96
  that is where it lives. A study writes no code, so its branch still sits where the base was when the
97
97
  study began; an approval that waited for the tickets the study depends on (`meta.json.ticket_deps`)
98
98
  would otherwise build on a base that lacks them. `<base>` = `meta.json.base`, empty →
99
- `git.default_base`: `git fetch origin <base>`, then `<ref>` = `origin/<base>`; the fetch failing
100
- with a remote configured → `blocked`, since a stale ref would leave the build on the old base
101
- unnoticed. No remote → the local `<base>`. `git merge-base --is-ancestor HEAD <ref>` and `HEAD` is not
99
+ `git.default_base`: `git fetch origin <base>` when a remote is configured (best-effort, as
100
+ `$flow-feat-build` does — a fetch the container cannot make is not an error: the orchestrator left
101
+ `origin/<base>` where the forge had it when it launched the run, and a container is given no git
102
+ credentials), then `<ref>` = `origin/<base>` when it resolves, the local `<base>` otherwise. Neither
103
+ resolves → `blocked`. `git merge-base --is-ancestor HEAD <ref>` and `HEAD` is not
102
104
  `<ref>` → the branch holds no commit of its own and the base moved: `git merge --ff-only <ref>`, and
103
105
  record `{ "key": "unattended:base-caught-up", "default": "<old short sha> → <new short sha> on
104
106
  <base>", "phase": "run" }`. The fast-forward fails → `blocked`, its message as the reason. Not an
@@ -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.94.0`.** Compare it once, at the start of the session, against
19
+ **This file belongs to flow `0.94.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
@@ -92,9 +92,11 @@ switch" case included, and only while no build or fix has begun (neither `05-imp
92
92
  that is where it lives. A study writes no code, so its branch still sits where the base was when the
93
93
  study began; an approval that waited for the tickets the study depends on (`meta.json.ticket_deps`)
94
94
  would otherwise build on a base that lacks them. `<base>` = `meta.json.base`, empty →
95
- `git.default_base`: `git fetch origin <base>`, then `<ref>` = `origin/<base>`; the fetch failing
96
- with a remote configured → `blocked`, since a stale ref would leave the build on the old base
97
- unnoticed. No remote → the local `<base>`. `git merge-base --is-ancestor HEAD <ref>` and `HEAD` is not
95
+ `git.default_base`: `git fetch origin <base>` when a remote is configured (best-effort, as
96
+ `/flow:feat:build` does — a fetch the container cannot make is not an error: the orchestrator left
97
+ `origin/<base>` where the forge had it when it launched the run, and a container is given no git
98
+ credentials), then `<ref>` = `origin/<base>` when it resolves, the local `<base>` otherwise. Neither
99
+ resolves → `blocked`. `git merge-base --is-ancestor HEAD <ref>` and `HEAD` is not
98
100
  `<ref>` → the branch holds no commit of its own and the base moved: `git merge --ff-only <ref>`, and
99
101
  record `{ "key": "unattended:base-caught-up", "default": "<old short sha> → <new short sha> on
100
102
  <base>", "phase": "run" }`. The fast-forward fails → `blocked`, its message as the reason. Not an
@@ -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.94.0`.** Compare it once, at the start of the session, against
20
+ **This file belongs to flow `0.94.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
@@ -96,9 +96,11 @@ switch" case included, and only while no build or fix has begun (neither `05-imp
96
96
  that is where it lives. A study writes no code, so its branch still sits where the base was when the
97
97
  study began; an approval that waited for the tickets the study depends on (`meta.json.ticket_deps`)
98
98
  would otherwise build on a base that lacks them. `<base>` = `meta.json.base`, empty →
99
- `git.default_base`: `git fetch origin <base>`, then `<ref>` = `origin/<base>`; the fetch failing
100
- with a remote configured → `blocked`, since a stale ref would leave the build on the old base
101
- unnoticed. No remote → the local `<base>`. `git merge-base --is-ancestor HEAD <ref>` and `HEAD` is not
99
+ `git.default_base`: `git fetch origin <base>` when a remote is configured (best-effort, as
100
+ `/flow-feat-build` does — a fetch the container cannot make is not an error: the orchestrator left
101
+ `origin/<base>` where the forge had it when it launched the run, and a container is given no git
102
+ credentials), then `<ref>` = `origin/<base>` when it resolves, the local `<base>` otherwise. Neither
103
+ resolves → `blocked`. `git merge-base --is-ancestor HEAD <ref>` and `HEAD` is not
102
104
  `<ref>` → the branch holds no commit of its own and the base moved: `git merge --ff-only <ref>`, and
103
105
  record `{ "key": "unattended:base-caught-up", "default": "<old short sha> → <new short sha> on
104
106
  <base>", "phase": "run" }`. The fast-forward fails → `blocked`, its message as the reason. Not an
@@ -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.94.0`.** Compare it once, at the start of the session, against
19
+ **This file belongs to flow `0.94.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
@@ -94,9 +94,11 @@ switch" case included, and only while no build or fix has begun (neither `05-imp
94
94
  that is where it lives. A study writes no code, so its branch still sits where the base was when the
95
95
  study began; an approval that waited for the tickets the study depends on (`meta.json.ticket_deps`)
96
96
  would otherwise build on a base that lacks them. `<base>` = `meta.json.base`, empty →
97
- `git.default_base`: `git fetch origin <base>`, then `<ref>` = `origin/<base>`; the fetch failing
98
- with a remote configured → `blocked`, since a stale ref would leave the build on the old base
99
- unnoticed. No remote → the local `<base>`. `git merge-base --is-ancestor HEAD <ref>` and `HEAD` is not
97
+ `git.default_base`: `git fetch origin <base>` when a remote is configured (best-effort, as
98
+ `/flow-feat-build` does — a fetch the container cannot make is not an error: the orchestrator left
99
+ `origin/<base>` where the forge had it when it launched the run, and a container is given no git
100
+ credentials), then `<ref>` = `origin/<base>` when it resolves, the local `<base>` otherwise. Neither
101
+ resolves → `blocked`. `git merge-base --is-ancestor HEAD <ref>` and `HEAD` is not
100
102
  `<ref>` → the branch holds no commit of its own and the base moved: `git merge --ff-only <ref>`, and
101
103
  record `{ "key": "unattended:base-caught-up", "default": "<old short sha> → <new short sha> on
102
104
  <base>", "phase": "run" }`. The fast-forward fails → `blocked`, its message as the reason. Not an
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "flow-workflows",
3
- "version": "0.94.0",
3
+ "version": "0.94.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.94.0",
6
+ "version": "0.94.1",
7
7
  "author": {
8
8
  "name": "Alberto Vioque",
9
9
  "email": "mashware@gmail.com"
@@ -5,6 +5,21 @@ 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.94.1 — An unattended start with a study no longer stops because the container cannot fetch · 2026-10-14
9
+
10
+ **In short**
11
+ - **`/flow:work:run` on `start` takes the base the orchestrator left** when `git fetch origin <base>`
12
+ fails, as `/flow:feat:build` already did. A container is given no git credentials, so that fetch
13
+ could never succeed there, and every handed-off study stopped as `blocked` before building.
14
+ - Nothing changes on a laptop or outside `unattended`: the fetch still runs first, and a fetch that
15
+ works still decides the base.
16
+
17
+ The catch-up of a study's branch with its base fetched `origin/<base>` and treated a failed fetch as
18
+ `blocked`, to avoid building on a stale ref. Under an orchestrator that ref is not stale: the
19
+ contract has it leave `origin/<base>` where the forge had it when the run was launched, and gives the
20
+ container no credentials to fetch with. The fetch is now best-effort; `origin/<base>` is used when it
21
+ resolves, the local `<base>` otherwise, and the run is `blocked` only when neither does.
22
+
8
23
  ## v0.94.0 — A repo commits the FLOW config for where flow runs, and whoever launches flow picks it · 2026-10-14
9
24
 
10
25
  **In short**