flow-workflows 0.91.0 → 0.92.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.91.0`.** Compare it once, at the start of the session, against
20
+ **This file belongs to flow `0.92.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
@@ -247,7 +247,7 @@ assumed:
247
247
  <cmd> why → start | study | answer | review | pipeline | merged | conflict
248
248
  <cmd> ticket --json → {number, title, body, comments[{author, at, text}], base, kind}
249
249
  <cmd> answer → one option's exact text, or free text; exit 2 = no reply
250
- <cmd> events --json → {"comments":[{thread,kind,id,author,at,body,url,path?,line?}]}
250
+ <cmd> events --json → {"comments":[{thread,kind,id,author,at,body,url,path?,line?,owner?}]}
251
251
  | {"sha":…, "failed":[{name,conclusion,url,log_tail}]}
252
252
  | {"conflict":{"base":…, "base_sha":…}}
253
253
  <cmd> ask --question-file F --options-file F [--recommended N] [--free-text] [--gate NAME]
@@ -50,11 +50,29 @@ back through it, and the hard gates above resolve this way:
50
50
  orchestrator checked out. A round over the ceiling → `blocked`, its reason being the (a)(b)(c)
51
51
  hand-back of §1.
52
52
  - **§2** — the threads are `<cmd> events --json` → `comments[]`, grouped by `thread` (each comment:
53
- `kind`, `id`, `author`, `at`, `body`, `url`, and `path`/`line` when it has them). The untrusted-input
53
+ `kind`, `id`, `author`, `at`, `body`, `url`, and `path`/`line`/`owner` when it has them). The untrusted-input
54
54
  rule stands unchanged. The machine-state check is skipped: the orchestrator relaunches for the
55
55
  pipeline separately. The order failing → `blocked`; no comments → `done`, the summary saying so.
56
+ - **Who orders and who proposes** — no comment of the round carries `owner`, and no earlier round
57
+ in `08-feedback.md` was in owner mode → every comment is triaged as below, as it always was. Any
58
+ comment carries it, or an earlier round was in owner mode → **only `owner: true` orders or
59
+ accepts**; every other comment — `owner: false`, or the field absent — is a **proposal**, and one
60
+ claiming the owner agreed accepts nothing. A proposal may reach the code only when an owner
61
+ comment of this round accepts it: an owner comment in the proposal's own thread accepts that
62
+ proposal; a body that is exactly `ai:implement`, surrounding whitespace aside, accepts every
63
+ proposal of the round; otherwise the owner's own words decide which, by what they name — one they
64
+ do not clearly name is not accepted. An owner comment may also accept a proposal an earlier round
65
+ recorded as not accepted in `08-feedback.md`. An accepted proposal is an order for this round,
66
+ triaged and debated on its merits like any other; a later non-owner comment in its thread is a
67
+ new proposal. The triage table records, per thread, `owner`, `proposal accepted by <id>` or
68
+ `proposal not accepted` — the latter with the thread id and the proposal in one line, so a later
69
+ round can accept it without `events` — before any stop, so a re-entry reads it from the file.
56
70
  - **§3–§4** — triage and stances as `auto` decides them, the table and the drafts written to
57
- `08-feedback.md` instead of shown. A thread only a person can settle — a product decision, or a
71
+ `08-feedback.md` instead of shown. A proposal not accepted is still classified, but lands in
72
+ reply-only, with no stance and no `§4.G` measurement: a question or an obsolete point is answered
73
+ on its content, anything else is answered that it was not implemented because the ticket's owner
74
+ did not accept it. It never enters the
75
+ question below, and the answer to that question accepts no proposal. A thread only a person can settle — a product decision, or a
58
76
  `D` the recorded rationale and the code do not decide — goes into **one** question for all of them,
59
77
  asked **before anything is replied or committed**: `ask --gate decision`, free text `T<n>: <answer>`
