flow-workflows 0.76.0 → 0.77.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.76.0`.** Compare it once, at the start of the session, against
20
+ **This file belongs to flow `0.77.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
@@ -296,6 +296,9 @@ prose describing a file is otherwise obeyed to the letter.
296
296
  "",
297
297
  {"ref": "#1", "text": "batch read sources", "mark": "wait", "link": "https://gitlab.com/…/merge_requests/9977"},
298
298
  {"ref": "#2", "text": "per-event and per-recipient counters", "mark": "current"},
299
+ {"ref": "1–2", "text": "counter columns + migration · repository query", "mark": "done", "indent": 4},
300
+ {"ref": "3", "text": "per-recipient aggregation in the use case", "mark": "current", "indent": 4},
301
+ {"ref": "4", "text": "expose both counters on the endpoint", "mark": "pending", "indent": 4},
299
302
  {"ref": "#3–#6", "text": "channel map · use case · document detail · route", "mark": "pending"},
300
303
  "",
301
304
  {"ref": "Now", "text": "unit suite and the test agent over #2", "mark": "info"},
@@ -307,10 +310,10 @@ prose describing a file is otherwise obeyed to the letter.
307
310
  }
308
311
  ```
309
312
 
310
- - **`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).
313
+ - **`mark` says what a line is**; the reader draws it. `done` · `current` (at most one per block) · `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).
311
314
  - **`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.
312
315
  - **`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.
313
- - **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).
316
+ - **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`; (2b) **the plan steps of the MR/PR being built**, right under its train entry — only while `build` or `fix` is working through a written plan (`$flow-feat-build §2.0ter`, `$flow-bug-fix §2.0bis`); one line per step, `ref` its number (`1`, `2`…), `indent: 4`, `key` `step-<n>`, `mark` `done` · `current` · `pending` from the plan's ticks in the phase artifact — never ahead of them; past three finished steps they collapse into one `done` line (`1–4`, `key` `steps-done`), and past three pending ones the tail collapses the same way (`key` `steps-pending`), so the block stays at five lines or fewer; drop the block when the MR/PR's build ends. This is the step list the user watches: a harness's own task list, where there is one, is a bonus on top — the panel is what every harness can feed; (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).
314
317
  - **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.
315
318
 
316
319
  ### 4.2 Over the terminal's MCP — `panel_set` once, `panel_patch` from then on
@@ -385,6 +388,10 @@ that never asked, because they answered it and the screen says it did not land;
385
388
  nobody clears keeps that tab claiming them for ever. The same applies to a blocker that lifted and
386
389
  to a `wait` line whose MR/PR merged.
387
390
 
391
+ **(f) Each plan step that lands** (the (2b) block): one patch, the moment its tick goes into the
392
+ phase artifact — that step to `done`, the next to `current`, `Now` moved on. Not batched at the end
393
+ of the MR/PR: a list that jumps from nothing to finished told the user nothing while it mattered.
394
+
388
395
  ### 4.5 `meta.json.cost[]` — what a phase measured, when it could
389
396
 
390
397
  A phase that can measure what it spent appends one entry: `{ "phase": "review", "at": "<ISO>",
@@ -95,7 +95,7 @@ Save it in `04-fix.md` under `## Plan`, right after the brief. **A fix that was
95
95
 
96
96
  - Apply the minimal fix targeting the finding of `03-investigation.md` (or the diagnosis if investigate was skipped).
97
97
  - Sensitive area (authentication, payments, sensitive data) → consult the `agents.architecture` agent from FLOW.md to confirm the correct layer; empty → check against `conventions` in FLOW.md.
98
- - More than 2 fix steps → the §2.0bis plan is already written: track its numbered steps with `TaskCreate` where the harness offers one — looked for as `$flow-feat-build §2.1` says, since it may be deferred or named otherwise — otherwise tick them off in `04-fix.md` where they stand and say so once in the first step report. One task per step, same order, marked `in_progress` and `completed` as they go — not batched.
98
+ - More than 2 fix steps → the §2.0bis plan is already written: tick its numbered steps off in `04-fix.md` where they stand, and show them in the live panel's step block (flow-core §4.1 (2b), patched per §4.4 (f)); a harness task list, if there is one, goes on top as `$flow-feat-build §2.1` says. One task per step, same order, marked `in_progress` and `completed` as they go — not batched.
99
99
  - **Comment discipline**: comment only a *why* the code cannot say (a non-obvious constraint, the reason for a workaround, a subtle invariant); match the surrounding file's comment density. **Never write the ticket ID or "fix for #N" into a code comment** — that lives in the commit/branch/MR-PR.
