flow-workflows 0.67.0 → 0.68.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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.67.0`.** Compare it once, at the start of the session, against
20
+ **This file belongs to flow `0.68.0`.** Compare it once, at the start of the session, against
21
21
  `version` in `~/.claude/flow/.claude-plugin/plugin.json`. The two differing means the session
22
22
  is running a **mixture** — the commands from one copy of the plugin, these shared rules from another
23
23
  — which is exactly what happens when a branch or a release candidate is loaded over an installed
@@ -65,6 +65,15 @@ a command relies on is simply absent in that session, and nothing else will repo
65
65
  base branch — and goes out in no MR/PR at all. So a phase writing a tracked file writes it
66
66
  **here**, in the directory it is running in, and `$flow-feat-ship §5.5` is what catches the
67
67
  tools that could not be told.
68
+ - **A fenced block in a FLOW file is an example, and an example is not configuration.** These
69
+ files are prose with keys in them, and the rule that decides what a key *is* — a `- key:` line
70
+ under a `## section` — knows nothing about triple backticks. So a block written to be pasted
71
+ ("add this to try it once") was read as the configuration it illustrates, for as long as it sat
72
+ there. It happened in a real repo: `agents.exec_cmd` came from the fenced example of a file whose
73
+ prose argued at length that it was deliberately unset, and every review round took the one-shot
74
+ path that prose warned against — with nothing anywhere to say so, because the file and the
75
+ configuration disagreed while both looked right. **Skip fenced regions when you read a FLOW
76
+ file**; `flow-workflows` does the same, so the two of you resolve the same config.
68
77
  - Merge by section and key. A key present in the active overlay replaces the base value; a key
69
78
  absent there inherits the base. **A present-but-empty overlay key masks the base** and resolves
70
79
  to the normal empty-key fallback — this is how Codex can inherit its session model while a legacy
@@ -129,6 +129,10 @@ Whether the world they describe exists —
129
129
  CLIs installed *and authenticated*, agents discoverable, hooks executable, the MCP reachable, the
130
130
  base branch resolvable — is §2 below; flag the key here, check the world there, never both.
131
131
 
132
+ - **Keys inside a fenced block**: report them, one line, naming the file and the keys — they are
133
+ an example and resolve to nothing (flow-core §0), which is exactly what a reader who pasted a
134
+ block to enable it cannot tell from a key that works. Say what to do about it: move the line out
135
+ of the fence to make it real, leave it there to keep it an illustration.
132
136
  - **Fan-out and cost ceilings**: `agents.fanout_max` must be a positive integer; else flag and note
133
137
  the default `4` applies. `agents.budget_max` must be a non-negative integer (`0` = no ceiling);
134
138
  else flag and note the default `12`. **Both absent → say so as a finding, not a pass**: the 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.67.0`.** Compare it once, at the start of the session, against
19
+ **This file belongs to flow `0.68.0`.** 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
@@ -64,6 +64,15 @@ a command relies on is simply absent in that session, and nothing else will repo
64
64
  base branch — and goes out in no MR/PR at all. So a phase writing a tracked file writes it
65
65
  **here**, in the directory it is running in, and `/flow:feat:ship §5.5` is what catches the
66
66
  tools that could not be told.
67
+ - **A fenced block in a FLOW file is an example, and an example is not configuration.** These
68
+ files are prose with keys in them, and the rule that decides what a key *is* — a `- key:` line
69
+ under a `## section` — knows nothing about triple backticks. So a block written to be pasted
70
+ ("add this to try it once") was read as the configuration it illustrates, for as long as it sat
71
+ there. It happened in a real repo: `agents.exec_cmd` came from the fenced example of a file whose
72
+ prose argued at length that it was deliberately unset, and every review round took the one-shot
73
+ path that prose warned against — with nothing anywhere to say so, because the file and the
74
+ configuration disagreed while both looked right. **Skip fenced regions when you read a FLOW
75
+ file**; `flow-workflows` does the same, so the two of you resolve the same config.
67
76
  - Merge by section and key. A key present in the active overlay replaces the base value; a key
68
77
  absent there inherits the base. **A present-but-empty overlay key masks the base** and resolves
69
78
  to the normal empty-key fallback — this is how Codex can inherit its session model while a legacy
@@ -125,6 +125,10 @@ Whether the world they describe exists —
125
125
  CLIs installed *and authenticated*, agents discoverable, hooks executable, the MCP reachable, the
126
126
  base branch resolvable — is §2 below; flag the key here, check the world there, never both.
127
127
 
128
+ - **Keys inside a fenced block**: report them, one line, naming the file and the keys — they are
129
+ an example and resolve to nothing (flow-core §0), which is exactly what a reader who pasted a
130
+ block to enable it cannot tell from a key that works. Say what to do about it: move the line out
131
+ of the fence to make it real, leave it there to keep it an illustration.
128
132
  - **Fan-out and cost ceilings**: `agents.fanout_max` must be a positive integer; else flag and note
