flow-workflows 0.65.0-rc.2 → 0.65.0-rc.4

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.65.0-rc.2`.** Compare it once, at the start of the session, against
20
+ **This file belongs to flow `0.65.0-rc.4`.** 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
@@ -27,6 +27,16 @@ a command relies on is simply absent in that session, and nothing else will repo
27
27
 
28
28
  ## 0. Effective FLOW config — base plus harness overlay
29
29
 
30
+ - **Look before you read.** The first thing a phase does about configuration is list what is there:
31
+ `ls <root>/FLOW*.md` (the root being the one the next bullet resolves). One call, and it is not
32
+ optional — **an overlay you did not list is an overlay you did not read**, and nothing downstream
33
+ will notice. This is not a hypothetical: every command below, and every artifact they write,
34
+ refers to the effective configuration as "`FLOW.md`", which is a file that exists, so reading it
35
+ and stopping feels finished. Two real sessions in a row read the base in full and never went
36
+ looking for the overlay sitting beside it — the models it set were silently the defaults, and
37
+ both runs reported the keys as unset with no way to tell that apart from a repo that never set
38
+ them. **Name the files this listing found the first time a phase reports any configured value**,
39
+ so a missed overlay is visible in the artifact rather than invisible everywhere.
30
40
  - Read `FLOW.md` at the repo root as the base, then the optional overlay for the harness running
31
41
  this command: `FLOW.claude.md`, `FLOW.codex.md`, `FLOW.opencode.md`, `FLOW.gemini.md`, or
32
42
  `FLOW.hermes.md`. The
@@ -34,12 +44,24 @@ a command relies on is simply absent in that session, and nothing else will repo
34
44
  valid without a base file; unknown `FLOW.*.md` names are ignored. Throughout every command,
35
45
  **"FLOW.md" means this effective merged configuration** unless the command explicitly names a
36
46
  file it will edit.
47
+ - **"The repo root" is the main checkout's, not the worktree's.** With `git.worktree` set, every
48
+ phase after `start` runs inside a linked worktree — and a `FLOW.md` the repo git-ignores (the
49
+ normal case for a personal config, and always the case for a harness overlay) exists **only in
50
+ the main checkout**. Looking for it where the phase happens finds nothing, and a configuration
51
+ that resolves to every fallback looks exactly like a repo that never had one: the models, the
52
+ ceilings and the sensitive paths are silently the defaults, and the phase reports nothing
53
+ because from where it stands there is nothing to report. So: prefer a `FLOW.md` in the directory
54
+ you are in — a repo that commits its config has one in every worktree, and it may legitimately
55
+ differ — and otherwise read both files from the main checkout, which
56
+ `git rev-parse --path-format=absolute --git-common-dir` locates from anywhere (its parent
57
+ directory). Name the file you actually read when a stop reports configuration.
37
58
  - Merge by section and key. A key present in the active overlay replaces the base value; a key
38
59
  absent there inherits the base. **A present-but-empty overlay key masks the base** and resolves
39
60
  to the normal empty-key fallback — this is how Codex can inherit its session model while a legacy
40
61
  `FLOW.md` still names a Claude model. A list-valued key is replaced as a whole, never appended.
41
62
  `conventions` is the one unkeyed section: its overlay lines are added after the base lines, so
42
- both sets apply. Keep the source file of every effective value; `doctor` reports it and later
63
+ both sets apply. **Every value carries the file it came from**, and a phase that prints a value
64
+ prints that file with it — "`agents: opus` (`FLOW.claude.md`)", never the value alone. `doctor` reports it and later
43
65
  edits preserve it.
44
66
  - The sections in either file are tracker, git, autonomy, quality, agents, models, data,
45
67
  conventions, notes, knowledge, and observability. Both files missing, or an effective empty key
@@ -162,7 +162,7 @@ Cost line: count every subagent this command launched — reviewers = §2.1 buil
162
162
  - Measured cost: <what the harness reported for this round, when it reported anything — `flow review --record` writes it to `meta.json.cost[]` and `$flow-work-status` and `flow cost` read it back. A harness that reports no figure is recorded as "not reported": the subagent count above is a headcount, not a cost, and a guess is worse than a gap.>
163
163
  - Effective size: <diff size (N changed lines) vs `meta.json.size`, which the tier used, and — when the diff landed within 10% under a tier threshold — that fact (§2.0)>
164
164
  - Review path: <the two paths this round actually took: `flow bundle` or git for the material, `flow review` or the agentic panel for the reviewers — each with the reason when it was the fallback (no CLI, non-zero exit, `agents.exec_cmd` empty, every role empty). Without this line a round that skipped the CLI reads exactly like one that used it.>
165
- - Agent models: <the value of `models.workers`/`models.agents` when set; otherwise "inherited from this thread"; agents named in `agents.<role>` keep their own definition's model>
165
+ - Agent models: <the value of `models.workers`/`models.agents` **with the file each came from** (flow-core §0) when set; otherwise "inherited from this thread", naming the config files you listed; agents named in `agents.<role>` keep their own definition's model>
166
166
  - Defaults used: <every empty `FLOW.md` key this round resolved with its default — one per line as `key → default` — or "none". In `guided`/`auto` each is also an entry in `meta.json.defaults_used[]` (flow-core §0); in `manual` the phase may offer one of them at its stop.>
167
167
  - Skipped for budget: <phases dropped by §2.0's give-up order, or "none">
168
168
  - Blockers: N
@@ -33,6 +33,9 @@ changing machines, after `$flow-init`, or when a command failed the way an envir
33
33
  `FLOW.md`, then its `FLOW.<harness>.md` overlay. Never read another harness's overlay. Both absent
34
34
  is **not** an error: say so in one line, check what needs no config (git, hooks, harness, base
35
35
  branch, plugin files), and note that `$flow-init` would let this command check the rest.
36
+ **Say which checkout the configuration came from** whenever it is not the directory you are in
37
+ (flow-core §0: a worktree does not carry a git-ignored `FLOW.md`). A diagnosis run from a
38
+ worktree that quietly read nothing is the one that certifies a repo as unconfigured.
36
39
  - Parse both files by section: `tracker`, `git`, `autonomy`, `quality`, `agents`, `models`, `data`,
37
40
  `conventions`, `notes`, `knowledge`, `observability`; merge keys and empty masks per flow-core §0.
38
41
  Keep the source of every effective value. Both absent → §1.5 runs with **every** key empty (all
@@ -310,7 +310,7 @@ Write `.claude/work/<TICKET>/06-review.md`. The `Cost:` line of `## Summary` is
310
310
  - Review tier: <full | proportional | light — which reviewers ran, at what built-in effort (medium/high/xhigh/max), and why, per §2.0>
