flow-workflows 0.71.0 → 0.73.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -17,7 +17,7 @@ Every `$flow-*` command assumes these rules. They are stated once, here, so a co
17
17
  carries what is specific to its phase. Read this once per session; a command that says "load
18
18
  `flow-core`" means this file.
19
19
 
20
- **This file belongs to flow `0.71.0`.** Compare it once, at the start of the session, against
20
+ **This file belongs to flow `0.73.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
@@ -237,7 +237,9 @@ terminal by construction, the turn is over before you notice.
237
237
  (`guided`/`auto` chaining, §2), the turn opens with the call that starts it, not with prose about
238
238
  the one that ended. **A report is never the last thing in a turn you meant to continue.**
239
239
  - **Progress belongs to the panel, not to a turn.** Someone watching reads the live panel (§4):
240
- `Now`, `Next`. Writing it costs no turn and no stop; saying it in chat costs both.
240
+ `Now`, `Next`. Writing it costs no turn and no stop; saying it in chat costs both. **An answered
241
+ question is progress too**: the `Decision` line and the panel's claim on the user go the moment
242
+ the answer arrives, before the work resumes (§4.4e).
241
243
  - **Stopping? Then say so.** `I need:` names the decision or the action you are waiting on. It
242
244
  never announces that you are continuing — if you were, you would not be writing this header.
243
245
 
@@ -269,8 +271,17 @@ right now. **Any progress line you were about to type into the chat is a panel u
269
271
  **Two transports, one document.** When the tools `panel_set` / `panel_patch` / `panel_get` are
270
272
  available, this console is a pane of agent-terminal: publish the panel through them (§4.2) and
271
273
  **stop writing `.claude/work/<work>/panel.json`** — while a pane is claimed, its file is not read at
272
- all. When the tools are not there, write the file exactly as before (§4.3). No work folder
273
- (lightweight `respond`/`green`) → nothing to publish, either way.
274
+ all. When they are not there, write the file exactly as before (§4.3). No work folder (lightweight
275
+ `respond`/`green`) → nothing to publish, either way.
276
+
277
+ **Look for them before you conclude they are missing**, once per session, in pre-flight. A harness
278
+ namespaces an MCP server's tools, so what you are looking for is a tool whose name *ends* in
279
+ `panel_set` — `mcp__panel__panel_set` on Claude Code, another prefix elsewhere — and the name is
280
+ whatever it is called there, not `panel_set`. It may also be **deferred**: listed by name with no
281
+ schema, uncallable until you load it, and indistinguishable from absent unless you read that list.
282
+ A deferred tool is a tool that is there; load the three schemas and publish. The file is the answer
283
+ only after that search comes back empty — and this is the one paragraph that decides it, because
284
+ prose describing a file is otherwise obeyed to the letter.
274
285
 
275
286
  ### 4.1 The document — the same whichever transport carries it
276
287
 
@@ -297,7 +308,7 @@ all. When the tools are not there, write the file exactly as before (§4.3). No
297
308
 
298
309
  - **`mark` says what a line is**; the reader draws it. `done` · `current` (at most one) · `pending` · `wait` (waiting on someone else: an open MR/PR, a user decision) · `block` · `info`. Marked lines form an aligned column: symbol, `ref`, text, link pinned right. Do not set `style` on a marked line — except `mark: "info"` + `style: ok|warn|error` when the colour *is* the information (a monitoring verdict).
299
310
  - **`ref` need not be a number**: `#1`, `#3–#6`, `Now`, `Next`, `Decision`. Column width is per block; blocks are separated by blank lines — use them so the MR/PR train and the labels below do not drag each other wide.
300
- - **`link` is a field, never a URL inside `text`.**
311
+ - **`link` is a field, never a URL inside `text`** — and **every line that names an MR/PR carries it**: the train entries, a blocker about somebody else's MR/PR, a `Now` or `Next` about the open one. The URL is in `meta.json.mrs[].url` or in whatever recorded that blocker; a bare `!10327` typed into `text` is a number the reader cannot make clickable, which is the whole point of the field. No URL recorded anywhere → the number in `text` and nothing else, and go and record it.
301
312
  - **Order:** (1) work title (`style: title`, no mark); (2) the MR/PR train, one entry per `meta.json.mrs[]` with `ref` `#n`, short title, real-state `mark`, `link` when there is a URL — not-started entries collapse into one `#a–#z` `pending` line; omit the block without `mrs`; (3) `Now` — what is running, the one fact `meta.json` cannot hold; (4) `Next`; (5) `Decision`, `mark: wait`, **only** when parked on the user — over the tools it travels with `attention: "wait"` (§4.2), and both are cleared together; (6) blockers, `mark: block` (a sibling repo with `contract_handoff: pending`, a red pipeline, an unmerged dependency).
302
313
  - **Rules:** `phase` is the phase you are **running now** (not `meta.json.phase`, which advances only at Close). `header: true` means ticket, type, phase and age are drawn by the reader — do not repeat them in `lines`. Keep it under ~14 lines. Every fact from `meta.json` and the artifacts — an invented MR/PR state is worse than a blank panel. Write in the language of the work's artifacts.
303
314
 
@@ -366,6 +377,13 @@ halfway is not shown as finished. When the stretch will outlast the ~30 min stal
366
377
  `stale_after_minutes` to what it will really take; (d) wherever `## Close` updates `meta.json`. A
367
378
  held panel still goes stale: the app stamps each delivery's arrival.
368
379
 
380
+ **(e) The moment a question is answered or a gate is cleared** — before you resume the work, not at
381
+ the next stop. Drop the `Decision` line, clear `attention`, and move `Now` on: one patch, the first
382
+ thing you do with the answer. A panel still asking what the user already answered is worse than one
383
+ that never asked, because they answered it and the screen says it did not land; and an `attention`
384
+ nobody clears keeps that tab claiming them for ever. The same applies to a blocker that lifted and
385
+ to a `wait` line whose MR/PR merged.
386
+
369
387
  ### 4.5 `meta.json.cost[]` — what a phase measured, when it could
370
388
 