100
100
  - Keep the log updated while editing.
101
101
 
@@ -235,7 +235,7 @@ refuse) · **degraded** (it runs, quietly worse than the config promises), plus
235
235
  a non-negative integer (`0` = no ceiling; else the default `12` applies). Report both effective
236
236
  numbers with the count of panel members `quality.review_skill`/`quality.reviewers` defines, so
237
237
  the widest command's cost is visible before it is paid, not after.
238
- - **A task-list tool** (`TaskCreate` on Claude Code, possibly deferred) is exposed. Absent → `build` and `fix` track their plan steps as a checklist in the phase artifact instead, and the terminal draws no step list — `warn`, not `fail`. On Claude Code the usual cause is a model the harness withholds it from by default: name the fix, `"CLAUDE_CODE_ENABLE_TODO_TOOLS": "true"` under `env` in `~/.claude/settings.json`.
238
+ - **A task-list tool** (`TaskCreate` on Claude Code, possibly deferred) — informational only. The plan steps are shown in the live panel and recorded in the phase artifact; a harness task list is an extra. Absent on Claude Code → one line saying it is withheld from newer models unless `"CLAUDE_CODE_ENABLE_TODO_TOOLS": "true"` is set under `env`, for whoever wants it without a panel.
239
239
  - **The `flow-workflows` CLI, which `review` reaches for before it composes a panel**:
240
240
  `npx flow-workflows@<version> --version` answers, with `<version>` read from `version` in
241
241
  `~/.claude/flow/.claude-plugin/plugin.json` — the same pin `review` uses, so the number that
@@ -150,7 +150,9 @@ Execution mode:
150
150
 
151
151
  Use `TaskCreate` to track the steps of the **§2.0ter plan for this MR/PR** — one task per numbered step, same order. Step skipped there (small MR/PR) → seed from `03-design.md` §"Implementation plan (order)", taking only the steps this MR/PR covers per `04-mr-plan.md`; the feature's plan predates the split and carries steps that belong to siblings. Mark each step `in_progress` when starting and `completed` when done — do not batch.
152
152
 
153
- **Find the task-list tool before you conclude there is none.** `TaskCreate` is the Claude Code name; a harness may call it otherwise (`TodoWrite` on older builds), list it **deferred** — by name only, uncallable until its schema is loaded — or not offer it at all: Claude Code withholds it from newer models unless `CLAUDE_CODE_ENABLE_TODO_TOOLS=true` is set. A deferred tool is a tool that is there: load it and seed the list. Only when the search comes back empty, the plan in `05-implementation.md` **is** the list — tick each step there (`- [x]`) as it lands, same cadence, and say it once in the first step report (`no task-list tool here — steps tracked in 05-implementation.md`), so the user does not wait for a list that will never draw. An instruction to use a tool that is not there is otherwise skipped in silence, and the plan is written and never followed.
153
+ **The steps go to the live panel** (flow-core §4.1 (2b), §4.4 (f)) — that is the list the user watches, whatever the harness. Publish the block when the first step starts, patch it as each one lands.
154
+
155
+ **A harness task list is optional on top.** `TaskCreate` is the Claude Code name; a harness may call it otherwise (`TodoWrite` on older builds), list it **deferred** — by name only, uncallable until its schema is loaded — or not offer it at all (Claude Code withholds it from newer models unless `CLAUDE_CODE_ENABLE_TODO_TOOLS=true`). There → seed it too; not there → nothing is missing and nothing is said. Either way the plan in `05-implementation.md` is the record: tick each step there (`- [x]`) as it lands — the panel and any task list follow the ticks, never the other way round.
154
156
 
155
157
  ### 2.1bis The premise this change rests on (any size, XS included)
156
158
 
@@ -201,7 +203,7 @@ The step's changes are **always reported before anything is recorded**. Who deci
201
203
 
202
204
  **After completing each plan step**:
203
205
 
204
- 1. **Mark the step `completed`** in the task list — or tick it in `05-implementation.md` where there is none (§2.1).
206
+ 1. **Tick the step** in `05-implementation.md`, patch the panel's step block (flow-core §4.4 (f)), and mark it `completed` in the harness task list if there is one (§2.1).
205
207
  2. **Report to the user** a step summary (≤ 5 lines):