311
311
  - Effective size: <diff size (N changed lines) vs `meta.json.size`, which of the two the tier used, and — when the diff pointed higher — that the work may be misclassified. When the diff landed within 10% under a tier threshold, say so here (§2.0).>
312
312
  - Review path: <the two paths this round actually took: `flow bundle` or git for the material, `flow review` or the agentic panel for the reviewers — each with the reason when it was the fallback (no CLI, non-zero exit, `agents.exec_cmd` empty, every role empty). Without this line a round that skipped the CLI reads exactly like one that used it.>
313
- - Agent models: <the value of `models.workers`/`models.agents` when set; otherwise "inherited from this thread" — plus, when the panel ran, that agents named in `agents.<role>` kept the model their own definition sets. The values as they are, no judgement on them>
313
+ - Agent models: <the value of `models.workers`/`models.agents` **with the file each came from** (flow-core §0) when set; otherwise "inherited from this thread", naming the config files you listed — "unset" without them reads the same whether the overlay was empty or never opened — plus, when the panel ran, that agents named in `agents.<role>` kept the model their own definition sets. The values as they are, no judgement on them>
314
314
  - Cost: <n>/<budget_max> subagents launched (<k> reviewers · <m> reinforcements · <s> skeptics), tier <light|proportional|full>, effort <medium|high|xhigh|max>
315
315
  - Measured cost: <what the harness reported for this round, when it reported anything — `flow review --record` writes it to `meta.json.cost[]` and `$flow-work-status` and `flow cost` read it back. A harness that reports no figure is recorded as "not reported": the subagent count above is a headcount, not a cost, and a guess is worse than a gap.>
316
316
  - Agents launched: <ran vs defined — `N/M` of the `review_skill`/`reviewers` roster, naming any that did not run (with the reason) and any substitution; "built-in only" if §2.0 selected no panel>
@@ -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.65.0-rc.2`.** Compare it once, at the start of the session, against
19
+ **This file belongs to flow `0.65.0-rc.4`.** 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
@@ -26,6 +26,16 @@ a command relies on is simply absent in that session, and nothing else will repo
26
26
 
27
27
  ## 0. Effective FLOW config — base plus harness overlay
28
28
 
29
+ - **Look before you read.** The first thing a phase does about configuration is list what is there:
30
+ `ls <root>/FLOW*.md` (the root being the one the next bullet resolves). One call, and it is not
31
+ optional — **an overlay you did not list is an overlay you did not read**, and nothing downstream
32
+ will notice. This is not a hypothetical: every command below, and every artifact they write,
33
+ refers to the effective configuration as "`FLOW.md`", which is a file that exists, so reading it
34
+ and stopping feels finished. Two real sessions in a row read the base in full and never went
35
+ looking for the overlay sitting beside it — the models it set were silently the defaults, and
36
+ both runs reported the keys as unset with no way to tell that apart from a repo that never set
37
+ them. **Name the files this listing found the first time a phase reports any configured value**,
38
+ so a missed overlay is visible in the artifact rather than invisible everywhere.
29
39
  - Read `FLOW.md` at the repo root as the base, then the optional overlay for the harness running
30
40
  this command: `FLOW.claude.md`, `FLOW.codex.md`, `FLOW.opencode.md`, `FLOW.gemini.md`, or
31
41
  `FLOW.hermes.md`. The
@@ -33,12 +43,24 @@ a command relies on is simply absent in that session, and nothing else will repo
33
43
  valid without a base file; unknown `FLOW.*.md` names are ignored. Throughout every command,
34
44
  **"FLOW.md" means this effective merged configuration** unless the command explicitly names a
35
45
  file it will edit.
46
+ - **"The repo root" is the main checkout's, not the worktree's.** With `git.worktree` set, every
47
+ phase after `start` runs inside a linked worktree — and a `FLOW.md` the repo git-ignores (the
48
+ normal case for a personal config, and always the case for a harness overlay) exists **only in
49
+ the main checkout**. Looking for it where the phase happens finds nothing, and a configuration
50
+ that resolves to every fallback looks exactly like a repo that never had one: the models, the
51
+ ceilings and the sensitive paths are silently the defaults, and the phase reports nothing
52
+ because from where it stands there is nothing to report. So: prefer a `FLOW.md` in the directory
53
+ you are in — a repo that commits its config has one in every worktree, and it may legitimately
54
+ differ — and otherwise read both files from the main checkout, which
55
+ `git rev-parse --path-format=absolute --git-common-dir` locates from anywhere (its parent
56
+ directory). Name the file you actually read when a stop reports configuration.
36
57
  - Merge by section and key. A key present in the active overlay replaces the base value; a key
37
58
  absent there inherits the base. **A present-but-empty overlay key masks the base** and resolves
38
59
  to the normal empty-key fallback — this is how Codex can inherit its session model while a legacy
39
60
  `FLOW.md` still names a Claude model. A list-valued key is replaced as a whole, never appended.
40
61
  `conventions` is the one unkeyed section: its overlay lines are added after the base lines, so
41
- both sets apply. Keep the source file of every effective value; `doctor` reports it and later
62
+ both sets apply. **Every value carries the file it came from**, and a phase that prints a value
63
+ prints that file with it — "`agents: opus` (`FLOW.claude.md`)", never the value alone. `doctor` reports it and later
42
64
  edits preserve it.
43
65
  - The sections in either file are tracker, git, autonomy, quality, agents, models, data,
44
66
  conventions, notes, knowledge, and observability. Both files missing, or an effective empty key
@@ -158,7 +158,7 @@ Cost line: count every subagent this command launched — reviewers = §2.1 buil
158
158
  - Measured cost: <what the harness reported for this round, when it reported anything — `flow review --record` writes it to `meta.json.cost[]` and `/flow:work:status` and `flow cost` read it back. A harness that reports no figure is recorded as "not reported": the subagent count above is a headcount, not a cost, and a guess is worse than a gap.>
159
159
  - Effective size: <diff size (N changed lines) vs `meta.json.size`, which the tier used, and — when the diff landed within 10% under a tier threshold — that fact (§2.0)>
160
160
  - Review path: <the two paths this round actually took: `flow bundle` or git for the material, `flow review` or the agentic panel for the reviewers — each with the reason when it was the fallback (no CLI, non-zero exit, `agents.exec_cmd` empty, every role empty). Without this line a round that skipped the CLI reads exactly like one that used it.>
161
- - Agent models: <the value of `models.workers`/`models.agents` when set; otherwise "inherited from this thread"; agents named in `agents.<role>` keep their own definition's model>
161
+ - Agent models: <the value of `models.workers`/`models.agents` **with the file each came from** (flow-core §0) when set; otherwise "inherited from this thread", naming the config files you listed; agents named in `agents.<role>` keep their own definition's model>
162
162
  - Defaults used: <every empty `FLOW.md` key this round resolved with its default — one per line as `key → default` — or "none". In `guided`/`auto` each is also an entry in `meta.json.defaults_used[]` (flow-core §0); in `manual` the phase may offer one of them at its stop.>
163
163
  - Skipped for budget: <phases dropped by §2.0's give-up order, or "none">
164
164
  - Blockers: N
@@ -29,6 +29,9 @@ changing machines, after `/flow:init`, or when a command failed the way an envir
29
29
  `FLOW.md`, then its `FLOW.<harness>.md` overlay. Never read another harness's overlay. Both absent
30
30
  is **not** an error: say so in one line, check what needs no config (git, hooks, harness, base
31
31
  branch, plugin files), and note that `/flow:init` would let this command check the rest.
32
+ **Say which checkout the configuration came from** whenever it is not the directory you are in
33
+ (flow-core §0: a worktree does not carry a git-ignored `FLOW.md`). A diagnosis run from a
34
+ worktree that quietly read nothing is the one that certifies a repo as unconfigured.
32
35
  - Parse both files by section: `tracker`, `git`, `autonomy`, `quality`, `agents`, `models`, `data`,
33
36
  `conventions`, `notes`, `knowledge`, `observability`; merge keys and empty masks per flow-core §0.
34
37
  Keep the source of every effective value. Both absent → §1.5 runs with **every** key empty (all
@@ -306,7 +306,7 @@ Write `.claude/work/<TICKET>/06-review.md`. The `Cost:` line of `## Summary` is
306
306
  - Review tier: <full | proportional | light — which reviewers ran, at what built-in effort (medium/high/xhigh/max), and why, per §2.0>
