opencode-plugin-flow 6.8.0 → 6.9.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.
package/CHANGELOG.md CHANGED
@@ -6,6 +6,88 @@ One short entry per release, written for users deciding whether to upgrade.
6
6
 
7
7
  No changes yet.
8
8
 
9
+ ## [6.9.0] - 2026-07-26
10
+
11
+ Rules the prompts used to restate are now enforced by the runtime, and Flow no
12
+ longer assumes an OpenCode-shaped host:
13
+
14
+ - Review findings carry two typed fields instead of prose conventions. An
15
+ optional `scopeBlocker` boolean surfaces as `blockedFeature.scopeBlocker` and
16
+ is accounted for by `nextAction`, so a scope blocker checkpoints for user
17
+ direction at the first failed review rather than depending on the manager
18
+ noticing a `[scope-blocker]` marker; the marker is gone everywhere. A
19
+ `findingId` is set to a prior id for a recurrence and omitted for a new issue,
20
+ which the runtime numbers as `<feature-id>.R<revision>-<NN>` and supplies back
21
+ as `priorFindings` with `nextFindingIdPrefix`. A failed result that drops a
22
+ live prior id is rejected instead of silently losing that history.
23
+ - The reviewer is asked to report every problem it finds and to use severity
24
+ purely for routing, replacing guidance that reserved `blocking` for issues
25
+ invalidating the outcome. Published guidance for current models indicates that
26
+ conservative review instructions suppress findings.
27
+ - The delivery projection carries a runtime-rendered `report`, so every surface
28
+ relays one formatted handoff verbatim instead of restating the same field list
29
+ four times.
30
+ - Validation on a host that reports no structured Bash exit code, or no
31
+ output-truncation flag, records a durable observation marked
32
+ `exit-code-unavailable` or `output-completeness-unknown` rather than failing the
33
+ capture. Such an observation never satisfies a gate, so the limitation is
34
+ visible instead of blocking. Worker-wave dispatch no longer instructs a single
35
+ assistant tool-use turn; a host that runs tasks serially is expected and
36
+ reported as serial.
37
+ - A tool call rejected by the runtime guard returns the same
38
+ `workflowData.failure.recovery` envelope every other Flow failure uses, which is
39
+ what the prompts already told the model to read. `flow_guidance` answers in
40
+ markdown, so its rejection is markdown rather than a JSON blob.
41
+ - `/flow-auto` on a host that reports no assistant message parentage now says so.
42
+ Continuation anchors on the assistant message owning the lease, so such a host
43
+ can never continue and correctly stops after each feature; previously that was
44
+ indistinguishable from a Flow defect. The warning now names the host limitation
45
+ and points at `/flow-run`.
46
+
47
+ Prompt text is now measured rather than argued about. Total shipped prompt bytes
48
+ drop from 42,466 to 38,495 and cross-surface near-duplicate rule statements from
49
+ 18 pairs to 12, with every removed instruction either replaced by an enforced
50
+ guard or a runtime-rendered value, or verified against the model. `flow-run`, the
51
+ dominant surface, loses 2,422 bytes: the elaborate revision-token protocol
52
+ collapses to the one rule that routes (`passed: false` never arms review), the
53
+ manager no longer reconstructs which prior findings are still live or tracks
54
+ their disposition in prose now that the runtime supplies `priorFindings` with
55
+ each finding's current severity and wording, and the prose describing internals
56
+ Flow already enforces — the strict review-start schema, the derived review kind,
57
+ the auto-continuation gate, and several statements that Flow persists no ledger —
58
+ is gone. Absolute-rule markers in `flow-run` fall from 62 to 51, which both
59
+ vendors' guidance treats as a compliance gain rather than a loss. `tests/prompt-quality.test.ts` and
60
+ `tests/documentation-contract.test.ts` no longer pin ordered prose phrases; they
61
+ assert structure, source-derived inventories, and budgets that ratchet down, so
62
+ tightening prompts is cheap and growth is what fails. Model behaviour is measured
63
+ by the new opt-in `evals/` harness, which drives the real slash commands against
64
+ a real model in a throwaway OpenCode host and asserts durable session state.
65
+
66
+ The harness arrived part-way through this release, so the cuts are not all
67
+ evidenced equally. The last one — the manager-side prior-finding reconstruction,
68
+ replaced by runtime `priorFindings` — was validated directly: `happy-path`,
69
+ `plan-only-stops` and `goal-change-refused` each passed three of three attempts
70
+ at the reduced footprint. Earlier cuts predate the harness and rest on the guards
71
+ and rendered values that replaced them, checked against a repeat-3 baseline
72
+ recorded once the harness existed. A fourth scenario, `failing-gate-blocks`,
73
+ passes at roughly even odds; it was measured to be equally unreliable at 6.8.0,
74
+ so it is reported but carries no signal about these prompts either way. Its cause
75
+ is a pre-existing gap rather than a prompt defect: `exitCode` and `scope` on a
76
+ validation observation are supplied by the model and never executed by Flow, so a
77
+ model that misreports a red gate as green is accepted by every predicate. Treat a
78
+ passing gate as a claim the model made, not one Flow verified.
79
+
80
+ The Session v5 schema adds two optional finding fields and widens `exitCode` to
81
+ allow `null`. Earlier v6 builds read the added fields as absent, but reject a
82
+ document containing a `null` exit code, so finish or close active work before
83
+ downgrading.
84
+
85
+ Install or update:
86
+
87
+ ```bash
88
+ opencode plugin opencode-plugin-flow@6.9.0 --global --force
89
+ ```
90
+
9
91
  ## [6.8.0] - 2026-07-24