206
208
  ```
207
209
  Step N done: <description>
@@ -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.76.0`.** Compare it once, at the start of the session, against
19
+ **This file belongs to flow `0.77.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
@@ -295,6 +295,9 @@ prose describing a file is otherwise obeyed to the letter.
295
295
  "",
296
296
  {"ref": "#1", "text": "batch read sources", "mark": "wait", "link": "https://gitlab.com/…/merge_requests/9977"},
297
297
  {"ref": "#2", "text": "per-event and per-recipient counters", "mark": "current"},
298
+ {"ref": "1–2", "text": "counter columns + migration · repository query", "mark": "done", "indent": 4},
299
+ {"ref": "3", "text": "per-recipient aggregation in the use case", "mark": "current", "indent": 4},
300
+ {"ref": "4", "text": "expose both counters on the endpoint", "mark": "pending", "indent": 4},
298
301
  {"ref": "#3–#6", "text": "channel map · use case · document detail · route", "mark": "pending"},
299
302
  "",
300
303
  {"ref": "Now", "text": "unit suite and the test agent over #2", "mark": "info"},
@@ -306,10 +309,10 @@ prose describing a file is otherwise obeyed to the letter.
306
309
  }
307
310
  ```
308
311
 
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).
312
+ - **`mark` says what a line is**; the reader draws it. `done` · `current` (at most one per block) · `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).
310
313
  - **`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.
311
314
  - **`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.
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).
315
+ - **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`; (2b) **the plan steps of the MR/PR being built**, right under its train entry — only while `build` or `fix` is working through a written plan (`/flow:feat:build §2.0ter`, `/flow:bug:fix §2.0bis`); one line per step, `ref` its number (`1`, `2`…), `indent: 4`, `key` `step-<n>`, `mark` `done` · `current` · `pending` from the plan's ticks in the phase artifact — never ahead of them; past three finished steps they collapse into one `done` line (`1–4`, `key` `steps-done`), and past three pending ones the tail collapses the same way (`key` `steps-pending`), so the block stays at five lines or fewer; drop the block when the MR/PR's build ends. This is the step list the user watches: a harness's own task list, where there is one, is a bonus on top — the panel is what every harness can feed; (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).
313
316
  - **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.
314
317
 
315
318
  ### 4.2 Over the terminal's MCP — `panel_set` once, `panel_patch` from then on
@@ -384,6 +387,10 @@ that never asked, because they answered it and the screen says it did not land;
384
387
  nobody clears keeps that tab claiming them for ever. The same applies to a blocker that lifted and
385
388
  to a `wait` line whose MR/PR merged.
386
389
 
390
+ **(f) Each plan step that lands** (the (2b) block): one patch, the moment its tick goes into the
391
+ phase artifact — that step to `done`, the next to `current`, `Now` moved on. Not batched at the end
392
+ of the MR/PR: a list that jumps from nothing to finished told the user nothing while it mattered.
393
+
387
394
  ### 4.5 `meta.json.cost[]` — what a phase measured, when it could
388
395
 
389
396
  A phase that can measure what it spent appends one entry: `{ "phase": "review", "at": "<ISO>",
@@ -91,7 +91,7 @@ Save it in `04-fix.md` under `## Plan`, right after the brief. **A fix that was
91
91
 
92
92
  - Apply the minimal fix targeting the finding of `03-investigation.md` (or the diagnosis if investigate was skipped).
93
93
  - Sensitive area (authentication, payments, sensitive data) → consult the `agents.architecture` agent from FLOW.md to confirm the correct layer; empty → check against `conventions` in FLOW.md.
94
- - More than 2 fix steps → the §2.0bis plan is already written: track its numbered steps with `TaskCreate` where the harness offers one — looked for as `/flow:feat:build §2.1` says, since it may be deferred or named otherwise — otherwise tick them off in `04-fix.md` where they stand and say so once in the first step report. One task per step, same order, marked `in_progress` and `completed` as they go — not batched.
94
+ - More than 2 fix steps → the §2.0bis plan is already written: tick its numbered steps off in `04-fix.md` where they stand, and show them in the live panel's step block (flow-core §4.1 (2b), patched per §4.4 (f)); a harness task list, if there is one, goes on top as `/flow:feat:build §2.1` says. One task per step, same order, marked `in_progress` and `completed` as they go — not batched.
95
95
  - **Comment discipline**: comment only a *why* the code cannot say (a non-obvious constraint, the reason for a workaround, a subtle invariant); match the surrounding file's comment density. **Never write the ticket ID or "fix for #N" into a code comment** — that lives in the commit/branch/MR-PR.
96
96
  - Keep the log updated while editing.
97
97
 
@@ -231,7 +231,7 @@ refuse) · **degraded** (it runs, quietly worse than the config promises), plus
231
231
  a non-negative integer (`0` = no ceiling; else the default `12` applies). Report both effective
232
232
  numbers with the count of panel members `quality.review_skill`/`quality.reviewers` defines, so
