opencode-plugin-flow 4.3.6 → 4.3.8

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,35 @@
2
2
 
3
3
  One short entry per release, written for users deciding whether to upgrade.
4
4
 
5
+ ## [4.3.8] - 2026-07-08
6
+
7
+ Parallel orchestration accounting lore makes broad worker use visible without
8
+ turning Flow state into a transcript store:
9
+
10
+ - `flow_feature_complete` can now record compact `orchestrationPasses` for
11
+ serial, skipped, exact-path candidate, isolated-worktree, tournament,
12
+ validation, review, and verifier passes.
13
+ - `flow_status` reports aggregate pass telemetry under
14
+ `session.budget.orchestration`, including worker counts, candidate/verifier
15
+ usage, skipped candidate decisions, and recent pass records.
16
+ - Completion now records orchestration telemetry on success, validation-gate
17
+ failures, failed reviews, and `needs_input`, while deduping retry payloads and
18
+ retaining only the latest compact pass records.
19
+ - Flow planning and running guidance now requires explicit implementation pass
20
+ decisions for broad work and keeps full handoffs, logs, and manager scratch
21
+ artifacts outside `.flow/**`.
22
+ - README runtime wording now matches the 4.3.6 behavior: completed feature
23
+ counts are telemetry only, not a three-feature stop.
24
+
25
+ ## [4.3.7] - 2026-07-08
26
+
27
+ Package-smoke patience lore keeps the 4.3.6 release path portable across slower
28
+ macOS Node 24 runners:
29
+
30
+ - The package smoke test now has an explicit timeout large enough for the packed
31
+ consumer declaration check to finish on CI, avoiding a runner-speed-only
32
+ failure after the Release workflow already passed.
33
+
5
34
  ## [4.3.6] - 2026-07-08
6
35
 
7
36
  Phase-continuity lore removes the rough stop after three completed features and
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.6 --global --force
21
- npx -y opencode-plugin-flow@4.3.6 sync
20
+ opencode plugin opencode-plugin-flow@4.3.8 --global --force
21
+ npx -y opencode-plugin-flow@4.3.8 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,12 @@ 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 candidates. Feature completion can carry compact
140
+ `orchestrationPasses`; `flow_status` reports the aggregate under
141
+ `session.budget.orchestration`.
142
+
136
143
  ## Install details, doctor, repair, uninstall
137
144
 
138
145
  See [docs/troubleshooting.md](docs/troubleshooting.md) for skill sync
@@ -143,7 +150,7 @@ To update a pinned Flow version, rerun the install command with the new
143
150
  version. To inspect skill health:
144
151
 
145
152
  ```bash
146
- npx -y opencode-plugin-flow@4.3.6 doctor
153
+ npx -y opencode-plugin-flow@4.3.8 doctor
147
154
  ```
148
155
 
149
156
  ## Experimental: compaction context
@@ -155,6 +155,64 @@ 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
+ modes: import("zod").ZodDefault<import("zod").ZodArray<import("zod").ZodEnum<{
179
+ audit: "audit";
180
+ review: "review";
181
+ validation: "validation";
182
+ evidence: "evidence";
183
+ verifier: "verifier";
184
+ "candidate-implementation": "candidate-implementation";
185
+ }>>>;
186
+ workerCount: import("zod").ZodDefault<import("zod").ZodNumber>;
187
+ candidateWorkerCount: import("zod").ZodDefault<import("zod").ZodNumber>;
188
+ verifierWorkerCount: import("zod").ZodDefault<import("zod").ZodNumber>;
189
+ sliceIds: import("zod").ZodDefault<import("zod").ZodArray<import("zod").ZodString>>;
190
+ dependsOn: import("zod").ZodDefault<import("zod").ZodArray<import("zod").ZodString>>;
191
+ writeScope: import("zod").ZodDefault<import("zod").ZodEnum<{
192
+ none: "none";
193
+ "manager-serial": "manager-serial";
194
+ "exact-path": "exact-path";
195
+ "isolated-worktree": "isolated-worktree";
196
+ mixed: "mixed";
197
+ }>>;
198
+ handoffRefs: import("zod").ZodDefault<import("zod").ZodArray<import("zod").ZodString>>;
199
+ verificationStatus: import("zod").ZodDefault<import("zod").ZodEnum<{
200
+ pending: "pending";
201
+ passed: "passed";
202
+ failed: "failed";
203
+ mixed: "mixed";
204
+ "not-needed": "not-needed";
205
+ downgraded: "downgraded";
206
+ }>>;
207
+ outcome: import("zod").ZodDefault<import("zod").ZodEnum<{
208
+ accepted: "accepted";
209
+ rejected: "rejected";
210
+ partial: "partial";
211
+ "not-covered": "not-covered";
212
+ superseded: "superseded";
213
+ }>>;
214
+ synthesisRef: import("zod").ZodOptional<import("zod").ZodString>;
215
+ }, import("zod/v4/core").$strict>>>;
158
216
  };