307
307
  - Effective size: <diff size (N changed lines) vs `meta.json.size`, which of the two the tier used, and — when the diff pointed higher — that the work may be misclassified. When the diff landed within 10% under a tier threshold, say so here (§2.0).>
308
308
  - Review path: <the two paths this round actually took: `flow bundle` or git for the material, `flow review` or the agentic panel for the reviewers — each with the reason when it was the fallback (no CLI, non-zero exit, `agents.exec_cmd` empty, every role empty). Without this line a round that skipped the CLI reads exactly like one that used it.>
309
- - Agent models: <the value of `models.workers`/`models.agents` when set; otherwise "inherited from this thread" — plus, when the panel ran, that agents named in `agents.<role>` kept the model their own definition sets. The values as they are, no judgement on them>
309
+ - Agent models: <the value of `models.workers`/`models.agents` **with the file each came from** (flow-core §0) when set; otherwise "inherited from this thread", naming the config files you listed — "unset" without them reads the same whether the overlay was empty or never opened — plus, when the panel ran, that agents named in `agents.<role>` kept the model their own definition sets. The values as they are, no judgement on them>
310
310
  - Cost: <n>/<budget_max> subagents launched (<k> reviewers · <m> reinforcements · <s> skeptics), tier <light|proportional|full>, effort <medium|high|xhigh|max>
311
311
  - Measured cost: <what the harness reported for this round, when it reported anything — `flow review --record` writes it to `meta.json.cost[]` and `/flow:work:status` and `flow cost` read it back. A harness that reports no figure is recorded as "not reported": the subagent count above is a headcount, not a cost, and a guess is worse than a gap.>
312
312
  - Agents launched: <ran vs defined — `N/M` of the `review_skill`/`reviewers` roster, naming any that did not run (with the reason) and any substitution; "built-in only" if §2.0 selected no panel>
