opencode-plugin-flow 4.3.7 → 4.3.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,49 @@
2
2
 
3
3
  One short entry per release, written for users deciding whether to upgrade.
4
4
 
5
+ ## [4.3.9] - 2026-07-08
6
+
7
+ Candidate accounting coherence lore makes the 4.3.8 orchestration accounting
8
+ rules self-consistent, so valid manager records stop bouncing off the schema:
9
+
10
+ - `decision: "parallel"` on implementation-decision records is now rejected
11
+ with one clear message (it stays valid for discovery, audit, and review
12
+ passes); previously every `candidateDecision` pairing produced contradictory
13
+ errors.
14
+ - Candidate-shaped decisions now require candidate execution evidence on every
15
+ pass kind, so a decision label alone can no longer validate while being
16
+ excluded from `candidatePassCount`.
17
+ - Candidate and verifier worker counts are checked per subtype instead of
18
+ summed, so one worker may fill both roles on a single pass row.
19
+ - Orchestration pass dedup now remembers every recorded pass id in
20
+ `recordedPassIds`, so resubmitted completions no longer double-count
21
+ telemetry after the recent-pass window rolls over.
22
+ - The candidate accounting rules are documented once, in
23
+ `skills/flow/references/parallel-orchestration.md`; the run skill, handoff
24
+ format, and wiki point there instead of restating them, and the two doc
25
+ instructions that contradicted the schema (omitted `decision` on decision
26
+ records, `workerCount=0` with positive `candidateWorkerCount`) are fixed.
27
+
28
+ ## [4.3.8] - 2026-07-08
29
+
30
+ Parallel orchestration accounting lore makes broad worker use visible without
31
+ turning Flow state into a transcript store:
32
+
33
+ - `flow_feature_complete` can now record compact `orchestrationPasses` for
34
+ serial, skipped, exact-path candidate, isolated-worktree, tournament,
35
+ validation, review, and verifier passes.
36
+ - `flow_status` reports aggregate pass telemetry under
37
+ `session.budget.orchestration`, including worker counts, candidate/verifier
38
+ usage, skipped candidate decisions, and recent pass records.
39
+ - Completion now records orchestration telemetry on success, validation-gate
40
+ failures, failed reviews, and `needs_input`, while deduping retry payloads and
41
+ retaining only the latest compact pass records.
42
+ - Flow planning and running guidance now requires explicit implementation pass
43
+ decisions for broad work and keeps full handoffs, logs, and manager scratch
44
+ artifacts outside `.flow/**`.
45
+ - README runtime wording now matches the 4.3.6 behavior: completed feature
46
+ counts are telemetry only, not a three-feature stop.
47
+
5
48
  ## [4.3.7] - 2026-07-08
6
49
 
7
50
  Package-smoke patience lore keeps the 4.3.6 release path portable across slower
package/README.md CHANGED
@@ -17,8 +17,8 @@ Full project documentation is available in the
17
17
  ## Quick start
18
18
 
19
19
  ```bash
20
- opencode plugin opencode-plugin-flow@4.3.7 --global --force
21
- npx -y opencode-plugin-flow@4.3.7 sync
20
+ opencode plugin opencode-plugin-flow@4.3.9 --global --force
21
+ npx -y opencode-plugin-flow@4.3.9 sync
22
22
  ```
23
23
 
24
24
  Restart OpenCode, then give Flow a goal:
@@ -112,9 +112,10 @@ The runtime owns only safety; judgment lives in the skills:
112
112
  that is shallower than the approved feature requires.
113
113
  - Failed reviews are bounded: a failed review pauses by default, and autonomous
114
114
  repair is limited to one repair plus one retry before the feature blocks.
115
- - Long sessions hit phase boundaries after a small number of completed
116
- features. Flow returns a compact resume packet and requires explicit
117
- `phaseBoundaryAck` before starting the next feature.
115
+ - Completed feature counts are telemetry only; Flow does not stop an approved
116
+ plan just because several features have completed. Review retry boundaries
117
+ still return a compact resume packet and require explicit `phaseBoundaryAck`
118
+ before starting the next feature.
118
119
  - A session can close as `completed` only after final completion has passed.
119
120
  - Crash recovery is built in: stale session locks expire automatically and
120
121
  unreadable session files are quarantined with recovery guidance, never
@@ -133,6 +134,13 @@ complete features, or close sessions. Flow reserves those agent ids and the
133
134
  public command ids while the plugin is enabled, and warns if they collide with
134
135
  your own config.
135
136
 
137
+ For broad implementation, the manager records whether work stayed serial,
138
+ used exact-path candidate workers, used isolated worktrees, ran a tournament, or
139
+ skipped eligible candidates. Feature completion can carry compact
140
+ `orchestrationPasses` with candidate eligibility, decision, and structured
141
+ factors; `flow_status` reports the aggregate under
142
+ `session.budget.orchestration`.
143
+
136
144
  ## Install details, doctor, repair, uninstall
137
145
 
138
146
  See [docs/troubleshooting.md](docs/troubleshooting.md) for skill sync
@@ -143,7 +151,7 @@ To update a pinned Flow version, rerun the install command with the new
143
151
  version. To inspect skill health:
144
152
 
145
153
  ```bash
146
- npx -y opencode-plugin-flow@4.3.7 doctor
154
+ npx -y opencode-plugin-flow@4.3.9 doctor
147
155
  ```
148
156
 
149
157
  ## Experimental: compaction context
@@ -155,6 +155,83 @@ export declare function createTools(ctx: unknown): {
155
155
  summary: import("zod").ZodString;
156
156
  resolutionHint: import("zod").ZodOptional<import("zod").ZodString>;
157
157
  }, import("zod/v4/core").$strict>]>>;