159
217
  execute(args: {
160
218
  status: "ok" | "needs_input";
@@ -196,6 +254,23 @@ export declare function createTools(ctx: unknown): {
196
254
  summary: string;
197
255
  resolutionHint?: string | undefined;
198
256
  } | undefined;
257
+ orchestrationPasses?: {
258
+ id: string;
259
+ kind: "discovery" | "audit" | "review" | "validation" | "verification" | "candidate" | "implementation-decision";
260
+ modes: ("audit" | "review" | "validation" | "evidence" | "verifier" | "candidate-implementation")[];
261
+ workerCount: number;
262
+ candidateWorkerCount: number;
263
+ verifierWorkerCount: number;
264
+ sliceIds: string[];
265
+ dependsOn: string[];
266
+ writeScope: "none" | "manager-serial" | "exact-path" | "isolated-worktree" | "mixed";
267
+ handoffRefs: string[];
268
+ verificationStatus: "pending" | "passed" | "failed" | "mixed" | "not-needed" | "downgraded";
269
+ outcome: "accepted" | "rejected" | "partial" | "not-covered" | "superseded";
270
+ decision?: "serial" | "parallel" | "candidate-exact-path" | "candidate-worktree" | "tournament" | "skipped" | undefined;
271
+ decisionReason?: string | undefined;
272
+ synthesisRef?: string | undefined;
273
+ }[] | undefined;
199
274
  }, context: ToolContext): Promise<import("@opencode-ai/plugin").ToolResult>;
200
275
  };