233
233
  the widest command's cost is visible before it is paid, not after.
234
- - **A task-list tool** (`TaskCreate` on Claude Code, possibly deferred) is exposed. Absent → `build` and `fix` track their plan steps as a checklist in the phase artifact instead, and the terminal draws no step list — `warn`, not `fail`. On Claude Code the usual cause is a model the harness withholds it from by default: name the fix, `"CLAUDE_CODE_ENABLE_TODO_TOOLS": "true"` under `env` in `~/.claude/settings.json`.
234
+ - **A task-list tool** (`TaskCreate` on Claude Code, possibly deferred) — informational only. The plan steps are shown in the live panel and recorded in the phase artifact; a harness task list is an extra. Absent on Claude Code → one line saying it is withheld from newer models unless `"CLAUDE_CODE_ENABLE_TODO_TOOLS": "true"` is set under `env`, for whoever wants it without a panel.
235
235
  - **The `flow-workflows` CLI, which `review` reaches for before it composes a panel**:
236
236
  `npx flow-workflows@<version> --version` answers, with `<version>` read from `version` in
237
237
  `~/.claude/flow/.claude-plugin/plugin.json` — the same pin `review` uses, so the number that
@@ -146,7 +146,9 @@ Execution mode:
146
146
 
147
147
  Use `TaskCreate` to track the steps of the **§2.0ter plan for this MR/PR** — one task per numbered step, same order. Step skipped there (small MR/PR) → seed from `03-design.md` §"Implementation plan (order)", taking only the steps this MR/PR covers per `04-mr-plan.md`; the feature's plan predates the split and carries steps that belong to siblings. Mark each step `in_progress` when starting and `completed` when done — do not batch.
148
148
 
149
- **Find the task-list tool before you conclude there is none.** `TaskCreate` is the Claude Code name; a harness may call it otherwise (`TodoWrite` on older builds), list it **deferred** — by name only, uncallable until its schema is loaded — or not offer it at all: Claude Code withholds it from newer models unless `CLAUDE_CODE_ENABLE_TODO_TOOLS=true` is set. A deferred tool is a tool that is there: load it and seed the list. Only when the search comes back empty, the plan in `05-implementation.md` **is** the list — tick each step there (`- [x]`) as it lands, same cadence, and say it once in the first step report (`no task-list tool here — steps tracked in 05-implementation.md`), so the user does not wait for a list that will never draw. An instruction to use a tool that is not there is otherwise skipped in silence, and the plan is written and never followed.
149
+ **The steps go to the live panel** (flow-core §4.1 (2b), §4.4 (f)) — that is the list the user watches, whatever the harness. Publish the block when the first step starts, patch it as each one lands.
150
+
151
+ **A harness task list is optional on top.** `TaskCreate` is the Claude Code name; a harness may call it otherwise (`TodoWrite` on older builds), list it **deferred** — by name only, uncallable until its schema is loaded — or not offer it at all (Claude Code withholds it from newer models unless `CLAUDE_CODE_ENABLE_TODO_TOOLS=true`). There → seed it too; not there → nothing is missing and nothing is said. Either way the plan in `05-implementation.md` is the record: tick each step there (`- [x]`) as it lands — the panel and any task list follow the ticks, never the other way round.
150
152
 
151
153
  ### 2.1bis The premise this change rests on (any size, XS included)
152
154
 
@@ -197,7 +199,7 @@ The step's changes are **always reported before anything is recorded**. Who deci
197
199
 
198
200
  **After completing each plan step**:
199
201
 
200
- 1. **Mark the step `completed`** in the task list — or tick it in `05-implementation.md` where there is none (§2.1).
202
+ 1. **Tick the step** in `05-implementation.md`, patch the panel's step block (flow-core §4.4 (f)), and mark it `completed` in the harness task list if there is one (§2.1).
201
203
  2. **Report to the user** a step summary (≤ 5 lines):
202
204
  ```
203
205
  Step N done: <description>
@@ -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.76.0`.** Compare it once, at the start of the session, against
20
+ **This file belongs to flow `0.77.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
@@ -296,6 +296,9 @@ prose describing a file is otherwise obeyed to the letter.
296
296
  "",
297
297
  {"ref": "#1", "text": "batch read sources", "mark": "wait", "link": "https://gitlab.com/…/merge_requests/9977"},
298
298
  {"ref": "#2", "text": "per-event and per-recipient counters", "mark": "current"},
299
+ {"ref": "1–2", "text": "counter columns + migration · repository query", "mark": "done", "indent": 4},
300
+ {"ref": "3", "text": "per-recipient aggregation in the use case", "mark": "current", "indent": 4},
301
+ {"ref": "4", "text": "expose both counters on the endpoint", "mark": "pending", "indent": 4},
299
302
  {"ref": "#3–#6", "text": "channel map · use case · document detail · route", "mark": "pending"},
300
303
  "",
301
304
  {"ref": "Now", "text": "unit suite and the test agent over #2", "mark": "info"},
@@ -307,10 +310,10 @@ prose describing a file is otherwise obeyed to the letter.
307
310
  }
308
311
  ```