10
92
 
11
93
  Checkpoint-safe continuation and leaner review convergence:
package/README.md CHANGED
@@ -21,11 +21,11 @@ into the active goal.
21
21
  Install the exact npm release through OpenCode:
22
22
 
23
23
  ```bash
24
- opencode plugin opencode-plugin-flow@6.8.0 --global --force
24
+ opencode plugin opencode-plugin-flow@6.9.0 --global --force
25
25
  ```
26
26
 
27
27
  Omit `--global` for project scope. Exact version pins do not update
28
- automatically. To update, replace `6.8.0` with the new release and rerun the
28
+ automatically. To update, replace `6.9.0` with the new release and rerun the
29
29
  command.
30
30
 
31
31
  Before upgrading from Flow v5 or earlier, finish or explicitly close any active
@@ -43,7 +43,7 @@ The equivalent manual project configuration is:
43
43
  ```json
44
44
  {
45
45
  "$schema": "https://opencode.ai/config.json",
46
- "plugin": ["opencode-plugin-flow@6.8.0"]
46
+ "plugin": ["opencode-plugin-flow@6.9.0"]
47
47
  }
48
48
  ```
49
49
 
@@ -86,8 +86,9 @@ continue, defer, or abandon the active work. If that work is completed but not
86
86
  closed, Flow closes it as completed before starting the new request.
87
87
 
88
88
  Existing implementation authority carries across approval and feature outcomes.
89
- Only when `failedReviewCount === 1` and no `[scope-blocker]` is present may Flow
90
- automatically reset and atomically start one fresh full retry. A
89
+ Flow automatically resets and atomically starts one fresh full retry only when
90
+ the projected `nextAction` is `flow_feature_reset`, which the runtime derives
91
+ from `failedReviewCount` and `blockedFeature.scopeBlocker`. A
91
92
  feature whose latest relevant reviewed outcome remains failed is never selected
92
93
  implicitly. `/flow-auto` may continue untouched, dependency-independent
93
94
  features, but when only retry-required candidates remain it projects
@@ -99,8 +100,10 @@ the superseded failed feature remains, status is ready with
99
100
  `await-user-direction`; explicit retry then uses `flow_run_start` with that
100
101
  feature's exact `featureId`, because there is no blocked run left to reset. The
101
102
  active session remains authoritative while it waits. Ordinary blocking findings
102
- are in-scope by default; a reviewer uses `[scope-blocker]` only when the required
103
- repair would materially exceed the approved plan. After a user checkpoint, the
103
+ are in-scope by default; a reviewer sets `scopeBlocker: true` on a finding only
104
+ when the required repair would materially exceed the approved plan. Each finding
105
+ also carries a runtime-issued `findingId`, and a failed result must carry every
106
+ still-live prior ID forward, which `flow_feature_complete` enforces. After a user checkpoint, the
104
107
  process-local continuation resumes only after that same OpenCode session observes
105
108
  an accepted non-replayed Flow mutation whose tool assistant ID resolves, through
106
109
  the cached `message.updated` `parentID`, to the authoritative user reply. A
@@ -233,8 +236,8 @@ plan-only, advanced, internal, or recovery controls.
233
236
 
234
237
  Start with `/flow-status`; its next action is durable default workflow
235
238
  direction, not permission to exceed the user's authority. For a first failed
236
- review, read detail once before reset because scope-blocker findings refine the
237
- compact default. Pass the exact retry or dependency-independent choice as
239
+ review, read detail once before reset to see the findings the retry must fix.
240
+ Pass the exact retry or dependency-independent choice as
238
241
  `nextFeatureId` so reset and run start are atomic; do not reset and then rely on
239
242
  default selection. If status is ready with `await-user-direction`, read detail
240
243
  once and pass the explicitly authorized retry's exact `featureId` to
@@ -249,7 +252,8 @@ For an interrupted accepted close, compact `/flow-status` supplies
249
252
  `archiveRetry.request`. Replay that request exactly once before any additional
250
253
  or detail recovery read. Flow confirms the existing bytes without rewriting
251
254
  Session v5, re-confirms archive cleanup, and returns the existing concise
252
- `workflowData.delivery`. Reconstruct only the plan-bounded, terminal disposition
255
+ `workflowData.delivery`. Relay its `report` lines verbatim, and reconstruct only
256
+ the plan-bounded, terminal disposition
253
257
  map from its latest `outcomeSummary` and terminal findings. If delivery is absent,
254
258
  report the exact recovery and claim no map. On a close revision conflict,
255
259
  refresh compact status and retry only after confirming the same session and goal