371
389
  A phase that can measure what it spent appends one entry: `{ "phase": "review", "at": "<ISO>",
@@ -199,7 +199,7 @@ refuse) · **degraded** (it runs, quietly worse than the config promises), plus
199
199
  `.agents/agents`, or a plugin. Report each missing name and that it falls back to `general-purpose`
200
200
  (a skill: skipped) — a panel missing agents reviews less and still reports a clean pass.
201
201
  - Harness cannot set a model per subagent → note that every `models.*` value degrades to inheritance.
202
- - **Where the live panel will go this session** (flow-core §4): `panel_set` / `panel_patch` exposed → the terminal draws the panel and no `panel.json` is written; absent → the panel is that file, as before. Neither is a fault — one line saying which one this session gets.
202
+ - **Where the live panel will go this session** (flow-core §4): a tool whose name ends in `panel_set` / `panel_patch` — namespaced by the harness (`mcp__panel__panel_set` on Claude Code) and possibly **deferred**, which reads as absent until the list of deferred tools is checked → the terminal draws the panel and no `panel.json` is written; genuinely absent → the panel is that file, as before. Neither is a fault — one line naming the tools as they are actually called here, or saying the file is the transport.
203
203
 
204
204
  ### 2.3 Knowledge sources
205
205
 
@@ -159,7 +159,7 @@ This system **orchestrates** the project's existing sub-agents and skills (it do
159
159
 
160
160
  ## The panel document
161
161
 
162
- `meta.json` is the *state machine*; the panel is the *view* a reader outside the chat watches. Optional: a work that never publishes it still resolves from `meta.json` alone. Writer rules (order, when, ceiling) and the two transports — the terminal's `panel_set` / `panel_patch` / `panel_get` tools, or `.claude/work/<work>/panel.json` — are flow-core §4. The document below is the same either way.
162
+ `meta.json` is the *state machine*; the panel is the *view* a reader outside the chat watches. Optional: a work that never publishes it still resolves from `meta.json` alone. Writer rules (order, when, ceiling) and the two transports — the terminal's `panel_set` / `panel_patch` / `panel_get` tools (namespaced by the harness, and possibly deferred: flow-core §4 says how to find them), or `.claude/work/<work>/panel.json` — are flow-core §4. The document below is the same either way.
163
163
 
164
164
  ```json