309
312
 
310
- - **`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).
313
+ - **`mark` says what a line is**; the reader draws it. `done` · `current` (at most one per block) · `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).
311
314
  - **`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.
312
315
  - **`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.
313
- - **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).
316
+ - **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`; (2b) **the plan steps of the MR/PR being built**, right under its train entry — only while `build` or `fix` is working through a written plan (`/flow-feat-build §2.0ter`, `/flow-bug-fix §2.0bis`); one line per step, `ref` its number (`1`, `2`…), `indent: 4`, `key` `step-<n>`, `mark` `done` · `current` · `pending` from the plan's ticks in the phase artifact — never ahead of them; past three finished steps they collapse into one `done` line (`1–4`, `key` `steps-done`), and past three pending ones the tail collapses the same way (`key` `steps-pending`), so the block stays at five lines or fewer; drop the block when the MR/PR's build ends. This is the step list the user watches: a harness's own task list, where there is one, is a bonus on top — the panel is what every harness can feed; (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).
314
317
  - **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.
315
318
 
316
319
  ### 4.2 Over the terminal's MCP — `panel_set` once, `panel_patch` from then on
@@ -385,6 +388,10 @@ that never asked, because they answered it and the screen says it did not land;
385
388
  nobody clears keeps that tab claiming them for ever. The same applies to a blocker that lifted and
386
389
  to a `wait` line whose MR/PR merged.
387
390
 
391
+ **(f) Each plan step that lands** (the (2b) block): one patch, the moment its tick goes into the
392
+ phase artifact — that step to `done`, the next to `current`, `Now` moved on. Not batched at the end
393
+ of the MR/PR: a list that jumps from nothing to finished told the user nothing while it mattered.
394
+
388
395
  ### 4.5 `meta.json.cost[]` — what a phase measured, when it could
389
396
 
390
397
  A phase that can measure what it spent appends one entry: `{ "phase": "review", "at": "<ISO>",
@@ -95,7 +95,7 @@ Save it in `04-fix.md` under `## Plan`, right after the brief. **A fix that was
95
95
 
96
96
  - Apply the minimal fix targeting the finding of `03-investigation.md` (or the diagnosis if investigate was skipped).
97
97
  - Sensitive area (authentication, payments, sensitive data) → consult the `agents.architecture` agent from FLOW.md to confirm the correct layer; empty → check against `conventions` in FLOW.md.
98
- - More than 2 fix steps → the §2.0bis plan is already written: track its numbered steps with `TaskCreate` where the harness offers one — looked for as `/flow-feat-build §2.1` says, since it may be deferred or named otherwise — otherwise tick them off in `04-fix.md` where they stand and say so once in the first step report. One task per step, same order, marked `in_progress` and `completed` as they go — not batched.
98
+ - More than 2 fix steps → the §2.0bis plan is already written: tick its numbered steps off in `04-fix.md` where they stand, and show them in the live panel's step block (flow-core §4.1 (2b), patched per §4.4 (f)); a harness task list, if there is one, goes on top as `/flow-feat-build §2.1` says. One task per step, same order, marked `in_progress` and `completed` as they go — not batched.
99
99
  - **Comment discipline**: comment only a *why* the code cannot say (a non-obvious constraint, the reason for a workaround, a subtle invariant); match the surrounding file's comment density. **Never write the ticket ID or "fix for #N" into a code comment** — that lives in the commit/branch/MR-PR.
100
100
  - Keep the log updated while editing.
101
101
 
@@ -235,7 +235,7 @@ refuse) · **degraded** (it runs, quietly worse than the config promises), plus
235
235
  a non-negative integer (`0` = no ceiling; else the default `12` applies). Report both effective
236
236
  numbers with the count of panel members `quality.review_skill`/`quality.reviewers` defines, so
237
237
  the widest command's cost is visible before it is paid, not after.
