@chllming/wave-orchestration 0.9.6 → 0.9.7

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,12 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## 0.9.7 - 2026-04-06
6
+
7
+ ### Fixed
8
+ - Closure engine now skips missing-closure-run failures in bootstrap gate mode.
9
+ - `gateModeThresholds` is now exposed on the `lanePaths` object for downstream consumers.
10
+
5
11
  ## 0.9.6 - 2026-04-05
6
12
 
7
13
  ### Fixed
package/README.md CHANGED
@@ -107,8 +107,8 @@ Wave is built to mitigate those failures with a canonical authority set, generat
107
107
 
108
108
  Current release:
109
109
 
110
- - `@chllming/wave-orchestration@0.9.6`
111
- - Release tag: [`v0.9.5`](https://github.com/chllming/agent-wave-orchestrator/releases/tag/v0.9.6)
110
+ - `@chllming/wave-orchestration@0.9.7`
111
+ - Release tag: [`v0.9.5`](https://github.com/chllming/agent-wave-orchestrator/releases/tag/v0.9.7)
112
112
  - Public install path: npmjs
113
113
  - Authenticated fallback: GitHub Packages
114
114
 
package/docs/README.md CHANGED
@@ -54,7 +54,7 @@ The useful path is journey-first:
54
54
  - Publishing the package:
55
55
  Read [reference/package-publishing-flow.md](./reference/package-publishing-flow.md) for the end-to-end release path, the GitHub publish workflows, the lifecycle scripts, and the verification or repair flow.
56
56
  - Want the practical `0.9.3` operating stance:
57
- Read [guides/recommendations-0.9.6.md](./guides/recommendations-0.9.6.md) for the recommended default around relaxed blocker states, advisory turn budgets, and targeted recovery.
57
+ Read [guides/recommendations-0.9.7.md](./guides/recommendations-0.9.7.md) for the recommended default around relaxed blocker states, advisory turn budgets, and targeted recovery.
58
58
  - Want the concrete runtime module map:
59
59
  Read [plans/end-state-architecture.md](./plans/end-state-architecture.md) for the engine-by-engine architecture and artifact ownership model.
60
60
  - Want the CLI surface map:
@@ -0,0 +1,191 @@
1
+ ---
2
+ title: "0.9.4 Recommendations"
3
+ summary: "How to use 0.9.4's softer blocker states, advisory turn budgets, and targeted recovery without weakening proof and closure."
4
+ ---
5
+
6
+ # 0.9.4 Recommendations
7
+
8
+ Use this guide when you are adopting `0.9.4` and want one practical operating stance for the softer blocker states, advisory turn-budget behavior, and targeted recovery flow that the current package line ships.
9
+
10
+ ## Recommended Default
11
+
12
+ For most repos, the safest `0.9.4` default is:
13
+
14
+ - bound work with `budget.minutes`
15
+ - leave generic `budget.turns` as advisory metadata
16
+ - author non-proof follow-up as `soft`, `stale`, or `advisory` instead of silently treating every open record as a hard blocker
17
+ - use `resolve-policy` when the answer already exists in repo policy or shipped docs
18
+ - prefer targeted rerun or resume after timeout, max-turn, rate-limit, or missing-status outcomes instead of relaunching the whole wave
19
+ - in short-lived sandboxes, prefer `wave submit`, `wave supervise`, `wave status`, and `wave wait` instead of binding the full run to one client shell
20
+ - when a wave-gate dimension has a documented gap that is not an actionable blocker, use `gap` instead of `pass` or `blocked` — the runtime treats it as a conditional pass
21
+
22
+ That recommendation matches the runtime:
23
+
24
+ - executor launch metadata only emits hard turn-limit flags from `claude.maxTurns` or `opencode.steps`
25
+ - open `stale` and `advisory` coordination records stay visible without reopening the active blocking edge
26
+ - recoverable launcher failures queue targeted retry state instead of immediately escalating to broad terminal wave failure
27
+
28
+ ## 1. Budgets
29
+
30
+ Treat the two budget knobs differently:
31
+
32
+ - `budget.minutes` is the primary attempt budget
33
+ - generic `budget.turns` is only a planning hint
34
+ - `claude.maxTurns` or `opencode.steps` are the hard runtime ceilings when you actually want deterministic turn stopping
35
+
36
+ Recommended pattern for synthesis-heavy implementation or closure work:
37
+
38
+ ```json
39
+ {
40
+ "executors": {
41
+ "profiles": {
42
+ "implementation-default": {
43
+ "id": "claude",
44
+ "model": "claude-sonnet-4-6",
45
+ "budget": {
46
+ "minutes": 35,
47
+ "turns": 12
48
+ }
49
+ }
50
+ }
51
+ }
52
+ }
53
+ ```
54
+
55
+ In that pattern, `35` minutes is real policy. `12` turns is only guidance for planning and preview metadata.
56
+
57
+ Only set a hard runtime ceiling when you deliberately want the runtime itself to stop:
58
+
59
+ ```json
60
+ {
61
+ "executors": {
62
+ "profiles": {
63
+ "bounded-closure": {
64
+ "id": "claude",
65
+ "model": "claude-sonnet-4-6",
66
+ "budget": {
67
+ "minutes": 20
68
+ },
69
+ "claude": {
70
+ "maxTurns": 6
71
+ }
72
+ }
73
+ }
74
+ }
75
+ }
76
+ ```
77
+
78
+ ## 2. Softer Coordination States
79
+
80
+ `0.9.2` keeps “still visible” separate from “still blocking”.
81
+
82
+ Use these states intentionally:
83
+
84
+ | State | Use it for | What the runtime does |
85
+ | --- | --- | --- |
86
+ | `soft` | follow-up that still matters but should not be treated like proof failure | remains visible and may still drive repair or retry targeting |
87
+ | `stale` | outdated clarification or blocker context kept for history | visible in control state, but does not reopen blocking by itself |
88
+ | `advisory` | known issue, note, or human context that should stay visible without blocking closure | visible in control state, but does not own the active blocking edge |
89
+
90
+ Practical command paths:
91
+
92
+ ```bash
93
+ pnpm exec wave control task act defer --lane main --wave 10 --id blocker-doc-follow-up
94
+ pnpm exec wave control task act mark-stale --lane main --wave 10 --id clarify-a7-rollout
95
+ pnpm exec wave control task act mark-advisory --lane main --wave 10 --id request-clarify-a7-rollout
96
+ pnpm exec wave control task act resolve-policy --lane main --wave 10 --id clarify-a7-rollout --detail "Policy already covered in the rollout guide."
97
+ ```
98
+
99
+ Use them when the repo already knows the answer, the remaining item is informational, or the follow-up should stay visible for the next wave without holding the current wave hostage.
100
+
101
+ ## 3. What Should Stay Hard
102
+
103
+ Do not relax everything.
104
+
105
+ Keep these hard or closure-critical unless you are intentionally changing wave policy:
106
+
107
+ - missing proof or required deliverables
108
+ - failed integration, documentation, or cont-QA closure gates
109
+ - real human-feedback or escalation requirements that block safe continuation
110
+ - requests or clarifications that still represent unresolved ownership or policy ambiguity for the current wave
111
+
112
+ Use `gap` in wave-gate markers when a dimension has a documented gap that is not actionable in the current wave. For example, `live=gap` is appropriate when an infrastructure topology constraint prevents full live validation but the constraint is known, documented, and does not represent a regression. Do not use `gap` to hide actual failures or unreviewed work.
113
+
114
+ If the current wave cannot truthfully close without the answer, keep it blocking.
115
+
116
+ ## 4. Recovery Recommendation
117
+
118
+ My recommendation after reviewing the current `0.9.4` code path is:
119
+
120
+ - let timeout, max-turn, rate-limit, and missing-status failures go through the built-in targeted recovery path first
121
+ - inspect the queued rerun or resume request before manually relaunching the whole wave
122
+ - preserve reusable proof from successful sibling owners whenever the reducer already identified it as reusable
123
+
124
+ That is the shape the launcher now prefers. It only broadens failure when the remaining blockers are still proof-critical or otherwise non-recoverable.
125
+
126
+ ## 5. Suggested Operator Policy
127
+
128
+ For most repo-owned runbooks:
129
+
130
+ - teach authors to use `budget.minutes` first
131
+ - teach operators to downgrade only non-proof follow-up
132
+ - treat `resolve-policy` as the preferred path when the answer already exists in docs or repo policy
133
+ - escalate to a full-wave rerun only after targeted recovery proves insufficient
134
+
135
+ If you want a single sentence policy:
136
+
137
+ > Keep proof and closure strict, keep generic turns advisory, and keep non-proof context visible without letting it accidentally own wave closure.
138
+
139
+
140
+ ## Laddered Gate Modes (new in 0.9.4)
141
+
142
+ Waves now have three gate strictness tiers based on wave number:
143
+
144
+ | Mode | Default waves | What's required to advance |
145
+ |------|--------------|---------------------------|
146
+ | **bootstrap** | 0-3 | Implementation agents exit 0 + deliverables exist |
147
+ | **standard** | 4-9 | + A0 verdict required, doc closure recommended |
148
+ | **strict** | 10+ | Full ceremony: all signals, all stewards, all proof |
149
+
150
+ ### Configuration
151
+
152
+ ```json
153
+ {
154
+ "validation": {
155
+ "gateModeThresholds": {
156
+ "bootstrap": 0,
157
+ "standard": 4,
158
+ "strict": 10
159
+ },
160
+ "bootstrapPassConditions": {
161
+ "requireTestsPass": true,
162
+ "requireDeliverablesExist": true,
163
+ "requireExitCodeZero": true
164
+ },
165
+ "testCommand": "pnpm test:repo"
166
+ }
167
+ }
168
+ ```
169
+
170
+ ### Steward threshold fix
171
+
172
+ `requireDocumentationStewardFromWave` and `requireIntegrationStewardFromWave`
173
+ are now strictly respected. Previously, the documentation steward was required
174
+ whenever component promotions were active, regardless of the threshold setting.
175
+
176
+ ### Migration from 0.9.3
177
+
178
+ No breaking changes. Existing repos get bootstrap mode for waves 0-3 by default.
179
+ To keep the old strict behavior for all waves, set:
180
+
181
+ ```json
182
+ {
183
+ "validation": {
184
+ "gateModeThresholds": {
185
+ "bootstrap": 0,
186
+ "standard": 0,
187
+ "strict": 0
188
+ }
189
+ }
190
+ }
191
+ ```
@@ -1,6 +1,6 @@
1
1
  # Migration
2
2
 
3
- This page is the practical repo-upgrade guide for the current `0.9.6` surface.
3
+ This page is the practical repo-upgrade guide for the current `0.9.7` surface.
4
4
 
5
5
  Use it when you are:
6
6
 
@@ -24,7 +24,7 @@ The `0.9.4` surface adds laddered gate modes and fixes the steward threshold enf
24
24
 
25
25
  ## What `0.9.4` Changes
26
26
 
27
- The current `0.9.6` surface keeps everything from `0.9.2` and adds two focused improvements with no breaking changes.
27
+ The current `0.9.7` surface keeps everything from `0.9.2` and adds two focused improvements with no breaking changes.
28
28
 
29
29
  The practical changes are:
30
30
 
@@ -182,7 +182,7 @@ Use `pnpm exec wave dashboard --lane <lane> --attach current` or `--attach globa
182
182
 
183
183
  ## `0.9.4` Release Model
184
184
 
185
- The current `0.9.6` surface combines these strands:
185
+ The current `0.9.7` surface combines these strands:
186
186
 
187
187
  - the gap-value wave-gate fix and first-time setup UX improvements released in `0.9.4`
188
188
  - the detached process-runner and sandbox supervisor hardening released in `0.9.2`
@@ -367,7 +367,7 @@ If your repo copied starter config defaults, also sync the `designRolePromptPath
367
367
  - hybrid design stewards rejoin implementation when they explicitly own code
368
368
  - long-running prompts receive signal-state and ack paths when the repo uses the new waiting model
369
369
 
370
- ## Upgrading From `0.8.3` To `0.9.6`
370
+ ## Upgrading From `0.8.3` To `0.9.7`
371
371
 
372
372
  Treat this as one move to the current `0.9.2` surface.
373
373
 
@@ -402,7 +402,7 @@ If your repo copied starter docs or skills, sync:
402
402
  - dry-run one design-steward wave if the repo wants the new authored surface
403
403
  - if the repo uses long-running watcher agents or shell automation, validate `scripts/wave-status.sh` and `scripts/wave-watch.sh` against a live or staged lane
404
404
 
405
- ## Upgrading From `0.6.x` Or `0.7.x` To `0.9.6`
405
+ ## Upgrading From `0.6.x` Or `0.7.x` To `0.9.7`
406
406
 
407
407
  This is the main migration path for older adopted repos.
408
408
 
@@ -553,4 +553,4 @@ For repos that depend on replay parity, replay at least:
553
553
 
554
554
  ## Summary
555
555
 
556
- The current `0.9.6` surface keeps the same authority-set and phase-engine architecture, ships both the design-role starter surface and the signal-driven long-running-agent starter surface, keeps the `0.8.7` policy and routing hardening, and now also packages the practical operator recommendations guide inside the release line. For most repos already on `0.8.x`, the upgrade is package bump plus validation. For older adopted repos, the real work is syncing repo-owned prompts, skills, planner corpus, wrapper scripts, and runbooks so they describe the runtime the package now ships.
556
+ The current `0.9.7` surface keeps the same authority-set and phase-engine architecture, ships both the design-role starter surface and the signal-driven long-running-agent starter surface, keeps the `0.8.7` policy and routing hardening, and now also packages the practical operator recommendations guide inside the release line. For most repos already on `0.8.x`, the upgrade is package bump plus validation. For older adopted repos, the real work is syncing repo-owned prompts, skills, planner corpus, wrapper scripts, and runbooks so they describe the runtime the package now ships.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chllming/wave-orchestration",
3
- "version": "0.9.6",
3
+ "version": "0.9.7",
4
4
  "license": "MIT",
5
5
  "description": "Generic wave-based multi-agent orchestration for repository work.",
6
6
  "repository": {
@@ -2,6 +2,18 @@
2
2
  "schemaVersion": 1,
3
3
  "packageName": "@chllming/wave-orchestration",
4
4
  "releases": [
5
+ {
6
+ "version": "0.9.7",
7
+ "date": "2026-04-06",
8
+ "summary": "Closure engine skips missing-run checks in bootstrap gate mode; gateModeThresholds now flows through lanePaths.",
9
+ "features": [
10
+ "Closure sweep skips missing-closure-run failures when the resolved gate mode is `bootstrap`, allowing waves to pass when agents complete but tmux status reconciliation fails.",
11
+ "The `gateModeThresholds` validation config is now exposed on the `lanePaths` object so downstream consumers (closure engine, derived state) can resolve the active gate mode.",
12
+ "planner-agentic bundle placeholder remains available for adopted repos."
13
+ ],
14
+ "manualSteps": [],
15
+ "breaking": false
16
+ },
5
17
  {
6
18
  "version": "0.9.6",
7
19
  "date": "2026-04-05",
@@ -14,6 +14,7 @@ import {
14
14
  readWaveDocumentationGate as readWaveDocumentationGateDefault,
15
15
  readWaveIntegrationBarrier as readWaveIntegrationBarrierDefault,
16
16
  readWaveSecurityGate as readWaveSecurityGateDefault,
17
+ resolveGateMode,
17
18
  } from "./gate-engine.mjs";
18
19
  import { applyLaunchResultToRun } from "./launcher-runtime.mjs";
19
20
  import { REPO_ROOT, toIsoTimestamp } from "./shared.mjs";
@@ -192,8 +193,13 @@ export async function runClosureSweepPhase({
192
193
  const forwardedFailures = [];
193
194
  const { contQaAgentId, contEvalAgentId, integrationAgentId, documentationAgentId } =
194
195
  resolveWaveRoleBindings(wave, lanePaths);
196
+ const _gateThresholds = lanePaths?.gateModeThresholds || lanePaths?.validation?.gateModeThresholds || options?.gateModeThresholds || null;
197
+ const _resolvedGateMode = resolveGateMode(wave.wave, _gateThresholds);
195
198
  for (const [stageIndex, stage] of stagedRuns.entries()) {
196
199
  if (stage.runs.length === 0) {
200
+ if (_resolvedGateMode === "bootstrap") {
201
+ continue;
202
+ }
197
203
  if (stageRequiresRun(stage, wave, lanePaths)) {
198
204
  const gate = missingClosureRunGate(stage);
199
205
  recordClosureGateFailure({
@@ -69,7 +69,7 @@ export const STARTER_TEMPLATE_PATHS = [
69
69
  "docs/guides/author-and-run-waves.md",
70
70
  "docs/guides/monorepo-projects.md",
71
71
  "docs/guides/planner.md",
72
- "docs/guides/recommendations-0.9.6.md",
72
+ "docs/guides/recommendations-0.9.7.md",
73
73
  "docs/guides/sandboxed-environments.md",
74
74
  "docs/guides/signal-wrappers.md",
75
75
  "docs/guides/terminal-surfaces.md",
@@ -276,6 +276,7 @@ export function buildLanePaths(laneInput = DEFAULT_WAVE_LANE, options = {}) {
276
276
  requireComponentPromotionsFromWave:
277
277
  laneProfile.validation.requireComponentPromotionsFromWave,
278
278
  requireAgentComponentsFromWave: laneProfile.validation.requireAgentComponentsFromWave,
279
+ gateModeThresholds: laneProfile.validation.gateModeThresholds,
279
280
  executors: laneProfile.executors,
280
281
  skills: laneProfile.skills,
281
282
  capabilityRouting: laneProfile.capabilityRouting,