flow-workflows 0.89.0 → 0.90.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.
- package/adapters/codex/CORE.md +1 -1
- package/adapters/codex/skills/flow-bug-ship/SKILL.md +3 -3
- package/adapters/codex/skills/flow-feat-review/SKILL.md +2 -0
- package/adapters/codex/skills/flow-feat-ship/SKILL.md +38 -12
- package/adapters/codex/skills/flow-work-README/SKILL.md +1 -1
- package/adapters/codex/skills/flow-work-query/SKILL.md +3 -0
- package/adapters/gemini/CORE.md +1 -1
- package/adapters/gemini/commands/flow/bug/ship.toml +3 -3
- package/adapters/gemini/commands/flow/feat/review.toml +2 -0
- package/adapters/gemini/commands/flow/feat/ship.toml +38 -12
- package/adapters/gemini/commands/flow/work/README.toml +1 -1
- package/adapters/gemini/commands/flow/work/query.toml +3 -0
- package/adapters/hermes/CORE.md +1 -1
- package/adapters/hermes/skills/flow-bug-ship/SKILL.md +3 -3
- package/adapters/hermes/skills/flow-feat-review/SKILL.md +2 -0
- package/adapters/hermes/skills/flow-feat-ship/SKILL.md +38 -12
- package/adapters/hermes/skills/flow-work-README/SKILL.md +1 -1
- package/adapters/hermes/skills/flow-work-query/SKILL.md +3 -0
- package/adapters/opencode/CORE.md +1 -1
- package/adapters/opencode/commands/flow-bug-ship.md +3 -3
- package/adapters/opencode/commands/flow-feat-review.md +2 -0
- package/adapters/opencode/commands/flow-feat-ship.md +38 -12
- package/adapters/opencode/commands/flow-work-README.md +1 -1
- package/adapters/opencode/commands/flow-work-query.md +3 -0
- package/package.json +1 -1
- package/plugins/flow/.claude-plugin/plugin.json +1 -1
- package/plugins/flow/CHANGELOG.md +21 -0
package/adapters/codex/CORE.md
CHANGED
|
@@ -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.
|
|
20
|
+
**This file belongs to flow `0.90.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
|
|
@@ -185,9 +185,9 @@ With an "all threads resolved before merge" policy, the MR/PR cannot be merged o
|
|
|
185
185
|
|
|
186
186
|
### 3.3 Performance comment
|
|
187
187
|
|
|
188
|
-
`$flow-feat-ship` §4.3, unchanged: query rows from `06-review.md`
|
|
189
|
-
|
|
190
|
-
|
|
188
|
+
`$flow-feat-ship` §4.3, unchanged: query rows from `06-review.md` — a modified query that was not
|
|
189
|
+
measured included, as `not measured (<reason>)` — and benchmark rows from `05-validation.md`,
|
|
190
|
+
posted as comments anchored on the changed lines of the MR/PR, confirmed in every mode. A slowness bug is the case where this comment *is* the proof the fix worked.
|
|
191
191
|
|
|
192
192
|
## 4. Close
|
|
193
193
|
|
|
@@ -212,6 +212,8 @@ Judging rules: **no number, no win** (unresolved is recorded unresolved, never s
|
|
|
212
212
|
|
|
213
213
|
**A modified query is judged against its own past, not only against its rivals.** For every query the diff *changes* (as opposed to adds), the duel carries the **base row** — the same query on `git merge-base HEAD <git.default_base>`, measured in the same sandbox with the same seed (`$flow-work-query` §4). Without it the table cannot say whether this diff made things better or worse, which is the one thing a reviewer wants from it.
|
|
214
214
|
|
|
215
|
+
**A modified query with no plan behind its verdict is recorded `ok (plan not measured)` — and says what would measure it (`data.explain_cmd`, a data set) — never a bare `ok`.** Ship publishes that row on the MR/PR (`$flow-feat-ship` §4.3); a reviewer who finds a plain "ok" and no number has no way to know nobody looked.
|
|
216
|
+
|
|
215
217
|
Verdicts as findings: **change** = blocker, through §6; **regressed** = blocker unless `03-design.md` justifies the trade, in which case it is stated and published; **schema / follow-up** → proposed ticket in the output **and a `followups[]` entry** (flow-core §7); **unresolved** → recorded literally with the open question (as §3.5). A `change` verdict resting on a measured plan is already confirmed — no §6 skeptic.
|
|
216
218
|
|
|
217
219
|
## 4. Over-engineering audit (fit + YAGNI)
|
|
@@ -240,22 +240,40 @@ Thread body: the SQL block under "Pre-deploy: run this SQL on the server BEFORE
|
|
|
240
240
|
|
|
241
241
|
With the repo policy "all threads resolved before merge", the MR/PR cannot merge until the SQL is executed and the thread **resolved**. **One single thread even with multiple statements.** Tell the user it is left open on purpose.
|
|
242
242
|
|
|
243
|
-
### 4.3 Performance comment (
|
|
244
|
-
|
|
245
|
-
`06-review.md` §"Data-access duel" has
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
A
|
|
250
|
-
|
|
243
|
+
### 4.3 Performance comment (every modified query, measured or not)
|
|
244
|
+
|
|
245
|
+
Post one when `06-review.md` §"Data-access duel" has a row for a **modified** query — **whatever its
|
|
246
|
+
verdict, measured or not** — or `07-validation.md` §3.7 has benchmark rows. New queries only, or
|
|
247
|
+
renames and reformats only, and nothing benchmarked → post nothing.
|
|
248
|
+
|
|
249
|
+
**A modified query that was never measured is the case this comment exists for.** Silence reads as
|
|
250
|
+
"nothing to see"; a reviewer cannot tell a query that was measured and is fine from one that nobody
|
|
251
|
+
looked at. The row says `not measured (<reason>)` and what would settle it (`data.explain_cmd`, a
|
|
252
|
+
data set, the entry point to run), so the reviewer knows what was *not* checked.
|
|
253
|
+
|
|
254
|
+
**Where it goes: on the query, not under the title.** One **inline thread anchored to the changed
|
|
255
|
+
lines of that query in the MR/PR diff** (a resolvable GitLab discussion with a `position`; a GitHub
|
|
256
|
+
review comment on `path` + `line`), one per modified query. The entry-point rows anchor to the entry
|
|
257
|
+
point's changed line the same way. Anchoring fails (the line is not in the diff, the forge refuses
|
|
258
|
+
the position) → a general MR/PR comment that names the file and line, and say so. A general comment
|
|
259
|
+
is the fallback, never the default: a number a reviewer meets on the line they are reading is read;
|
|
260
|
+
one at the bottom of the page is not.
|
|
261
|
+
|
|
262
|
+
Still a comment and not a description section, because it is **re-posted on every push that changes
|
|
263
|
+
a measured path** (`$flow-work-green`, `$flow-work-respond`), and a description rewritten each round
|
|
251
264
|
loses what the numbers were two rounds ago. The history is the point.
|
|
252
265
|
|
|
266
|
+
For each modified query the comment carries the **plan before and after** — the `data.explain_cmd`
|
|
267
|
+
output on the merge base and on the branch, same data, trimmed to access type, index, rows read — next
|
|
268
|
+
to the numbers:
|
|
269
|
+
|
|
253
270
|
```markdown
|
|
254
|
-
## Performance — base `<sha>` → `<sha>`
|
|
271
|
+
## Performance — `FooRepository::findBar()`, base `<sha>` → `<sha>`
|
|
255
272
|
|
|
256
|
-
|
|
|
257
|
-
|
|
258
|
-
| `
|
|
273
|
+
| | Plan (access · index · rows read) | Rows returned | Time (min–max, 3 runs) | Verdict |
|
|
274
|
+
|---|---|---|---|---|
|
|
275
|
+
| base | `ref` · `idx_a` · 41k | 15 | 120–131 ms | |
|
|
276
|
+
| now | `range` · `idx_b` · 750 | 15 | 8–9 ms | improved |
|
|
259
277
|
|
|
260
278
|
| Entry point | Time | Peak memory | Verdict |
|
|
261
279
|
|---|---|---|---|
|
|
@@ -265,6 +283,14 @@ Measured on <data set>, <n> runs each. A difference inside the run-to-run spread
|
|
|
265
283
|
no measurable change, not a percentage.
|
|
266
284
|
```
|
|
267
285
|
|
|
286
|
+
- **The query, ready to run where the data is real.** Every performance comment ends with the exact
|
|
287
|
+
query (as the engine receives it, parameters filled with representative values) and the read-only
|
|
288
|
+
plan command for it — `EXPLAIN`, never `EXPLAIN ANALYZE` on a write — in a code block, so the
|
|
289
|
+
author can run it on production or a replica and answer in the thread. This is a complement to the
|
|
290
|
+
sandbox measurement, never a substitute: the flow does not touch production.
|
|
291
|
+
- **Memory is the entry point's, not the query's.** A modified query also gets the entry-point row
|
|
292
|
+
that exercises it, through `quality.bench_cmd` on both sides (`$flow-*-validate` §3.7). No
|
|
293
|
+
`bench_cmd` → the entry-point row says `not measured (no quality.bench_cmd)`; never an estimate.
|
|
268
294
|
- **Verdicts**: `improved` · `no measurable change` · `regressed` · `not measured (<reason>)`.
|
|
269
295
|
- **A `regressed` row is a review blocker** unless `03-design.md` justifies the trade — in which
|
|
270
296
|
case the justification goes in the comment, in one line, next to the row.
|
|
@@ -50,7 +50,7 @@ This system **orchestrates** the project's existing sub-agents and skills (it do
|
|
|
50
50
|
- **Understand before starting**: design-affecting doubts left after ticket + knowledge search + code → one `AskUserQuestion` with all of them before closing `$flow-feat-start` or `$flow-feat-design` §1.5.
|
|
51
51
|
- **Reuse before creating**: in `$flow-feat-design`, check the affected and neighbouring modules before any new entity, column, repository, service or event; justify intentional duplication in `03-design.md`; never force a poor fit.
|
|
52
52
|
- **Solve the real project problem, not the generic one (fit + YAGNI)**: before any defensive mechanism, **two questions with evidence** — **(a) Does it fit? Can this scenario actually happen given how this project works?** (knowledge search + code, **not** textbook patterns; already prevented → **unnecessary**); **(b) Do we need it now, for what the ticket asks?** (hypothetical → **don't add it**, "idea for a separate ticket"). Bias **remove, not add** — `$flow-feat-design` challenger ("Fit and need") and the defensive mechanisms table of `03-design.md`.
|
|
53
|
-
- **A change is measured against what it replaces, not only against its rivals**: a **modified** query carries the **base row** — the same query on `git merge-base HEAD <git.default_base>`, same sandbox, same seed, same three runs (`$flow-work-query` §4) — and `quality.bench_cmd` benchmarks a touched route, command, consumer or job on both sides (`$flow-*-validate` §3.7). Times are reported `min–max`, and **a difference inside the spread is "no measurable change", never a percentage**. `regressed` blocks like `change` unless the design justifies the trade. The numbers are posted as
|
|
53
|
+
- **A change is measured against what it replaces, not only against its rivals**: a **modified** query carries the **base row** — the same query on `git merge-base HEAD <git.default_base>`, same sandbox, same seed, same three runs (`$flow-work-query` §4) — and `quality.bench_cmd` benchmarks a touched route, command, consumer or job on both sides (`$flow-*-validate` §3.7). Times are reported `min–max`, and **a difference inside the spread is "no measurable change", never a percentage**. `regressed` blocks like `change` unless the design justifies the trade. The numbers — or, for a modified query nobody could measure, `not measured` and why — are posted as **inline comments on the changed query** (`ship` §4.3), re-posted whenever a later push changes a measured path.
|
|
54
54
|
- **A query is judged on its plan, not on its prose**: cost lives in the **execution plan**, not the diff. `$flow-work-query`: facts, a challenger blinded to the design's rationale, the main agent judges — **no number, no win**, **no dogma in either direction**, **the objector's variant measured next to yours**. **Any size, XS included.** A performance objection is answered with a plan; an unmeasured plan is never reported as measured ("schema only" / "not measured" are legitimate verdicts; a fixture-sized test database is not evidence).
|
|
55
55
|
- **Size is revisable**: a later phase (`design`, `plan`, `investigate`) seeing a clear mismatch **proposes reclassifying to the user** and updates `meta.json.size`.
|
|
56
56
|
- **If the implementation invalidates the design, return to design**: in `$flow-feat-build`, 2+ significant deviations in `05-implementation.md`, or one changing an ADR-light decision → **pause and return to `$flow-feat-design`** (what `$flow-feat-review` and `$flow-feat-validate` read). Same for `$flow-bug-fix` vs `$flow-bug-investigate`.
|
|
@@ -149,6 +149,9 @@ Per query, exactly one of:
|
|
|
149
149
|
|
|
150
150
|
- **ok** — access supported and bounded; state the index used and rows read. For a modified query,
|
|
151
151
|
say how it compares to the base row: *improved*, *no measurable change*, or *regressed*.
|
|
152
|
+
**No plan was read → it is `ok (plan not measured)`**, with the reason, never a bare `ok`: a
|
|
153
|
+
modified query reaches the MR/PR through `$flow-feat-ship` §4.3 and the reviewer must be able to
|
|
154
|
+
tell it was never measured.
|
|
152
155
|
- **regressed** — measurably worse than the base version, and the design does not justify it. A
|
|
153
156
|
blocker, the same as `change`. Justified in `03-design.md` (a correctness fix that costs time, a
|
|
154
157
|
deliberate trade) → not a blocker, but it is stated in the verdict and it reaches the MR/PR.
|
package/adapters/gemini/CORE.md
CHANGED
|
@@ -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.
|
|
19
|
+
**This file belongs to flow `0.90.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
|
|
@@ -181,9 +181,9 @@ With an "all threads resolved before merge" policy, the MR/PR cannot be merged o
|
|
|
181
181
|
|
|
182
182
|
### 3.3 Performance comment
|
|
183
183
|
|
|
184
|
-
`/flow:feat:ship` §4.3, unchanged: query rows from `06-review.md`
|
|
185
|
-
|
|
186
|
-
|
|
184
|
+
`/flow:feat:ship` §4.3, unchanged: query rows from `06-review.md` — a modified query that was not
|
|
185
|
+
measured included, as `not measured (<reason>)` — and benchmark rows from `05-validation.md`,
|
|
186
|
+
posted as comments anchored on the changed lines of the MR/PR, confirmed in every mode. A slowness bug is the case where this comment *is* the proof the fix worked.
|
|
187
187
|
|
|
188
188
|
## 4. Close
|
|
189
189
|
|
|
@@ -208,6 +208,8 @@ Judging rules: **no number, no win** (unresolved is recorded unresolved, never s
|
|
|
208
208
|
|
|
209
209
|
**A modified query is judged against its own past, not only against its rivals.** For every query the diff *changes* (as opposed to adds), the duel carries the **base row** — the same query on `git merge-base HEAD <git.default_base>`, measured in the same sandbox with the same seed (`/flow:work:query` §4). Without it the table cannot say whether this diff made things better or worse, which is the one thing a reviewer wants from it.
|
|
210
210
|
|
|
211
|
+
**A modified query with no plan behind its verdict is recorded `ok (plan not measured)` — and says what would measure it (`data.explain_cmd`, a data set) — never a bare `ok`.** Ship publishes that row on the MR/PR (`/flow:feat:ship` §4.3); a reviewer who finds a plain "ok" and no number has no way to know nobody looked.
|
|
212
|
+
|
|
211
213
|
Verdicts as findings: **change** = blocker, through §6; **regressed** = blocker unless `03-design.md` justifies the trade, in which case it is stated and published; **schema / follow-up** → proposed ticket in the output **and a `followups[]` entry** (flow-core §7); **unresolved** → recorded literally with the open question (as §3.5). A `change` verdict resting on a measured plan is already confirmed — no §6 skeptic.
|
|
212
214
|
|
|
213
215
|
## 4. Over-engineering audit (fit + YAGNI)
|
|
@@ -236,22 +236,40 @@ Thread body: the SQL block under "Pre-deploy: run this SQL on the server BEFORE
|
|
|
236
236
|
|
|
237
237
|
With the repo policy "all threads resolved before merge", the MR/PR cannot merge until the SQL is executed and the thread **resolved**. **One single thread even with multiple statements.** Tell the user it is left open on purpose.
|
|
238
238
|
|
|
239
|
-
### 4.3 Performance comment (
|
|
240
|
-
|
|
241
|
-
`06-review.md` §"Data-access duel" has
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
A
|
|
246
|
-
|
|
239
|
+
### 4.3 Performance comment (every modified query, measured or not)
|
|
240
|
+
|
|
241
|
+
Post one when `06-review.md` §"Data-access duel" has a row for a **modified** query — **whatever its
|
|
242
|
+
verdict, measured or not** — or `07-validation.md` §3.7 has benchmark rows. New queries only, or
|
|
243
|
+
renames and reformats only, and nothing benchmarked → post nothing.
|
|
244
|
+
|
|
245
|
+
**A modified query that was never measured is the case this comment exists for.** Silence reads as
|
|
246
|
+
"nothing to see"; a reviewer cannot tell a query that was measured and is fine from one that nobody
|
|
247
|
+
looked at. The row says `not measured (<reason>)` and what would settle it (`data.explain_cmd`, a
|
|
248
|
+
data set, the entry point to run), so the reviewer knows what was *not* checked.
|
|
249
|
+
|
|
250
|
+
**Where it goes: on the query, not under the title.** One **inline thread anchored to the changed
|
|
251
|
+
lines of that query in the MR/PR diff** (a resolvable GitLab discussion with a `position`; a GitHub
|
|
252
|
+
review comment on `path` + `line`), one per modified query. The entry-point rows anchor to the entry
|
|
253
|
+
point's changed line the same way. Anchoring fails (the line is not in the diff, the forge refuses
|
|
254
|
+
the position) → a general MR/PR comment that names the file and line, and say so. A general comment
|
|
255
|
+
is the fallback, never the default: a number a reviewer meets on the line they are reading is read;
|
|
256
|
+
one at the bottom of the page is not.
|
|
257
|
+
|
|
258
|
+
Still a comment and not a description section, because it is **re-posted on every push that changes
|
|
259
|
+
a measured path** (`/flow:work:green`, `/flow:work:respond`), and a description rewritten each round
|
|
247
260
|
loses what the numbers were two rounds ago. The history is the point.
|
|
248
261
|
|
|
262
|
+
For each modified query the comment carries the **plan before and after** — the `data.explain_cmd`
|
|
263
|
+
output on the merge base and on the branch, same data, trimmed to access type, index, rows read — next
|
|
264
|
+
to the numbers:
|
|
265
|
+
|
|
249
266
|
```markdown
|
|
250
|
-
## Performance — base `<sha>` → `<sha>`
|
|
267
|
+
## Performance — `FooRepository::findBar()`, base `<sha>` → `<sha>`
|
|
251
268
|
|
|
252
|
-
|
|
|
253
|
-
|
|
254
|
-
| `
|
|
269
|
+
| | Plan (access · index · rows read) | Rows returned | Time (min–max, 3 runs) | Verdict |
|
|
270
|
+
|---|---|---|---|---|
|
|
271
|
+
| base | `ref` · `idx_a` · 41k | 15 | 120–131 ms | |
|
|
272
|
+
| now | `range` · `idx_b` · 750 | 15 | 8–9 ms | improved |
|
|
255
273
|
|
|
256
274
|
| Entry point | Time | Peak memory | Verdict |
|
|
257
275
|
|---|---|---|---|
|
|
@@ -261,6 +279,14 @@ Measured on <data set>, <n> runs each. A difference inside the run-to-run spread
|
|
|
261
279
|
no measurable change, not a percentage.
|
|
262
280
|
```
|
|
263
281
|
|
|
282
|
+
- **The query, ready to run where the data is real.** Every performance comment ends with the exact
|
|
283
|
+
query (as the engine receives it, parameters filled with representative values) and the read-only
|
|
284
|
+
plan command for it — `EXPLAIN`, never `EXPLAIN ANALYZE` on a write — in a code block, so the
|
|
285
|
+
author can run it on production or a replica and answer in the thread. This is a complement to the
|
|
286
|
+
sandbox measurement, never a substitute: the flow does not touch production.
|
|
287
|
+
- **Memory is the entry point's, not the query's.** A modified query also gets the entry-point row
|
|
288
|
+
that exercises it, through `quality.bench_cmd` on both sides (`/flow:*:validate` §3.7). No
|
|
289
|
+
`bench_cmd` → the entry-point row says `not measured (no quality.bench_cmd)`; never an estimate.
|
|
264
290
|
- **Verdicts**: `improved` · `no measurable change` · `regressed` · `not measured (<reason>)`.
|
|
265
291
|
- **A `regressed` row is a review blocker** unless `03-design.md` justifies the trade — in which
|
|
266
292
|
case the justification goes in the comment, in one line, next to the row.
|
|
@@ -46,7 +46,7 @@ This system **orchestrates** the project's existing sub-agents and skills (it do
|
|
|
46
46
|
- **Understand before starting**: design-affecting doubts left after ticket + knowledge search + code → one `AskUserQuestion` with all of them before closing `/flow:feat:start` or `/flow:feat:design` §1.5.
|
|
47
47
|
- **Reuse before creating**: in `/flow:feat:design`, check the affected and neighbouring modules before any new entity, column, repository, service or event; justify intentional duplication in `03-design.md`; never force a poor fit.
|
|
48
48
|
- **Solve the real project problem, not the generic one (fit + YAGNI)**: before any defensive mechanism, **two questions with evidence** — **(a) Does it fit? Can this scenario actually happen given how this project works?** (knowledge search + code, **not** textbook patterns; already prevented → **unnecessary**); **(b) Do we need it now, for what the ticket asks?** (hypothetical → **don't add it**, "idea for a separate ticket"). Bias **remove, not add** — `/flow:feat:design` challenger ("Fit and need") and the defensive mechanisms table of `03-design.md`.
|
|
49
|
-
- **A change is measured against what it replaces, not only against its rivals**: a **modified** query carries the **base row** — the same query on `git merge-base HEAD <git.default_base>`, same sandbox, same seed, same three runs (`/flow:work:query` §4) — and `quality.bench_cmd` benchmarks a touched route, command, consumer or job on both sides (`/flow:*:validate` §3.7). Times are reported `min–max`, and **a difference inside the spread is "no measurable change", never a percentage**. `regressed` blocks like `change` unless the design justifies the trade. The numbers are posted as
|
|
49
|
+
- **A change is measured against what it replaces, not only against its rivals**: a **modified** query carries the **base row** — the same query on `git merge-base HEAD <git.default_base>`, same sandbox, same seed, same three runs (`/flow:work:query` §4) — and `quality.bench_cmd` benchmarks a touched route, command, consumer or job on both sides (`/flow:*:validate` §3.7). Times are reported `min–max`, and **a difference inside the spread is "no measurable change", never a percentage**. `regressed` blocks like `change` unless the design justifies the trade. The numbers — or, for a modified query nobody could measure, `not measured` and why — are posted as **inline comments on the changed query** (`ship` §4.3), re-posted whenever a later push changes a measured path.
|
|
50
50
|
- **A query is judged on its plan, not on its prose**: cost lives in the **execution plan**, not the diff. `/flow:work:query`: facts, a challenger blinded to the design's rationale, the main agent judges — **no number, no win**, **no dogma in either direction**, **the objector's variant measured next to yours**. **Any size, XS included.** A performance objection is answered with a plan; an unmeasured plan is never reported as measured ("schema only" / "not measured" are legitimate verdicts; a fixture-sized test database is not evidence).
|
|
51
51
|
- **Size is revisable**: a later phase (`design`, `plan`, `investigate`) seeing a clear mismatch **proposes reclassifying to the user** and updates `meta.json.size`.
|
|
52
52
|
- **If the implementation invalidates the design, return to design**: in `/flow:feat:build`, 2+ significant deviations in `05-implementation.md`, or one changing an ADR-light decision → **pause and return to `/flow:feat:design`** (what `/flow:feat:review` and `/flow:feat:validate` read). Same for `/flow:bug:fix` vs `/flow:bug:investigate`.
|
|
@@ -145,6 +145,9 @@ Per query, exactly one of:
|
|
|
145
145
|
|
|
146
146
|
- **ok** — access supported and bounded; state the index used and rows read. For a modified query,
|
|
147
147
|
say how it compares to the base row: *improved*, *no measurable change*, or *regressed*.
|
|
148
|
+
**No plan was read → it is `ok (plan not measured)`**, with the reason, never a bare `ok`: a
|
|
149
|
+
modified query reaches the MR/PR through `/flow:feat:ship` §4.3 and the reviewer must be able to
|
|
150
|
+
tell it was never measured.
|
|
148
151
|
- **regressed** — measurably worse than the base version, and the design does not justify it. A
|
|
149
152
|
blocker, the same as `change`. Justified in `03-design.md` (a correctness fix that costs time, a
|
|
150
153
|
deliberate trade) → not a blocker, but it is stated in the verdict and it reaches the MR/PR.
|
package/adapters/hermes/CORE.md
CHANGED
|
@@ -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.
|
|
20
|
+
**This file belongs to flow `0.90.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
|
|
@@ -185,9 +185,9 @@ With an "all threads resolved before merge" policy, the MR/PR cannot be merged o
|
|
|
185
185
|
|
|
186
186
|
### 3.3 Performance comment
|
|
187
187
|
|
|
188
|
-
`/flow-feat-ship` §4.3, unchanged: query rows from `06-review.md`
|
|
189
|
-
|
|
190
|
-
|
|
188
|
+
`/flow-feat-ship` §4.3, unchanged: query rows from `06-review.md` — a modified query that was not
|
|
189
|
+
measured included, as `not measured (<reason>)` — and benchmark rows from `05-validation.md`,
|
|
190
|
+
posted as comments anchored on the changed lines of the MR/PR, confirmed in every mode. A slowness bug is the case where this comment *is* the proof the fix worked.
|
|
191
191
|
|
|
192
192
|
## 4. Close
|
|
193
193
|
|
|
@@ -212,6 +212,8 @@ Judging rules: **no number, no win** (unresolved is recorded unresolved, never s
|
|
|
212
212
|
|
|
213
213
|
**A modified query is judged against its own past, not only against its rivals.** For every query the diff *changes* (as opposed to adds), the duel carries the **base row** — the same query on `git merge-base HEAD <git.default_base>`, measured in the same sandbox with the same seed (`/flow-work-query` §4). Without it the table cannot say whether this diff made things better or worse, which is the one thing a reviewer wants from it.
|
|
214
214
|
|
|
215
|
+
**A modified query with no plan behind its verdict is recorded `ok (plan not measured)` — and says what would measure it (`data.explain_cmd`, a data set) — never a bare `ok`.** Ship publishes that row on the MR/PR (`/flow-feat-ship` §4.3); a reviewer who finds a plain "ok" and no number has no way to know nobody looked.
|
|
216
|
+
|
|
215
217
|
Verdicts as findings: **change** = blocker, through §6; **regressed** = blocker unless `03-design.md` justifies the trade, in which case it is stated and published; **schema / follow-up** → proposed ticket in the output **and a `followups[]` entry** (flow-core §7); **unresolved** → recorded literally with the open question (as §3.5). A `change` verdict resting on a measured plan is already confirmed — no §6 skeptic.
|
|
216
218
|
|
|
217
219
|
## 4. Over-engineering audit (fit + YAGNI)
|
|
@@ -240,22 +240,40 @@ Thread body: the SQL block under "Pre-deploy: run this SQL on the server BEFORE
|
|
|
240
240
|
|
|
241
241
|
With the repo policy "all threads resolved before merge", the MR/PR cannot merge until the SQL is executed and the thread **resolved**. **One single thread even with multiple statements.** Tell the user it is left open on purpose.
|
|
242
242
|
|
|
243
|
-
### 4.3 Performance comment (
|
|
244
|
-
|
|
245
|
-
`06-review.md` §"Data-access duel" has
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
A
|
|
250
|
-
|
|
243
|
+
### 4.3 Performance comment (every modified query, measured or not)
|
|
244
|
+
|
|
245
|
+
Post one when `06-review.md` §"Data-access duel" has a row for a **modified** query — **whatever its
|
|
246
|
+
verdict, measured or not** — or `07-validation.md` §3.7 has benchmark rows. New queries only, or
|
|
247
|
+
renames and reformats only, and nothing benchmarked → post nothing.
|
|
248
|
+
|
|
249
|
+
**A modified query that was never measured is the case this comment exists for.** Silence reads as
|
|
250
|
+
"nothing to see"; a reviewer cannot tell a query that was measured and is fine from one that nobody
|
|
251
|
+
looked at. The row says `not measured (<reason>)` and what would settle it (`data.explain_cmd`, a
|
|
252
|
+
data set, the entry point to run), so the reviewer knows what was *not* checked.
|
|
253
|
+
|
|
254
|
+
**Where it goes: on the query, not under the title.** One **inline thread anchored to the changed
|
|
255
|
+
lines of that query in the MR/PR diff** (a resolvable GitLab discussion with a `position`; a GitHub
|
|
256
|
+
review comment on `path` + `line`), one per modified query. The entry-point rows anchor to the entry
|
|
257
|
+
point's changed line the same way. Anchoring fails (the line is not in the diff, the forge refuses
|
|
258
|
+
the position) → a general MR/PR comment that names the file and line, and say so. A general comment
|
|
259
|
+
is the fallback, never the default: a number a reviewer meets on the line they are reading is read;
|
|
260
|
+
one at the bottom of the page is not.
|
|
261
|
+
|
|
262
|
+
Still a comment and not a description section, because it is **re-posted on every push that changes
|
|
263
|
+
a measured path** (`/flow-work-green`, `/flow-work-respond`), and a description rewritten each round
|
|
251
264
|
loses what the numbers were two rounds ago. The history is the point.
|
|
252
265
|
|
|
266
|
+
For each modified query the comment carries the **plan before and after** — the `data.explain_cmd`
|
|
267
|
+
output on the merge base and on the branch, same data, trimmed to access type, index, rows read — next
|
|
268
|
+
to the numbers:
|
|
269
|
+
|
|
253
270
|
```markdown
|
|
254
|
-
## Performance — base `<sha>` → `<sha>`
|
|
271
|
+
## Performance — `FooRepository::findBar()`, base `<sha>` → `<sha>`
|
|
255
272
|
|
|
256
|
-
|
|
|
257
|
-
|
|
258
|
-
| `
|
|
273
|
+
| | Plan (access · index · rows read) | Rows returned | Time (min–max, 3 runs) | Verdict |
|
|
274
|
+
|---|---|---|---|---|
|
|
275
|
+
| base | `ref` · `idx_a` · 41k | 15 | 120–131 ms | |
|
|
276
|
+
| now | `range` · `idx_b` · 750 | 15 | 8–9 ms | improved |
|
|
259
277
|
|
|
260
278
|
| Entry point | Time | Peak memory | Verdict |
|
|
261
279
|
|---|---|---|---|
|
|
@@ -265,6 +283,14 @@ Measured on <data set>, <n> runs each. A difference inside the run-to-run spread
|
|
|
265
283
|
no measurable change, not a percentage.
|
|
266
284
|
```
|
|
267
285
|
|
|
286
|
+
- **The query, ready to run where the data is real.** Every performance comment ends with the exact
|
|
287
|
+
query (as the engine receives it, parameters filled with representative values) and the read-only
|
|
288
|
+
plan command for it — `EXPLAIN`, never `EXPLAIN ANALYZE` on a write — in a code block, so the
|
|
289
|
+
author can run it on production or a replica and answer in the thread. This is a complement to the
|
|
290
|
+
sandbox measurement, never a substitute: the flow does not touch production.
|
|
291
|
+
- **Memory is the entry point's, not the query's.** A modified query also gets the entry-point row
|
|
292
|
+
that exercises it, through `quality.bench_cmd` on both sides (`/flow-*-validate` §3.7). No
|
|
293
|
+
`bench_cmd` → the entry-point row says `not measured (no quality.bench_cmd)`; never an estimate.
|
|
268
294
|
- **Verdicts**: `improved` · `no measurable change` · `regressed` · `not measured (<reason>)`.
|
|
269
295
|
- **A `regressed` row is a review blocker** unless `03-design.md` justifies the trade — in which
|
|
270
296
|
case the justification goes in the comment, in one line, next to the row.
|
|
@@ -50,7 +50,7 @@ This system **orchestrates** the project's existing sub-agents and skills (it do
|
|
|
50
50
|
- **Understand before starting**: design-affecting doubts left after ticket + knowledge search + code → one `AskUserQuestion` with all of them before closing `/flow-feat-start` or `/flow-feat-design` §1.5.
|
|
51
51
|
- **Reuse before creating**: in `/flow-feat-design`, check the affected and neighbouring modules before any new entity, column, repository, service or event; justify intentional duplication in `03-design.md`; never force a poor fit.
|
|
52
52
|
- **Solve the real project problem, not the generic one (fit + YAGNI)**: before any defensive mechanism, **two questions with evidence** — **(a) Does it fit? Can this scenario actually happen given how this project works?** (knowledge search + code, **not** textbook patterns; already prevented → **unnecessary**); **(b) Do we need it now, for what the ticket asks?** (hypothetical → **don't add it**, "idea for a separate ticket"). Bias **remove, not add** — `/flow-feat-design` challenger ("Fit and need") and the defensive mechanisms table of `03-design.md`.
|
|
53
|
-
- **A change is measured against what it replaces, not only against its rivals**: a **modified** query carries the **base row** — the same query on `git merge-base HEAD <git.default_base>`, same sandbox, same seed, same three runs (`/flow-work-query` §4) — and `quality.bench_cmd` benchmarks a touched route, command, consumer or job on both sides (`/flow-*-validate` §3.7). Times are reported `min–max`, and **a difference inside the spread is "no measurable change", never a percentage**. `regressed` blocks like `change` unless the design justifies the trade. The numbers are posted as
|
|
53
|
+
- **A change is measured against what it replaces, not only against its rivals**: a **modified** query carries the **base row** — the same query on `git merge-base HEAD <git.default_base>`, same sandbox, same seed, same three runs (`/flow-work-query` §4) — and `quality.bench_cmd` benchmarks a touched route, command, consumer or job on both sides (`/flow-*-validate` §3.7). Times are reported `min–max`, and **a difference inside the spread is "no measurable change", never a percentage**. `regressed` blocks like `change` unless the design justifies the trade. The numbers — or, for a modified query nobody could measure, `not measured` and why — are posted as **inline comments on the changed query** (`ship` §4.3), re-posted whenever a later push changes a measured path.
|
|
54
54
|
- **A query is judged on its plan, not on its prose**: cost lives in the **execution plan**, not the diff. `/flow-work-query`: facts, a challenger blinded to the design's rationale, the main agent judges — **no number, no win**, **no dogma in either direction**, **the objector's variant measured next to yours**. **Any size, XS included.** A performance objection is answered with a plan; an unmeasured plan is never reported as measured ("schema only" / "not measured" are legitimate verdicts; a fixture-sized test database is not evidence).
|
|
55
55
|
- **Size is revisable**: a later phase (`design`, `plan`, `investigate`) seeing a clear mismatch **proposes reclassifying to the user** and updates `meta.json.size`.
|
|
56
56
|
- **If the implementation invalidates the design, return to design**: in `/flow-feat-build`, 2+ significant deviations in `05-implementation.md`, or one changing an ADR-light decision → **pause and return to `/flow-feat-design`** (what `/flow-feat-review` and `/flow-feat-validate` read). Same for `/flow-bug-fix` vs `/flow-bug-investigate`.
|
|
@@ -149,6 +149,9 @@ Per query, exactly one of:
|
|
|
149
149
|
|
|
150
150
|
- **ok** — access supported and bounded; state the index used and rows read. For a modified query,
|
|
151
151
|
say how it compares to the base row: *improved*, *no measurable change*, or *regressed*.
|
|
152
|
+
**No plan was read → it is `ok (plan not measured)`**, with the reason, never a bare `ok`: a
|
|
153
|
+
modified query reaches the MR/PR through `/flow-feat-ship` §4.3 and the reviewer must be able to
|
|
154
|
+
tell it was never measured.
|
|
152
155
|
- **regressed** — measurably worse than the base version, and the design does not justify it. A
|
|
153
156
|
blocker, the same as `change`. Justified in `03-design.md` (a correctness fix that costs time, a
|
|
154
157
|
deliberate trade) → not a blocker, but it is stated in the verdict and it reaches the MR/PR.
|
|
@@ -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.
|
|
19
|
+
**This file belongs to flow `0.90.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
|
|
@@ -183,9 +183,9 @@ With an "all threads resolved before merge" policy, the MR/PR cannot be merged o
|
|
|
183
183
|
|
|
184
184
|
### 3.3 Performance comment
|
|
185
185
|
|
|
186
|
-
`/flow-feat-ship` §4.3, unchanged: query rows from `06-review.md`
|
|
187
|
-
|
|
188
|
-
|
|
186
|
+
`/flow-feat-ship` §4.3, unchanged: query rows from `06-review.md` — a modified query that was not
|
|
187
|
+
measured included, as `not measured (<reason>)` — and benchmark rows from `05-validation.md`,
|
|
188
|
+
posted as comments anchored on the changed lines of the MR/PR, confirmed in every mode. A slowness bug is the case where this comment *is* the proof the fix worked.
|
|
189
189
|
|
|
190
190
|
## 4. Close
|
|
191
191
|
|
|
@@ -210,6 +210,8 @@ Judging rules: **no number, no win** (unresolved is recorded unresolved, never s
|
|
|
210
210
|
|
|
211
211
|
**A modified query is judged against its own past, not only against its rivals.** For every query the diff *changes* (as opposed to adds), the duel carries the **base row** — the same query on `git merge-base HEAD <git.default_base>`, measured in the same sandbox with the same seed (`/flow-work-query` §4). Without it the table cannot say whether this diff made things better or worse, which is the one thing a reviewer wants from it.
|
|
212
212
|
|
|
213
|
+
**A modified query with no plan behind its verdict is recorded `ok (plan not measured)` — and says what would measure it (`data.explain_cmd`, a data set) — never a bare `ok`.** Ship publishes that row on the MR/PR (`/flow-feat-ship` §4.3); a reviewer who finds a plain "ok" and no number has no way to know nobody looked.
|
|
214
|
+
|
|
213
215
|
Verdicts as findings: **change** = blocker, through §6; **regressed** = blocker unless `03-design.md` justifies the trade, in which case it is stated and published; **schema / follow-up** → proposed ticket in the output **and a `followups[]` entry** (flow-core §7); **unresolved** → recorded literally with the open question (as §3.5). A `change` verdict resting on a measured plan is already confirmed — no §6 skeptic.
|
|
214
216
|
|
|
215
217
|
## 4. Over-engineering audit (fit + YAGNI)
|
|
@@ -238,22 +238,40 @@ Thread body: the SQL block under "Pre-deploy: run this SQL on the server BEFORE
|
|
|
238
238
|
|
|
239
239
|
With the repo policy "all threads resolved before merge", the MR/PR cannot merge until the SQL is executed and the thread **resolved**. **One single thread even with multiple statements.** Tell the user it is left open on purpose.
|
|
240
240
|
|
|
241
|
-
### 4.3 Performance comment (
|
|
242
|
-
|
|
243
|
-
`06-review.md` §"Data-access duel" has
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
A
|
|
248
|
-
|
|
241
|
+
### 4.3 Performance comment (every modified query, measured or not)
|
|
242
|
+
|
|
243
|
+
Post one when `06-review.md` §"Data-access duel" has a row for a **modified** query — **whatever its
|
|
244
|
+
verdict, measured or not** — or `07-validation.md` §3.7 has benchmark rows. New queries only, or
|
|
245
|
+
renames and reformats only, and nothing benchmarked → post nothing.
|
|
246
|
+
|
|
247
|
+
**A modified query that was never measured is the case this comment exists for.** Silence reads as
|
|
248
|
+
"nothing to see"; a reviewer cannot tell a query that was measured and is fine from one that nobody
|
|
249
|
+
looked at. The row says `not measured (<reason>)` and what would settle it (`data.explain_cmd`, a
|
|
250
|
+
data set, the entry point to run), so the reviewer knows what was *not* checked.
|
|
251
|
+
|
|
252
|
+
**Where it goes: on the query, not under the title.** One **inline thread anchored to the changed
|
|
253
|
+
lines of that query in the MR/PR diff** (a resolvable GitLab discussion with a `position`; a GitHub
|
|
254
|
+
review comment on `path` + `line`), one per modified query. The entry-point rows anchor to the entry
|
|
255
|
+
point's changed line the same way. Anchoring fails (the line is not in the diff, the forge refuses
|
|
256
|
+
the position) → a general MR/PR comment that names the file and line, and say so. A general comment
|
|
257
|
+
is the fallback, never the default: a number a reviewer meets on the line they are reading is read;
|
|
258
|
+
one at the bottom of the page is not.
|
|
259
|
+
|
|
260
|
+
Still a comment and not a description section, because it is **re-posted on every push that changes
|
|
261
|
+
a measured path** (`/flow-work-green`, `/flow-work-respond`), and a description rewritten each round
|
|
249
262
|
loses what the numbers were two rounds ago. The history is the point.
|
|
250
263
|
|
|
264
|
+
For each modified query the comment carries the **plan before and after** — the `data.explain_cmd`
|
|
265
|
+
output on the merge base and on the branch, same data, trimmed to access type, index, rows read — next
|
|
266
|
+
to the numbers:
|
|
267
|
+
|
|
251
268
|
```markdown
|
|
252
|
-
## Performance — base `<sha>` → `<sha>`
|
|
269
|
+
## Performance — `FooRepository::findBar()`, base `<sha>` → `<sha>`
|
|
253
270
|
|
|
254
|
-
|
|
|
255
|
-
|
|
256
|
-
| `
|
|
271
|
+
| | Plan (access · index · rows read) | Rows returned | Time (min–max, 3 runs) | Verdict |
|
|
272
|
+
|---|---|---|---|---|
|
|
273
|
+
| base | `ref` · `idx_a` · 41k | 15 | 120–131 ms | |
|
|
274
|
+
| now | `range` · `idx_b` · 750 | 15 | 8–9 ms | improved |
|
|
257
275
|
|
|
258
276
|
| Entry point | Time | Peak memory | Verdict |
|
|
259
277
|
|---|---|---|---|
|
|
@@ -263,6 +281,14 @@ Measured on <data set>, <n> runs each. A difference inside the run-to-run spread
|
|
|
263
281
|
no measurable change, not a percentage.
|
|
264
282
|
```
|
|
265
283
|
|
|
284
|
+
- **The query, ready to run where the data is real.** Every performance comment ends with the exact
|
|
285
|
+
query (as the engine receives it, parameters filled with representative values) and the read-only
|
|
286
|
+
plan command for it — `EXPLAIN`, never `EXPLAIN ANALYZE` on a write — in a code block, so the
|
|
287
|
+
author can run it on production or a replica and answer in the thread. This is a complement to the
|
|
288
|
+
sandbox measurement, never a substitute: the flow does not touch production.
|
|
289
|
+
- **Memory is the entry point's, not the query's.** A modified query also gets the entry-point row
|
|
290
|
+
that exercises it, through `quality.bench_cmd` on both sides (`/flow-*-validate` §3.7). No
|
|
291
|
+
`bench_cmd` → the entry-point row says `not measured (no quality.bench_cmd)`; never an estimate.
|
|
266
292
|
- **Verdicts**: `improved` · `no measurable change` · `regressed` · `not measured (<reason>)`.
|
|
267
293
|
- **A `regressed` row is a review blocker** unless `03-design.md` justifies the trade — in which
|
|
268
294
|
case the justification goes in the comment, in one line, next to the row.
|
|
@@ -48,7 +48,7 @@ This system **orchestrates** the project's existing sub-agents and skills (it do
|
|
|
48
48
|
- **Understand before starting**: design-affecting doubts left after ticket + knowledge search + code → one `AskUserQuestion` with all of them before closing `/flow-feat-start` or `/flow-feat-design` §1.5.
|
|
49
49
|
- **Reuse before creating**: in `/flow-feat-design`, check the affected and neighbouring modules before any new entity, column, repository, service or event; justify intentional duplication in `03-design.md`; never force a poor fit.
|
|
50
50
|
- **Solve the real project problem, not the generic one (fit + YAGNI)**: before any defensive mechanism, **two questions with evidence** — **(a) Does it fit? Can this scenario actually happen given how this project works?** (knowledge search + code, **not** textbook patterns; already prevented → **unnecessary**); **(b) Do we need it now, for what the ticket asks?** (hypothetical → **don't add it**, "idea for a separate ticket"). Bias **remove, not add** — `/flow-feat-design` challenger ("Fit and need") and the defensive mechanisms table of `03-design.md`.
|
|
51
|
-
- **A change is measured against what it replaces, not only against its rivals**: a **modified** query carries the **base row** — the same query on `git merge-base HEAD <git.default_base>`, same sandbox, same seed, same three runs (`/flow-work-query` §4) — and `quality.bench_cmd` benchmarks a touched route, command, consumer or job on both sides (`/flow-*-validate` §3.7). Times are reported `min–max`, and **a difference inside the spread is "no measurable change", never a percentage**. `regressed` blocks like `change` unless the design justifies the trade. The numbers are posted as
|
|
51
|
+
- **A change is measured against what it replaces, not only against its rivals**: a **modified** query carries the **base row** — the same query on `git merge-base HEAD <git.default_base>`, same sandbox, same seed, same three runs (`/flow-work-query` §4) — and `quality.bench_cmd` benchmarks a touched route, command, consumer or job on both sides (`/flow-*-validate` §3.7). Times are reported `min–max`, and **a difference inside the spread is "no measurable change", never a percentage**. `regressed` blocks like `change` unless the design justifies the trade. The numbers — or, for a modified query nobody could measure, `not measured` and why — are posted as **inline comments on the changed query** (`ship` §4.3), re-posted whenever a later push changes a measured path.
|
|
52
52
|
- **A query is judged on its plan, not on its prose**: cost lives in the **execution plan**, not the diff. `/flow-work-query`: facts, a challenger blinded to the design's rationale, the main agent judges — **no number, no win**, **no dogma in either direction**, **the objector's variant measured next to yours**. **Any size, XS included.** A performance objection is answered with a plan; an unmeasured plan is never reported as measured ("schema only" / "not measured" are legitimate verdicts; a fixture-sized test database is not evidence).
|
|
53
53
|
- **Size is revisable**: a later phase (`design`, `plan`, `investigate`) seeing a clear mismatch **proposes reclassifying to the user** and updates `meta.json.size`.
|
|
54
54
|
- **If the implementation invalidates the design, return to design**: in `/flow-feat-build`, 2+ significant deviations in `05-implementation.md`, or one changing an ADR-light decision → **pause and return to `/flow-feat-design`** (what `/flow-feat-review` and `/flow-feat-validate` read). Same for `/flow-bug-fix` vs `/flow-bug-investigate`.
|
|
@@ -147,6 +147,9 @@ Per query, exactly one of:
|
|
|
147
147
|
|
|
148
148
|
- **ok** — access supported and bounded; state the index used and rows read. For a modified query,
|
|
149
149
|
say how it compares to the base row: *improved*, *no measurable change*, or *regressed*.
|
|
150
|
+
**No plan was read → it is `ok (plan not measured)`**, with the reason, never a bare `ok`: a
|
|
151
|
+
modified query reaches the MR/PR through `/flow-feat-ship` §4.3 and the reviewer must be able to
|
|
152
|
+
tell it was never measured.
|
|
150
153
|
- **regressed** — measurably worse than the base version, and the design does not justify it. A
|
|
151
154
|
blocker, the same as `change`. Justified in `03-design.md` (a correctness fix that costs time, a
|
|
152
155
|
deliberate trade) → not a blocker, but it is stated in the verdict and it reaches the MR/PR.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "flow-workflows",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.90.0",
|
|
4
4
|
"description": "Guided feat/bug workflows (start→ship), post-deploy monitoring and multi-agent code review, stack-agnostic. Each repo uses a shared FLOW.md plus optional harness overlay.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"name": "flow",
|
|
4
4
|
"displayName": "Flow — guided dev workflows",
|
|
5
5
|
"description": "Guided feat/bug workflows (start→ship), post-deploy monitoring and multi-agent code review, stack-agnostic. Each repo uses a shared FLOW.md plus optional harness overlay.",
|
|
6
|
-
"version": "0.
|
|
6
|
+
"version": "0.90.0",
|
|
7
7
|
"author": {
|
|
8
8
|
"name": "Alberto Vioque",
|
|
9
9
|
"email": "mashware@gmail.com"
|
|
@@ -5,6 +5,27 @@ plugin and is what `/flow:news` reads to show you what changed since your previo
|
|
|
5
5
|
|
|
6
6
|
The canonical, richest notes live in the [GitHub Releases](https://github.com/mashware/flow-workflows/releases).
|
|
7
7
|
|
|
8
|
+
## v0.90.0 — A query that changed reaches the MR with its plan, or with the admission that nobody measured it · 2026-10-07
|
|
9
|
+
|
|
10
|
+
**In short**
|
|
11
|
+
- **A modified query always leaves a performance comment**, measured or not. Before, a repo without
|
|
12
|
+
`data.explain_cmd` closed the review with the query marked `ok` on the schema alone, the ship step
|
|
13
|
+
saw "nothing measured" and posted nothing — so the reviewer could not tell a query that had been
|
|
14
|
+
checked from one nobody looked at.
|
|
15
|
+
- **The comment sits on the query**: an inline thread on the changed lines of the diff, one per
|
|
16
|
+
modified query, instead of a general note under the title. A general comment is only the fallback
|
|
17
|
+
when the forge refuses the anchor.
|
|
18
|
+
- **Before and after, side by side**: plan (access, index, rows read), rows returned and time
|
|
19
|
+
`min–max` on the merge base and on the branch; peak memory comes from the entry point that runs the
|
|
20
|
+
query, through `quality.bench_cmd`. Missing pieces say `not measured (<reason>)` and which key
|
|
21
|
+
would measure them.
|
|
22
|
+
- **The comment ends with the query and its read-only plan command**, ready to run on production or a
|
|
23
|
+
replica; the answer goes in the thread.
|
|
24
|
+
- **A bare `ok` is gone for a modified query with no plan**: the review writes
|
|
25
|
+
`ok (plan not measured)`.
|
|
26
|
+
- `docs/CONFIGURATION.md` now lists what the comment can say for each combination of `data.*` and
|
|
27
|
+
`quality.bench_cmd`.
|
|
28
|
+
|
|
8
29
|
## v0.89.0 — An unattended run can stop at the end of the study, for a person to approve it · 2026-10-02
|
|
9
30
|
|
|
10
31
|
**In short**
|