238
- - **A task-list tool** (`TaskCreate` on Claude Code, possibly deferred) is exposed. Absent → `build` and `fix` track their plan steps as a checklist in the phase artifact instead, and the terminal draws no step list — `warn`, not `fail`. On Claude Code the usual cause is a model the harness withholds it from by default: name the fix, `"CLAUDE_CODE_ENABLE_TODO_TOOLS": "true"` under `env` in `~/.claude/settings.json`.
238
+ - **A task-list tool** (`TaskCreate` on Claude Code, possibly deferred) — informational only. The plan steps are shown in the live panel and recorded in the phase artifact; a harness task list is an extra. Absent on Claude Code → one line saying it is withheld from newer models unless `"CLAUDE_CODE_ENABLE_TODO_TOOLS": "true"` is set under `env`, for whoever wants it without a panel.
239
239
  - **The `flow-workflows` CLI, which `review` reaches for before it composes a panel**:
240
240
  `npx flow-workflows@<version> --version` answers, with `<version>` read from `version` in
241
241
  `~/.claude/flow/.claude-plugin/plugin.json` — the same pin `review` uses, so the number that
@@ -150,7 +150,9 @@ Execution mode:
150
150
 
151
151
  Use `TaskCreate` to track the steps of the **§2.0ter plan for this MR/PR** — one task per numbered step, same order. Step skipped there (small MR/PR) → seed from `03-design.md` §"Implementation plan (order)", taking only the steps this MR/PR covers per `04-mr-plan.md`; the feature's plan predates the split and carries steps that belong to siblings. Mark each step `in_progress` when starting and `completed` when done — do not batch.
152
152
 
153
- **Find the task-list tool before you conclude there is none.** `TaskCreate` is the Claude Code name; a harness may call it otherwise (`TodoWrite` on older builds), list it **deferred** — by name only, uncallable until its schema is loaded — or not offer it at all: Claude Code withholds it from newer models unless `CLAUDE_CODE_ENABLE_TODO_TOOLS=true` is set. A deferred tool is a tool that is there: load it and seed the list. Only when the search comes back empty, the plan in `05-implementation.md` **is** the list — tick each step there (`- [x]`) as it lands, same cadence, and say it once in the first step report (`no task-list tool here — steps tracked in 05-implementation.md`), so the user does not wait for a list that will never draw. An instruction to use a tool that is not there is otherwise skipped in silence, and the plan is written and never followed.
153
+ **The steps go to the live panel** (flow-core §4.1 (2b), §4.4 (f)) — that is the list the user watches, whatever the harness. Publish the block when the first step starts, patch it as each one lands.
154
+
155
+ **A harness task list is optional on top.** `TaskCreate` is the Claude Code name; a harness may call it otherwise (`TodoWrite` on older builds), list it **deferred** — by name only, uncallable until its schema is loaded — or not offer it at all (Claude Code withholds it from newer models unless `CLAUDE_CODE_ENABLE_TODO_TOOLS=true`). There → seed it too; not there → nothing is missing and nothing is said. Either way the plan in `05-implementation.md` is the record: tick each step there (`- [x]`) as it lands — the panel and any task list follow the ticks, never the other way round.
154
156
 
155
157
  ### 2.1bis The premise this change rests on (any size, XS included)
156
158
 
@@ -201,7 +203,7 @@ The step's changes are **always reported before anything is recorded**. Who deci
201
203
 
202
204
  **After completing each plan step**:
203
205
 
204
- 1. **Mark the step `completed`** in the task list — or tick it in `05-implementation.md` where there is none (§2.1).
206
+ 1. **Tick the step** in `05-implementation.md`, patch the panel's step block (flow-core §4.4 (f)), and mark it `completed` in the harness task list if there is one (§2.1).
205
207
  2. **Report to the user** a step summary (≤ 5 lines):
206
208
  ```
207
209
  Step N done: <description>
@@ -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.76.0`.** Compare it once, at the start of the session, against
19
+ **This file belongs to flow `0.77.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
@@ -295,6 +295,9 @@ prose describing a file is otherwise obeyed to the letter.
295
295
  "",
296
296
  {"ref": "#1", "text": "batch read sources", "mark": "wait", "link": "https://gitlab.com/…/merge_requests/9977"},
297
297
  {"ref": "#2", "text": "per-event and per-recipient counters", "mark": "current"},
298
+ {"ref": "1–2", "text": "counter columns + migration · repository query", "mark": "done", "indent": 4},
299
+ {"ref": "3", "text": "per-recipient aggregation in the use case", "mark": "current", "indent": 4},
300
+ {"ref": "4", "text": "expose both counters on the endpoint", "mark": "pending", "indent": 4},
298
301
  {"ref": "#3–#6", "text": "channel map · use case · document detail · route", "mark": "pending"},
299
302
  "",
300
303
  {"ref": "Now", "text": "unit suite and the test agent over #2", "mark": "info"},
@@ -306,10 +309,10 @@ prose describing a file is otherwise obeyed to the letter.
306
309
  }
307
310
  ```