165
165
  {
@@ -185,13 +185,13 @@ This system **orchestrates** the project's existing sub-agents and skills (it do
185
185
  - **`lines`** — one entry per line. Bare string = plain line; object takes `text`, `ref`, `mark`, `link`, `style`, `indent`. Empty string = blank line **and alignment block separator** (`ref` widths per block).
186
186
  - **`mark`** — `done` · `current` · `pending` · `wait` (waiting on someone else) · `block` · `info`; the reader draws it. `style` on a marked line overrides its colour — right only when the colour *is* the information.
187
187
  - **`ref`** — the column label: `#1`, `#3–#6`, `Now`, `Next`, `Decision`.
188
- - **`link`** — URL as a **field, never pasted into `text`**; the reader shortens it to the MR/PR number and makes it clickable.
188
+ - **`link`** — URL as a **field, never pasted into `text`**; the reader shortens it to the MR/PR number and makes it clickable. Every line naming an MR/PR carries one — train entry, blocker about another MR/PR, `Now`/`Next` about the open one (flow-core §4.1).
189
189
  - **`stale_after_minutes`** — raises the 30-minute staleness threshold for a stretch known to run long.
190
190
  - **`style`** — `normal` · `dim` · `title` · `accent` · `ok` · `warn` · `error`; semantic names, the reader owns the palette.
191
191
  - **`header`** — `true` (default): the reader draws ticket, type, phase and age, which never belong in `lines`. `false` hands every line to the writer.
192
192
  - **`phase`** — the phase running **right now** (`meta.json.phase` advances only at close); the reader prefers it.
193
193
  - **`updated_at`** — local ISO-8601 with offset from the real clock, never carried over; lets the reader flag a stale snapshot. Over the tools the app stamps each delivery itself.
194
- - **`attention`** *(tools only)* — `wait` · `block` · `done`, beside `phase`, absent while simply working: the pane's claim on the user's attention, which the app never deduces from a line's `mark`. A tab's card shows the strongest claim among its panes, so an uncleared `wait` flags that tab for ever.
194
+ - **`attention`** *(tools only)* — `wait` · `block` · `done`, beside `phase`, absent while simply working: the pane's claim on the user's attention, which the app never deduces from a line's `mark`. A tab's card shows the strongest claim among its panes, so an uncleared `wait` flags that tab for ever — it goes, with the `Decision` line, the moment the question is answered (flow-core §4.4e).
195
195
  - **`key`** *(tools only)* — a unique, never-painted name on any line a later `panel_patch` may replace or delete (`title`, `mr-1`, `now`, `next`, `decision`, `block-1`).
196
196
 
197
197
  **No headings over the train.** A shipped MR/PR is *open, waiting to merge*; `mark` says it per entry — `wait` shipped, `current` being worked, `done` only merged.
@@ -117,7 +117,7 @@ After a break the panel is most likely stale, and a resumed session is exactly w
117
117
 
118
118
  - `phase` = the phase you are resuming into (`meta.json.phase` does not yet say it).
119
119
  - `Now` in prose; `Next` names the command §4 suggested.
120
- - `Decision` marked `wait` is always set after a resume — nothing is running, the next move is the user's.
120
+ - `Decision` marked `wait` is always set after a resume — nothing is running, the next move is the user's. It goes the moment they make it (flow-core §4.4e), not at the next stop.
121
121
  - `block` lines for the blockers §4 surfaced (`contract_handoff` `pending` in a sibling repo, a red pipeline, an unmerged dependency).
122
122
  - Train: one entry per `meta.json.mrs[]`, not-started collapsed into one `#a–#z` line; omit without `mrs`.
123
123
  - `updated_at` from `date -Iseconds` when the panel goes to the file; every fact from `meta.json` and the artifacts; language of the work's artifacts.
@@ -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.71.0`.** Compare it once, at the start of the session, against
19
+ **This file belongs to flow `0.73.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
@@ -236,7 +236,9 @@ terminal by construction, the turn is over before you notice.
236
236
  (`guided`/`auto` chaining, §2), the turn opens with the call that starts it, not with prose about
237
237
  the one that ended. **A report is never the last thing in a turn you meant to continue.**
238
238
  - **Progress belongs to the panel, not to a turn.** Someone watching reads the live panel (§4):
239
- `Now`, `Next`. Writing it costs no turn and no stop; saying it in chat costs both.
239
+ `Now`, `Next`. Writing it costs no turn and no stop; saying it in chat costs both. **An answered
240
+ question is progress too**: the `Decision` line and the panel's claim on the user go the moment
241
+ the answer arrives, before the work resumes (§4.4e).
240
242
  - **Stopping? Then say so.** `I need:` names the decision or the action you are waiting on. It
241
243
  never announces that you are continuing — if you were, you would not be writing this header.
242
244
 
@@ -268,8 +270,17 @@ right now. **Any progress line you were about to type into the chat is a panel u
268
270
  **Two transports, one document.** When the tools `panel_set` / `panel_patch` / `panel_get` are
269
271
  available, this console is a pane of agent-terminal: publish the panel through them (§4.2) and
270
272
  **stop writing `.claude/work/<work>/panel.json`** — while a pane is claimed, its file is not read at
271
- all. When the tools are not there, write the file exactly as before (§4.3). No work folder
272
- (lightweight `respond`/`green`) → nothing to publish, either way.
273
+ all. When they are not there, write the file exactly as before (§4.3). No work folder (lightweight
274
+ `respond`/`green`) → nothing to publish, either way.
275
+
276
+ **Look for them before you conclude they are missing**, once per session, in pre-flight. A harness
277
+ namespaces an MCP server's tools, so what you are looking for is a tool whose name *ends* in
278
+ `panel_set` — `mcp__panel__panel_set` on Claude Code, another prefix elsewhere — and the name is
279
+ whatever it is called there, not `panel_set`. It may also be **deferred**: listed by name with no
280
+ schema, uncallable until you load it, and indistinguishable from absent unless you read that list.
281
+ A deferred tool is a tool that is there; load the three schemas and publish. The file is the answer
282
+ only after that search comes back empty — and this is the one paragraph that decides it, because
283
+ prose describing a file is otherwise obeyed to the letter.
273
284
 
274
285
  ### 4.1 The document — the same whichever transport carries it
275
286
 
@@ -296,7 +307,7 @@ all. When the tools are not there, write the file exactly as before (§4.3). No
296
307
 
297
308
  - **`mark` says what a line is**; the reader draws it. `done` · `current` (at most one) · `pending` · `wait` (waiting on someone else: an open MR/PR, a user decision) · `block` · `info`. Marked lines form an aligned column: symbol, `ref`, text, link pinned right. Do not set `style` on a marked line — except `mark: "info"` + `style: ok|warn|error` when the colour *is* the information (a monitoring verdict).
298
309
  - **`ref` need not be a number**: `#1`, `#3–#6`, `Now`, `Next`, `Decision`. Column width is per block; blocks are separated by blank lines — use them so the MR/PR train and the labels below do not drag each other wide.
299
- - **`link` is a field, never a URL inside `text`.**
310
+ - **`link` is a field, never a URL inside `text`** — and **every line that names an MR/PR carries it**: the train entries, a blocker about somebody else's MR/PR, a `Now` or `Next` about the open one. The URL is in `meta.json.mrs[].url` or in whatever recorded that blocker; a bare `!10327` typed into `text` is a number the reader cannot make clickable, which is the whole point of the field. No URL recorded anywhere → the number in `text` and nothing else, and go and record it.
300
311
  - **Order:** (1) work title (`style: title`, no mark); (2) the MR/PR train, one entry per `meta.json.mrs[]` with `ref` `#n`, short title, real-state `mark`, `link` when there is a URL — not-started entries collapse into one `#a–#z` `pending` line; omit the block without `mrs`; (3) `Now` — what is running, the one fact `meta.json` cannot hold; (4) `Next`; (5) `Decision`, `mark: wait`, **only** when parked on the user — over the tools it travels with `attention: "wait"` (§4.2), and both are cleared together; (6) blockers, `mark: block` (a sibling repo with `contract_handoff: pending`, a red pipeline, an unmerged dependency).
301
312
  - **Rules:** `phase` is the phase you are **running now** (not `meta.json.phase`, which advances only at Close). `header: true` means ticket, type, phase and age are drawn by the reader — do not repeat them in `lines`. Keep it under ~14 lines. Every fact from `meta.json` and the artifacts — an invented MR/PR state is worse than a blank panel. Write in the language of the work's artifacts.
302
313
 
@@ -365,6 +376,13 @@ halfway is not shown as finished. When the stretch will outlast the ~30 min stal
365
376
  `stale_after_minutes` to what it will really take; (d) wherever `## Close` updates `meta.json`. A
366
377
  held panel still goes stale: the app stamps each delivery's arrival.
367
378
 
379
+ **(e) The moment a question is answered or a gate is cleared** — before you resume the work, not at
380
+ the next stop. Drop the `Decision` line, clear `attention`, and move `Now` on: one patch, the first
381
+ thing you do with the answer. A panel still asking what the user already answered is worse than one
382
+ that never asked, because they answered it and the screen says it did not land; and an `attention`
383
+ nobody clears keeps that tab claiming them for ever. The same applies to a blocker that lifted and
384
+ to a `wait` line whose MR/PR merged.
385
+
368
386
  ### 4.5 `meta.json.cost[]` — what a phase measured, when it could
369
387
 
370
388
  A phase that can measure what it spent appends one entry: `{ "phase": "review", "at": "<ISO>",
@@ -195,7 +195,7 @@ refuse) · **degraded** (it runs, quietly worse than the config promises), plus
195
195
  `.agents/agents`, or a plugin. Report each missing name and that it falls back to `general-purpose`
196
196
  (a skill: skipped) — a panel missing agents reviews less and still reports a clean pass.
197
197
  - Harness cannot set a model per subagent → note that every `models.*` value degrades to inheritance.
198
- - **Where the live panel will go this session** (flow-core §4): `panel_set` / `panel_patch` exposed → the terminal draws the panel and no `panel.json` is written; absent → the panel is that file, as before. Neither is a fault — one line saying which one this session gets.
198
+ - **Where the live panel will go this session** (flow-core §4): a tool whose name ends in `panel_set` / `panel_patch` — namespaced by the harness (`mcp__panel__panel_set` on Claude Code) and possibly **deferred**, which reads as absent until the list of deferred tools is checked → the terminal draws the panel and no `panel.json` is written; genuinely absent → the panel is that file, as before. Neither is a fault — one line naming the tools as they are actually called here, or saying the file is the transport.
199
199
 
200
200
  ### 2.3 Knowledge sources
201
201
 
@@ -155,7 +155,7 @@ This system **orchestrates** the project's existing sub-agents and skills (it do
155
155
 
156
156
  ## The panel document
157
157
 
158
- `meta.json` is the *state machine*; the panel is the *view* a reader outside the chat watches. Optional: a work that never publishes it still resolves from `meta.json` alone. Writer rules (order, when, ceiling) and the two transports — the terminal's `panel_set` / `panel_patch` / `panel_get` tools, or `.claude/work/<work>/panel.json` — are flow-core §4. The document below is the same either way.
158
+ `meta.json` is the *state machine*; the panel is the *view* a reader outside the chat watches. Optional: a work that never publishes it still resolves from `meta.json` alone. Writer rules (order, when, ceiling) and the two transports — the terminal's `panel_set` / `panel_patch` / `panel_get` tools (namespaced by the harness, and possibly deferred: flow-core §4 says how to find them), or `.claude/work/<work>/panel.json` — are flow-core §4. The document below is the same either way.
159
159
 
160
160
  ```json
161
161
  {
@@ -181,13 +181,13 @@ This system **orchestrates** the project's existing sub-agents and skills (it do
181
181
  - **`lines`** — one entry per line. Bare string = plain line; object takes `text`, `ref`, `mark`, `link`, `style`, `indent`. Empty string = blank line **and alignment block separator** (`ref` widths per block).
182
182
  - **`mark`** — `done` · `current` · `pending` · `wait` (waiting on someone else) · `block` · `info`; the reader draws it. `style` on a marked line overrides its colour — right only when the colour *is* the information.
183
183
  - **`ref`** — the column label: `#1`, `#3–#6`, `Now`, `Next`, `Decision`.
184
- - **`link`** — URL as a **field, never pasted into `text`**; the reader shortens it to the MR/PR number and makes it clickable.
184
+ - **`link`** — URL as a **field, never pasted into `text`**; the reader shortens it to the MR/PR number and makes it clickable. Every line naming an MR/PR carries one — train entry, blocker about another MR/PR, `Now`/`Next` about the open one (flow-core §4.1).
185
185
  - **`stale_after_minutes`** — raises the 30-minute staleness threshold for a stretch known to run long.
186
186
  - **`style`** — `normal` · `dim` · `title` · `accent` · `ok` · `warn` · `error`; semantic names, the reader owns the palette.
187
187
  - **`header`** — `true` (default): the reader draws ticket, type, phase and age, which never belong in `lines`. `false` hands every line to the writer.
188
188
  - **`phase`** — the phase running **right now** (`meta.json.phase` advances only at close); the reader prefers it.
189
189
  - **`updated_at`** — local ISO-8601 with offset from the real clock, never carried over; lets the reader flag a stale snapshot. Over the tools the app stamps each delivery itself.
190
- - **`attention`** *(tools only)* — `wait` · `block` · `done`, beside `phase`, absent while simply working: the pane's claim on the user's attention, which the app never deduces from a line's `mark`. A tab's card shows the strongest claim among its panes, so an uncleared `wait` flags that tab for ever.
190
+ - **`attention`** *(tools only)* — `wait` · `block` · `done`, beside `phase`, absent while simply working: the pane's claim on the user's attention, which the app never deduces from a line's `mark`. A tab's card shows the strongest claim among its panes, so an uncleared `wait` flags that tab for ever — it goes, with the `Decision` line, the moment the question is answered (flow-core §4.4e).
191
191
  - **`key`** *(tools only)* — a unique, never-painted name on any line a later `panel_patch` may replace or delete (`title`, `mr-1`, `now`, `next`, `decision`, `block-1`).
192
192
 
193
193
  **No headings over the train.** A shipped MR/PR is *open, waiting to merge*; `mark` says it per entry — `wait` shipped, `current` being worked, `done` only merged.
@@ -113,7 +113,7 @@ After a break the panel is most likely stale, and a resumed session is exactly w
113
113
 
114
114
  - `phase` = the phase you are resuming into (`meta.json.phase` does not yet say it).
115
115
  - `Now` in prose; `Next` names the command §4 suggested.
116
- - `Decision` marked `wait` is always set after a resume — nothing is running, the next move is the user's.
116
+ - `Decision` marked `wait` is always set after a resume — nothing is running, the next move is the user's. It goes the moment they make it (flow-core §4.4e), not at the next stop.
117
117
  - `block` lines for the blockers §4 surfaced (`contract_handoff` `pending` in a sibling repo, a red pipeline, an unmerged dependency).
118
118
  - Train: one entry per `meta.json.mrs[]`, not-started collapsed into one `#a–#z` line; omit without `mrs`.
119
119
  - `updated_at` from `date -Iseconds` when the panel goes to the file; every fact from `meta.json` and the artifacts; language of the work's artifacts.
@@ -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.71.0`.** Compare it once, at the start of the session, against
20
+ **This file belongs to flow `0.73.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
@@ -237,7 +237,9 @@ terminal by construction, the turn is over before you notice.
237
237
  (`guided`/`auto` chaining, §2), the turn opens with the call that starts it, not with prose about
238
238
  the one that ended. **A report is never the last thing in a turn you meant to continue.**
239
239
  - **Progress belongs to the panel, not to a turn.** Someone watching reads the live panel (§4):
240
- `Now`, `Next`. Writing it costs no turn and no stop; saying it in chat costs both.
240
+ `Now`, `Next`. Writing it costs no turn and no stop; saying it in chat costs both. **An answered
241
+ question is progress too**: the `Decision` line and the panel's claim on the user go the moment
242
+ the answer arrives, before the work resumes (§4.4e).
241
243
  - **Stopping? Then say so.** `I need:` names the decision or the action you are waiting on. It
242
244
  never announces that you are continuing — if you were, you would not be writing this header.
243
245
 
@@ -269,8 +271,17 @@ right now. **Any progress line you were about to type into the chat is a panel u
269
271
  **Two transports, one document.** When the tools `panel_set` / `panel_patch` / `panel_get` are
270
272
  available, this console is a pane of agent-terminal: publish the panel through them (§4.2) and
271
273
  **stop writing `.claude/work/<work>/panel.json`** — while a pane is claimed, its file is not read at
272
- all. When the tools are not there, write the file exactly as before (§4.3). No work folder
273
- (lightweight `respond`/`green`) → nothing to publish, either way.
274
+ all. When they are not there, write the file exactly as before (§4.3). No work folder (lightweight
275
+ `respond`/`green`) → nothing to publish, either way.
276
+
277
+ **Look for them before you conclude they are missing**, once per session, in pre-flight. A harness
278
+ namespaces an MCP server's tools, so what you are looking for is a tool whose name *ends* in
279
+ `panel_set` — `mcp__panel__panel_set` on Claude Code, another prefix elsewhere — and the name is
280
+ whatever it is called there, not `panel_set`. It may also be **deferred**: listed by name with no
281
+ schema, uncallable until you load it, and indistinguishable from absent unless you read that list.
282
+ A deferred tool is a tool that is there; load the three schemas and publish. The file is the answer
283
+ only after that search comes back empty — and this is the one paragraph that decides it, because
284
+ prose describing a file is otherwise obeyed to the letter.
274
285
 
275
286
  ### 4.1 The document — the same whichever transport carries it
276
287
 
@@ -297,7 +308,7 @@ all. When the tools are not there, write the file exactly as before (§4.3). No
297
308
 
298
309
  - **`mark` says what a line is**; the reader draws it. `done` · `current` (at most one) · `pending` · `wait` (waiting on someone else: an open MR/PR, a user decision) · `block` · `info`. Marked lines form an aligned column: symbol, `ref`, text, link pinned right. Do not set `style` on a marked line — except `mark: "info"` + `style: ok|warn|error` when the colour *is* the information (a monitoring verdict).
299
310
  - **`ref` need not be a number**: `#1`, `#3–#6`, `Now`, `Next`, `Decision`. Column width is per block; blocks are separated by blank lines — use them so the MR/PR train and the labels below do not drag each other wide.
300
- - **`link` is a field, never a URL inside `text`.**
311
+ - **`link` is a field, never a URL inside `text`** — and **every line that names an MR/PR carries it**: the train entries, a blocker about somebody else's MR/PR, a `Now` or `Next` about the open one. The URL is in `meta.json.mrs[].url` or in whatever recorded that blocker; a bare `!10327` typed into `text` is a number the reader cannot make clickable, which is the whole point of the field. No URL recorded anywhere → the number in `text` and nothing else, and go and record it.
301
312
  - **Order:** (1) work title (`style: title`, no mark); (2) the MR/PR train, one entry per `meta.json.mrs[]` with `ref` `#n`, short title, real-state `mark`, `link` when there is a URL — not-started entries collapse into one `#a–#z` `pending` line; omit the block without `mrs`; (3) `Now` — what is running, the one fact `meta.json` cannot hold; (4) `Next`; (5) `Decision`, `mark: wait`, **only** when parked on the user — over the tools it travels with `attention: "wait"` (§4.2), and both are cleared together; (6) blockers, `mark: block` (a sibling repo with `contract_handoff: pending`, a red pipeline, an unmerged dependency).
302
313
  - **Rules:** `phase` is the phase you are **running now** (not `meta.json.phase`, which advances only at Close). `header: true` means ticket, type, phase and age are drawn by the reader — do not repeat them in `lines`. Keep it under ~14 lines. Every fact from `meta.json` and the artifacts — an invented MR/PR state is worse than a blank panel. Write in the language of the work's artifacts.
303
314
 
@@ -366,6 +377,13 @@ halfway is not shown as finished. When the stretch will outlast the ~30 min stal
366
377
  `stale_after_minutes` to what it will really take; (d) wherever `## Close` updates `meta.json`. A
367
378
  held panel still goes stale: the app stamps each delivery's arrival.
368
379
 
380
+ **(e) The moment a question is answered or a gate is cleared** — before you resume the work, not at
381
+ the next stop. Drop the `Decision` line, clear `attention`, and move `Now` on: one patch, the first
382
+ thing you do with the answer. A panel still asking what the user already answered is worse than one
383
+ that never asked, because they answered it and the screen says it did not land; and an `attention`
384
+ nobody clears keeps that tab claiming them for ever. The same applies to a blocker that lifted and
385
+ to a `wait` line whose MR/PR merged.
386
+
369
387
  ### 4.5 `meta.json.cost[]` — what a phase measured, when it could
370
388
 
371
389
  A phase that can measure what it spent appends one entry: `{ "phase": "review", "at": "<ISO>",
@@ -199,7 +199,7 @@ refuse) · **degraded** (it runs, quietly worse than the config promises), plus
199
199
  `.agents/agents`, or a plugin. Report each missing name and that it falls back to `general-purpose`
200
200
  (a skill: skipped) — a panel missing agents reviews less and still reports a clean pass.
201
201
  - Harness cannot set a model per subagent → note that every `models.*` value degrades to inheritance.
202
- - **Where the live panel will go this session** (flow-core §4): `panel_set` / `panel_patch` exposed → the terminal draws the panel and no `panel.json` is written; absent → the panel is that file, as before. Neither is a fault — one line saying which one this session gets.
202
+ - **Where the live panel will go this session** (flow-core §4): a tool whose name ends in `panel_set` / `panel_patch` — namespaced by the harness (`mcp__panel__panel_set` on Claude Code) and possibly **deferred**, which reads as absent until the list of deferred tools is checked → the terminal draws the panel and no `panel.json` is written; genuinely absent → the panel is that file, as before. Neither is a fault — one line naming the tools as they are actually called here, or saying the file is the transport.
203
203
 
204
204
  ### 2.3 Knowledge sources
205
205
 
@@ -159,7 +159,7 @@ This system **orchestrates** the project's existing sub-agents and skills (it do
159
159
 
160
160
  ## The panel document
161
161
 
162
- `meta.json` is the *state machine*; the panel is the *view* a reader outside the chat watches. Optional: a work that never publishes it still resolves from `meta.json` alone. Writer rules (order, when, ceiling) and the two transports — the terminal's `panel_set` / `panel_patch` / `panel_get` tools, or `.claude/work/<work>/panel.json` — are flow-core §4. The document below is the same either way.
162
+ `meta.json` is the *state machine*; the panel is the *view* a reader outside the chat watches. Optional: a work that never publishes it still resolves from `meta.json` alone. Writer rules (order, when, ceiling) and the two transports — the terminal's `panel_set` / `panel_patch` / `panel_get` tools (namespaced by the harness, and possibly deferred: flow-core §4 says how to find them), or `.claude/work/<work>/panel.json` — are flow-core §4. The document below is the same either way.
163
163
 
164
164
  ```json
165
165
  {
@@ -185,13 +185,13 @@ This system **orchestrates** the project's existing sub-agents and skills (it do
185
185
  - **`lines`** — one entry per line. Bare string = plain line; object takes `text`, `ref`, `mark`, `link`, `style`, `indent`. Empty string = blank line **and alignment block separator** (`ref` widths per block).
186
186
  - **`mark`** — `done` · `current` · `pending` · `wait` (waiting on someone else) · `block` · `info`; the reader draws it. `style` on a marked line overrides its colour — right only when the colour *is* the information.
187
187
  - **`ref`** — the column label: `#1`, `#3–#6`, `Now`, `Next`, `Decision`.
188
- - **`link`** — URL as a **field, never pasted into `text`**; the reader shortens it to the MR/PR number and makes it clickable.
188
+ - **`link`** — URL as a **field, never pasted into `text`**; the reader shortens it to the MR/PR number and makes it clickable. Every line naming an MR/PR carries one — train entry, blocker about another MR/PR, `Now`/`Next` about the open one (flow-core §4.1).
189
189
  - **`stale_after_minutes`** — raises the 30-minute staleness threshold for a stretch known to run long.
190
190
  - **`style`** — `normal` · `dim` · `title` · `accent` · `ok` · `warn` · `error`; semantic names, the reader owns the palette.
191
191
  - **`header`** — `true` (default): the reader draws ticket, type, phase and age, which never belong in `lines`. `false` hands every line to the writer.
192
192
  - **`phase`** — the phase running **right now** (`meta.json.phase` advances only at close); the reader prefers it.
193
193
  - **`updated_at`** — local ISO-8601 with offset from the real clock, never carried over; lets the reader flag a stale snapshot. Over the tools the app stamps each delivery itself.
194
- - **`attention`** *(tools only)* — `wait` · `block` · `done`, beside `phase`, absent while simply working: the pane's claim on the user's attention, which the app never deduces from a line's `mark`. A tab's card shows the strongest claim among its panes, so an uncleared `wait` flags that tab for ever.
194
+ - **`attention`** *(tools only)* — `wait` · `block` · `done`, beside `phase`, absent while simply working: the pane's claim on the user's attention, which the app never deduces from a line's `mark`. A tab's card shows the strongest claim among its panes, so an uncleared `wait` flags that tab for ever — it goes, with the `Decision` line, the moment the question is answered (flow-core §4.4e).
195
195
  - **`key`** *(tools only)* — a unique, never-painted name on any line a later `panel_patch` may replace or delete (`title`, `mr-1`, `now`, `next`, `decision`, `block-1`).
196
196
 
197
197
  **No headings over the train.** A shipped MR/PR is *open, waiting to merge*; `mark` says it per entry — `wait` shipped, `current` being worked, `done` only merged.
@@ -117,7 +117,7 @@ After a break the panel is most likely stale, and a resumed session is exactly w
117
117
 
118
118
  - `phase` = the phase you are resuming into (`meta.json.phase` does not yet say it).
119
119
  - `Now` in prose; `Next` names the command §4 suggested.
120
- - `Decision` marked `wait` is always set after a resume — nothing is running, the next move is the user's.
120
+ - `Decision` marked `wait` is always set after a resume — nothing is running, the next move is the user's. It goes the moment they make it (flow-core §4.4e), not at the next stop.
121
121
  - `block` lines for the blockers §4 surfaced (`contract_handoff` `pending` in a sibling repo, a red pipeline, an unmerged dependency).
122
122
  - Train: one entry per `meta.json.mrs[]`, not-started collapsed into one `#a–#z` line; omit without `mrs`.
123
123
  - `updated_at` from `date -Iseconds` when the panel goes to the file; every fact from `meta.json` and the artifacts; language of the work's artifacts.
@@ -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.71.0`.** Compare it once, at the start of the session, against
19
+ **This file belongs to flow `0.73.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
@@ -236,7 +236,9 @@ terminal by construction, the turn is over before you notice.
236
236
  (`guided`/`auto` chaining, §2), the turn opens with the call that starts it, not with prose about
237
237
  the one that ended. **A report is never the last thing in a turn you meant to continue.**
238
238
  - **Progress belongs to the panel, not to a turn.** Someone watching reads the live panel (§4):
239
- `Now`, `Next`. Writing it costs no turn and no stop; saying it in chat costs both.
239
+ `Now`, `Next`. Writing it costs no turn and no stop; saying it in chat costs both. **An answered
240
+ question is progress too**: the `Decision` line and the panel's claim on the user go the moment
241
+ the answer arrives, before the work resumes (§4.4e).
240
242
  - **Stopping? Then say so.** `I need:` names the decision or the action you are waiting on. It
241
243
  never announces that you are continuing — if you were, you would not be writing this header.
242
244
 
@@ -268,8 +270,17 @@ right now. **Any progress line you were about to type into the chat is a panel u
268
270
  **Two transports, one document.** When the tools `panel_set` / `panel_patch` / `panel_get` are
269
271
  available, this console is a pane of agent-terminal: publish the panel through them (§4.2) and
270
272
  **stop writing `.claude/work/<work>/panel.json`** — while a pane is claimed, its file is not read at
271
- all. When the tools are not there, write the file exactly as before (§4.3). No work folder
272
- (lightweight `respond`/`green`) → nothing to publish, either way.
273
+ all. When they are not there, write the file exactly as before (§4.3). No work folder (lightweight
274
+ `respond`/`green`) → nothing to publish, either way.
275
+
276
+ **Look for them before you conclude they are missing**, once per session, in pre-flight. A harness
277
+ namespaces an MCP server's tools, so what you are looking for is a tool whose name *ends* in
278
+ `panel_set` — `mcp__panel__panel_set` on Claude Code, another prefix elsewhere — and the name is
279
+ whatever it is called there, not `panel_set`. It may also be **deferred**: listed by name with no
280
+ schema, uncallable until you load it, and indistinguishable from absent unless you read that list.
281
+ A deferred tool is a tool that is there; load the three schemas and publish. The file is the answer
282
+ only after that search comes back empty — and this is the one paragraph that decides it, because
283
+ prose describing a file is otherwise obeyed to the letter.
273
284
 
274
285
  ### 4.1 The document — the same whichever transport carries it
275
286
 
@@ -296,7 +307,7 @@ all. When the tools are not there, write the file exactly as before (§4.3). No
296
307
 
297
308
  - **`mark` says what a line is**; the reader draws it. `done` · `current` (at most one) · `pending` · `wait` (waiting on someone else: an open MR/PR, a user decision) · `block` · `info`. Marked lines form an aligned column: symbol, `ref`, text, link pinned right. Do not set `style` on a marked line — except `mark: "info"` + `style: ok|warn|error` when the colour *is* the information (a monitoring verdict).
298
309
  - **`ref` need not be a number**: `#1`, `#3–#6`, `Now`, `Next`, `Decision`. Column width is per block; blocks are separated by blank lines — use them so the MR/PR train and the labels below do not drag each other wide.
299
- - **`link` is a field, never a URL inside `text`.**
310
+ - **`link` is a field, never a URL inside `text`** — and **every line that names an MR/PR carries it**: the train entries, a blocker about somebody else's MR/PR, a `Now` or `Next` about the open one. The URL is in `meta.json.mrs[].url` or in whatever recorded that blocker; a bare `!10327` typed into `text` is a number the reader cannot make clickable, which is the whole point of the field. No URL recorded anywhere → the number in `text` and nothing else, and go and record it.
300
311
  - **Order:** (1) work title (`style: title`, no mark); (2) the MR/PR train, one entry per `meta.json.mrs[]` with `ref` `#n`, short title, real-state `mark`, `link` when there is a URL — not-started entries collapse into one `#a–#z` `pending` line; omit the block without `mrs`; (3) `Now` — what is running, the one fact `meta.json` cannot hold; (4) `Next`; (5) `Decision`, `mark: wait`, **only** when parked on the user — over the tools it travels with `attention: "wait"` (§4.2), and both are cleared together; (6) blockers, `mark: block` (a sibling repo with `contract_handoff: pending`, a red pipeline, an unmerged dependency).
301
312
  - **Rules:** `phase` is the phase you are **running now** (not `meta.json.phase`, which advances only at Close). `header: true` means ticket, type, phase and age are drawn by the reader — do not repeat them in `lines`. Keep it under ~14 lines. Every fact from `meta.json` and the artifacts — an invented MR/PR state is worse than a blank panel. Write in the language of the work's artifacts.
302
313
 
@@ -365,6 +376,13 @@ halfway is not shown as finished. When the stretch will outlast the ~30 min stal
365
376
  `stale_after_minutes` to what it will really take; (d) wherever `## Close` updates `meta.json`. A
366
377
  held panel still goes stale: the app stamps each delivery's arrival.
367
378
 
379
+ **(e) The moment a question is answered or a gate is cleared** — before you resume the work, not at
380
+ the next stop. Drop the `Decision` line, clear `attention`, and move `Now` on: one patch, the first
381
+ thing you do with the answer. A panel still asking what the user already answered is worse than one
382
+ that never asked, because they answered it and the screen says it did not land; and an `attention`
383
+ nobody clears keeps that tab claiming them for ever. The same applies to a blocker that lifted and
384
+ to a `wait` line whose MR/PR merged.
385
+
368
386
  ### 4.5 `meta.json.cost[]` — what a phase measured, when it could
369
387
 
370
388
  A phase that can measure what it spent appends one entry: `{ "phase": "review", "at": "<ISO>",
@@ -197,7 +197,7 @@ refuse) · **degraded** (it runs, quietly worse than the config promises), plus
197
197
  `.agents/agents`, or a plugin. Report each missing name and that it falls back to `general-purpose`
198
198
  (a skill: skipped) — a panel missing agents reviews less and still reports a clean pass.
199
199
  - Harness cannot set a model per subagent → note that every `models.*` value degrades to inheritance.
200
- - **Where the live panel will go this session** (flow-core §4): `panel_set` / `panel_patch` exposed → the terminal draws the panel and no `panel.json` is written; absent → the panel is that file, as before. Neither is a fault — one line saying which one this session gets.
200
+ - **Where the live panel will go this session** (flow-core §4): a tool whose name ends in `panel_set` / `panel_patch` — namespaced by the harness (`mcp__panel__panel_set` on Claude Code) and possibly **deferred**, which reads as absent until the list of deferred tools is checked → the terminal draws the panel and no `panel.json` is written; genuinely absent → the panel is that file, as before. Neither is a fault — one line naming the tools as they are actually called here, or saying the file is the transport.
201
201
 
202
202
  ### 2.3 Knowledge sources
203
203
 
@@ -157,7 +157,7 @@ This system **orchestrates** the project's existing sub-agents and skills (it do
157
157
 
158
158
  ## The panel document
159
159
 
160
- `meta.json` is the *state machine*; the panel is the *view* a reader outside the chat watches. Optional: a work that never publishes it still resolves from `meta.json` alone. Writer rules (order, when, ceiling) and the two transports — the terminal's `panel_set` / `panel_patch` / `panel_get` tools, or `.claude/work/<work>/panel.json` — are flow-core §4. The document below is the same either way.
160
+ `meta.json` is the *state machine*; the panel is the *view* a reader outside the chat watches. Optional: a work that never publishes it still resolves from `meta.json` alone. Writer rules (order, when, ceiling) and the two transports — the terminal's `panel_set` / `panel_patch` / `panel_get` tools (namespaced by the harness, and possibly deferred: flow-core §4 says how to find them), or `.claude/work/<work>/panel.json` — are flow-core §4. The document below is the same either way.
161
161
 
162
162
  ```json
163
163
  {
@@ -183,13 +183,13 @@ This system **orchestrates** the project's existing sub-agents and skills (it do
183
183
  - **`lines`** — one entry per line. Bare string = plain line; object takes `text`, `ref`, `mark`, `link`, `style`, `indent`. Empty string = blank line **and alignment block separator** (`ref` widths per block).
184
184
  - **`mark`** — `done` · `current` · `pending` · `wait` (waiting on someone else) · `block` · `info`; the reader draws it. `style` on a marked line overrides its colour — right only when the colour *is* the information.
185
185
  - **`ref`** — the column label: `#1`, `#3–#6`, `Now`, `Next`, `Decision`.
186
- - **`link`** — URL as a **field, never pasted into `text`**; the reader shortens it to the MR/PR number and makes it clickable.
186
+ - **`link`** — URL as a **field, never pasted into `text`**; the reader shortens it to the MR/PR number and makes it clickable. Every line naming an MR/PR carries one — train entry, blocker about another MR/PR, `Now`/`Next` about the open one (flow-core §4.1).
187
187
  - **`stale_after_minutes`** — raises the 30-minute staleness threshold for a stretch known to run long.
188
188
  - **`style`** — `normal` · `dim` · `title` · `accent` · `ok` · `warn` · `error`; semantic names, the reader owns the palette.
189
189
  - **`header`** — `true` (default): the reader draws ticket, type, phase and age, which never belong in `lines`. `false` hands every line to the writer.
190
190
  - **`phase`** — the phase running **right now** (`meta.json.phase` advances only at close); the reader prefers it.
191
191
  - **`updated_at`** — local ISO-8601 with offset from the real clock, never carried over; lets the reader flag a stale snapshot. Over the tools the app stamps each delivery itself.
192
- - **`attention`** *(tools only)* — `wait` · `block` · `done`, beside `phase`, absent while simply working: the pane's claim on the user's attention, which the app never deduces from a line's `mark`. A tab's card shows the strongest claim among its panes, so an uncleared `wait` flags that tab for ever.
192
+ - **`attention`** *(tools only)* — `wait` · `block` · `done`, beside `phase`, absent while simply working: the pane's claim on the user's attention, which the app never deduces from a line's `mark`. A tab's card shows the strongest claim among its panes, so an uncleared `wait` flags that tab for ever — it goes, with the `Decision` line, the moment the question is answered (flow-core §4.4e).
193
193
  - **`key`** *(tools only)* — a unique, never-painted name on any line a later `panel_patch` may replace or delete (`title`, `mr-1`, `now`, `next`, `decision`, `block-1`).
194
194
 
195
195
  **No headings over the train.** A shipped MR/PR is *open, waiting to merge*; `mark` says it per entry — `wait` shipped, `current` being worked, `done` only merged.
@@ -115,7 +115,7 @@ After a break the panel is most likely stale, and a resumed session is exactly w
115
115
 
116
116
  - `phase` = the phase you are resuming into (`meta.json.phase` does not yet say it).
117
117
  - `Now` in prose; `Next` names the command §4 suggested.
118
- - `Decision` marked `wait` is always set after a resume — nothing is running, the next move is the user's.
118
+ - `Decision` marked `wait` is always set after a resume — nothing is running, the next move is the user's. It goes the moment they make it (flow-core §4.4e), not at the next stop.
119
119
  - `block` lines for the blockers §4 surfaced (`contract_handoff` `pending` in a sibling repo, a red pipeline, an unmerged dependency).
120
120
  - Train: one entry per `meta.json.mrs[]`, not-started collapsed into one `#a–#z` line; omit without `mrs`.
121
121
  - `updated_at` from `date -Iseconds` when the panel goes to the file; every fact from `meta.json` and the artifacts; language of the work's artifacts.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "flow-workflows",
3
- "version": "0.71.0",
3
+ "version": "0.73.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.71.0",
6
+ "version": "0.73.0",
7
7
  "author": {
8
8
  "name": "Alberto Vioque",
9
9
  "email": "mashware@gmail.com"
@@ -5,6 +5,40 @@ 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.73.0 — The panel kept asking what you had already answered · 2026-09-22
9
+
10
+ **In short**
11
+ - **An answered question now clears the panel at once.** The `Decision` line and the pane's claim on your attention go the moment the answer arrives — before the work resumes, not at the next stop.
12
+ - **Same for a blocker that lifted** and for a `wait` line whose MR/PR merged: the panel said "waiting for you" long after nothing was.
13
+ - **Every line that names an MR/PR carries its link** — the train, a blocker about somebody else's MR/PR, a `Now` about the open one — so the reader can paint `!10327` as something you can click. A number typed into the text is a number the reader cannot use.
14
+
15
+ A panel that still asks what you answered five minutes ago is worse than one that never asked: you
16
+ answered, and the screen says it did not land. The rule that produced it was honest — publish before
17
+ a stop, before a long stretch, at every close — and an answer is none of those three: it arrives
18
+ mid-turn, between two pieces of work, and the next publication was whenever the phase happened to
19
+ end. So the claim on the user outlived the question by an entire phase, and a tab whose card shows
20
+ the strongest claim among its panes kept flagging itself.
21
+
22
+ The link rule is the same failure in the other direction. `!10327` written into a line's text reads
23
+ correctly and does nothing; the field exists so the reader can shorten a URL and make it clickable,
24
+ and flow knows the URL — it is in `meta.json`. Where nothing recorded one, the number stays plain
25
+ text and the fix is to record it.
26
+
27
+ ## v0.72.0 — The tools were there, under a name nobody looked for · 2026-09-22
28
+
29
+ **In short**
30
+ - **A session with the panel tools connected kept writing the file.** The rule named them `panel_set` / `panel_patch`, and a harness namespaces an MCP server's tools — so the agent looked for a name that exists nowhere and concluded, reasonably, that there was no panel.
31
+ - **Now the search is the rule**: once per session, in pre-flight, look for a tool whose name *ends* in `panel_set` — `mcp__panel__panel_set` on Claude Code, another prefix elsewhere.
32
+ - **A deferred tool is a tool that is there.** Listed by name with no schema, it reads as absent to anything that does not check that list; flow loads the three schemas and publishes.
33
+ - **The file is the answer only after that search comes back empty**, and `/flow:doctor` names the tools as they are actually called here.
34
+
35
+ v0.71.0 gave the panel a second transport and described it with the names the server declares.
36
+ Neither the plugin nor the agent reading it ever sees those: a harness prefixes them, and it may
37
+ hand them over as names alone, uncallable until their schemas are loaded. Both together are
38
+ indistinguishable from an absent server — and the fallback, "write the file exactly as before", is
39
+ the most obeyed sentence in the section. So the transport chosen itself was the file, every time,
40
+ on the one terminal that had the panel.
41
+
8
42
  ## v0.71.0 — The panel was a file because nothing better was listening · 2026-09-22
9
43
 
10
44
  **In short**