158
+ orchestrationPasses: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
159
+ id: import("zod").ZodString;
160
+ kind: import("zod").ZodEnum<{
161
+ discovery: "discovery";
162
+ audit: "audit";
163
+ review: "review";
164
+ validation: "validation";
165
+ verification: "verification";
166
+ candidate: "candidate";
167
+ "implementation-decision": "implementation-decision";
168
+ }>;
169
+ decision: import("zod").ZodOptional<import("zod").ZodEnum<{
170
+ serial: "serial";
171
+ parallel: "parallel";
172
+ "candidate-exact-path": "candidate-exact-path";
173
+ "candidate-worktree": "candidate-worktree";
174
+ tournament: "tournament";
175
+ skipped: "skipped";
176
+ }>>;
177
+ decisionReason: import("zod").ZodOptional<import("zod").ZodString>;
178
+ candidateEligibility: import("zod").ZodDefault<import("zod").ZodEnum<{
179
+ eligible: "eligible";
180
+ not_eligible: "not_eligible";
181
+ unknown: "unknown";
182
+ }>>;
183
+ candidateDecision: import("zod").ZodOptional<import("zod").ZodEnum<{
184
+ skipped: "skipped";
185
+ used: "used";
186
+ serial_required: "serial_required";
187
+ }>>;
188
+ decisionFactors: import("zod").ZodDefault<import("zod").ZodArray<import("zod").ZodEnum<{
189
+ shared_state: "shared_state";
190
+ overlapping_files: "overlapping_files";
191
+ small_slice: "small_slice";
192
+ needs_manager_judgment: "needs_manager_judgment";
193
+ independent_surface: "independent_surface";
194
+ validation_available: "validation_available";
195
+ }>>>;
196
+ modes: import("zod").ZodDefault<import("zod").ZodArray<import("zod").ZodEnum<{
197
+ audit: "audit";
198
+ review: "review";
199
+ validation: "validation";
200
+ evidence: "evidence";
201
+ verifier: "verifier";
202
+ "candidate-implementation": "candidate-implementation";
203
+ }>>>;
204
+ workerCount: import("zod").ZodDefault<import("zod").ZodNumber>;
205
+ candidateWorkerCount: import("zod").ZodDefault<import("zod").ZodNumber>;
206
+ verifierWorkerCount: import("zod").ZodDefault<import("zod").ZodNumber>;
207
+ sliceIds: import("zod").ZodDefault<import("zod").ZodArray<import("zod").ZodString>>;
208
+ dependsOn: import("zod").ZodDefault<import("zod").ZodArray<import("zod").ZodString>>;
209
+ writeScope: import("zod").ZodDefault<import("zod").ZodEnum<{
210
+ none: "none";
211
+ "manager-serial": "manager-serial";
212
+ "exact-path": "exact-path";
213
+ "isolated-worktree": "isolated-worktree";
214
+ mixed: "mixed";
215
+ }>>;
216
+ handoffRefs: import("zod").ZodDefault<import("zod").ZodArray<import("zod").ZodString>>;
217
+ verificationStatus: import("zod").ZodDefault<import("zod").ZodEnum<{
218
+ pending: "pending";
219
+ passed: "passed";
220
+ failed: "failed";
221
+ mixed: "mixed";
222
+ "not-needed": "not-needed";
223
+ downgraded: "downgraded";
224
+ }>>;
225
+ outcome: import("zod").ZodDefault<import("zod").ZodEnum<{
226
+ accepted: "accepted";
227
+ modified: "modified";
228
+ rejected: "rejected";
229
+ partial: "partial";
230
+ "not-covered": "not-covered";
231
+ superseded: "superseded";
232
+ }>>;
233
+ synthesisRef: import("zod").ZodOptional<import("zod").ZodString>;
234
+ }, import("zod/v4/core").$strict>>>;
158
235
  };
159
236
  execute(args: {
160
237
  status: "ok" | "needs_input";
@@ -196,6 +273,26 @@ export declare function createTools(ctx: unknown): {
196
273
  summary: string;
197
274
  resolutionHint?: string | undefined;
198
275
  } | undefined;
276
+ orchestrationPasses?: {
277
+ id: string;
278
+ kind: "discovery" | "audit" | "review" | "validation" | "verification" | "candidate" | "implementation-decision";
279
+ candidateEligibility: "eligible" | "not_eligible" | "unknown";
280
+ decisionFactors: ("shared_state" | "overlapping_files" | "small_slice" | "needs_manager_judgment" | "independent_surface" | "validation_available")[];
281
+ modes: ("audit" | "review" | "validation" | "evidence" | "verifier" | "candidate-implementation")[];
282
+ workerCount: number;
283
+ candidateWorkerCount: number;
284
+ verifierWorkerCount: number;
285
+ sliceIds: string[];
286
+ dependsOn: string[];
287
+ writeScope: "none" | "manager-serial" | "exact-path" | "isolated-worktree" | "mixed";
288
+ handoffRefs: string[];
289
+ verificationStatus: "pending" | "passed" | "failed" | "mixed" | "not-needed" | "downgraded";
290
+ outcome: "accepted" | "modified" | "rejected" | "partial" | "not-covered" | "superseded";
291
+ decision?: "serial" | "parallel" | "candidate-exact-path" | "candidate-worktree" | "tournament" | "skipped" | undefined;
292
+ decisionReason?: string | undefined;
293
+ candidateDecision?: "skipped" | "used" | "serial_required" | undefined;
294
+ synthesisRef?: string | undefined;
295
+ }[] | undefined;
199
296
  }, context: ToolContext): Promise<import("@opencode-ai/plugin").ToolResult>;
200
297
  };
201
298
  flow_feature_reset: {