@@ -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.65.0-rc.2`.** Compare it once, at the start of the session, against
20
+ **This file belongs to flow `0.65.0-rc.4`.** 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
@@ -27,6 +27,16 @@ a command relies on is simply absent in that session, and nothing else will repo
27
27
 
28
28
  ## 0. Effective FLOW config — base plus harness overlay
29
29
 
30
+ - **Look before you read.** The first thing a phase does about configuration is list what is there:
31
+ `ls <root>/FLOW*.md` (the root being the one the next bullet resolves). One call, and it is not
32
+ optional — **an overlay you did not list is an overlay you did not read**, and nothing downstream
33
+ will notice. This is not a hypothetical: every command below, and every artifact they write,
34
+ refers to the effective configuration as "`FLOW.md`", which is a file that exists, so reading it
35
+ and stopping feels finished. Two real sessions in a row read the base in full and never went
36
+ looking for the overlay sitting beside it — the models it set were silently the defaults, and
37
+ both runs reported the keys as unset with no way to tell that apart from a repo that never set
38
+ them. **Name the files this listing found the first time a phase reports any configured value**,
39
+ so a missed overlay is visible in the artifact rather than invisible everywhere.
30
40
  - Read `FLOW.md` at the repo root as the base, then the optional overlay for the harness running
31
41
  this command: `FLOW.claude.md`, `FLOW.codex.md`, `FLOW.opencode.md`, `FLOW.gemini.md`, or
32
42
  `FLOW.hermes.md`. The
@@ -34,12 +44,24 @@ a command relies on is simply absent in that session, and nothing else will repo
34
44
  valid without a base file; unknown `FLOW.*.md` names are ignored. Throughout every command,
35
45
  **"FLOW.md" means this effective merged configuration** unless the command explicitly names a
36
46
  file it will edit.
47
+ - **"The repo root" is the main checkout's, not the worktree's.** With `git.worktree` set, every
48
+ phase after `start` runs inside a linked worktree — and a `FLOW.md` the repo git-ignores (the
49
+ normal case for a personal config, and always the case for a harness overlay) exists **only in
50
+ the main checkout**. Looking for it where the phase happens finds nothing, and a configuration
51
+ that resolves to every fallback looks exactly like a repo that never had one: the models, the
52
+ ceilings and the sensitive paths are silently the defaults, and the phase reports nothing
53
+ because from where it stands there is nothing to report. So: prefer a `FLOW.md` in the directory
54
+ you are in — a repo that commits its config has one in every worktree, and it may legitimately
55
+ differ — and otherwise read both files from the main checkout, which
56
+ `git rev-parse --path-format=absolute --git-common-dir` locates from anywhere (its parent
57
+ directory). Name the file you actually read when a stop reports configuration.
37
58
  - Merge by section and key. A key present in the active overlay replaces the base value; a key
38
59
  absent there inherits the base. **A present-but-empty overlay key masks the base** and resolves
39
60
  to the normal empty-key fallback — this is how Codex can inherit its session model while a legacy
40
61
  `FLOW.md` still names a Claude model. A list-valued key is replaced as a whole, never appended.
41
62
  `conventions` is the one unkeyed section: its overlay lines are added after the base lines, so
42
- both sets apply. Keep the source file of every effective value; `doctor` reports it and later
63
+ both sets apply. **Every value carries the file it came from**, and a phase that prints a value
64
+ prints that file with it — "`agents: opus` (`FLOW.claude.md`)", never the value alone. `doctor` reports it and later
43
65
  edits preserve it.
44
66
  - The sections in either file are tracker, git, autonomy, quality, agents, models, data,
45
67
  conventions, notes, knowledge, and observability. Both files missing, or an effective empty key
@@ -162,7 +162,7 @@ Cost line: count every subagent this command launched — reviewers = §2.1 buil
162
162
  - Measured cost: <what the harness reported for this round, when it reported anything — `flow review --record` writes it to `meta.json.cost[]` and `/flow-work-status` and `flow cost` read it back. A harness that reports no figure is recorded as "not reported": the subagent count above is a headcount, not a cost, and a guess is worse than a gap.>
163
163
  - Effective size: <diff size (N changed lines) vs `meta.json.size`, which the tier used, and — when the diff landed within 10% under a tier threshold — that fact (§2.0)>
164
164
  - Review path: <the two paths this round actually took: `flow bundle` or git for the material, `flow review` or the agentic panel for the reviewers — each with the reason when it was the fallback (no CLI, non-zero exit, `agents.exec_cmd` empty, every role empty). Without this line a round that skipped the CLI reads exactly like one that used it.>
165
- - Agent models: <the value of `models.workers`/`models.agents` when set; otherwise "inherited from this thread"; agents named in `agents.<role>` keep their own definition's model>
165
+ - Agent models: <the value of `models.workers`/`models.agents` **with the file each came from** (flow-core §0) when set; otherwise "inherited from this thread", naming the config files you listed; agents named in `agents.<role>` keep their own definition's model>
166
166
  - Defaults used: <every empty `FLOW.md` key this round resolved with its default — one per line as `key → default` — or "none". In `guided`/`auto` each is also an entry in `meta.json.defaults_used[]` (flow-core §0); in `manual` the phase may offer one of them at its stop.>
167
167
  - Skipped for budget: <phases dropped by §2.0's give-up order, or "none">
168
168
  - Blockers: N
@@ -33,6 +33,9 @@ changing machines, after `/flow-init`, or when a command failed the way an envir
33
33
  `FLOW.md`, then its `FLOW.<harness>.md` overlay. Never read another harness's overlay. Both absent
34
34
  is **not** an error: say so in one line, check what needs no config (git, hooks, harness, base
35
35
  branch, plugin files), and note that `/flow-init` would let this command check the rest.
36
+ **Say which checkout the configuration came from** whenever it is not the directory you are in
37
+ (flow-core §0: a worktree does not carry a git-ignored `FLOW.md`). A diagnosis run from a
38
+ worktree that quietly read nothing is the one that certifies a repo as unconfigured.
36
39
  - Parse both files by section: `tracker`, `git`, `autonomy`, `quality`, `agents`, `models`, `data`,
37
40
  `conventions`, `notes`, `knowledge`, `observability`; merge keys and empty masks per flow-core §0.
38
41
  Keep the source of every effective value. Both absent → §1.5 runs with **every** key empty (all
@@ -310,7 +310,7 @@ Write `.claude/work/<TICKET>/06-review.md`. The `Cost:` line of `## Summary` is
310
310
  - Review tier: <full | proportional | light — which reviewers ran, at what built-in effort (medium/high/xhigh/max), and why, per §2.0>
311
311
  - Effective size: <diff size (N changed lines) vs `meta.json.size`, which of the two the tier used, and — when the diff pointed higher — that the work may be misclassified. When the diff landed within 10% under a tier threshold, say so here (§2.0).>
312
312
  - Review path: <the two paths this round actually took: `flow bundle` or git for the material, `flow review` or the agentic panel for the reviewers — each with the reason when it was the fallback (no CLI, non-zero exit, `agents.exec_cmd` empty, every role empty). Without this line a round that skipped the CLI reads exactly like one that used it.>
313
- - Agent models: <the value of `models.workers`/`models.agents` when set; otherwise "inherited from this thread" — plus, when the panel ran, that agents named in `agents.<role>` kept the model their own definition sets. The values as they are, no judgement on them>
313
+ - Agent models: <the value of `models.workers`/`models.agents` **with the file each came from** (flow-core §0) when set; otherwise "inherited from this thread", naming the config files you listed — "unset" without them reads the same whether the overlay was empty or never opened — plus, when the panel ran, that agents named in `agents.<role>` kept the model their own definition sets. The values as they are, no judgement on them>
314
314
  - Cost: <n>/<budget_max> subagents launched (<k> reviewers · <m> reinforcements · <s> skeptics), tier <light|proportional|full>, effort <medium|high|xhigh|max>
315
315
  - Measured cost: <what the harness reported for this round, when it reported anything — `flow review --record` writes it to `meta.json.cost[]` and `/flow-work-status` and `flow cost` read it back. A harness that reports no figure is recorded as "not reported": the subagent count above is a headcount, not a cost, and a guess is worse than a gap.>
