flow-workflows 0.93.0 → 0.94.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.
Files changed (46) hide show
  1. package/README.md +4 -4
  2. package/adapters/codex/CORE.md +50 -16
  3. package/adapters/codex/skills/flow-bug-validate/SKILL.md +1 -1
  4. package/adapters/codex/skills/flow-doctor/SKILL.md +33 -15
  5. package/adapters/codex/skills/flow-feat-design/SKILL.md +2 -2
  6. package/adapters/codex/skills/flow-feat-ship/SKILL.md +3 -1
  7. package/adapters/codex/skills/flow-feat-start/SKILL.md +1 -1
  8. package/adapters/codex/skills/flow-feat-validate/SKILL.md +1 -1
  9. package/adapters/codex/skills/flow-init/SKILL.md +12 -8
  10. package/adapters/codex/skills/flow-next/SKILL.md +5 -4
  11. package/adapters/codex/skills/flow-work-README/SKILL.md +5 -2
  12. package/adapters/gemini/CORE.md +50 -16
  13. package/adapters/gemini/commands/flow/bug/validate.toml +1 -1
  14. package/adapters/gemini/commands/flow/doctor.toml +33 -15
  15. package/adapters/gemini/commands/flow/feat/design.toml +2 -2
  16. package/adapters/gemini/commands/flow/feat/ship.toml +3 -1
  17. package/adapters/gemini/commands/flow/feat/start.toml +1 -1
  18. package/adapters/gemini/commands/flow/feat/validate.toml +1 -1
  19. package/adapters/gemini/commands/flow/init.toml +12 -8
  20. package/adapters/gemini/commands/flow/next.toml +5 -4
  21. package/adapters/gemini/commands/flow/work/README.toml +5 -2
  22. package/adapters/hermes/CORE.md +50 -16
  23. package/adapters/hermes/skills/flow-bug-validate/SKILL.md +1 -1
  24. package/adapters/hermes/skills/flow-doctor/SKILL.md +33 -15
  25. package/adapters/hermes/skills/flow-feat-design/SKILL.md +2 -2
  26. package/adapters/hermes/skills/flow-feat-ship/SKILL.md +3 -1
  27. package/adapters/hermes/skills/flow-feat-start/SKILL.md +1 -1
  28. package/adapters/hermes/skills/flow-feat-validate/SKILL.md +1 -1
  29. package/adapters/hermes/skills/flow-init/SKILL.md +12 -8
  30. package/adapters/hermes/skills/flow-next/SKILL.md +5 -4
  31. package/adapters/hermes/skills/flow-work-README/SKILL.md +5 -2
  32. package/adapters/opencode/CORE.md +50 -16
  33. package/adapters/opencode/commands/flow-bug-validate.md +1 -1
  34. package/adapters/opencode/commands/flow-doctor.md +33 -15
  35. package/adapters/opencode/commands/flow-feat-design.md +2 -2
  36. package/adapters/opencode/commands/flow-feat-ship.md +3 -1
  37. package/adapters/opencode/commands/flow-feat-start.md +1 -1
  38. package/adapters/opencode/commands/flow-feat-validate.md +1 -1
  39. package/adapters/opencode/commands/flow-init.md +12 -8
  40. package/adapters/opencode/commands/flow-next.md +5 -4
  41. package/adapters/opencode/commands/flow-work-README.md +5 -2
  42. package/bin/cli.mjs +160 -65
  43. package/package.json +1 -1
  44. package/plugins/flow/.claude-plugin/plugin.json +1 -1
  45. package/plugins/flow/CHANGELOG.md +33 -0
  46. package/plugins/flow/examples/FLOW.template.md +13 -4
package/README.md CHANGED
@@ -204,8 +204,8 @@ Artifacts are **hand-editable**: rewrite `03-design.md` and the next phase respe
204
204
 
205
205
  `FLOW.md` at the repo root is the shared base. `FLOW.claude.md`, `FLOW.codex.md`,
206
206
  `FLOW.opencode.md`, `FLOW.gemini.md`, `FLOW.hermes.md`, or `FLOW.zcode.md` can sparsely override values for the product executing the
207
- command. Existing repos with only `FLOW.md` behave exactly as before; anything effectively empty
208
- is auto-detected or asked for.
207
+ command. An optional `FLOW.<context>.md`, selected by `FLOW_CONTEXT=<name>` in the environment, sits between the two: a layer the repo commits for where flow runs (CI, a server, an orchestrator). Existing repos with only `FLOW.md` behave exactly as
208
+ before; anything effectively empty is auto-detected or asked for.
209
209
 
210
210
  | Section | What it configures |
211
211
  |---|---|
@@ -222,8 +222,8 @@ is auto-detected or asked for.
222
222
  | `observability` | The profile `/flow:work:watch` monitors after a deploy |
223
223
 
224
224
  `/flow:init` writes a compact base and creates the active overlay only when it has a