129
133
  the default `4` applies. `agents.budget_max` must be a non-negative integer (`0` = no ceiling);
130
134
  else flag and note the default `12`. **Both absent → say so as a finding, not a pass**: the review
@@ -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.67.0`.** Compare it once, at the start of the session, against
20
+ **This file belongs to flow `0.68.0`.** Compare it once, at the start of the session, against
21
21
  `version` in `~/.claude/flow/.claude-plugin/plugin.json`. The two differing means the session
22
22
  is running a **mixture** — the commands from one copy of the plugin, these shared rules from another
23
23
  — which is exactly what happens when a branch or a release candidate is loaded over an installed
@@ -65,6 +65,15 @@ a command relies on is simply absent in that session, and nothing else will repo
65
65
  base branch — and goes out in no MR/PR at all. So a phase writing a tracked file writes it
66
66
  **here**, in the directory it is running in, and `/flow-feat-ship §5.5` is what catches the
67
67
  tools that could not be told.
68
+ - **A fenced block in a FLOW file is an example, and an example is not configuration.** These
69
+ files are prose with keys in them, and the rule that decides what a key *is* — a `- key:` line
70
+ under a `## section` — knows nothing about triple backticks. So a block written to be pasted
71
+ ("add this to try it once") was read as the configuration it illustrates, for as long as it sat
72
+ there. It happened in a real repo: `agents.exec_cmd` came from the fenced example of a file whose
73
+ prose argued at length that it was deliberately unset, and every review round took the one-shot
74
+ path that prose warned against — with nothing anywhere to say so, because the file and the
75
+ configuration disagreed while both looked right. **Skip fenced regions when you read a FLOW
76
+ file**; `flow-workflows` does the same, so the two of you resolve the same config.
68
77
  - Merge by section and key. A key present in the active overlay replaces the base value; a key
69
78
  absent there inherits the base. **A present-but-empty overlay key masks the base** and resolves
70
79
  to the normal empty-key fallback — this is how Codex can inherit its session model while a legacy
@@ -129,6 +129,10 @@ Whether the world they describe exists —
129
129
  CLIs installed *and authenticated*, agents discoverable, hooks executable, the MCP reachable, the
130
130
  base branch resolvable — is §2 below; flag the key here, check the world there, never both.
131
131
 
132
+ - **Keys inside a fenced block**: report them, one line, naming the file and the keys — they are
133
+ an example and resolve to nothing (flow-core §0), which is exactly what a reader who pasted a
134
+ block to enable it cannot tell from a key that works. Say what to do about it: move the line out
135
+ of the fence to make it real, leave it there to keep it an illustration.
132
136
  - **Fan-out and cost ceilings**: `agents.fanout_max` must be a positive integer; else flag and note
133
137
  the default `4` applies. `agents.budget_max` must be a non-negative integer (`0` = no ceiling);
134
138
  else flag and note the default `12`. **Both absent → say so as a finding, not a pass**: the 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.67.0`.** Compare it once, at the start of the session, against
19
+ **This file belongs to flow `0.68.0`.** 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
@@ -64,6 +64,15 @@ a command relies on is simply absent in that session, and nothing else will repo
64
64
  base branch — and goes out in no MR/PR at all. So a phase writing a tracked file writes it
65
65
  **here**, in the directory it is running in, and `/flow-feat-ship §5.5` is what catches the
66
66
  tools that could not be told.
67
+ - **A fenced block in a FLOW file is an example, and an example is not configuration.** These
68
+ files are prose with keys in them, and the rule that decides what a key *is* — a `- key:` line
69
+ under a `## section` — knows nothing about triple backticks. So a block written to be pasted
70
+ ("add this to try it once") was read as the configuration it illustrates, for as long as it sat
71
+ there. It happened in a real repo: `agents.exec_cmd` came from the fenced example of a file whose
72
+ prose argued at length that it was deliberately unset, and every review round took the one-shot
73
+ path that prose warned against — with nothing anywhere to say so, because the file and the
74
+ configuration disagreed while both looked right. **Skip fenced regions when you read a FLOW
75
+ file**; `flow-workflows` does the same, so the two of you resolve the same config.
67
76
  - Merge by section and key. A key present in the active overlay replaces the base value; a key
68
77
  absent there inherits the base. **A present-but-empty overlay key masks the base** and resolves
69
78
  to the normal empty-key fallback — this is how Codex can inherit its session model while a legacy
@@ -127,6 +127,10 @@ Whether the world they describe exists —
127
127
  CLIs installed *and authenticated*, agents discoverable, hooks executable, the MCP reachable, the
128
128
  base branch resolvable — is §2 below; flag the key here, check the world there, never both.