201
276
  flow_feature_reset: {
package/dist/cli.js CHANGED
@@ -44,6 +44,12 @@ success | partial | blocked
44
44
  ## Scope
45
45
  <owned slice: path set, module, command, risk lens, route, data range, or question set>
46
46
 
47
+ ## Pass metadata
48
+ - Pass id: <stable pass id from the manifest>
49
+ - Manifest row id: <row id from the manifest>
50
+ - Depends on: <upstream row ids or "none">
51
+ - Write scope: <none | manager-serial | exact-path | isolated-worktree | mixed>
52
+
47
53
  ## Coverage
48
54
  - Expected: <files, ranges, questions, commands, or findings assigned>
49
55
  - Checked: <actual coverage, for example "12/12 files" or "command not run">
@@ -98,6 +104,11 @@ success | partial | blocked
98
104
  ## Scope
99
105
  <claim ids, sources or commands checked, and the acceptance question>
100
106
 
107
+ ## Pass metadata
108
+ - Pass id: <stable pass id from the manifest>
109
+ - Manifest row id: <row id from the manifest>
110
+ - Depends on: <upstream row ids or "none">
111
+
101
112
  ## Verdict per claim
102
113
  - <claim id>: verdict=<supported | partly-supported | unsupported | source-not-found>
103
114
  - claim: <claim text>
@@ -128,6 +139,12 @@ success | partial | blocked
128
139
  ## Scope
129
140
  <isolated worktree or exact path-owned slice>
130
141
 
142
+ ## Pass metadata
143
+ - Pass id: <stable pass id from the manifest>
144
+ - Manifest row id: <row id from the manifest>
145
+ - Depends on: <upstream row ids or "none">
146
+ - Write scope: <exact-path | isolated-worktree>
147
+
131
148
  ## Changed or proposed patch
132
149
  - <path>: <what changed and why>
133
150
 
@@ -154,6 +171,32 @@ live-verified | test-verified | type-check-only | not-verified
154
171
 
155
172
  The manager must inspect and validate any candidate patch before recording Flow
156
173
  completion.
174
+
175
+ ## Manager pass accounting record
176
+
177
+ The manager, not the worker, may carry compact records into
178
+ \`flow_feature_complete.orchestrationPasses\`. Use one record per material pass or
179
+ implementation decision; keep handoffs and long artifacts outside \`.flow/**\`.
180
+
181
+ \`\`\`json
182
+ {
183
+ "id": "stable-pass-id",
184
+ "kind": "discovery | audit | review | validation | verification | candidate | implementation-decision",
185
+ "decision": "serial | parallel | candidate-exact-path | candidate-worktree | tournament | skipped",
186
+ "decisionReason": "why this pass shape was chosen",
187
+ "modes": ["evidence"],
188
+ "workerCount": 1,
189
+ "candidateWorkerCount": 0,
190
+ "verifierWorkerCount": 0,
191
+ "sliceIds": ["manifest-row-id"],
192
+ "dependsOn": [],
193
+ "writeScope": "none | manager-serial | exact-path | isolated-worktree | mixed",
194
+ "handoffRefs": ["/tmp/flow-handoff.md"],
195
+ "verificationStatus": "not-needed | pending | passed | failed | mixed | downgraded",
196
+ "outcome": "accepted | rejected | partial | not-covered | superseded",
197
+ "synthesisRef": "/tmp/flow-synthesis.md"
198
+ }
199
+ \`\`\`
157
200
  `;
158
201
 
159
202
  // skills/flow/references/parallel-orchestration.md
@@ -206,6 +249,35 @@ Pass notes:
206
249
  or exact non-overlapping path ownership. Patches stay proposals until the
207
250
  manager inspects, merges or rejects, and validates.
208
251
 
252
+ ## Implementation pass decision
253
+
254
+ Before implementing a broad, risky, or multi-target feature, record one manager
255
+ decision. This is required even when the answer is "stay serial"; the point is
256
+ to make the skipped parallelism visible instead of relying on memory.
257
+
258
+ Use one of these decisions:
259
+
260
+ - \`serial\`: the manager implements directly because slices overlap, the next
261
+ edit depends on one shared contract, or prompt/merge overhead would exceed the
262
+ value.
263
+ - \`candidate-exact-path\`: one or more candidate workers may edit exact
264
+ non-overlapping paths or modules named by the manager.
265
+ - \`candidate-worktree\`: one or more candidate workers may edit in isolated
266
+ worktrees, then the manager inspects and merges or rejects.
267
+ - \`tournament\`: several isolated candidate implementations compete for the same
268
+ outcome; the manager filters by tests, review, and source inspection before
269
+ accepting one.
270
+ - \`skipped\`: candidate workers were considered but rejected; include the reason,
271
+ such as shared fixtures, shared API contracts, unclear ownership, or no user
272
+ authorization for worker edits.
273
+
274
+ Record the decision in the pass manifest with a stable pass id,
275
+ \`decisionReason\`, \`writeScope\`, expected verification, and where any handoff or
276
+ synthesis artifact will live. If the feature completes, include the compact
277
+ record in the \`orchestrationPasses\` array of the \`flow_feature_complete\`
278
+ payload. The runtime stores only compact accounting; full worker handoffs stay
279
+ in manager-owned scratch files or the conversation.
280
+
209
281
  ## When to stay serial
210
282
 
211
283
  - One file, command, or design question determines the next step.
@@ -281,6 +353,12 @@ schemas, docs, tests, commands, or artifacts to identify real slices. Keep the
281
353
  immediate blocker local: do not delegate the question that determines whether
282
354
  fan-out is even valid.
283
355
 
356
+ Treat orientation as uncertainty reduction. Resolve environment uncertainty by
357
+ inspecting the repo, running cheap commands, or assigning evidence workers; ask
358
+ the user only when the remaining specification uncertainty would make a wrong
359
+ slice expensive to undo. Do not split a vague goal into workers until the
360
+ candidate slices have concrete targets, dependencies, and verification signals.
361
+
284
362
  ## Stage 2 — Slice
285
363
 
286
364
  Split along whichever axis keeps slices independent: modules or path sets,
@@ -288,14 +366,29 @@ route or endpoint groups, risk lenses, command surfaces, data ranges, or claim
288
366
  sets. Each slice needs a one-line scope, expected coverage, and a defined
289
367
  output the manager can check.
290
368
 
369
+ For implementation slices, also name dependencies and write ownership before
370
+ spawning. A real dependency edge means the later slice waits for a verified
371
+ handoff or manager synthesis from the earlier slice; a shared file, fixture,
372
+ schema, or public contract usually means the work should stay serial unless an
373
+ isolated worktree is used. The manifest owns those edges through \`dependsOn\`
374
+ and \`writeScope\`.
375
+
291
376
  ## Stage 3 — Manifest (the pre-fan-out coverage gate)
292
377
 
293
378
  Before spawning, write a pass manifest: one row per slice, plus a totals check.
379
+ Give the pass a stable id so later handoffs, verifier claims, and completion
380
+ payloads can refer to the same work without replaying chat.
294
381
 
295
- | # | Slice scope | Expected coverage | Mode | Verification tier |
296
- | --- | --- | --- | --- | --- |
297
- | 1 | \`src/core/**\` plus its tests | 14 files | \`evidence\` | accept locally |
298
- | 2 | release contract: CI workflows, \`package.json\`, changelog | 6 files | \`evidence\` | verify once |
382
+ | Row id | Slice scope | Expected coverage | Mode | Depends on | Write scope | Verification tier | Handoff ref | Verification status | Synthesis ref |
383
+ | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
384
+ | \`runtime-read\` | \`src/core/**\` plus its tests | 14 files | \`evidence\` | none | none | accept locally | pending | pending | pending |
385
+ | \`release-read\` | release contract: CI workflows, \`package.json\`, changelog | 6 files | \`evidence\` | none | none | verify once | pending | pending | pending |
386
+
387
+ \`writeScope\` values in runtime accounting are \`none\`, \`manager-serial\`,
388
+ \`exact-path\`, \`isolated-worktree\`, or \`mixed\`. Use \`manager-serial\` for a
389
+ recorded serial implementation decision, \`exact-path\` for disjoint candidate
390
+ edits in one checkout, and \`isolated-worktree\` for candidate work that must be
391
+ merged back by the manager.
299
392
 
300
393
  - Count the total work items when countable: files, modules, routes, commands,
301
394
  rows, findings, screenshots, or claims. Confirm slice counts add back to the
@@ -304,11 +397,20 @@ Before spawning, write a pass manifest: one row per slice, plus a totals check.
304
397
  "all changed files plus callers" or "all public commands plus release docs."
305
398
  - Assign each slice's verification tier now (see Stage 6). Deciding where a
306
399
  wrong claim is expensive belongs before handoffs arrive, not after.
400
+ - Record dependency edges now. A row may be spawned only after every \`depends on\`
401
+ row it names has returned a verified handoff or a manager synthesis that
402
+ explicitly settles the dependency.
307
403
  - Fix the slice map centrally before spawning if the gate does not reconcile.
308
404
 
309
405
  The manifest is also the accounting contract for the pass: N rows spawned means
310
406
  N handoffs collected and checked in Stage 5 before anything is synthesized.
311
407
 
408
+ For implementation decisions, add a manifest row even when no worker is spawned:
409
+ \`kind=implementation-decision\`, \`decision=serial\` or \`decision=skipped\`,
410
+ \`workerCount=0\`, \`writeScope=manager-serial\`, and a concrete \`decisionReason\`.
411
+ This is how Flow distinguishes deliberate serial work from forgotten candidate
412
+ or verifier passes.
413
+
312
414
  Write the manifest where it survives the pass: the conversation is enough for a
313
415
  single bounded pass, but when a follow-up pass or a session resume is
314
416
  plausible, persist it with the synthesis (Stage 7) so the accounting can be
@@ -321,8 +423,10 @@ Every worker prompt includes:
321
423
  \`\`\`text
322
424
  Overall goal, context only: <goal>
323
425
  Mode: evidence | review | validation | audit | verifier | candidate-implementation
426
+ Pass id and manifest row id: <stable ids from the manifest>
324
427
  Your exact slice: <paths, modules, command, claim ids, risk lens, or worktree>
325
428
  Expected coverage: <count, paths, range, or complete question set>
429
+ Dependencies and write scope: <verified dependencies, if any; none | manager-serial | exact-path | isolated-worktree>
326
430
  Do: <bounded actions>
327
431
  Do not: call state-changing Flow tools, edit .flow/**, own sibling slices, or make the final Flow verdict.
328
432
  Return only the Flow handoff in this exact shape:
@@ -348,6 +452,20 @@ worker that never returns, errors out, returns empty or unstructured output, or
348
452
  reports \`partial\` or \`blocked\` is a hole in the pass, and synthesizing around it
349
453
  silently drops a slice.
350
454
 
455
+ For each row, fill in:
456
+
457
+ - \`handoffRefs\`: worker ids, handoff file paths, command output artifacts, or
458
+ review packet location that the manager can re-open.
459
+ - \`verificationStatus\`: \`not-needed\`, \`pending\`, \`passed\`, \`failed\`, \`mixed\`,
460
+ or \`downgraded\`.
461
+ - \`outcome\`: \`accepted\`, \`rejected\`, \`partial\`, \`not-covered\`, or \`superseded\`.
462
+ - \`synthesisRef\`: the manager-owned synthesis file or plan field that carries
463
+ the accepted result forward.
464
+
465
+ Rows with no worker, such as serial or skipped implementation decisions, still
466
+ need a row id, decision, reason, and outcome. They are not handoffs, but they
467
+ are accounting.
468
+
351
469
  Worker failure ladder:
352
470
 
353
471
  1. Re-spawn once with a narrower slice and a note about what the first attempt
@@ -369,6 +487,11 @@ handoff only after a cheap manager-side pass:
369
487
  - The evidence supports the claim, not just the topic.
370
488
  - Findings stay inside the worker's slice.
371
489
  - Headline counts can be recounted or traced.
490
+ - Dependency claims cite the verified upstream handoff, synthesis, or source
491
+ artifact they depend on.
492
+ - Candidate implementation claims identify whether they came from exact path
493
+ ownership or an isolated worktree, and whether the manager inspected the
494
+ resulting patch.
372
495
  - Contradictions between workers are either resolved or explicitly marked as
373
496
  contested.
374
497
 
@@ -433,6 +556,38 @@ Where accepted evidence goes:
433
556
  - Candidate patches are not Flow evidence until the manager inspects, merges or
434
557
  rejects them, and validates the main Flow-managed workspace.
435
558
 
559
+ When completing a feature, include compact pass accounting in
560
+ \`flow_feature_complete.orchestrationPasses\` for any pass or implementation
561
+ decision that materially affected the feature:
562
+
563
+ \`\`\`json
564
+ {
565
+ "id": "feature-id-implementation-decision",
566
+ "kind": "implementation-decision",
567
+ "decision": "serial",
568
+ "decisionReason": "Shared schema and tests made exact path ownership unsafe.",
569
+ "modes": [],
570
+ "workerCount": 0,
571
+ "candidateWorkerCount": 0,
572
+ "verifierWorkerCount": 0,
573
+ "sliceIds": ["manager-implementation"],
574
+ "dependsOn": [],
575
+ "writeScope": "manager-serial",
576
+ "handoffRefs": [],
577
+ "verificationStatus": "not-needed",
578
+ "outcome": "accepted",
579
+ "synthesisRef": "/tmp/flow-pass-synthesis.md"
580
+ }
581
+ \`\`\`
582
+
583
+ For candidate and verifier passes, use \`kind: "candidate"\` or
584
+ \`kind: "verification"\`, list the worker modes used, worker counts, slice ids,
585
+ handoff refs, dependency ids, verification status, and whether the manager
586
+ accepted, rejected, downgraded, or superseded the pass. The runtime aggregates
587
+ these compact records into \`session.budget.orchestration\` and stores them on
588
+ the feature history entry. Do not store full handoffs, long logs, or scratch
589
+ tables in \`.flow/session.json\`.
590
+
436
591
  Persist the manifest and the synthesis when another pass may follow or the
437
592
  session is long enough to be compacted or resumed: write the distilled result —
438
593
  the accounted manifest, accepted claims with evidence and confidence, dropped
@@ -451,6 +606,10 @@ Stop after a pass when:
451
606
  - accepted claims are evidenced, scoped, and confidence-labeled.
452
607
  - material single-source, contested, high-stakes, or payload-bound claims have
453
608
  been verified or downgraded.
609
+ - every dependency edge named in the manifest has either a verified upstream
610
+ result or an explicit not-covered outcome.
611
+ - implementation pass decisions are recorded, including skipped candidate
612
+ workers and the reason they were skipped.
454
613
  - remaining gaps are explicit and do not block the Flow artifact being produced.
455
614
 
456
615
  Start a bounded follow-up pass only when:
@@ -458,6 +617,9 @@ Start a bounded follow-up pass only when:
458
617
  - the original slice map missed material scope.
459
618
  - workers disagree on a claim that affects the Flow decision.
460
619
  - a high-stakes or payload-bound claim needs verification.
620
+ - a dependency has just become verified and now unlocks a dependent slice.
621
+ - a candidate patch was rejected and an isolated alternative is still cheaper
622
+ than serial repair.
461
623
  - a first pass exposes a narrower implementation or validation slice worth
462
624
  isolating.
463
625
 
@@ -484,21 +646,24 @@ directory. The manager keeps the middleware local because it is one file and
484
646
  anchors every other judgment.
485
647
 
486
648
  Pass manifest: twelve countable route modules remain after the local check, and
487
- 4 + 3 + 5 adds back to 12 with no overlaps or gaps.
649
+ 4 + 3 + 5 adds back to 12 with no overlaps or gaps. The pass id is
650
+ \`api-error-handling-read\`.
488
651
 
489
- | # | Slice scope | Expected coverage | Mode | Verification tier |
490
- | --- | --- | --- | --- | --- |
491
- | A | auth and account routes | 4/12 modules | \`evidence\` | accept locally |
492
- | B | billing and subscription routes | 3/12 modules | \`review\` | verify once |
493
- | C | remaining content and admin routes | 5/12 modules | \`audit\` | verify once |
652
+ | Row id | Slice scope | Expected coverage | Mode | Depends on | Write scope | Verification tier | Handoff ref | Verification status | Synthesis ref |
653
+ | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
654
+ | \`routes-auth\` | auth and account routes | 4/12 modules | \`evidence\` | none | none | accept locally | pending | pending | pending |
655
+ | \`routes-billing\` | billing and subscription routes | 3/12 modules | \`review\` | none | none | verify once | pending | pending | pending |
656
+ | \`routes-admin\` | remaining content and admin routes | 5/12 modules | \`audit\` | none | none | verify once | pending | pending | pending |
494
657
 
495
658
  Worker prompts:
496
659
 
497
660
  \`\`\`text
498
661
  Overall goal, context only: confirm API error handling is consistent.
499
662
  Mode: evidence
663
+ Pass id and manifest row id: api-error-handling-read / routes-auth
500
664
  Your exact slice: the four auth and account route modules under src/routes/.
501
665
  Expected coverage: 4/4 modules.
666
+ Dependencies and write scope: none; none.
502
667
  Do: report each route's error paths, status codes, and middleware usage with file:line evidence.
503
668
  Do not: call state-changing Flow tools, edit .flow/**, own sibling slices, or make the final Flow verdict.
504
669
  Return only the Flow handoff in this exact shape:
@@ -508,8 +673,10 @@ Return only the Flow handoff in this exact shape:
508
673
  \`\`\`text
509
674
  Overall goal, context only: confirm API error handling is consistent.
510
675
  Mode: review
676
+ Pass id and manifest row id: api-error-handling-read / routes-billing
511
677
  Your exact slice: the three billing and subscription route modules under src/routes/.
512
678
  Expected coverage: 3/3 modules.
679
+ Dependencies and write scope: none; none.
513
680
  Do: separate blocking findings from advisory notes and cite file:line evidence.
514
681
  Do not: call state-changing Flow tools, edit .flow/**, own sibling slices, or make the final Flow verdict.
515
682
  Return only the Flow handoff in this exact shape:
@@ -519,8 +686,10 @@ Return only the Flow handoff in this exact shape:
519
686
  \`\`\`text
520
687
  Overall goal, context only: confirm API error handling is consistent.
521
688
  Mode: audit
689
+ Pass id and manifest row id: api-error-handling-read / routes-admin
522
690
  Your exact slice: the five content and admin route modules under src/routes/.
523
691
  Expected coverage: 5/5 modules.
692
+ Dependencies and write scope: none; none.
524
693
  Do: check each claimed error path against the shared middleware contract and report divergences with evidence.
525
694
  Do not: call state-changing Flow tools, edit .flow/**, own sibling slices, or make the final Flow verdict.
526
695
  Return only the Flow handoff in this exact shape:
@@ -531,6 +700,9 @@ Accounting: three manifest rows spawned means three handoffs collected before
531
700
  synthesis. If slice B returned \`partial\`, the manager would re-spawn it once
532
701
  with a narrower scope, then cover it directly, and as a last resort carry it
533
702
  into the synthesis explicitly as not-covered.
703
+ The manager fills \`handoffRefs\`, \`verificationStatus\`, \`outcome\`, and
704
+ \`synthesisRef\` for each row before any claim becomes a plan decision or review
705
+ payload.
534
706
 
535
707
  Handoff checks: the manager accepts only reports with terminal status, matching
536
708
  coverage counts, concrete file:line evidence, confidence tags, and claims inside
@@ -548,6 +720,12 @@ Final synthesis: the manager re-reads the relevant route and middleware lines,
548
720
  keeps only verified or clearly labeled claims, and records one artifact such as
549
721
  a plan decision, review payload, or docs patch. Raw handoffs and unverified
550
722
  suggestions do not move into the next pass or user-facing answer.
723
+
724
+ If the pass shaped feature execution, the manager records compact accounting in
725
+ \`flow_feature_complete.orchestrationPasses\`, such as pass id
726
+ \`api-error-handling-read\`, kind \`review\`, worker count \`3\`, slice ids
727
+ \`routes-auth\`, \`routes-billing\`, and \`routes-admin\`, verification status
728
+ \`mixed\` or \`passed\`, and a synthesis ref pointing to the manager-owned summary.
551
729
  `;
552
730
 
553
731
  // skills/flow/references/recovery-playbook.md
@@ -831,15 +1009,19 @@ config, or release surfaces in the pass manifest.
831
1009
 
832
1010
  Write the pass manifest and the worker prompts exactly as Stages 3 and 4 of
833
1011
  \`../../flow/references/parallel-orchestration.md\` define them: one manifest row
834
- per slice with expected coverage and a verification tier, and a self-contained
835
- prompt per worker naming the mode (usually \`evidence\`), the exact slice, and
836
- the expected coverage. Discovery-specific rules:
1012
+ per slice with expected coverage, dependencies, write scope, and a verification
1013
+ tier, and a self-contained prompt per worker naming the mode (usually
1014
+ \`evidence\`), the exact slice, and the expected coverage. Discovery-specific
1015
+ rules:
837
1016
 
838
1017
  - Workers are read-only. For validation-oriented discovery, workers may report
839
1018
  commands that should be run, and include raw output only for commands they
840
1019
  actually ran.
841
1020
  - Workers cannot read reference files themselves; paste the matching handoff
842
1021
  template from \`../../flow/references/handoff-format.md\` into the prompt.
1022
+ - If discovery finds later features with disjoint path ownership, preserve that
1023
+ fact in feature \`targets\` and \`dependsOn\` so execution can make an explicit
1024
+ serial or candidate-pass decision instead of rediscovering ownership.
843
1025
 
844
1026
  ## Synthesis
845
1027
 
@@ -1258,6 +1440,11 @@ to execute.
1258
1440
  validation entry should name the expected test level, such as targeted unit,
1259
1441
  integration, browser/e2e, package/build, docs/static, cleanup preservation, or
1260
1442
  broad project gate.
1443
+ - When a feature may benefit from parallel implementation, make \`targets\`
1444
+ precise enough for later ownership decisions: name exact modules, docs,
1445
+ commands, or route groups, and use \`dependsOn\` to preserve prerequisite order.
1446
+ Broad shared-contract work should stay in one feature or an earlier foundation
1447
+ feature so later candidate passes can own disjoint paths safely.
1261
1448
  - Assign \`reviewDepth\` from risk. Use \`detailed\` for persistence, migration,
1262
1449
  concurrency, security, final-delivery-adjacent, or cross-module slices; use
1263
1450
  \`standard\` for normal code changes; reserve \`quick\` for low-risk non-behavioral
@@ -1623,7 +1810,7 @@ Never trim failing output, relabel a failed command as passed, or use "not run"
1623
1810
  `;
1624
1811
 
1625
1812
  // skills/flow-run/SKILL.md
1626
- var SKILL_default6 = '---\nname: flow-run\ndescription: "Use when an approved Flow plan has a feature to implement, validate, or complete in the v4 runtime, and the work is scoped to one active feature. For planning a goal first use flow-plan; for the full goal-to-completion loop or resuming a session use flow."\n---\n\n# Flow Run\n\nUse this skill for implementation after a Flow plan is approved. Work one feature at a time.\n\nIf `flow_run_start` is unavailable, stop and tell the user to check that `opencode-plugin-flow` is loaded in OpenCode.\n\n## Start\n\n- Call `flow_status`.\n- If `flow_status` returns a `session.resumePacket` or\n `session.budget.phaseBoundary`, stop the current autonomous loop and report\n the resume instructions. Only call `flow_run_start` with\n `phaseBoundaryAck: true` at the start of a fresh user invocation that is\n explicitly resuming the Flow session; do not acknowledge a boundary inside\n the same uninterrupted loop that created it.\n- Call `flow_run_start` with no `featureId` unless the user or plan requires a specific runnable feature.\n- Treat the returned feature as the sole scope until it is completed, blocked, or reset.\n- Helper rule: when a named helper skill is unavailable, record the gap and\n keep the corresponding claims conservative instead of simulating its checks.\n- Load `flow-deslop` for cleanup/refactor features.\n- Load `flow-ui-quality` for frontend, UX, responsive, accessibility, or visual work.\n\n## Implement\n\n- Read the feature `targets`, `summary`, `validation`, dependencies, and plan `requirements`/`decisions`.\n- Treat the feature\'s `reviewDepth` as the minimum feature-review depth that\n must be recorded in `flow_feature_complete`.\n- Keep edits scoped to the active feature. If new scope appears, stop and replan or defer it to another feature.\n- Preserve unrelated user changes in the worktree.\n- When a wrong assumption invalidates the feature, use `flow_feature_reset`; do not pile patches onto a bad path.\n- Do not stage, commit, push, amend, rebase, publish, or mutate releases as part\n of feature execution. If the user explicitly asks for commit preparation, load\n `flow-commit` only after `flow_feature_complete` has been recorded, unless the\n user explicitly asks for a WIP commit path. Keep Git boundaries separate from\n Flow state recording.\n\n## Validate\n\n- For complex validation, regression-sensitive changes, browser QA, route QA,\n failure-prone checks, unclear coverage, exploratory QA, or\n `validationRun` summarization, load `flow-test` (helper rule applies).\n- Read `references/validation-rubric.md` before completing.\n- Run the strongest practical checks for the changed behavior.\n- Record concrete command names, status, and observed results. "Tests pass" is not evidence.\n- Non-final features complete with `validationScope: "targeted"`.\n- The final feature must run a broad project-level gate and use `validationScope: "broad"`.\n\nFor broad validation research, risky changes, or unclear coverage, use\n`../flow/references/parallel-orchestration.md` to fan out named Flow workers.\nUse the mode-to-agent mapping in that reference instead of generic subagents.\nWrite its pass manifest before fan-out, paste the matching handoff template\nfrom `../flow/references/handoff-format.md` into every worker prompt, and\napply its verification tiers to the handoffs that come back.\nThey may report command output they actually ran or propose focused checks; the\nmanager decides what is strong enough to record.\n\nFor independent implementation attempts, use candidate workers only with\nexplicit user authorization plus isolated worktrees or exact non-overlapping\npath ownership. Treat their output as candidate patches. The manager inspects,\nmerges, validates, and records Flow state serially.\n\n## Review and complete\n\nBefore `flow_feature_complete`, obtain a `featureReview` payload. Load\n`flow-review`; for read-only subagent reviews, the manager receives the review\npacket and records both `featureReviewDepth` and `featureReview`.\n\nSend reviewers a compact review packet. Do not rely on the accumulated parent\nconversation. Include only:\n\n- active feature id, title, summary, `reviewDepth`, targets, validation, and dependencies\n- relevant plan requirements, decisions, and final review policy\n- changed files and a short diff summary\n- validation evidence with exact commands, status, and observed result\n- targeted paths or risk lenses the reviewer must inspect\n\nIf the review returns `status: "failed"`, do not fix inside the review pass.\nRecord the failed attempt by calling `flow_feature_complete` with the otherwise\nprepared completion payload, the failed `featureReview`, and the attempted\n`featureReviewDepth`; the runtime will reject completion and update the retry\nbudget. Default to stopping and reporting the blocker. When the user already\nauthorized autonomous implementation, make at most one repair and run one retry\nreview. If the retry fails or the runtime reports review retry budget\nexhausted, stop with the blocker.\n\nIf `flow_status` reports `setup.skills` or `flow-review` cannot be loaded, do\nnot record a Flow-gated `featureReview` or `finalReview`. You may perform an\nadvisory review using available context or the bundled review fallback provided\nby plugin config, then complete with `status: "needs_input"` if review evidence\nis required to proceed.\n\nFor the final feature, also obtain a `finalReview` payload whose `reviewDepth` equals the approved plan\'s `finalReviewPolicy`.\n\nComplete with:\n\n```json\n{\n "status": "ok",\n "featureId": "active-feature-id",\n "summary": "what changed",\n "artifactsChanged": [{ "path": "src/file.ts" }],\n "validationRun": [\n { "command": "bun test tests/foo.test.ts", "status": "passed", "summary": "3 pass, exercised foo behavior" }\n ],\n "validationScope": "targeted",\n "featureReviewDepth": "standard",\n "featureReview": { "status": "passed", "summary": "review summary", "blockingFindings": [] }\n}\n```\n\nIf `flow_feature_complete` returns a `session.resumePacket` or\n`session.budget.phaseBoundary`, stop after reporting the compact handoff. If\ngenuinely blocked, call `flow_feature_complete` with `status: "needs_input"` and\nan `outcome` that explains the blocker and next step. Never fabricate validation\nor review evidence to force progress.\n';
1813
+ var SKILL_default6 = '---\nname: flow-run\ndescription: "Use when an approved Flow plan has a feature to implement, validate, or complete in the v4 runtime, and the work is scoped to one active feature. For planning a goal first use flow-plan; for the full goal-to-completion loop or resuming a session use flow."\n---\n\n# Flow Run\n\nUse this skill for implementation after a Flow plan is approved. Work one feature at a time.\n\nIf `flow_run_start` is unavailable, stop and tell the user to check that `opencode-plugin-flow` is loaded in OpenCode.\n\n## Start\n\n- Call `flow_status`.\n- If `flow_status` returns a `session.resumePacket` or\n `session.budget.phaseBoundary`, stop the current autonomous loop and report\n the resume instructions. Only call `flow_run_start` with\n `phaseBoundaryAck: true` at the start of a fresh user invocation that is\n explicitly resuming the Flow session; do not acknowledge a boundary inside\n the same uninterrupted loop that created it.\n- Call `flow_run_start` with no `featureId` unless the user or plan requires a specific runnable feature.\n- Treat the returned feature as the sole scope until it is completed, blocked, or reset.\n- Helper rule: when a named helper skill is unavailable, record the gap and\n keep the corresponding claims conservative instead of simulating its checks.\n- Load `flow-deslop` for cleanup/refactor features.\n- Load `flow-ui-quality` for frontend, UX, responsive, accessibility, or visual work.\n\n## Implement\n\n- Read the feature `targets`, `summary`, `validation`, dependencies, and plan `requirements`/`decisions`.\n- Treat the feature\'s `reviewDepth` as the minimum feature-review depth that\n must be recorded in `flow_feature_complete`.\n- For broad, risky, or multi-target work, record an implementation pass\n decision before editing: `serial`, `candidate-exact-path`,\n `candidate-worktree`, `tournament`, or `skipped`. Use\n `../flow/references/parallel-orchestration.md` for the decision rules,\n manifest fields, and compact `orchestrationPasses` record.\n- If candidate workers are skipped, record the reason, such as overlapping\n targets, shared contracts, missing isolation, or no explicit authorization\n for worker edits.\n- Keep edits scoped to the active feature. If new scope appears, stop and replan or defer it to another feature.\n- Preserve unrelated user changes in the worktree.\n- When a wrong assumption invalidates the feature, use `flow_feature_reset`; do not pile patches onto a bad path.\n- Do not stage, commit, push, amend, rebase, publish, or mutate releases as part\n of feature execution. If the user explicitly asks for commit preparation, load\n `flow-commit` only after `flow_feature_complete` has been recorded, unless the\n user explicitly asks for a WIP commit path. Keep Git boundaries separate from\n Flow state recording.\n\n## Validate\n\n- For complex validation, regression-sensitive changes, browser QA, route QA,\n failure-prone checks, unclear coverage, exploratory QA, or\n `validationRun` summarization, load `flow-test` (helper rule applies).\n- Read `references/validation-rubric.md` before completing.\n- Run the strongest practical checks for the changed behavior.\n- Record concrete command names, status, and observed results. "Tests pass" is not evidence.\n- Non-final features complete with `validationScope: "targeted"`.\n- The final feature must run a broad project-level gate and use `validationScope: "broad"`.\n\nFor broad validation research, risky changes, or unclear coverage, use\n`../flow/references/parallel-orchestration.md` to fan out named Flow workers.\nUse the mode-to-agent mapping in that reference instead of generic subagents.\nWrite its pass manifest before fan-out, paste the matching handoff template\nfrom `../flow/references/handoff-format.md` into every worker prompt, and\napply its verification tiers to the handoffs that come back.\nThey may report command output they actually ran or propose focused checks; the\nmanager decides what is strong enough to record.\n\nFor independent implementation attempts, use candidate workers only with\nexplicit user authorization plus isolated worktrees or exact non-overlapping\npath ownership. Treat their output as candidate patches. The manager inspects,\nmerges, validates, and records Flow state serially.\nWhen a candidate pass or serial/skipped implementation decision materially\nshaped the feature, include its compact record in\n`flow_feature_complete.orchestrationPasses`. Do not paste full worker handoffs\nor long logs into the runtime payload.\n\n## Review and complete\n\nBefore `flow_feature_complete`, obtain a `featureReview` payload. Load\n`flow-review`; for read-only subagent reviews, the manager receives the review\npacket and records both `featureReviewDepth` and `featureReview`.\n\nSend reviewers a compact review packet. Do not rely on the accumulated parent\nconversation. Include only:\n\n- active feature id, title, summary, `reviewDepth`, targets, validation, and dependencies\n- relevant plan requirements, decisions, and final review policy\n- changed files and a short diff summary\n- validation evidence with exact commands, status, and observed result\n- targeted paths or risk lenses the reviewer must inspect\n\nIf the review returns `status: "failed"`, do not fix inside the review pass.\nRecord the failed attempt by calling `flow_feature_complete` with the otherwise\nprepared completion payload, the failed `featureReview`, and the attempted\n`featureReviewDepth`; the runtime will reject completion and update the retry\nbudget. Default to stopping and reporting the blocker. When the user already\nauthorized autonomous implementation, make at most one repair and run one retry\nreview. If the retry fails or the runtime reports review retry budget\nexhausted, stop with the blocker.\n\nIf `flow_status` reports `setup.skills` or `flow-review` cannot be loaded, do\nnot record a Flow-gated `featureReview` or `finalReview`. You may perform an\nadvisory review using available context or the bundled review fallback provided\nby plugin config, then complete with `status: "needs_input"` if review evidence\nis required to proceed.\n\nFor the final feature, also obtain a `finalReview` payload whose `reviewDepth` equals the approved plan\'s `finalReviewPolicy`.\n\nComplete with:\n\n```json\n{\n "status": "ok",\n "featureId": "active-feature-id",\n "summary": "what changed",\n "artifactsChanged": [{ "path": "src/file.ts" }],\n "validationRun": [\n { "command": "bun test tests/foo.test.ts", "status": "passed", "summary": "3 pass, exercised foo behavior" }\n ],\n "validationScope": "targeted",\n "featureReviewDepth": "standard",\n "featureReview": { "status": "passed", "summary": "review summary", "blockingFindings": [] },\n "orchestrationPasses": [\n {\n "id": "active-feature-id-implementation-decision",\n "kind": "implementation-decision",\n "decision": "serial",\n "decisionReason": "Shared contract edits made worker ownership unsafe.",\n "writeScope": "manager-serial",\n "verificationStatus": "not-needed",\n "outcome": "accepted"\n }\n ]\n}\n```\n\nIf `flow_feature_complete` returns a `session.resumePacket` or\n`session.budget.phaseBoundary`, stop after reporting the compact handoff. If\ngenuinely blocked, call `flow_feature_complete` with `status: "needs_input"` and\nan `outcome` that explains the blocker and next step. Never fabricate validation\nor review evidence to force progress.\n';
1627
1814
 
1628
1815
  // skills/flow-test/SKILL.md
1629
1816
  var SKILL_default7 = `---
@@ -2547,4 +2734,4 @@ main(process.argv).catch((error) => {
2547
2734
  process.exitCode = 1;
2548
2735
  });
2549
2736
 
2550
- //# debugId=70ED7108866181D964756E2164756E21
2737
+ //# debugId=F8C7F51F0C6F267C64756E2164756E21