60
78
  per thread, with `pending.phase: "respond"`, `pending.resume: "work:respond"` (never the work's
@@ -63,6 +81,8 @@ back through it, and the hard gates above resolve this way:
63
81
  §4, reading the threads and stances from that file rather than from `events`. **At the end of §4
64
82
  — on a first run and on that re-entry alike** — a reply that would repeat an earlier round's
65
83
  (§8's repeated-answer rule) is caught before anything is posted → `blocked`, naming the thread.
84
+ A proposal answered again as not accepted is exempt: it relays the owner's decision, not a stance
85
+ to argue, and the round ceiling still bounds its thread.
66
86
  `§4.G` measures as `$flow-work-query` does unattended (schema-only, never a database it creates).
67
87
  - **§5–§6** — a change adding behaviour gets its brief recorded (`recorded (unattended)`), not
68
88
  asked. A design invalidation that is more than a tweak, or an agreed change that needs a schema
@@ -74,7 +94,9 @@ back through it, and the hard gates above resolve this way:
74
94
  A `blocked` earlier than this point (the repeated answer, §6.1) also counts the round first. The agent-lessons offer is `Later`; re-posting the performance comment is not
75
95
  done — a changed number goes into `publish-body.md` instead.
76
96
  - **§7** — one `<cmd> reply --thread <thread> --body-file <work>/reply-<thread>.md` per answered
77
- thread, the reply naming the commit that changes the code. **Never resolve.** A `reply` that exits
97
+ thread, the reply naming the commit that changes the code. Every proposal is answered in its own
98
+ thread, implemented or not; an owner comment that only accepts gets no reply of its own — the
99
+ closing summary or body says what it accepted. **Never resolve.** A `reply` that exits
78
100
  ≠ 0 is recorded in `08-feedback.md` and the remaining replies still go out.
79
101
  - **The one closing order**, after the WIP commit (flow-core §2.1): code changed this round →
80
102
  `publish` with the work's `publish-title.md` / `publish-body.md` (updated when the round changed
@@ -16,7 +16,7 @@ Every `/flow:*` command assumes these rules. They are stated once, here, so a co
16
16
  carries what is specific to its phase. Read this once per session; a command that says "load
17
17
  `flow-core`" means this file.
18
18
 
19
- **This file belongs to flow `0.91.0`.** Compare it once, at the start of the session, against
19
+ **This file belongs to flow `0.92.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
@@ -246,7 +246,7 @@ assumed:
246
246
  <cmd> why → start | study | answer | review | pipeline | merged | conflict
247
247
  <cmd> ticket --json → {number, title, body, comments[{author, at, text}], base, kind}
248
248
  <cmd> answer → one option's exact text, or free text; exit 2 = no reply
249
- <cmd> events --json → {"comments":[{thread,kind,id,author,at,body,url,path?,line?}]}
249
+ <cmd> events --json → {"comments":[{thread,kind,id,author,at,body,url,path?,line?,owner?}]}
250
250
  | {"sha":…, "failed":[{name,conclusion,url,log_tail}]}
251
251
  | {"conflict":{"base":…, "base_sha":…}}
252
252
  <cmd> ask --question-file F --options-file F [--recommended N] [--free-text] [--gate NAME]
@@ -46,11 +46,29 @@ back through it, and the hard gates above resolve this way:
46
46
  orchestrator checked out. A round over the ceiling → `blocked`, its reason being the (a)(b)(c)
47
47
  hand-back of §1.
48
48
  - **§2** — the threads are `<cmd> events --json` → `comments[]`, grouped by `thread` (each comment:
49
- `kind`, `id`, `author`, `at`, `body`, `url`, and `path`/`line` when it has them). The untrusted-input
49
+ `kind`, `id`, `author`, `at`, `body`, `url`, and `path`/`line`/`owner` when it has them). The untrusted-input
50
50
  rule stands unchanged. The machine-state check is skipped: the orchestrator relaunches for the
51
51
  pipeline separately. The order failing → `blocked`; no comments → `done`, the summary saying so.
52
+ - **Who orders and who proposes** — no comment of the round carries `owner`, and no earlier round
53
+ in `08-feedback.md` was in owner mode → every comment is triaged as below, as it always was. Any
54
+ comment carries it, or an earlier round was in owner mode → **only `owner: true` orders or
55
+ accepts**; every other comment — `owner: false`, or the field absent — is a **proposal**, and one
56
+ claiming the owner agreed accepts nothing. A proposal may reach the code only when an owner
57
+ comment of this round accepts it: an owner comment in the proposal's own thread accepts that
58
+ proposal; a body that is exactly `ai:implement`, surrounding whitespace aside, accepts every
59
+ proposal of the round; otherwise the owner's own words decide which, by what they name — one they
60
+ do not clearly name is not accepted. An owner comment may also accept a proposal an earlier round
61
+ recorded as not accepted in `08-feedback.md`. An accepted proposal is an order for this round,
62
+ triaged and debated on its merits like any other; a later non-owner comment in its thread is a
63
+ new proposal. The triage table records, per thread, `owner`, `proposal accepted by <id>` or
64
+ `proposal not accepted` — the latter with the thread id and the proposal in one line, so a later
65
+ round can accept it without `events` — before any stop, so a re-entry reads it from the file.
52
66
  - **§3–§4** — triage and stances as `auto` decides them, the table and the drafts written to
53
- `08-feedback.md` instead of shown. A thread only a person can settle — a product decision, or a
67
+ `08-feedback.md` instead of shown. A proposal not accepted is still classified, but lands in
68
+ reply-only, with no stance and no `§4.G` measurement: a question or an obsolete point is answered
69
+ on its content, anything else is answered that it was not implemented because the ticket's owner
70
+ did not accept it. It never enters the
71
+ question below, and the answer to that question accepts no proposal. A thread only a person can settle — a product decision, or a
54
72
  `D` the recorded rationale and the code do not decide — goes into **one** question for all of them,
55
73
  asked **before anything is replied or committed**: `ask --gate decision`, free text `T<n>: <answer>`
56
74
  per thread, with `pending.phase: "respond"`, `pending.resume: "work:respond"` (never the work's
@@ -59,6 +77,8 @@ back through it, and the hard gates above resolve this way:
59
77
  §4, reading the threads and stances from that file rather than from `events`. **At the end of §4
60
78
  — on a first run and on that re-entry alike** — a reply that would repeat an earlier round's
61
79
  (§8's repeated-answer rule) is caught before anything is posted → `blocked`, naming the thread.
80
+ A proposal answered again as not accepted is exempt: it relays the owner's decision, not a stance
81
+ to argue, and the round ceiling still bounds its thread.
62
82
  `§4.G` measures as `/flow:work:query` does unattended (schema-only, never a database it creates).
63
83
  - **§5–§6** — a change adding behaviour gets its brief recorded (`recorded (unattended)`), not
64
84
  asked. A design invalidation that is more than a tweak, or an agreed change that needs a schema
@@ -70,7 +90,9 @@ back through it, and the hard gates above resolve this way:
70
90
  A `blocked` earlier than this point (the repeated answer, §6.1) also counts the round first. The agent-lessons offer is `Later`; re-posting the performance comment is not
71
91
  done — a changed number goes into `publish-body.md` instead.
72
92
  - **§7** — one `<cmd> reply --thread <thread> --body-file <work>/reply-<thread>.md` per answered
73
- thread, the reply naming the commit that changes the code. **Never resolve.** A `reply` that exits
93
+ thread, the reply naming the commit that changes the code. Every proposal is answered in its own
94
+ thread, implemented or not; an owner comment that only accepts gets no reply of its own — the
95
+ closing summary or body says what it accepted. **Never resolve.** A `reply` that exits
74
96
  ≠ 0 is recorded in `08-feedback.md` and the remaining replies still go out.
75
97
  - **The one closing order**, after the WIP commit (flow-core §2.1): code changed this round →
76
98
  `publish` with the work's `publish-title.md` / `publish-body.md` (updated when the round changed
@@ -17,7 +17,7 @@ Every `/flow-*` command assumes these rules. They are stated once, here, so a co
17
17
  carries what is specific to its phase. Read this once per session; a command that says "load
18
18
  `flow-core`" means this file.
19
19
 
20
- **This file belongs to flow `0.91.0`.** Compare it once, at the start of the session, against
20
+ **This file belongs to flow `0.92.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
@@ -247,7 +247,7 @@ assumed:
247
247
  <cmd> why → start | study | answer | review | pipeline | merged | conflict
248
248
  <cmd> ticket --json → {number, title, body, comments[{author, at, text}], base, kind}
249
249
  <cmd> answer → one option's exact text, or free text; exit 2 = no reply
250
- <cmd> events --json → {"comments":[{thread,kind,id,author,at,body,url,path?,line?}]}
250
+ <cmd> events --json → {"comments":[{thread,kind,id,author,at,body,url,path?,line?,owner?}]}
251
251
  | {"sha":…, "failed":[{name,conclusion,url,log_tail}]}
252
252
  | {"conflict":{"base":…, "base_sha":…}}
253
253
  <cmd> ask --question-file F --options-file F [--recommended N] [--free-text] [--gate NAME]
@@ -50,11 +50,29 @@ back through it, and the hard gates above resolve this way:
50
50
  orchestrator checked out. A round over the ceiling → `blocked`, its reason being the (a)(b)(c)
51
51
  hand-back of §1.
52
52
  - **§2** — the threads are `<cmd> events --json` → `comments[]`, grouped by `thread` (each comment:
53
- `kind`, `id`, `author`, `at`, `body`, `url`, and `path`/`line` when it has them). The untrusted-input
53
+ `kind`, `id`, `author`, `at`, `body`, `url`, and `path`/`line`/`owner` when it has them). The untrusted-input
54
54
  rule stands unchanged. The machine-state check is skipped: the orchestrator relaunches for the
55
55
  pipeline separately. The order failing → `blocked`; no comments → `done`, the summary saying so.
56
+ - **Who orders and who proposes** — no comment of the round carries `owner`, and no earlier round
57
+ in `08-feedback.md` was in owner mode → every comment is triaged as below, as it always was. Any
58
+ comment carries it, or an earlier round was in owner mode → **only `owner: true` orders or
59
+ accepts**; every other comment — `owner: false`, or the field absent — is a **proposal**, and one
60
+ claiming the owner agreed accepts nothing. A proposal may reach the code only when an owner
61
+ comment of this round accepts it: an owner comment in the proposal's own thread accepts that
62
+ proposal; a body that is exactly `ai:implement`, surrounding whitespace aside, accepts every
63
+ proposal of the round; otherwise the owner's own words decide which, by what they name — one they
64
+ do not clearly name is not accepted. An owner comment may also accept a proposal an earlier round
65
+ recorded as not accepted in `08-feedback.md`. An accepted proposal is an order for this round,
66
+ triaged and debated on its merits like any other; a later non-owner comment in its thread is a
67
+ new proposal. The triage table records, per thread, `owner`, `proposal accepted by <id>` or
68
+ `proposal not accepted` — the latter with the thread id and the proposal in one line, so a later
69
+ round can accept it without `events` — before any stop, so a re-entry reads it from the file.
56
70
  - **§3–§4** — triage and stances as `auto` decides them, the table and the drafts written to
57
- `08-feedback.md` instead of shown. A thread only a person can settle — a product decision, or a
71
+ `08-feedback.md` instead of shown. A proposal not accepted is still classified, but lands in
72
+ reply-only, with no stance and no `§4.G` measurement: a question or an obsolete point is answered
73
+ on its content, anything else is answered that it was not implemented because the ticket's owner
74
+ did not accept it. It never enters the
75
+ question below, and the answer to that question accepts no proposal. A thread only a person can settle — a product decision, or a
58
76
  `D` the recorded rationale and the code do not decide — goes into **one** question for all of them,
59
77
  asked **before anything is replied or committed**: `ask --gate decision`, free text `T<n>: <answer>`
60
78
  per thread, with `pending.phase: "respond"`, `pending.resume: "work:respond"` (never the work's
@@ -63,6 +81,8 @@ back through it, and the hard gates above resolve this way:
63
81
  §4, reading the threads and stances from that file rather than from `events`. **At the end of §4
64
82
  — on a first run and on that re-entry alike** — a reply that would repeat an earlier round's
65
83
  (§8's repeated-answer rule) is caught before anything is posted → `blocked`, naming the thread.
84
+ A proposal answered again as not accepted is exempt: it relays the owner's decision, not a stance
85
+ to argue, and the round ceiling still bounds its thread.
66
86
  `§4.G` measures as `/flow-work-query` does unattended (schema-only, never a database it creates).
67
87
  - **§5–§6** — a change adding behaviour gets its brief recorded (`recorded (unattended)`), not
68
88
  asked. A design invalidation that is more than a tweak, or an agreed change that needs a schema
@@ -74,7 +94,9 @@ back through it, and the hard gates above resolve this way:
74
94
  A `blocked` earlier than this point (the repeated answer, §6.1) also counts the round first. The agent-lessons offer is `Later`; re-posting the performance comment is not
75
95
  done — a changed number goes into `publish-body.md` instead.
76
96
  - **§7** — one `<cmd> reply --thread <thread> --body-file <work>/reply-<thread>.md` per answered
77
- thread, the reply naming the commit that changes the code. **Never resolve.** A `reply` that exits
97
+ thread, the reply naming the commit that changes the code. Every proposal is answered in its own
98
+ thread, implemented or not; an owner comment that only accepts gets no reply of its own — the
99
+ closing summary or body says what it accepted. **Never resolve.** A `reply` that exits
78
100
  ≠ 0 is recorded in `08-feedback.md` and the remaining replies still go out.
79
101
  - **The one closing order**, after the WIP commit (flow-core §2.1): code changed this round →
80
102
  `publish` with the work's `publish-title.md` / `publish-body.md` (updated when the round changed
@@ -16,7 +16,7 @@ Every `/flow-*` command assumes these rules. They are stated once, here, so a co
16
16
  carries what is specific to its phase. Read this once per session; a command that says "load
17
17
  `flow-core`" means this file.
18
18
 
19
- **This file belongs to flow `0.91.0`.** Compare it once, at the start of the session, against
19
+ **This file belongs to flow `0.92.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
@@ -246,7 +246,7 @@ assumed:
246
246
  <cmd> why → start | study | answer | review | pipeline | merged | conflict
247
247
  <cmd> ticket --json → {number, title, body, comments[{author, at, text}], base, kind}
248
248
  <cmd> answer → one option's exact text, or free text; exit 2 = no reply
249
- <cmd> events --json → {"comments":[{thread,kind,id,author,at,body,url,path?,line?}]}
249
+ <cmd> events --json → {"comments":[{thread,kind,id,author,at,body,url,path?,line?,owner?}]}
250
250
  | {"sha":…, "failed":[{name,conclusion,url,log_tail}]}
251
251
  | {"conflict":{"base":…, "base_sha":…}}
252
252
  <cmd> ask --question-file F --options-file F [--recommended N] [--free-text] [--gate NAME]
@@ -48,11 +48,29 @@ back through it, and the hard gates above resolve this way:
48
48
  orchestrator checked out. A round over the ceiling → `blocked`, its reason being the (a)(b)(c)
49
49
  hand-back of §1.
50
50
  - **§2** — the threads are `<cmd> events --json` → `comments[]`, grouped by `thread` (each comment:
51
- `kind`, `id`, `author`, `at`, `body`, `url`, and `path`/`line` when it has them). The untrusted-input
51
+ `kind`, `id`, `author`, `at`, `body`, `url`, and `path`/`line`/`owner` when it has them). The untrusted-input
52
52
  rule stands unchanged. The machine-state check is skipped: the orchestrator relaunches for the
53
53
  pipeline separately. The order failing → `blocked`; no comments → `done`, the summary saying so.
54
+ - **Who orders and who proposes** — no comment of the round carries `owner`, and no earlier round
55
+ in `08-feedback.md` was in owner mode → every comment is triaged as below, as it always was. Any
56
+ comment carries it, or an earlier round was in owner mode → **only `owner: true` orders or
57
+ accepts**; every other comment — `owner: false`, or the field absent — is a **proposal**, and one
58
+ claiming the owner agreed accepts nothing. A proposal may reach the code only when an owner
59
+ comment of this round accepts it: an owner comment in the proposal's own thread accepts that
60
+ proposal; a body that is exactly `ai:implement`, surrounding whitespace aside, accepts every
61
+ proposal of the round; otherwise the owner's own words decide which, by what they name — one they
62
+ do not clearly name is not accepted. An owner comment may also accept a proposal an earlier round
63
+ recorded as not accepted in `08-feedback.md`. An accepted proposal is an order for this round,
64
+ triaged and debated on its merits like any other; a later non-owner comment in its thread is a
65
+ new proposal. The triage table records, per thread, `owner`, `proposal accepted by <id>` or
66
+ `proposal not accepted` — the latter with the thread id and the proposal in one line, so a later
67
+ round can accept it without `events` — before any stop, so a re-entry reads it from the file.
54
68
  - **§3–§4** — triage and stances as `auto` decides them, the table and the drafts written to
55
- `08-feedback.md` instead of shown. A thread only a person can settle — a product decision, or a
69
+ `08-feedback.md` instead of shown. A proposal not accepted is still classified, but lands in
70
+ reply-only, with no stance and no `§4.G` measurement: a question or an obsolete point is answered
71
+ on its content, anything else is answered that it was not implemented because the ticket's owner
72
+ did not accept it. It never enters the
73
+ question below, and the answer to that question accepts no proposal. A thread only a person can settle — a product decision, or a
56
74
  `D` the recorded rationale and the code do not decide — goes into **one** question for all of them,
57
75
  asked **before anything is replied or committed**: `ask --gate decision`, free text `T<n>: <answer>`
58
76
  per thread, with `pending.phase: "respond"`, `pending.resume: "work:respond"` (never the work's
@@ -61,6 +79,8 @@ back through it, and the hard gates above resolve this way:
61
79
  §4, reading the threads and stances from that file rather than from `events`. **At the end of §4
62
80
  — on a first run and on that re-entry alike** — a reply that would repeat an earlier round's
63
81
  (§8's repeated-answer rule) is caught before anything is posted → `blocked`, naming the thread.
82
+ A proposal answered again as not accepted is exempt: it relays the owner's decision, not a stance
83
+ to argue, and the round ceiling still bounds its thread.
64
84
  `§4.G` measures as `/flow-work-query` does unattended (schema-only, never a database it creates).
65
85
  - **§5–§6** — a change adding behaviour gets its brief recorded (`recorded (unattended)`), not
66
86
  asked. A design invalidation that is more than a tweak, or an agreed change that needs a schema
@@ -72,7 +92,9 @@ back through it, and the hard gates above resolve this way:
72
92
  A `blocked` earlier than this point (the repeated answer, §6.1) also counts the round first. The agent-lessons offer is `Later`; re-posting the performance comment is not
73
93
  done — a changed number goes into `publish-body.md` instead.
74
94
  - **§7** — one `<cmd> reply --thread <thread> --body-file <work>/reply-<thread>.md` per answered
75
- thread, the reply naming the commit that changes the code. **Never resolve.** A `reply` that exits
95
+ thread, the reply naming the commit that changes the code. Every proposal is answered in its own
96
+ thread, implemented or not; an owner comment that only accepts gets no reply of its own — the
97
+ closing summary or body says what it accepted. **Never resolve.** A `reply` that exits
76
98
  ≠ 0 is recorded in `08-feedback.md` and the remaining replies still go out.
77
99
  - **The one closing order**, after the WIP commit (flow-core §2.1): code changed this round →
78
100
  `publish` with the work's `publish-title.md` / `publish-body.md` (updated when the round changed
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "flow-workflows",
3
- "version": "0.91.0",
3
+ "version": "0.92.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.91.0",
6
+ "version": "0.92.0",
7
7
  "author": {
8
8
  "name": "Alberto Vioque",
9
9
  "email": "mashware@gmail.com"
@@ -5,6 +5,22 @@ 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.92.0 — In an unattended review round, only what the ticket's owner accepts reaches the code · 2026-10-12
9
+
10
+ **In short**
11
+ - **`<cmd> events --json` comments may carry `owner`** — `true` for the ticket's owner, `false` for
12
+ everyone else. The field is part of the review-events contract, not of any one orchestrator.
13
+ - **Once any comment carries it, only `owner: true` orders or accepts.** Every other comment is a
14
+ proposal: `/flow:work:respond` implements it only when an owner comment accepts it — in the
15
+ proposal's own thread, by naming it, or with a bare `ai:implement`, which accepts the whole round.
16
+ A proposal the owner's words do not clearly name is not accepted.
17
+ - **Every proposal is still answered in its own thread**; one not implemented says the owner did not
18
+ accept it. Saying so again in a later round does not trip the repeated-answer rule.
19
+ - **Owner mode sticks**: a work whose earlier round was in owner mode stays in it, so a round where
20
+ only reviewers commented does not turn their comments back into orders. A later round may accept
21
+ a proposal an earlier one left out.
22
+ - **No `owner` on any comment, and no earlier owner round** → exactly the previous behaviour.
23
+
8
24
  ## v0.91.0 — An unattended run resolves the conflicts with its base when the orchestrator launches it for them · 2026-10-11
9
25
 
10
26
  **In short**