129
129
 
130
+ - **Keys inside a fenced block**: report them, one line, naming the file and the keys — they are
131
+ an example and resolve to nothing (flow-core §0), which is exactly what a reader who pasted a
132
+ block to enable it cannot tell from a key that works. Say what to do about it: move the line out
133
+ of the fence to make it real, leave it there to keep it an illustration.
130
134
  - **Fan-out and cost ceilings**: `agents.fanout_max` must be a positive integer; else flag and note
131
135
  the default `4` applies. `agents.budget_max` must be a non-negative integer (`0` = no ceiling);
132
136
  else flag and note the default `12`. **Both absent → say so as a finding, not a pass**: the review
package/bin/cli.mjs CHANGED
@@ -240,7 +240,22 @@ function parseFlow(text) {
240
240
  const out = {}
241
241
  let section = null
242
242
  let listKey = null
243
+ let fence = null
243
244
  for (const line of text.split('\n')) {
245
+ // A fenced block is an illustration, not configuration. This reader knows headings and
246
+ // `- key:` lines and nothing else, so an example written the way `docs/CONFIGURATION.md`
247
+ // and every FLOW.md in the wild write one — keys inside triple backticks, under a sentence
248
+ // saying "paste this to try it" — was live config the whole time. A real repo had
249
+ // `agents.exec_cmd` set from the block of a file whose prose argued, at length, that it was
250
+ // deliberately unset, and every review round took the one-shot path it warned against.
251
+ // Closing fence: same character, at least as long as the opening one (CommonMark).
252
+ const f = /^\s{0,3}(`{3,}|~{3,})/.exec(line)
253
+ if (f) {
254
+ if (!fence) fence = f[1]
255
+ else if (f[1][0] === fence[0] && f[1].length >= fence.length) fence = null
256
+ continue
257
+ }
258
+ if (fence) continue
244
259
  const heading = /^##\s+(\S+)/.exec(line)
245
260
  if (heading) {
246
261
  section = heading[1]
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "flow-workflows",
3
- "version": "0.67.0",
3
+ "version": "0.68.0",
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.67.0",
6
+ "version": "0.68.0",
7
7
  "author": {
8
8
  "name": "Alberto Vioque",
9
9
  "email": "mashware@gmail.com"
@@ -5,6 +5,33 @@ 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.68.0 — The block written to be pasted was the configuration · 2026-09-21
9
+
10
+ **In short**
11
+ - **A fenced block in a FLOW file is an example again.** `- key:` lines inside triple backticks (or tildes) are skipped by `bin/cli.mjs` and by flow-core §0, so the two resolve the same configuration. Until now they were read as the config they illustrate.
12
+ - **This was found in a live repo, not imagined.** `agents.exec_cmd` was set from the fenced example of a file whose prose argued, at length, that it was deliberately unset — so every review round took the one-shot path that prose warned against, and nothing anywhere said so.
13
+ - **`/flow:doctor` reports keys found inside a fence**, names the file and says what to do: move the line out to make it real, leave it to keep it an illustration.
14
+ - **`script/tests/flow-config.sh`** pins it — fenced values never leak, `~~~` and four-backtick blocks are fences, a closed fence does not swallow the keys after it. Every case fails against the old reader.
15
+ - **Two tests now actually run in CI**: the new one and `tier.sh`, which existed and was wired into nothing.
16
+
17
+ A `FLOW.md` is prose with keys in it, and that is the point of it: the keys are the contract, the
18
+ prose is why the value is what it is. What decides which is which is shape alone — a `- key:` line
19
+ under a `## section` — and shape is exactly what a documented example shares with the thing it
20
+ documents. `docs/CONFIGURATION.md` teaches keys in fenced blocks. The template's own comments do.
21
+ So does every real `FLOW.md` that explains an option before enabling it.
22
+
23
+ The repo where this surfaced had a Claude overlay with three paragraphs on why `agents.exec_cmd`
24
+ stays unset — cost against the panel that had been finding the defects — followed by a block
25
+ introduced with *"to try it once, add both blocks below and take them out again afterwards"*. The
26
+ block was live from the moment it was written: `exec_cmd` set, `quality.reviewers` masked with four
27
+ role descriptions instead of the four agents the base names. The file and its configuration said
28
+ opposite things, and both looked right.
29
+
30
+ Nothing warns about that class of mistake, because the file is valid and the round it produces is
31
+ green. So the reader changes: fenced regions are skipped, by the CLI and by the command pages that
32
+ read the file themselves, and `doctor` reports what it found in one — a reader who pasted a block
33
+ to enable it needs to be told why it does nothing, which is the mirror of the same problem.
34
+
8
35
  ## v0.67.0 — Every layer of the review was argued from judgement, and none was ever checked · 2026-09-21
9
36
 
10
37
  **In short**