316
316
  - Agents launched: <ran vs defined — `N/M` of the `review_skill`/`reviewers` roster, naming any that did not run (with the reason) and any substitution; "built-in only" if §2.0 selected no panel>
@@ -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.65.0-rc.2`.** Compare it once, at the start of the session, against
19
+ **This file belongs to flow `0.65.0-rc.4`.** 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
@@ -26,6 +26,16 @@ a command relies on is simply absent in that session, and nothing else will repo
26
26
 
27
27
  ## 0. Effective FLOW config — base plus harness overlay
28
28
 
29
+ - **Look before you read.** The first thing a phase does about configuration is list what is there:
30
+ `ls <root>/FLOW*.md` (the root being the one the next bullet resolves). One call, and it is not
31
+ optional — **an overlay you did not list is an overlay you did not read**, and nothing downstream
32
+ will notice. This is not a hypothetical: every command below, and every artifact they write,
33
+ refers to the effective configuration as "`FLOW.md`", which is a file that exists, so reading it
34
+ and stopping feels finished. Two real sessions in a row read the base in full and never went
35
+ looking for the overlay sitting beside it — the models it set were silently the defaults, and
36
+ both runs reported the keys as unset with no way to tell that apart from a repo that never set
37
+ them. **Name the files this listing found the first time a phase reports any configured value**,
38
+ so a missed overlay is visible in the artifact rather than invisible everywhere.
29
39
  - Read `FLOW.md` at the repo root as the base, then the optional overlay for the harness running
30
40
  this command: `FLOW.claude.md`, `FLOW.codex.md`, `FLOW.opencode.md`, `FLOW.gemini.md`, or
31
41
  `FLOW.hermes.md`. The
@@ -33,12 +43,24 @@ a command relies on is simply absent in that session, and nothing else will repo
33
43
  valid without a base file; unknown `FLOW.*.md` names are ignored. Throughout every command,
34
44
  **"FLOW.md" means this effective merged configuration** unless the command explicitly names a
35
45
  file it will edit.
46
+ - **"The repo root" is the main checkout's, not the worktree's.** With `git.worktree` set, every
47
+ phase after `start` runs inside a linked worktree — and a `FLOW.md` the repo git-ignores (the
48
+ normal case for a personal config, and always the case for a harness overlay) exists **only in
49
+ the main checkout**. Looking for it where the phase happens finds nothing, and a configuration
50
+ that resolves to every fallback looks exactly like a repo that never had one: the models, the
51
+ ceilings and the sensitive paths are silently the defaults, and the phase reports nothing
52
+ because from where it stands there is nothing to report. So: prefer a `FLOW.md` in the directory
53
+ you are in — a repo that commits its config has one in every worktree, and it may legitimately
54
+ differ — and otherwise read both files from the main checkout, which
55
+ `git rev-parse --path-format=absolute --git-common-dir` locates from anywhere (its parent
56
+ directory). Name the file you actually read when a stop reports configuration.
36
57
  - Merge by section and key. A key present in the active overlay replaces the base value; a key
37
58
  absent there inherits the base. **A present-but-empty overlay key masks the base** and resolves
38
59
  to the normal empty-key fallback — this is how Codex can inherit its session model while a legacy
39
60
  `FLOW.md` still names a Claude model. A list-valued key is replaced as a whole, never appended.
40
61
  `conventions` is the one unkeyed section: its overlay lines are added after the base lines, so
41
- both sets apply. Keep the source file of every effective value; `doctor` reports it and later
62
+ both sets apply. **Every value carries the file it came from**, and a phase that prints a value
63
+ prints that file with it — "`agents: opus` (`FLOW.claude.md`)", never the value alone. `doctor` reports it and later
42
64
  edits preserve it.
43
65
  - The sections in either file are tracker, git, autonomy, quality, agents, models, data,
44
66
  conventions, notes, knowledge, and observability. Both files missing, or an effective empty key
@@ -160,7 +160,7 @@ Cost line: count every subagent this command launched — reviewers = §2.1 buil
160
160
  - Measured cost: <what the harness reported for this round, when it reported anything — `flow review --record` writes it to `meta.json.cost[]` and `/flow-work-status` and `flow cost` read it back. A harness that reports no figure is recorded as "not reported": the subagent count above is a headcount, not a cost, and a guess is worse than a gap.>
161
161
  - Effective size: <diff size (N changed lines) vs `meta.json.size`, which the tier used, and — when the diff landed within 10% under a tier threshold — that fact (§2.0)>
162
162
  - Review path: <the two paths this round actually took: `flow bundle` or git for the material, `flow review` or the agentic panel for the reviewers — each with the reason when it was the fallback (no CLI, non-zero exit, `agents.exec_cmd` empty, every role empty). Without this line a round that skipped the CLI reads exactly like one that used it.>
163
- - Agent models: <the value of `models.workers`/`models.agents` when set; otherwise "inherited from this thread"; agents named in `agents.<role>` keep their own definition's model>
163
+ - Agent models: <the value of `models.workers`/`models.agents` **with the file each came from** (flow-core §0) when set; otherwise "inherited from this thread", naming the config files you listed; agents named in `agents.<role>` keep their own definition's model>
164
164
  - Defaults used: <every empty `FLOW.md` key this round resolved with its default — one per line as `key → default` — or "none". In `guided`/`auto` each is also an entry in `meta.json.defaults_used[]` (flow-core §0); in `manual` the phase may offer one of them at its stop.>
165
165
  - Skipped for budget: <phases dropped by §2.0's give-up order, or "none">
166
166
  - Blockers: N
@@ -31,6 +31,9 @@ changing machines, after `/flow-init`, or when a command failed the way an envir
31
31
  `FLOW.md`, then its `FLOW.<harness>.md` overlay. Never read another harness's overlay. Both absent
32
32
  is **not** an error: say so in one line, check what needs no config (git, hooks, harness, base
33
33
  branch, plugin files), and note that `/flow-init` would let this command check the rest.
34
+ **Say which checkout the configuration came from** whenever it is not the directory you are in
35
+ (flow-core §0: a worktree does not carry a git-ignored `FLOW.md`). A diagnosis run from a
36
+ worktree that quietly read nothing is the one that certifies a repo as unconfigured.
34
37
  - Parse both files by section: `tracker`, `git`, `autonomy`, `quality`, `agents`, `models`, `data`,
35
38
  `conventions`, `notes`, `knowledge`, `observability`; merge keys and empty masks per flow-core §0.
36
39
  Keep the source of every effective value. Both absent → §1.5 runs with **every** key empty (all
@@ -308,7 +308,7 @@ Write `.claude/work/<TICKET>/06-review.md`. The `Cost:` line of `## Summary` is
308
308
  - Review tier: <full | proportional | light — which reviewers ran, at what built-in effort (medium/high/xhigh/max), and why, per §2.0>