308
311
 
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).
312
+ - **`mark` says what a line is**; the reader draws it. `done` · `current` (at most one per block) · `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).
310
313
  - **`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.
311
314
  - **`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.
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).
315
+ - **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`; (2b) **the plan steps of the MR/PR being built**, right under its train entry — only while `build` or `fix` is working through a written plan (`/flow-feat-build §2.0ter`, `/flow-bug-fix §2.0bis`); one line per step, `ref` its number (`1`, `2`…), `indent: 4`, `key` `step-<n>`, `mark` `done` · `current` · `pending` from the plan's ticks in the phase artifact — never ahead of them; past three finished steps they collapse into one `done` line (`1–4`, `key` `steps-done`), and past three pending ones the tail collapses the same way (`key` `steps-pending`), so the block stays at five lines or fewer; drop the block when the MR/PR's build ends. This is the step list the user watches: a harness's own task list, where there is one, is a bonus on top — the panel is what every harness can feed; (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).
313
316
  - **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.
314
317
 
315
318
  ### 4.2 Over the terminal's MCP — `panel_set` once, `panel_patch` from then on
@@ -384,6 +387,10 @@ that never asked, because they answered it and the screen says it did not land;
384
387
  nobody clears keeps that tab claiming them for ever. The same applies to a blocker that lifted and
385
388
  to a `wait` line whose MR/PR merged.
386
389
 
390
+ **(f) Each plan step that lands** (the (2b) block): one patch, the moment its tick goes into the
391
+ phase artifact — that step to `done`, the next to `current`, `Now` moved on. Not batched at the end
392
+ of the MR/PR: a list that jumps from nothing to finished told the user nothing while it mattered.
393
+
387
394
  ### 4.5 `meta.json.cost[]` — what a phase measured, when it could
388
395
 
389
396
  A phase that can measure what it spent appends one entry: `{ "phase": "review", "at": "<ISO>",
@@ -93,7 +93,7 @@ Save it in `04-fix.md` under `## Plan`, right after the brief. **A fix that was
93
93
 
94
94
  - Apply the minimal fix targeting the finding of `03-investigation.md` (or the diagnosis if investigate was skipped).
95
95
  - Sensitive area (authentication, payments, sensitive data) → consult the `agents.architecture` agent from FLOW.md to confirm the correct layer; empty → check against `conventions` in FLOW.md.
96
- - More than 2 fix steps → the §2.0bis plan is already written: track its numbered steps with `TaskCreate` where the harness offers one — looked for as `/flow-feat-build §2.1` says, since it may be deferred or named otherwise — otherwise tick them off in `04-fix.md` where they stand and say so once in the first step report. One task per step, same order, marked `in_progress` and `completed` as they go — not batched.
96
+ - More than 2 fix steps → the §2.0bis plan is already written: tick its numbered steps off in `04-fix.md` where they stand, and show them in the live panel's step block (flow-core §4.1 (2b), patched per §4.4 (f)); a harness task list, if there is one, goes on top as `/flow-feat-build §2.1` says. One task per step, same order, marked `in_progress` and `completed` as they go — not batched.
97
97
  - **Comment discipline**: comment only a *why* the code cannot say (a non-obvious constraint, the reason for a workaround, a subtle invariant); match the surrounding file's comment density. **Never write the ticket ID or "fix for #N" into a code comment** — that lives in the commit/branch/MR-PR.
98
98
  - Keep the log updated while editing.
99
99
 
@@ -233,7 +233,7 @@ refuse) · **degraded** (it runs, quietly worse than the config promises), plus
233
233
  a non-negative integer (`0` = no ceiling; else the default `12` applies). Report both effective
234
234
  numbers with the count of panel members `quality.review_skill`/`quality.reviewers` defines, so
235
235
  the widest command's cost is visible before it is paid, not after.
236
- - **A task-list tool** (`TaskCreate` on Claude Code, possibly deferred) is exposed. Absent → `build` and `fix` track their plan steps as a checklist in the phase artifact instead, and the terminal draws no step list — `warn`, not `fail`. On Claude Code the usual cause is a model the harness withholds it from by default: name the fix, `"CLAUDE_CODE_ENABLE_TODO_TOOLS": "true"` under `env` in `~/.claude/settings.json`.
236
+ - **A task-list tool** (`TaskCreate` on Claude Code, possibly deferred) — informational only. The plan steps are shown in the live panel and recorded in the phase artifact; a harness task list is an extra. Absent on Claude Code → one line saying it is withheld from newer models unless `"CLAUDE_CODE_ENABLE_TODO_TOOLS": "true"` is set under `env`, for whoever wants it without a panel.
237
237
  - **The `flow-workflows` CLI, which `review` reaches for before it composes a panel**:
238
238
  `npx flow-workflows@<version> --version` answers, with `<version>` read from `version` in
239
239
  `~/.claude/flow/.claude-plugin/plugin.json` — the same pin `review` uses, so the number that
@@ -148,7 +148,9 @@ Execution mode:
148
148
 
149
149
  Use `TaskCreate` to track the steps of the **§2.0ter plan for this MR/PR** — one task per numbered step, same order. Step skipped there (small MR/PR) → seed from `03-design.md` §"Implementation plan (order)", taking only the steps this MR/PR covers per `04-mr-plan.md`; the feature's plan predates the split and carries steps that belong to siblings. Mark each step `in_progress` when starting and `completed` when done — do not batch.
150
150
 
151
- **Find the task-list tool before you conclude there is none.** `TaskCreate` is the Claude Code name; a harness may call it otherwise (`TodoWrite` on older builds), list it **deferred** — by name only, uncallable until its schema is loaded — or not offer it at all: Claude Code withholds it from newer models unless `CLAUDE_CODE_ENABLE_TODO_TOOLS=true` is set. A deferred tool is a tool that is there: load it and seed the list. Only when the search comes back empty, the plan in `05-implementation.md` **is** the list — tick each step there (`- [x]`) as it lands, same cadence, and say it once in the first step report (`no task-list tool here — steps tracked in 05-implementation.md`), so the user does not wait for a list that will never draw. An instruction to use a tool that is not there is otherwise skipped in silence, and the plan is written and never followed.
151
+ **The steps go to the live panel** (flow-core §4.1 (2b), §4.4 (f)) — that is the list the user watches, whatever the harness. Publish the block when the first step starts, patch it as each one lands.
152
+
153
+ **A harness task list is optional on top.** `TaskCreate` is the Claude Code name; a harness may call it otherwise (`TodoWrite` on older builds), list it **deferred** — by name only, uncallable until its schema is loaded — or not offer it at all (Claude Code withholds it from newer models unless `CLAUDE_CODE_ENABLE_TODO_TOOLS=true`). There → seed it too; not there → nothing is missing and nothing is said. Either way the plan in `05-implementation.md` is the record: tick each step there (`- [x]`) as it lands — the panel and any task list follow the ticks, never the other way round.
152
154
 
153
155
  ### 2.1bis The premise this change rests on (any size, XS included)
154
156
 
@@ -199,7 +201,7 @@ The step's changes are **always reported before anything is recorded**. Who deci
199
201
 
200
202
  **After completing each plan step**:
201
203
 
202
- 1. **Mark the step `completed`** in the task list — or tick it in `05-implementation.md` where there is none (§2.1).
204
+ 1. **Tick the step** in `05-implementation.md`, patch the panel's step block (flow-core §4.4 (f)), and mark it `completed` in the harness task list if there is one (§2.1).
203
205
  2. **Report to the user** a step summary (≤ 5 lines):
204
206
  ```
205
207
  Step N done: <description>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "flow-workflows",
3
- "version": "0.76.0",
3
+ "version": "0.77.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.76.0",
6
+ "version": "0.77.0",
7
7
  "author": {
8
8
  "name": "Alberto Vioque",
9
9
  "email": "mashware@gmail.com"
@@ -5,6 +5,21 @@ 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.77.0 — The steps of the MR/PR you are on are on the panel · 2026-09-22
9
+
10
+ **In short**
11
+ - **The live panel shows the plan steps of the MR/PR being built**, indented under its entry in the
12
+ train: finished, current and pending, updated as each one lands — on every harness that feeds the
13
+ panel, not only on the one that has a task list.
14
+ - **A harness task list becomes an extra.** `build` and `fix` still seed it where it exists, but
15
+ nothing depends on it, and `/flow:doctor` reports it as information rather than a warning.
16
+
17
+ v0.76.0 made the step list findable on Claude Code, where it only exists behind
18
+ `CLAUDE_CODE_ENABLE_TODO_TOOLS` and costs context in every session. The panel already had the words
19
+ for it (`done` · `current` · `pending`) and is fed the same way from Codex, OpenCode or zcode. The
20
+ ticks in the phase artifact stay the record; the panel and any task list follow them. Steps past three
21
+ on either side collapse into one line, so the block never takes more than five.
22
+
8
23
  ## v0.76.0 — The plan was written for a list the terminal was never given · 2026-09-22
9
24
 
10
25
  **In short**