225
- harness-specific value. It offers to git-ignore `/FLOW.md`, `/FLOW.*.md`, and `.claude/work/`.
226
- Both files are personal config, not team config
225
+ harness-specific value. It offers to git-ignore `/FLOW.md`, each harness overlay by name, and
226
+ `.claude/work/`. The base and overlays are personal config, not team config
227
227
  ([why](docs/PHILOSOPHY.md#personal-config-not-team-config)). Resolution and examples:
228
228
  [CONFIGURATION](docs/CONFIGURATION.md#harness-overlays).
229
229
 
@@ -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.93.0`.** Compare it once, at the start of the session, against
20
+ **This file belongs to flow `0.94.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
@@ -25,10 +25,14 @@ copy that stays enabled: the harness resolves a command from the one and a skill
25
25
  silently. Name both numbers at the first stop and say which half is which; a rule this file adds and
26
26
  a command relies on is simply absent in that session, and nothing else will report it.
27
27
 
28
- ## 0. Effective FLOW config — base plus harness overlay
28
+ ## 0. Effective FLOW config — base, context layer and harness overlay
29
29
 
30
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
31
+ `find <root> -maxdepth 1 -name 'FLOW*.md'; printf 'FLOW_CONTEXT=%q\n' "${FLOW_CONTEXT-}"` (the roots
32
+ being the ones the bullets below resolve — in a worktree, name both in the same `find`). A quoted
33
+ `-name`, not a shell glob: in zsh a glob that matches nothing aborts the whole command, so the
34
+ root that has no FLOW file would hide the one that does; and `%q`, not `echo`, so a trailing
35
+ space or a `\r` from a CRLF `.env` shows instead of reading as a clean name. One call, and it is not
32
36
  optional — **an overlay you did not list is an overlay you did not read**, and nothing downstream
33
37
  will notice. Every command and artifact calls the effective configuration "`FLOW.md`", a file that
34
38
  exists, so reading it and stopping feels finished — and a missed overlay reports its keys as unset,
@@ -38,24 +42,47 @@ a command relies on is simply absent in that session, and nothing else will repo
38
42
  this command: `FLOW.claude.md`, `FLOW.codex.md`, `FLOW.opencode.md`, `FLOW.gemini.md`,
39
43
  `FLOW.hermes.md`, or `FLOW.zcode.md`. The
40
44
  harness is the product executing the command, never guessed from a model name. An overlay is
41
- valid without a base file; unknown `FLOW.*.md` names are ignored. **A page can outlive the product it
45
+ valid without a base file. **A page can outlive the product it
42
46
  was written for**: zcode reads the plugin's Claude pages as well as its own `/flow:`-prefixed
43
47
  mirror of them, so a `claude` in a path or in a `--harness` flag records where the page was
44
48
  written, never who is running it. On zcode the overlay is `FLOW.zcode.md` and the flag is
45
49
  `--harness zcode`, whichever of the two pages you were handed. Throughout every command,
46
50
  **"FLOW.md" means this effective merged configuration** unless the command explicitly names a
47
51
  file it will edit.
52
+ - **The context layer sits between the two, and whoever launches flow picks it.** `FLOW_CONTEXT`
53
+ set in the environment → `FLOW.<FLOW_CONTEXT>.md` is read after the base and before the harness
54
+ overlay, with the overlay's merge rules. It is how a repo commits what only makes sense where
55
+ flow runs unattended, in CI or on a server — a way to drive the app in a container, a convention
56
+ for those MRs/PRs — without it reaching every laptop through the base. Flow never needs to know
57
+ who set it. Unset or empty → no context layer, and nothing else changes. Set, and the file is
58
+ not there → not an error; say so beside the files you name (`FLOW_CONTEXT=ci: FLOW.ci.md not
59
+ found`), because a typo in the variable is otherwise a repo with no context file. **The name is
60
+ one plain segment, taken exactly as written**: an ASCII letter or digit, then ASCII letters,
61
+ digits, `-` or `_` — nothing trimmed, so a padded `" ci"` fails — and not a harness name in any case
62
+ (`FLOW_CONTEXT=Claude` would read an overlay as the wrong layer). A name that fails → read no
63
+ context layer, say so in the same place, and carry on — never a stop. `flow-workflows` applies
64
+ the same rule, so the two of you resolve the same layers.
65
+ Any other `FLOW.<name>.md` at the root is a context file this run did not select: unread, by
66
+ design.
48
67
  - **"The repo root" is the main checkout's, not the worktree's.** With `git.worktree` set, every
49
68
  phase after `start` runs inside a linked worktree — and a `FLOW.md` the repo git-ignores (the
50
69
  normal case for a personal config, and always the case for a harness overlay) exists **only in
51
70
  the main checkout**. Looking for it where the phase happens finds nothing, and a configuration
52
71
  that resolves to every fallback looks exactly like a repo that never had one: the models, the
53
72
  ceilings and the sensitive paths are silently the defaults, and the phase reports nothing
54
- because from where it stands there is nothing to report. So: prefer a `FLOW.md` in the directory
55
- you are in — a repo that commits its config has one in every worktree, and it may legitimately
56
- differ — and otherwise read both files from the main checkout, which
73
+ because from where it stands there is nothing to report. So, **for each file on its own**: prefer
74
+ the copy in the directory you are in — a repo that commits its config has one in every worktree,
75
+ and it may legitimately differ — and otherwise read it from the main checkout, which
57
76
  `git rev-parse --path-format=absolute --git-common-dir` locates from anywhere (its parent
58
- directory). Name the file you actually read when a stop reports configuration.
77
+ directory) — **unless that checkout tracks it**: the main checkout's HEAD is the first `HEAD`
78
+ line of `git worktree list --porcelain`, and `git ls-tree --name-only <that sha> -- <file>`
79
+ printing the name means it is tracked. A tracked file missing here is this branch's own state,
80
+ deleted, renamed or not added yet, and the main checkout's copy is another branch's version.
81
+ Either command failing → do not borrow the file, and say so where you name the files you read.
82
+ The file name matches exactly, case included, even where the filesystem would not care. One root for all of them misses a file whenever
83
+ they live apart: a committed context file is in the worktree while the git-ignored base exists
84
+ only in the main checkout. Name the file you actually
85
+ read, and where, when a stop reports configuration.
59
86
  **This is a rule about reading a git-ignored config, and it inverts for anything a phase
60
87
  writes into the repo.** A tracked file belongs to the branch, and the branch is the worktree:
61
88
  written to the main checkout it lands on whatever that checkout is standing on — usually the
@@ -68,16 +95,17 @@ a command relies on is simply absent in that session, and nothing else will repo
68
95
  ("add this to try it once") would be read as the configuration it illustrates, while the prose
69
96
  around it says otherwise and nothing reports the disagreement. **Skip fenced regions when you read a FLOW
70
97
  file**; `flow-workflows` does the same, so the two of you resolve the same config.
71
- - Merge by section and key. A key present in the active overlay replaces the base value; a key
72
- absent there inherits the base. **A present-but-empty overlay key masks the base** and resolves
98
+ - Merge by section and key, in order: base, context layer, active overlay. A key present in a
99
+ later layer replaces the earlier value; a key absent there inherits it. **A present-but-empty key
100
+ masks what came before** and resolves
73
101
  to the normal empty-key fallback — this is how Codex can inherit its session model while a legacy
74
102
  `FLOW.md` still names a Claude model. A list-valued key is replaced as a whole, never appended.
75
- `conventions` is the one unkeyed section: its overlay lines are added after the base lines, so
76
- both sets apply. **Every value carries the file it came from**, and a phase that prints a value
103
+ `conventions` is the one unkeyed section: each layer's lines are added after the previous ones,
104
+ so every set applies. **Every value carries the file it came from**, and a phase that prints a value
77
105
  prints that file with it — "`agents: opus` (`FLOW.claude.md`)", never the value alone. `doctor` reports it and later
78
106
  edits preserve it.
79
- - The sections in either file are tracker, git, autonomy, quality, agents, models, data,
80
- conventions, notes, knowledge, and observability. Both files missing, or an effective empty key
107
+ - The sections in any of the files are tracker, git, autonomy, quality, agents, models, data,
108
+ conventions, notes, knowledge, and observability. No layer found, or an effective empty key
81
109
  → the default or auto-discovery each step names. Never stop because a file or key is empty.
82
110
  - **An empty key that is a real decision for this repo is offered where it first matters**, and
83
111
  nowhere else. Three steps, in order:
@@ -102,7 +130,10 @@ a command relies on is simply absent in that session, and nothing else will repo
102
130
  The FLOW config is personal, so writing a line is not a team decision; it is still an edit to the
103
131
  tree, so the option is an explicit choice the user makes, never a default action (same bar as
104
132
  flow-core §8's convention offer, and the two share their wording). Update a value in the file it
105
- came from. A new repo fact or shared preference goes to `FLOW.md`; a new harness-owned model,
133
+ came from — **except that the context layer is not personal**: it is committed, a value it holds
134
+ is the repo's, and changing it is a change to a tracked file of this branch, written here (the
135
+ inversion above) and shipped in the MR/PR like code, never offered as a quick config line. A new
136
+ key never goes to the context layer by this route. A new repo fact or shared preference goes to `FLOW.md`; a new harness-owned model,
106
137
  agent, skill, orchestration tool, or knowledge-tool name goes to the active overlay. Never edit an
107
138
  inactive harness's overlay.
108
139
  - **Knowledge sources, by role** (`knowledge` section): `search` (one or more tools or commands
@@ -1080,7 +1111,10 @@ learned during `build` is enforced in the review of that same MR/PR, not of the
1080
1111
  **`ship` offers them once, at Close** — one `AskUserQuestion`, batched up to 4, options **Add to
1081
1112
  FLOW.md** · **Not a rule** · **Later**, the `text` being the whole prompt. *Add* appends a convention
1082
1113
  to the base `FLOW.md`. A `quality` correction updates the file its effective value came from, or the
1083
- base when the key was absent: otherwise an overlay would immediately hide the correction. The FLOW
1114
+ base when the key was absent: otherwise an overlay would immediately hide the correction. A value
1115
+ that came from the context layer is the exception (§0): that file is committed, so the correction
1116
+ is a change to this branch, made before the MR/PR is created or offered as a follow-up — never a
1117
+ config line written after it. The FLOW
1084
1118
  config is personal, but this is still an edit to a file in the tree, so **it is asked in every
1085
1119
  mode**, like `KNOWLEDGE.md`'s first creation. No candidates → the step does not exist and says
1086
1120
  nothing.
@@ -37,7 +37,7 @@ Read `~/.claude/flow/CORE.codex.md` first (shared rules: `FLOW.md` step 0, model
37
37
 
38
38
  **Mandatory regression test**: launch the `agents.testing` agent from FLOW.md (empty → `Agent general-purpose` with a test-writing role):
39
39
 
40
- > Write a test that **fails** before the fix and **passes** after. Read `.claude/work/<TICKET>/03-investigation.md` (minimal reproduction), `04-fix.md` (what was changed). Follow the effective conventions from `FLOW.md` plus the active harness overlay. Report the path of the added test.
40
+ > Write a test that **fails** before the fix and **passes** after. Read `.claude/work/<TICKET>/03-investigation.md` (minimal reproduction), `04-fix.md` (what was changed). Follow the effective conventions from `FLOW.md`, the context layer `FLOW_CONTEXT` selects and the active harness overlay. Report the path of the added test.
41
41
 
42
42
  Then:
43
43
  1. Run only that test with `quality.test_one` from FLOW.md; it must pass.
@@ -30,15 +30,19 @@ changing machines, after `$flow-init`, or when a command failed the way an envir
30
30
  ## 1. Load
31
31
 
32
32
  - Identify the active harness and read the effective configuration exactly as flow-core §0: base
33
- `FLOW.md`, then its `FLOW.<harness>.md` overlay. Never read another harness's overlay. Both absent
33
+ `FLOW.md`, then the context layer `FLOW.<FLOW_CONTEXT>.md` when the variable is set, then its
34
+ `FLOW.<harness>.md` overlay. Never read another harness's overlay. **Name the active context** —
35
+ its value and the file it selects, `none` when the variable is unset, and the reason when the name
36
+ was refused or the file is missing (flow-core §0): a context set on a server and lost on the way
37
+ reads here as `none`, and nowhere else. No layer present
34
38
  is **not** an error: say so in one line, check what needs no config (git, hooks, harness, base
35
39
  branch, plugin files), and note that `$flow-init` would let this command check the rest.
36
40
  **Say which checkout the configuration came from** whenever it is not the directory you are in
37
41
  (flow-core §0: a worktree does not carry a git-ignored `FLOW.md`). A diagnosis run from a
38
42
  worktree that quietly read nothing is the one that certifies a repo as unconfigured.
39
- - Parse both files by section: `tracker`, `git`, `autonomy`, `quality`, `agents`, `models`, `data`,
43
+ - Parse each layer by section: `tracker`, `git`, `autonomy`, `quality`, `agents`, `models`, `data`,
40
44
  `conventions`, `notes`, `knowledge`, `observability`; merge keys and empty masks per flow-core §0.
41
- Keep the source of every effective value. Both absent → §1.5 runs with **every** key empty (all
45
+ Keep the source of every effective value. No layer present → §1.5 runs with **every** key empty (all
42
46
  fallbacks), which is a legitimate and complete answer.
43
47
 
44
48
  ## 1.5 What the configuration says
@@ -52,14 +56,14 @@ documented keys absent from the effective configuration (the "empty → fallback
52
56
  For **every** documented key in `examples/FLOW.template.md`, one row:
53
57
 
54
58
  - **set** → the value and source file (list keys like `git.worktree_resync` or
55
- `quality.reviewers`: the items). A value overridden by the active overlay names only the active
56
- value here; do not make the user mentally merge two tables.
59
+ `quality.reviewers`: the items). A value overridden by a later layer names only the winning
60
+ value and its file here; do not make the user mentally merge two tables.
57
61
  - **empty / absent** → `(empty → <what happens>)`, taken from the key's comment in the template
58
62
  (e.g. `quality.test` → "auto-discover from Makefile/npm/composer/Gradle/dotnet/Xcode/Flutter"; `tracker.tool` → "manual paste";
59
63
  `agents.security` → "general-purpose with the role"; `git.worktree` → "off / in-place";
60
64
  `git.worktree_resync` → "`$flow-work-try` only switches, no re-sync"; `quality.review_depth` →
61
- "proportional" — the other depths are `light` and `full`). An empty overlay mask says
62
- `(masked by FLOW.<harness>.md → <what happens>)`. Never leave a reader guessing what an empty key
65
+ "proportional" — the other depths are `light` and `full`). An empty mask says
66
+ `(masked by FLOW.<context or harness>.md → <what happens>)`. Never leave a reader guessing what an empty key
63
67
  does.
64
68
 
65
69
  For `knowledge`, print the four roles resolved with who decided each: the `knowledge` key, or empty with its fallback (`search` → no lookups; `stage` → artifact only; `read_staging` → artifacts; `save` → `KNOWLEDGE.md`). A `domain_memory` section still in the file → one line: *"`domain_memory` is no longer read; name the tools you want under `knowledge`"* — it is retired configuration, not an error.
@@ -73,7 +77,7 @@ print one informational line: those values currently apply to every harness with
73
77
  override. This is valid configuration, not a warning and never a claim that a free-text model name
74
78
  is invalid.
75
79
 
76
- #### 1.5.2 Resolved models (only if either file has a `models` key)
80
+ #### 1.5.2 Resolved models (only if any layer has a `models` key)
77
81
 
78
82
  Three keys, all about subagents. Print what each one actually reaches:
79
83
 
@@ -123,10 +127,23 @@ data.volumes (none — duel ran schema-only) 2 works last: query
123
127
 
124
128
  ### 1.5.4 Problems in the configuration files (flag, do not fix)
125
129
 
126
- Report problems, change nothing. Validate the base and active overlay separately, name the file
127
- that owns each problem, and ignore inactive overlays. An unknown root `FLOW.*.md` file gets one
128
- warning listing the supported harness names because no command will read it. **Scope: these files.**
129
- Whether the world they describe exists —
130
+ Report problems, change nothing. Validate the base, the active context file and the active
131
+ overlay separately, name the file that owns each problem, and ignore inactive overlays. Any other
132
+ root `FLOW.<name>.md` is a context file this run did not select: list it once, as inactive, with the
133
+ `FLOW_CONTEXT=<name>` that would select it and the six harness overlay names beside it — a
134
+ misspelled overlay (`FLOW.cluade.md`) reads exactly like a context, and only the reader can tell —
135
+ never as unknown, and its keys are not validated. Only a name the context rule refuses (flow-core
136
+ §0) gets a warning, because nothing will ever read it.
137
+ - **A context file git would swallow**: run `git check-ignore -v --no-index FLOW.flow-probe.md` at
138
+ the repo root — a name no repo tracks, so a context file that was force-added does not hide the
139
+ rule, and `--no-index` asks the ignore rules rather than the index. It prints a rule that does not
140
+ start with `!` → one warning naming that rule and its file (`.gitignore`, `.git/info/exclude`, a
141
+ global excludes file): a `FLOW.*.md` written by an older `$flow-init` hides every new context file
142
+ from `git add`, and the run that needs it reports it `not found` somewhere else, long after.
143
+ Replace the glob with the names `$flow-init` §5 lists. A `!` rule, or nothing printed → no
144
+ warning.
145
+
146
+ **Scope: these files.** Whether the world they describe exists —
130
147
  CLIs installed *and authenticated*, agents discoverable, hooks executable, the MCP reachable, the
131
148
  base branch resolvable — is §2 below; flag the key here, check the world there, never both.
132
149
 
@@ -266,10 +283,11 @@ refuse) · **degraded** (it runs, quietly worse than the config promises), plus
266
283
  ## 3. Output
267
284
 
268
285
  §1.5 always prints — it is the answer to half the question. Start it with one line naming the files
269
- that produced the effective configuration (`FLOW.md + FLOW.codex.md`, `FLOW.md only`, active
270
- overlay only, or defaults only). **The checks are quiet on success**:
286
+ that produced the effective configuration, in merge order and with the checkout each came from
287
+ when it is not this one (`FLOW.md + FLOW.ci.md [FLOW_CONTEXT=ci] + FLOW.codex.md`, `FLOW.md only`,
288
+ active overlay only, or defaults only), and the active context on the next line. **The checks are quiet on success**:
271
289
  one line per check that is *not* ok, grouped by the six areas above, plus a summary line. Close with
272
- `N effective keys set (O from overlay), M using fallbacks, K warnings` from §1.5 next to the
290
+ `N effective keys set (C from the context layer, O from overlay), M using fallbacks, K warnings` from §1.5 next to the
273
291
  findings count.
274
292
 
275
293
 
@@ -103,8 +103,8 @@ authorization, payments, personal data, a public contract, a migration):
103
103
  Each advisor gets this brief, with its lens substituted:
104
104
 
105
105
  > Propose ONE approach to solve ticket `<TICKET>`, from this lens: `<lens brief>`. Read
106
- > `.claude/work/<TICKET>/01-context.md` for context and the effective FLOW configuration (base plus
107
- > active harness overlay) for project conventions. What already exists in the repository:
106
+ > `.claude/work/<TICKET>/01-context.md` for context and the effective FLOW configuration (base, the
107
+ > context layer `FLOW_CONTEXT` selects, and the active harness overlay) for project conventions. What already exists in the repository:
108
108
  > `<the §1.5.1 inventory>` — propose a new piece only where nothing there fits. Do not
109
109
  > write code. Be specific about real modules and layers of this project. Report: name, what it is
110
110
  > (one sentence), modules/layers affected, main risk, and why it could be a bad idea. Under 250 words.
@@ -533,7 +533,9 @@ Read `meta.json.conventions_candidates[]` (flow-core §8). **No entries with `st
533
533
  decision — the FLOW config is personal — so it is one question, never a negotiation.
534
534
  4. **Add / Replace** → append a `conventions` line to the base `FLOW.md`. For a `quality.<key>`,
535
535
  update the file its effective value came from, or the base when it was absent; otherwise an
536
- overlay would immediately hide the correction. Show the old value and source in the result.
536
+ overlay would immediately hide the correction. A value from the context layer (flow-core §0) is
537
+ not edited here: that file is committed and the MR/PR is already out, so record the candidate as
538
+ a `followups[]` entry (`kind: "tooling"`) naming the file and the line instead. Show the old value and source in the result.
537
539
  Then `status: "added"`. **Not a rule** → `declined`, never offered again in any work.
538
540
  **Later** → stays `proposed` and is offered again by the next `ship` of a work that has it.
539
541
  5. **One line on screen**: how many rules were added and where, never a list of the texts —
@@ -50,7 +50,7 @@ its reason file in a `mktemp -d` directory (flow-core §2.1).
50
50
 
51
51
  ## 1. Pre-flight
52
52
 
53
- - Read the effective FLOW configuration per flow-core §0; neither base nor active overlay → each
53
+ - Read the effective FLOW configuration per flow-core §0; no FLOW layer present → each
54
54
  step's default. This command **creates** `00-summary.md` (§6) instead of reading it (flow-core §5).
55
55
  - No recognizable project structure → warn and stop.
56
56
  - **Determine the mode**: `$ARGUMENTS` non-empty → *ticket mode* (identifier = `$ARGUMENTS`); empty → *ticket-less* (identifier = the §2.5 slug).
@@ -38,7 +38,7 @@ One of the three below writes and two of them read, so they do not all go at onc
38
38
 
39
39
  **First, alone — the writer.** It is told the **test files are the deliverable**, saved as each one is finished, not at the end:
40
40
 
41
- 1. **Testing agent**: the `agents.testing` agent from the effective FLOW config; if empty, `Agent general-purpose` with this role. Brief: "Review the branch changes and complete the test suite where coverage is missing. Focus: the acceptance criteria in `03-design.md` marked `test` that no current test demonstrably asserts (see the §3 mapping), plus edge cases from `03-design.md`, error paths, input validations, emitted domain events. Do not rewrite tests that already pass. Read `.claude/work/<TICKET>/03-design.md` and `05-implementation.md`. Follow the project's effective test conventions from `FLOW.md` plus the active harness overlay."
41
+ 1. **Testing agent**: the `agents.testing` agent from the effective FLOW config; if empty, `Agent general-purpose` with this role. Brief: "Review the branch changes and complete the test suite where coverage is missing. Focus: the acceptance criteria in `03-design.md` marked `test` that no current test demonstrably asserts (see the §3 mapping), plus edge cases from `03-design.md`, error paths, input validations, emitted domain events. Do not rewrite tests that already pass. Read `.claude/work/<TICKET>/03-design.md` and `05-implementation.md`. Follow the project's effective test conventions from `FLOW.md`, the context layer `FLOW_CONTEXT` selects and the active harness overlay."
42
42
 
43
43
  **Then, in parallel — the readers**, once the testing agent has reported and its files are on disk. The suite runs here and not earlier for a second reason beyond the collision: run after the writer, it is the first thing that has ever executed the tests this phase just added.
44
44
 
@@ -24,14 +24,17 @@ and optional harness-owned values in the active `FLOW.<harness>.md`. The active
24
24
  `FLOW.zcode.md`; identify it from the
25
25
  product executing this command, never from the selected model (zcode runs the Claude pages too, so
26
26
  the page you are reading does not name the harness). Every other `$flow-*` command reads
27
- the base and then that overlay. The user answers the **minimum**: what the repo can tell is
27
+ the base, then the context layer `FLOW_CONTEXT` selects (flow-core §0), then that overlay. A
28
+ context file is the repo's, committed for where flow runs: `init` writes neither it nor its key. The user answers the **minimum**: what the repo can tell is
28
29
  auto-detected and only confirmed.
29
30
 
30
31
  Key names and contract: `examples/FLOW.template.md` from the plugin. Do not invent keys that are not there.
31
32
 
32
33
  ## 1. If either configuration file already exists
33
34
 
34
- Show `FLOW.md` and the active overlay when each exists, then show their effective merged values.
35
+ Show `FLOW.md` and the active overlay when each exists, then show their effective merged values —
36
+ with the context layer `FLOW_CONTEXT` selects merged in and named when it is set (flow-core §0), so
37
+ a value it masks is not offered as if the base still decided it.
35
38
  Ask: **update** (re-detect and re-ask, preserving what the user keeps) or **cancel**. Never read,
36
39
  change, or display another harness's overlay. Never overwrite either file without confirmation.
37
40
  Label harness-sensitive values that currently come from the base as **shared across harnesses**;
@@ -106,7 +109,7 @@ review, not a questionnaire. Then, and only then, five questions:
106
109
  4. **The quality commands as one block** (`quality.test`, `test_one`, `static_analysis`, `style_fix`,
107
110
  `db_update`, `db_diff`) — confirm or edit what §2 found, all in one question, each may stay empty
108
111
  (= auto-discover at the moment it is needed). Several suites chain into `test` with `&&`.
109
- 5. **Git-ignore** `FLOW.md`, `FLOW.*.md`, and `.claude/work/` — see §5.
112
+ 5. **Git-ignore** `FLOW.md`, the six harness overlays by name, and `.claude/work/` — see §5.
110
113
 
111
114
  **Two keys are written without being asked**: `agents.fanout_max` (`4`) and `agents.budget_max`
112
115
  (`12`), with their default values, because they are the only brake on what a review costs and a key
@@ -125,7 +128,7 @@ overlay, never the base.
125
128
 
126
129
  ## 4. Write the base and, only when needed, the active overlay
127
130
 
128
- Write compact files at the repo root — every command reads the base and active overlay in every
131
+ Write compact files at the repo root — every command reads every FLOW layer in every
129
132
  phase, so their size is paid on every step:
130
133
 
131
134
  - `FLOW.md` holds repo facts and shared preferences: tracker, git, autonomy, quality commands, cost
@@ -158,9 +161,10 @@ phase, so their size is paid on every step:
158
161
  - The base and overlays are **personal config, not team config** (repo facts mixed with one
159
162
  developer's flow preferences, tools and agents; **no secrets**) — they should not be committed.
160
163
  One `AskUserQuestion`, both parts in the same question:
161
- - The root files not already git-ignored → **offer to add `/FLOW.md` and `/FLOW.*.md` to
162
- `.gitignore`**. This edits a tracked file — confirm before writing. A team wanting the repo-fact
163
- subset can still commit it deliberately. Do not use a recursive pattern: examples under the
164
- plugin must remain visible.
164
+ - The root files not already git-ignored → **offer to add `/FLOW.md`, `/FLOW.claude.md`, `/FLOW.codex.md`, `/FLOW.gemini.md`, `/FLOW.hermes.md`, `/FLOW.opencode.md` and `/FLOW.zcode.md` to `.gitignore`**,
165
+ each by name. This edits a tracked file — confirm before writing. A team wanting the repo-fact
166
+ subset can still commit it deliberately. Never `/FLOW.*.md`: it also hides a context layer
167
+ (`FLOW.<context>.md`, flow-core §0), which a repo commits on purpose. Do not use a recursive
168
+ pattern either: examples under the plugin must remain visible.
165
169
  - Git-ignore `.claude/work/` too — recommended default: ignore it (artifacts are personal working state; teams that want to share them commit deliberately). `git.worktree` not `off` → offer `.worktrees/` in the same gesture.
166
170
  - Suggest `$flow-next` as the next step (it routes to `$flow-feat-start`, `$flow-work-resume` or `$flow-work-status`).
@@ -25,8 +25,9 @@ runs a phase on its own and never advances `meta.json`.
25
25
 
26
26
  ## 1. Look
27
27
 
28
- 1. Identify the active harness. Does `FLOW.md` or its active `FLOW.<harness>.md` exist at the repo
29
- root? An inactive harness's overlay does not configure this session.
28
+ 1. Identify the active harness. Does `FLOW.md`, the context file `FLOW_CONTEXT` selects, or the
29
+ active `FLOW.<harness>.md` exist (flow-core §0)? An inactive harness's overlay, or a context file
30
+ no variable selects, does not configure this session.
30
31
  2. `git branch --show-current`, and whether `.claude/work/*/meta.json` has a `branch` equal to it (also check `worktree` entries, and `.claude/work/_archive/` is ignored).
31
32
  3. `.claude/work/` — how many open works, and their `phase` (from `meta.json`; read `00-summary.md` when present, never the full artifacts).
32
33
  3b. `followups[]` across those works **and** `.claude/work/_archive/*/meta.json`: any entry `accepted` with no `work` started (flow-core §7).
@@ -36,7 +37,7 @@ runs a phase on its own and never advances `meta.json`.
36
37
 
37
38
  | Situation | Say | Propose |
38
39
  |---|---|---|
39
- | Neither base nor active overlay | "This repo is not configured for flow on this harness yet." One line on what the FLOW config is (personal config, auto-detected). | `$flow-init` |
40
+ | No FLOW layer present | "This repo is not configured for flow on this harness yet." One line on what the FLOW config is (personal config, auto-detected). | `$flow-init` |
40
41
  | A work matches the current branch | Its stop header (flow-core §3: ticket · size · phase · MR #n of N) and the next phase for its size. | `$flow-work-resume` |
41
42
  | No match, but open works exist | Count, and the two most recently updated with their phase. | `$flow-work-status`, or `$flow-feat-start` / `$flow-bug-start` if the user said what they want to do |
42
43
  | No works at all, but an accepted follow-up is waiting | "Nothing in flight — but `<TICKET>` F1 was accepted and never started: `<title>`." | `$flow-feat-start <ticket>` (or `$flow-bug-start`) for that follow-up · `$flow-feat-start` for something else |
@@ -45,7 +46,7 @@ runs a phase on its own and never advances `meta.json`.
45
46
  - The SessionStart hook (`hooks/session-start.sh`) has already printed the first two rows of this table's second case — the header and what the last session was doing — off disk, without reading a ticket or an artifact. Say them again anyway: `next` is where the user asked, and a line they scrolled past is not an answer.
46
47
  - An `accepted` follow-up exists **and** other works are open → do not reroute; add one line naming it after the options. It is a standing commitment, not an interruption.
47
48
  - Dirty tree and no matching work → mention it in one line ("uncommitted changes on `<branch>`, no work is tracking them") before the options; `start` will warn again.
48
- - A base or active overlay is present but `$flow-doctor` has never been run in this session and the
49
+ - A FLOW layer is present but `$flow-doctor` has never been run in this session and the
49
50
  git host CLI is not on `PATH` → add `$flow-doctor` as a secondary option.
50
51
  - In `autonomy.mode: guided`/`auto`, the route is still asked: `next` is where a session begins, and the mode governs what happens *inside* a phase, not which work the user wants to pick up.
51
52
 
@@ -26,8 +26,11 @@ This system **orchestrates** the project's existing sub-agents and skills (it do
26
26
  commands, code conventions, and observability profile.
27
27
  - The active `FLOW.<harness>.md` is an optional sparse overlay (`claude`, `codex`, `opencode`,
28
28
  `gemini`, `hermes`, or `zcode`) for model names, agents, skills, orchestration, knowledge tools, or any other value that
29
- differs on that harness. Every command reads the base and then the active overlay in step 0;
29
+ differs on that harness. Every command reads the base, the context layer below, and then the
30
+ active overlay in step 0;
30
31
  existing repos with only `FLOW.md` behave exactly as before.
32
+ - `FLOW_CONTEXT=<name>` in the environment adds `FLOW.<name>.md` between the two: a layer the repo
33
+ commits for where flow runs (CI, a server, an orchestrator), with the overlay's merge rules.
31
34
  - An overlay key replaces the base even when explicitly empty; an absent key inherits it. Lists
32
35
  replace whole lists. Overlay `conventions` are added after base conventions. In the rest of this
33
36
  document, `FLOW.md` means the effective merged configuration unless a write target is explicit.
@@ -248,7 +251,7 @@ Two signals arrive on an open MR/PR, each with its own cross-cutting loop (feat
248
251
 
249
252
  ## Cross-cutting commands
250
253
 
251
- - `$flow-next` — the entry point: no base or active overlay → init; work on the current branch →
254
+ - `$flow-next` — the entry point: no FLOW layer → init; work on the current branch →
252
255
  resume; otherwise status.
253
256
  - `$flow-work-daily [question]` — the **work assistant** (daily standup), read-only. **Local** (`.claude/work/` + git) + **forge** (open MRs/PRs, reviews awaiting you, red CI, unmergeable, unresolved threads via `git.cli`) + **tracker** (assigned tickets, priority changes via `tracker.tool`); where they cross, concrete commands (`$flow-feat-start`, `$flow-work-green`, `$flow-work-respond`). No argument → *yesterday · today · blockers*; a question → just that. External sources best-effort, never blocking; the only write is a "last seen" marker, like `$flow-news`.
254
257
  - `$flow-work-status` — all works in `.claude/work/`, current phase, divergence with git.
@@ -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.93.0`.** Compare it once, at the start of the session, against
19
+ **This file belongs to flow `0.94.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
@@ -24,10 +24,14 @@ copy that stays enabled: the harness resolves a command from the one and a skill
24
24
  silently. Name both numbers at the first stop and say which half is which; a rule this file adds and
25
25
  a command relies on is simply absent in that session, and nothing else will report it.
26
26
 
27
- ## 0. Effective FLOW config — base plus harness overlay
27
+ ## 0. Effective FLOW config — base, context layer and harness overlay
28
28
 
29
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
30
+ `find <root> -maxdepth 1 -name 'FLOW*.md'; printf 'FLOW_CONTEXT=%q\n' "${FLOW_CONTEXT-}"` (the roots
31
+ being the ones the bullets below resolve — in a worktree, name both in the same `find`). A quoted
32
+ `-name`, not a shell glob: in zsh a glob that matches nothing aborts the whole command, so the
33
+ root that has no FLOW file would hide the one that does; and `%q`, not `echo`, so a trailing
34
+ space or a `\r` from a CRLF `.env` shows instead of reading as a clean name. One call, and it is not
31
35
  optional — **an overlay you did not list is an overlay you did not read**, and nothing downstream
32
36
  will notice. Every command and artifact calls the effective configuration "`FLOW.md`", a file that
33
37
  exists, so reading it and stopping feels finished — and a missed overlay reports its keys as unset,
@@ -37,24 +41,47 @@ a command relies on is simply absent in that session, and nothing else will repo
37
41
  this command: `FLOW.claude.md`, `FLOW.codex.md`, `FLOW.opencode.md`, `FLOW.gemini.md`,
38
42
  `FLOW.hermes.md`, or `FLOW.zcode.md`. The
39
43
  harness is the product executing the command, never guessed from a model name. An overlay is
40
- valid without a base file; unknown `FLOW.*.md` names are ignored. **A page can outlive the product it
44
+ valid without a base file. **A page can outlive the product it
41
45
  was written for**: zcode reads the plugin's Claude pages as well as its own `/flow:`-prefixed
42
46
  mirror of them, so a `claude` in a path or in a `--harness` flag records where the page was
43
47
  written, never who is running it. On zcode the overlay is `FLOW.zcode.md` and the flag is
44
48
  `--harness zcode`, whichever of the two pages you were handed. Throughout every command,
45
49
  **"FLOW.md" means this effective merged configuration** unless the command explicitly names a
46
50
  file it will edit.
51
+ - **The context layer sits between the two, and whoever launches flow picks it.** `FLOW_CONTEXT`
52
+ set in the environment → `FLOW.<FLOW_CONTEXT>.md` is read after the base and before the harness
53
+ overlay, with the overlay's merge rules. It is how a repo commits what only makes sense where
54
+ flow runs unattended, in CI or on a server — a way to drive the app in a container, a convention
55
+ for those MRs/PRs — without it reaching every laptop through the base. Flow never needs to know
56
+ who set it. Unset or empty → no context layer, and nothing else changes. Set, and the file is
57
+ not there → not an error; say so beside the files you name (`FLOW_CONTEXT=ci: FLOW.ci.md not
58
+ found`), because a typo in the variable is otherwise a repo with no context file. **The name is
59
+ one plain segment, taken exactly as written**: an ASCII letter or digit, then ASCII letters,
60
+ digits, `-` or `_` — nothing trimmed, so a padded `" ci"` fails — and not a harness name in any case
61
+ (`FLOW_CONTEXT=Claude` would read an overlay as the wrong layer). A name that fails → read no
62
+ context layer, say so in the same place, and carry on — never a stop. `flow-workflows` applies
63
+ the same rule, so the two of you resolve the same layers.
64
+ Any other `FLOW.<name>.md` at the root is a context file this run did not select: unread, by
65
+ design.
47
66
  - **"The repo root" is the main checkout's, not the worktree's.** With `git.worktree` set, every
48
67
  phase after `start` runs inside a linked worktree — and a `FLOW.md` the repo git-ignores (the
49
68
  normal case for a personal config, and always the case for a harness overlay) exists **only in
50
69
  the main checkout**. Looking for it where the phase happens finds nothing, and a configuration
51
70
  that resolves to every fallback looks exactly like a repo that never had one: the models, the
52
71
  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
72
+ because from where it stands there is nothing to report. So, **for each file on its own**: prefer
73
+ the copy in the directory you are in — a repo that commits its config has one in every worktree,
74
+ and it may legitimately differ — and otherwise read it from the main checkout, which
56
75
  `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.
76
+ directory) — **unless that checkout tracks it**: the main checkout's HEAD is the first `HEAD`
77
+ line of `git worktree list --porcelain`, and `git ls-tree --name-only <that sha> -- <file>`
78
+ printing the name means it is tracked. A tracked file missing here is this branch's own state,
79
+ deleted, renamed or not added yet, and the main checkout's copy is another branch's version.
80
+ Either command failing → do not borrow the file, and say so where you name the files you read.
81
+ The file name matches exactly, case included, even where the filesystem would not care. One root for all of them misses a file whenever
82
+ they live apart: a committed context file is in the worktree while the git-ignored base exists
83
+ only in the main checkout. Name the file you actually
84
+ read, and where, when a stop reports configuration.
58
85
  **This is a rule about reading a git-ignored config, and it inverts for anything a phase
59
86
  writes into the repo.** A tracked file belongs to the branch, and the branch is the worktree:
60
87
  written to the main checkout it lands on whatever that checkout is standing on — usually the
@@ -67,16 +94,17 @@ a command relies on is simply absent in that session, and nothing else will repo
67
94
  ("add this to try it once") would be read as the configuration it illustrates, while the prose
68
95
  around it says otherwise and nothing reports the disagreement. **Skip fenced regions when you read a FLOW
69
96
  file**; `flow-workflows` does the same, so the two of you resolve the same config.
70
- - Merge by section and key. A key present in the active overlay replaces the base value; a key
71
- absent there inherits the base. **A present-but-empty overlay key masks the base** and resolves
97
+ - Merge by section and key, in order: base, context layer, active overlay. A key present in a
98
+ later layer replaces the earlier value; a key absent there inherits it. **A present-but-empty key
99
+ masks what came before** and resolves
72
100
  to the normal empty-key fallback — this is how Codex can inherit its session model while a legacy
73
101
  `FLOW.md` still names a Claude model. A list-valued key is replaced as a whole, never appended.
74
- `conventions` is the one unkeyed section: its overlay lines are added after the base lines, so
75
- both sets apply. **Every value carries the file it came from**, and a phase that prints a value
102
+ `conventions` is the one unkeyed section: each layer's lines are added after the previous ones,
103
+ so every set applies. **Every value carries the file it came from**, and a phase that prints a value
76
104
  prints that file with it — "`agents: opus` (`FLOW.claude.md`)", never the value alone. `doctor` reports it and later
77
105
  edits preserve it.
78
- - The sections in either file are tracker, git, autonomy, quality, agents, models, data,
79
- conventions, notes, knowledge, and observability. Both files missing, or an effective empty key
106
+ - The sections in any of the files are tracker, git, autonomy, quality, agents, models, data,
107
+ conventions, notes, knowledge, and observability. No layer found, or an effective empty key
80
108
  → the default or auto-discovery each step names. Never stop because a file or key is empty.
81
109
  - **An empty key that is a real decision for this repo is offered where it first matters**, and
82
110
  nowhere else. Three steps, in order:
@@ -101,7 +129,10 @@ a command relies on is simply absent in that session, and nothing else will repo
101
129
  The FLOW config is personal, so writing a line is not a team decision; it is still an edit to the
102
130
  tree, so the option is an explicit choice the user makes, never a default action (same bar as
103
131
  flow-core §8's convention offer, and the two share their wording). Update a value in the file it
104
- came from. A new repo fact or shared preference goes to `FLOW.md`; a new harness-owned model,
132
+ came from — **except that the context layer is not personal**: it is committed, a value it holds
133
+ is the repo's, and changing it is a change to a tracked file of this branch, written here (the
134
+ inversion above) and shipped in the MR/PR like code, never offered as a quick config line. A new
135
+ key never goes to the context layer by this route. A new repo fact or shared preference goes to `FLOW.md`; a new harness-owned model,
105
136
  agent, skill, orchestration tool, or knowledge-tool name goes to the active overlay. Never edit an
106
137
  inactive harness's overlay.
107
138
  - **Knowledge sources, by role** (`knowledge` section): `search` (one or more tools or commands
@@ -1079,7 +1110,10 @@ learned during `build` is enforced in the review of that same MR/PR, not of the
1079
1110
  **`ship` offers them once, at Close** — one `AskUserQuestion`, batched up to 4, options **Add to
1080
1111
  FLOW.md** · **Not a rule** · **Later**, the `text` being the whole prompt. *Add* appends a convention
1081
1112
  to the base `FLOW.md`. A `quality` correction updates the file its effective value came from, or the
1082
- base when the key was absent: otherwise an overlay would immediately hide the correction. The FLOW
1113
+ base when the key was absent: otherwise an overlay would immediately hide the correction. A value
1114
+ that came from the context layer is the exception (§0): that file is committed, so the correction
1115
+ is a change to this branch, made before the MR/PR is created or offered as a follow-up — never a
1116
+ config line written after it. The FLOW
1083
1117
  config is personal, but this is still an edit to a file in the tree, so **it is asked in every
1084
1118
  mode**, like `KNOWLEDGE.md`'s first creation. No candidates → the step does not exist and says
1085
1119
  nothing.
@@ -33,7 +33,7 @@ Read `~/.claude/flow/CORE.gemini.md` first (shared rules: `FLOW.md` step 0, mode
33
33
 
34
34
  **Mandatory regression test**: launch the `agents.testing` agent from FLOW.md (empty → `Agent general-purpose` with a test-writing role):
35
35
 
36
- > Write a test that **fails** before the fix and **passes** after. Read `.claude/work/<TICKET>/03-investigation.md` (minimal reproduction), `04-fix.md` (what was changed). Follow the effective conventions from `FLOW.md` plus the active harness overlay. Report the path of the added test.
36
+ > Write a test that **fails** before the fix and **passes** after. Read `.claude/work/<TICKET>/03-investigation.md` (minimal reproduction), `04-fix.md` (what was changed). Follow the effective conventions from `FLOW.md`, the context layer `FLOW_CONTEXT` selects and the active harness overlay. Report the path of the added test.
37
37
 
38
38
  Then:
39
39
  1. Run only that test with `quality.test_one` from FLOW.md; it must pass.