309
309
  - Effective size: <diff size (N changed lines) vs `meta.json.size`, which of the two the tier used, and — when the diff pointed higher — that the work may be misclassified. When the diff landed within 10% under a tier threshold, say so here (§2.0).>
310
310
  - Review path: <the two paths this round actually took: `flow bundle` or git for the material, `flow review` or the agentic panel for the reviewers — each with the reason when it was the fallback (no CLI, non-zero exit, `agents.exec_cmd` empty, every role empty). Without this line a round that skipped the CLI reads exactly like one that used it.>
311
- - Agent models: <the value of `models.workers`/`models.agents` when set; otherwise "inherited from this thread" — plus, when the panel ran, that agents named in `agents.<role>` kept the model their own definition sets. The values as they are, no judgement on them>
311
+ - Agent models: <the value of `models.workers`/`models.agents` **with the file each came from** (flow-core §0) when set; otherwise "inherited from this thread", naming the config files you listed — "unset" without them reads the same whether the overlay was empty or never opened — plus, when the panel ran, that agents named in `agents.<role>` kept the model their own definition sets. The values as they are, no judgement on them>
312
312
  - Cost: <n>/<budget_max> subagents launched (<k> reviewers · <m> reinforcements · <s> skeptics), tier <light|proportional|full>, effort <medium|high|xhigh|max>
313
313
  - Measured cost: <what the harness reported for this round, when it reported anything — `flow review --record` writes it to `meta.json.cost[]` and `/flow-work-status` and `flow cost` read it back. A harness that reports no figure is recorded as "not reported": the subagent count above is a headcount, not a cost, and a guess is worse than a gap.>
314
314
  - Agents launched: <ran vs defined — `N/M` of the `review_skill`/`reviewers` roster, naming any that did not run (with the reason) and any substitution; "built-in only" if §2.0 selected no panel>
package/bin/cli.mjs CHANGED
@@ -201,6 +201,7 @@ function check() {
201
201
 
202
202
  const MAX_FILE_BYTES = 64 * 1024
203
203
  const MAX_TOTAL_BYTES = 512 * 1024
204
+ const MAX_DIFF_LINES = 2000
204
205
 
205
206
  function git(args, cwd = process.cwd()) {
206
207
  try {
@@ -215,6 +216,15 @@ function git(args, cwd = process.cwd()) {
215
216
  // `FLOW.md` is `## section` then `- key: value`, with an indented `- item` list where a key
216
217
  // has no inline value. `conventions` carries bare prose lines and is skipped by the same
217
218
  // rule that skips anything else without a `key:`.
219
+ // A value wrapped in matching quotes means what is inside them. The template writes globs
220
+ // that way (`- '*.lock'`), and keeping the quotes turned every one of them into a pathspec
221
+ // that matches a filename with quotes in it — so the key silently excluded nothing. Only a
222
+ // whole-value wrap is stripped: a command that quotes one of its own arguments is untouched.
223
+ function unquote(v) {
224
+ const m = /^(['"])([\s\S]*)\1$/.exec(v)
225
+ return m ? m[2] : v
226
+ }
227
+
218
228
  function parseFlow(text) {
219
229
  const out = {}
220
230
  let section = null
@@ -230,13 +240,13 @@ function parseFlow(text) {
230
240
  if (!section) continue
231
241
  const item = /^\s+-\s+(.*)$/.exec(line)
232
242
  if (item && listKey) {
233
- out[section][listKey].push(item[1].trim())
243
+ out[section][listKey].push(unquote(item[1].trim()))
234
244
  continue
235
245
  }
236
246
  const kv = /^-\s+`?([a-z_]+)`?:\s*(.*)$/.exec(line)
237
247
  if (!kv) { listKey = null; continue }
238
248
  const [, key, value] = kv
239
- if (value.trim()) { out[section][key] = value.trim(); listKey = null }
249
+ if (value.trim()) { out[section][key] = unquote(value.trim()); listKey = null }
240
250
  else { out[section][key] = []; listKey = key }
241
251
  }
242
252
  // A key with no inline value opens a list. One that never got an item is simply unset —
@@ -248,11 +258,36 @@ function parseFlow(text) {
248
258
  return out
249
259
  }
250
260
 
261
+ // Where the FLOW files actually are. A phase run inside a linked worktree has its own root,
262
+ // and a `FLOW.md` the repo git-ignores exists only in the main checkout — so a worktree would
263
+ // resolve every key to its fallback and say nothing. Prefer the root we are in (a repo that
264
+ // commits its config gets it in every worktree, and a worktree may legitimately differ), and
265
+ // fall back to the main checkout, which `--git-common-dir` points into from anywhere.
266
+ function configRoot(repo) {
267
+ if (existsSync(join(repo, 'FLOW.md'))) return repo
268
+ const common = git(['rev-parse', '--path-format=absolute', '--git-common-dir'], repo).trim()
269
+ if (!common) return repo
270
+ const main = dirname(common)
271
+ return main !== repo && existsSync(join(main, 'FLOW.md')) ? main : repo
272
+ }
273
+
274
+ // Which config files a run actually read. The pack says so out loud because the failure it
275
+ // makes visible is silent by nature: a phase that read the base and never looked for the
276
+ // overlay reports every key it set as unset, which is what a repo with no overlay reports too.
277
+ function configFiles(repo, harness) {
278
+ const root = configRoot(repo)
279
+ const names = ['FLOW.md', harness && `FLOW.${harness}.md`].filter(Boolean)
280
+ const found = names.filter((n) => existsSync(join(root, n)))
281
+ const where = root === repo ? '' : ` (from ${root})`
282
+ return found.length ? found.join(' + ') + where : `none found${where || ` in ${repo}`}`
283
+ }
284
+
251
285
  // Base file plus the overlay of the harness running this, exactly as flow-core §0 resolves
252
286
  // it: a key present in the overlay replaces the base value.
253
287
  function flowConfig(repo, harness) {
288
+ const root = configRoot(repo)
254
289
  const read = (name) => {
255
- const p = join(repo, name)
290
+ const p = join(root, name)
256
291
  return existsSync(p) ? parseFlow(readFileSync(p, 'utf8')) : {}
257
292
  }
258
293
  const base = read('FLOW.md')
@@ -298,6 +333,7 @@ function buildBundle(argv) {
298
333
  const cfg = flowConfig(repo, flag('--harness'))
299
334
  const branch = git(['rev-parse', '--abbrev-ref', 'HEAD'], repo).trim()
300
335
  const maxFile = Number(flag('--max-file-bytes', MAX_FILE_BYTES)) || MAX_FILE_BYTES
336
+ const maxDiffLines = Number(flag('--max-diff-lines', MAX_DIFF_LINES)) || MAX_DIFF_LINES
301
337
 
302
338
  const resolves = (ref) => Boolean(git(['rev-parse', '--verify', '--quiet', ref], repo).trim())
303
339
  let base = flag('--base') || cfg.git?.default_base || ''
@@ -324,32 +360,68 @@ function buildBundle(argv) {
324
360
  const excluded = (list) => ['--', '.', ...list.map((p) => `:(exclude)${p}`)]
325
361
  const paths = exclude.length ? excluded(exclude) : []
326
362
 
327
- // One size rule for the whole pack. Applying it only to the file contents would let a
328
- // generated file of any size through in the diff instead — which is the same cost, one
329
- // section lower down, and exactly what a reviewer does not need to read.
363
+ // Two limits, because how big a file is and how big its change is are different questions,
364
+ // and one rule for both answers neither. A 1 MB source file with a 40-line edit belongs in
365
+ // the diff and not in the contents — measuring it by its size drops the change this pack
366
+ // exists to carry, and says so in a section nobody reads before the diff they were handed.
367
+ // A file whose *diff* is enormous is the one a reviewer cannot use, and a generated file
368
+ // nobody reviews at all belongs in `git.diff_exclude`, which is the key for exactly that.
330
369
  const changed = git(['diff', '--name-only', from, ...paths], repo).split('\n').filter(Boolean)
370
+
371
+ // `--numstat -z`: `<add>\t<del>\t<path>\0`, and for a rename an empty path field followed by
372
+ // the old and new paths as their own records. A path we fail to match simply keeps its diff,
373
+ // which is the safe direction for a rule whose failure mode was dropping too much.
374
+ const churn = new Map()
375
+ const fields = git(['diff', '--numstat', '-z', from, ...paths], repo).split('\0')
376
+ for (let i = 0; i < fields.length; i += 1) {
377
+ const m = /^(\d+|-)\t(\d+|-)\t(.*)$/.exec(fields[i])
378
+ if (!m) continue
379
+ let rel = m[3]
380
+ if (!rel) { rel = fields[i + 2] ?? ''; i += 2 } // rename: old, new
381
+ if (!rel) continue
382
+ churn.set(rel, m[1] === '-' || m[2] === '-' ? null : Number(m[1]) + Number(m[2]))
383
+ }
384
+ const unreadableDiff = changed.filter((rel) => {
385
+ const n = churn.get(rel)
386
+ return n === null || (n !== undefined && n > maxDiffLines)
387
+ })
388
+ const diffPaths = excluded([...exclude, ...unreadableDiff])
389
+
390
+ // The contents section keeps the file-size rule: it is the one place a file's own size is
391
+ // what it costs.
331
392
  const oversize = changed.filter((rel) => {
332
393
  const abs = join(repo, rel)
333
394
  return existsSync(abs) && statSync(abs).size > maxFile
334
395
  })
335
- const diffPaths = excluded([...exclude, ...oversize])
336
396
 
337
397
  const out = []
338
398
  out.push(`# flow bundle — ${branch}`)
339
399
  out.push('')
340
400
  out.push(`Base \`${base}\` · merge base \`${from.slice(0, 12)}\` · generated by \`flow bundle\`.`)
401
+ out.push(`Config read: ${configFiles(repo, flag('--harness'))}.`)
341
402
  out.push('Committed and uncommitted changes together. Nothing here is parsed or summarised.')
342
403
  out.push('')
343
404
 
344
405
  out.push('## Worklist')
345
406
  out.push('')
346
- const stat = git(['diff', '--stat', from, ...diffPaths], repo).trim()
407
+ // The whole change, not the part that survived the limits below: a worklist that agrees
408
+ // with a reduced diff is how a reviewer reads half a change and never finds out.
409
+ const stat = git(['diff', '--stat', from, ...paths], repo).trim()
347
410
  out.push(stat ? fence(stat) : '_no changes against the base_')
348
411
  out.push('')
349
412
  if (exclude.length) {
350
413
  out.push(`Left out by \`git.diff_exclude\`: ${exclude.map((p) => `\`${p}\``).join(' · ')}`)
351
414
  out.push('')
352
415
  }
416
+ if (unreadableDiff.length) {
417
+ out.push('**Not in the diff below**, over `--max-diff-lines` (' + maxDiffLines + ') or binary — read these from git before reviewing them:')
418
+ out.push('')
419
+ out.push(unreadableDiff.map((rel) => {
420
+ const n = churn.get(rel)
421
+ return `- \`${rel}\` — ${n === null ? 'binary' : `${n} changed lines`}`
422
+ }).join('\n'))
423
+ out.push('')
424
+ }
353
425
  const untracked = git(['ls-files', '--others', '--exclude-standard'], repo).trim()
354
426
  if (untracked) {
355
427
  out.push('Untracked, so absent from the diff below:')
@@ -368,7 +440,7 @@ function buildBundle(argv) {
368
440
  out.push('')
369
441
  const skipped = oversize.map((rel) => {
370
442
  const size = statSync(join(repo, rel)).size
371
- return `${rel} — ${size} bytes, over --max-file-bytes (${maxFile}); left out of the diff too`
443
+ return `${rel} — ${size} bytes, over --max-file-bytes (${maxFile}); its diff is above`
372
444
  })
373
445
  let spent = 0
374
446
  for (const rel of changed) {
@@ -712,7 +784,8 @@ function usage() {
712
784
 
713
785
  npx flow-workflows install <harness> [project]
714
786
  npx flow-workflows check
715
- npx flow-workflows bundle [--base <ref>] [--checks] [--harness <name>] [--max-file-bytes N]
787
+ npx flow-workflows bundle [--base <ref>] [--checks] [--harness <name>]
788
+ [--max-file-bytes N] [--max-diff-lines N]
716
789
  npx flow-workflows review [--out <file>] [--record] [same options as bundle]
717
790
  npx flow-workflows cost
718
791
 
@@ -726,6 +799,11 @@ Claude Code and Codex CLI have their own marketplaces:
726
799
  files in full, and the work's handoff — so a phase reads it in one call instead of
727
800
  rediscovering it in ten. --checks also runs quality.static_analysis and copies its
728
801
  output out verbatim. Paths in git.diff_exclude are left out of the diff.
802
+ Two limits, two questions: --max-file-bytes decides what is too big to print in full,
803
+ --max-diff-lines what is too big to read as a diff. A large file with a small change
804
+ keeps its diff; the worklist always shows the whole change, and anything held back is
805
+ named there rather than at the end. FLOW.md is read from the main checkout when this
806
+ runs inside a worktree that does not carry one.
729
807
 
730
808
  "review" runs one reviewer per role through agents.exec_cmd — any non-interactive
731
809
  harness invocation — over that same pack, one turn each instead of an agentic loop
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "flow-workflows",
3
- "version": "0.65.0-rc.2",
3
+ "version": "0.65.0-rc.4",
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.65.0-rc.2",
6
+ "version": "0.65.0-rc.4",
7
7
  "author": {
8
8
  "name": "Alberto Vioque",
9
9
  "email": "mashware@gmail.com"
@@ -8,7 +8,7 @@ The canonical, richest notes live in the [GitHub Releases](https://github.com/ma
8
8
  ## v0.65.0 — Every phase rediscovered the same context, and nobody knew what it cost · 2026-09-17
9
9
 
10
10
  **In short**
11
- - **A round gathers its material once.** `npx flow-workflows bundle` prints one context pack — worklist, diff, changed files, the repo's own analysis output, the work's handoff — instead of every reviewer paying to rediscover it.
11
+ - **A round gathers its material once.** `npx flow-workflows bundle` prints one context pack — worklist, diff, changed files, the repo's own analysis output, the work's handoff — instead of every reviewer paying to rediscover it. Two limits govern it, because how big a file is and how big its change is are different questions: a large file with a small edit keeps its diff.
12
12
  - **The panel can run outside the agentic loop.** With `agents.exec_cmd` set, `npx flow-workflows review` runs one reviewer per role in **one turn each**, deduplicated — and that is what runs when the key is there, not one option among two.
13
13
  - **What a phase spent is written down.** `meta.json.cost[]` records the figure the harness reported, `"not reported"` when it reported none and never an estimate; `flow cost`, `/flow:work:status` and the review artifact read it back.
14
14
  - **A change can be run before it is tagged — and the candidate's own code is what runs.** Candidates publish under the `next` channel so `latest` never moves; the commands pin the CLI to the plugin's own version, so a candidate's commands can never be served by the previous release's CLI; and a session that has ended up with two copies of the plugin says so instead of running a mixture.
@@ -74,6 +74,37 @@ What made all of this visible was the `Review path` line added above — a round
74
74
  round that did not are one line apart in the artifact, and without that line this release would have
75
75
  shipped believing its own notes.
76
76
 
77
+ The second candidate ran the whole flow again and the CLI worked, which is how the next three were
78
+ found — all of them in `bundle`, and all of them the kind that exit 0. **One size rule governed both
79
+ the contents and the diff**, so a 1 MB source file with a 40-line edit lost its diff entirely: the
80
+ pack carried 458 of 974 changed lines and its worklist, counted after the rule, agreed. There are
81
+ two limits now — `--max-file-bytes` decides what is too big to print in full, `--max-diff-lines`
82
+ what is too big to read as a diff — the worklist always counts the whole change, and anything held
83
+ back is named there rather than at the end, before the diff it is missing from. **`FLOW.md` was read
84
+ from wherever the command ran**, and with `git.worktree` set that is a worktree, where a git-ignored
85
+ config does not exist: every key resolved to its fallback and nothing said so, which is
86
+ indistinguishable from a repo that has no configuration. Both the CLI and flow-core §0 now fall back
87
+ to the main checkout, which `--git-common-dir` locates from anywhere. And **a quoted value kept its
88
+ quotes**, so the `- '*.lock'` the template itself documents became a pathspec matching a filename
89
+ with quotes in it — `git.diff_exclude` excluded nothing for anyone who copied the example.
90
+
91
+ The third candidate then found the one that had been hiding behind them. A harness overlay —
92
+ `FLOW.claude.md` and its siblings, where a model id belongs so it never reaches another harness —
93
+ **was never read**. Not once, in two full runs, on two different models: both read the base file in
94
+ full and neither went looking for the overlay beside it, so the models it set were silently the
95
+ defaults and both artifacts reported the keys as *unset* — which is exactly what a repo that never
96
+ set them reports. The instruction to merge an overlay has always been there; what was missing was
97
+ anything that made a phase **look**. Every command, and every artifact they write, calls the
98
+ effective configuration "`FLOW.md`", and that is a real file, so reading it and stopping feels
99
+ finished. Step 0 now begins by listing `FLOW*.md` — one call, not optional — every printed value
100
+ carries the file it came from, and `bundle` states in its header which files the run read, so an
101
+ overlay that was never opened is a line in the pack instead of nothing at all.
102
+
103
+ None of the four could be seen from the repo, and none of them failed. That is the argument for
104
+ driving a candidate through a real work rather than reading it: the run that found them is also the
105
+ one whose review then read the diff from git and caught five blocking defects anyway, because the
106
+ fallback is a real path and not an apology.
107
+
77
108
  ## v0.64.0 — Announcing the next step was how the run ended · 2026-09-16
78
109
 
79
110
  **In short**