@chllming/wave-orchestration 0.8.3 → 0.8.4

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.
Files changed (39) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/README.md +47 -11
  3. package/docs/README.md +6 -2
  4. package/docs/concepts/what-is-a-wave.md +1 -1
  5. package/docs/plans/architecture-hardening-migration.md +8 -1
  6. package/docs/plans/current-state.md +15 -7
  7. package/docs/plans/end-state-architecture.md +82 -69
  8. package/docs/plans/examples/wave-example-live-proof.md +1 -1
  9. package/docs/plans/migration.md +235 -62
  10. package/docs/plans/wave-orchestrator.md +37 -11
  11. package/docs/reference/cli-reference.md +34 -14
  12. package/docs/reference/coordination-and-closure.md +19 -6
  13. package/docs/reference/npmjs-trusted-publishing.md +5 -4
  14. package/docs/reference/sample-waves.md +4 -4
  15. package/package.json +1 -1
  16. package/releases/manifest.json +20 -0
  17. package/scripts/wave-orchestrator/agent-state.mjs +0 -491
  18. package/scripts/wave-orchestrator/autonomous.mjs +10 -6
  19. package/scripts/wave-orchestrator/{launcher-closure.mjs → closure-engine.mjs} +190 -74
  20. package/scripts/wave-orchestrator/{launcher-derived-state.mjs → derived-state-engine.mjs} +34 -146
  21. package/scripts/wave-orchestrator/{launcher-gates.mjs → gate-engine.mjs} +395 -139
  22. package/scripts/wave-orchestrator/human-input-resolution.mjs +14 -10
  23. package/scripts/wave-orchestrator/human-input-workflow.mjs +104 -0
  24. package/scripts/wave-orchestrator/implementation-engine.mjs +120 -0
  25. package/scripts/wave-orchestrator/launcher-runtime.mjs +5 -6
  26. package/scripts/wave-orchestrator/launcher.mjs +271 -724
  27. package/scripts/wave-orchestrator/projection-writer.mjs +256 -0
  28. package/scripts/wave-orchestrator/reconcile-format.mjs +32 -0
  29. package/scripts/wave-orchestrator/reducer-snapshot.mjs +297 -0
  30. package/scripts/wave-orchestrator/replay.mjs +3 -1
  31. package/scripts/wave-orchestrator/result-envelope.mjs +589 -0
  32. package/scripts/wave-orchestrator/retry-control.mjs +5 -0
  33. package/scripts/wave-orchestrator/{launcher-retry.mjs → retry-engine.mjs} +267 -18
  34. package/scripts/wave-orchestrator/role-helpers.mjs +51 -0
  35. package/scripts/wave-orchestrator/{launcher-supervisor.mjs → session-supervisor.mjs} +178 -103
  36. package/scripts/wave-orchestrator/shared.mjs +1 -0
  37. package/scripts/wave-orchestrator/traces.mjs +10 -1
  38. package/scripts/wave-orchestrator/wave-files.mjs +11 -9
  39. package/scripts/wave-orchestrator/wave-state-reducer.mjs +52 -5
@@ -1,102 +1,275 @@
1
1
  # Migration
2
2
 
3
- For the staged internal cutover from the legacy launcher-centric runtime to the authority-set / reducer / phase-engine architecture, see [architecture-hardening-migration.md](./architecture-hardening-migration.md). This page stays focused on package adoption and upgrade steps for repo operators.
3
+ This page is the operator-facing upgrade guide for adopting repos. It explains how to move from older Wave package versions onto the current `0.8.4` surface without guessing which files are package-owned, which files are repo-owned, and which validations to trust after the bump.
4
+
5
+ For the completed internal architecture cutover record, see [architecture-hardening-migration.md](./architecture-hardening-migration.md). That document is historical. This one is the practical repo-upgrade checklist.
6
+
7
+ ## What `0.8.4` Changes
8
+
9
+ `0.8.4` is a hardening release, not a new authoring model.
10
+
11
+ - contradiction replay no longer depends on component-matrix parsing when the trace does not declare promoted components
12
+ - `requireComponentPromotionsFromWave` now disables both component-promotion proof blocking and component-matrix current-level blocking before the configured threshold
13
+ - `projection-writer.mjs` is now the single persistence layer for projection outputs, while `derived-state-engine.mjs` computes those payloads without persisting them directly
14
+ - starter docs, release notes, README, and publishing guidance now describe the shipped runtime instead of transitional architecture claims
15
+
16
+ There are no new CLI flags or wave-file section requirements in `0.8.4`.
17
+
18
+ ## Upgrade Contract
19
+
20
+ - `pnpm up @chllming/wave-orchestration` updates the runtime in `node_modules`.
21
+ - `pnpm exec wave upgrade` writes `.wave/install-state.json` and `.wave/upgrade-history/*` only.
22
+ - `wave upgrade` does not rewrite repo-owned `wave.config.json`, `docs/agents/*`, `docs/plans/waves/*`, `skills/*`, `docs/context7/*`, or repo-specific reference docs.
23
+ - `.tmp/<lane>-wave-launcher/` is runtime state, not migration source of truth. Do not treat old generated artifacts as the thing to preserve.
4
24
 
5
25
  ## Default Adoption Path
6
26
 
27
+ Use this when the repo is not already running Wave or you are replacing a very old local starter copy.
28
+
7
29
  1. Install the package from npmjs with `pnpm add -D @chllming/wave-orchestration`.
8
30
  2. For a fresh repo, run `pnpm exec wave init`.
9
- 3. For a repo that already has Wave config, docs, or waves you want to preserve, run `pnpm exec wave init --adopt-existing`.
10
- 4. Edit `wave.config.json` for the repo's docs, roles, validation rules, executor defaults, skill attachment policy, and component-cutover matrix paths.
11
- 5. Replace the starter plan docs, sample waves, starter `skills/` bundles, and component cutover matrix with repository-specific ones.
12
- 6. Configure Context7 bundles for the external libraries that repo actually uses.
13
- 7. Run `pnpm exec wave doctor` and `pnpm exec wave launch --lane main --dry-run --no-dashboard` until validation passes.
14
- 8. Inspect seeded coordination and inbox artifacts with `pnpm exec wave coord show --lane main --wave 0 --dry-run --json` and `pnpm exec wave coord inbox --lane main --wave 0 --agent A1 --dry-run`.
15
- 9. Upgrade later with `pnpm up @chllming/wave-orchestration` and `pnpm exec wave upgrade`.
31
+ 3. For a repo that already owns Wave config, docs, or waves, run `pnpm exec wave init --adopt-existing`.
32
+ 4. Review `wave.config.json` for docs roots, roles, validation thresholds, executor defaults, skill attachments, Context7 bundles, and component-cutover matrix paths.
33
+ 5. Replace starter sample plans, starter skills, and starter prompts with repo-owned versions where needed.
34
+ 6. Run the validation checklist in this doc before the first live launcher run.
16
35
 
17
- GitHub Packages remains available as an authenticated fallback path, and maintainer npm publishing setup is documented in [npmjs-trusted-publishing.md](../reference/npmjs-trusted-publishing.md).
36
+ GitHub Packages remains an authenticated fallback install path, but npmjs is the default public distribution channel.
18
37
 
19
- ## Upgrade Contract
38
+ ## Safe Upgrade Flow For Any Existing Repo
39
+
40
+ Use this flow before the version-specific sections below.
20
41
 
21
- - Package upgrades change the runtime behavior in `node_modules`; they do not copy a new starter scaffold into the repo.
22
- - `wave upgrade` writes `.wave/install-state.json` and `.wave/upgrade-history/*` only.
23
- - Existing `wave.config.json`, role prompts, plan docs, `skills/` bundles, Context7 bundles, and wave files are never overwritten by the upgrade flow.
24
- - Fresh `wave init` seeds the starter `skills/` library. `wave init --adopt-existing` records existing repo-owned skill bundles when they are already present, but does not replace or rewrite them.
25
- - The current runtime expects the post-roadmap model: typed coordination, compiled inboxes, `A8` integration, staged closure, orchestrator-first clarification, and operational runtime policy.
42
+ ### 1. Upgrade When The Lane Is Idle
26
43
 
27
- ## Upgrading From 0.6.x To 0.8.3
44
+ - Prefer upgrading between waves, not mid-attempt.
45
+ - If a lane still has running sessions, finish or intentionally stop that attempt before changing package versions.
46
+ - If a repo is stranded after a prior crash, inspect `wave control status` first, then decide whether to relaunch or reconcile on the upgraded package.
28
47
 
29
- Read `CHANGELOG.md` first, then treat this section as the repo-owned migration checklist for adopted `0.6.x` workspaces.
48
+ ### 2. Bump The Package
30
49
 
31
- `wave upgrade` updates the installed runtime only. It does not copy planner starter files into a repo that already owns its docs, skills, and Context7 bundles.
50
+ ```bash
51
+ pnpm up @chllming/wave-orchestration
52
+ pnpm exec wave upgrade
53
+ ```
32
54
 
33
- `0.8.3` carries forward the `0.8.2` completed-wave control-status hardening and fixes the human-answer reconciliation path: answered feedback now closes the linked clarification or escalation chain in canonical coordination, re-syncs helper-assignment projections, and preserves ad-hoc `--run <id>` context when writing safe continuation intent.
55
+ ### 3. Sync Repo-Owned Starter Surface Only If You Copied It
34
56
 
35
- ### Required Repo Changes
57
+ If your repo copied package-owned starter docs, prompts, or skills instead of treating them as read-only package material, sync the copied files that you still want to match upstream.
36
58
 
37
- If the repo adopted Wave before the planner corpus became a tracked required surface, sync:
59
+ The common sync set is:
38
60
 
61
+ - `docs/agents/wave-launcher-role.md`
62
+ - `docs/agents/wave-orchestrator-role.md`
39
63
  - `docs/agents/wave-planner-role.md`
64
+ - `skills/wave-core/`
40
65
  - `skills/role-planner/`
66
+ - runtime and closure-role starter skills under `skills/`
41
67
  - `docs/context7/planner-agent/`
42
68
  - `docs/reference/wave-planning-lessons.md`
43
- - the `planner-agentic` bundle entry in `docs/context7/bundles.json`
69
+ - `docs/plans/current-state.md`
70
+ - `docs/plans/end-state-architecture.md`
71
+ - `docs/plans/wave-orchestrator.md`
72
+ - `docs/plans/migration.md`
44
73
 
45
- If the repo copied the shipped starter architecture docs or skills and wants the `0.8.3` authority-model language, also sync:
74
+ If your repo never copied those starter files, do not invent migration work. The installed package already carries the new runtime behavior.
46
75
 
47
- - `docs/agents/wave-launcher-role.md`
48
- - `docs/agents/wave-orchestrator-role.md`
49
- - `skills/wave-core/`
50
- - the relevant runtime and closure-role starter skills under `skills/`
51
- - `docs/plans/architecture-hardening-migration.md`
76
+ ### 4. Re-validate Before A Live Run
52
77
 
53
- ### Recommended Upgrade Validation
78
+ Run these from the repo root:
54
79
 
55
- After syncing those repo-owned files:
80
+ ```bash
81
+ pnpm exec wave doctor
82
+ pnpm exec wave launch --lane main --dry-run --no-dashboard
83
+ pnpm exec wave control status --lane main --wave 0 --json
84
+ pnpm exec wave coord inbox --lane main --wave 0 --agent A1 --dry-run
85
+ ```
56
86
 
57
- 1. Run `pnpm exec wave doctor`.
58
- 2. Run `pnpm exec wave launch --lane main --dry-run --no-dashboard`.
59
- 3. Use `pnpm exec wave dashboard --lane <lane> --attach current` or `--attach global` when you need to reattach to a live tmux-backed dashboard without reverse-engineering the socket or session name.
60
- 4. If your operators answer human-input tickets through `wave feedback respond`, update any repo-local runbooks so ad-hoc runs always pass `--run <id>` when responding outside the main roadmap lane.
87
+ Use `pnpm exec wave dashboard --lane <lane> --attach current` or `--attach global` when you need to reattach to an existing tmux-backed dashboard after the upgrade.
61
88
 
62
- ## Upgrading From 0.5.4 To 0.6.1
89
+ ## Version-Specific Upgrade Guidance
63
90
 
64
- Read `CHANGELOG.md` first, then treat the rest of this page as the manual repo-owned migration checklist for the `0.6.1` release. `wave upgrade` will update package-owned runtime code only; it will not rewrite the docs, prompts, config, or wave files that your repo already owns.
91
+ ## Upgrading From `0.8.3` To `0.8.4`
65
92
 
66
- ### Required Repo Changes
93
+ This is the smallest migration.
67
94
 
68
- 1. Rename legacy `evaluator` config and prompt terminology to `cont-QA`.
69
- 2. Keep `A0` as the final closure owner that emits both the final verdict and `[wave-gate]`.
70
- 3. Add `E0` only when the wave needs benchmark-driven tuning or service-output evaluation.
71
- 4. Add wave-level `## Eval targets` whenever `cont-EVAL` is present.
72
- 5. Update any starter docs or examples that still describe the pre-`0.6.1` evaluator model.
95
+ ### What changed
73
96
 
74
- In practice that means checking:
97
+ - contradiction replay for non-promoted traces is now independent of component-matrix parsing
98
+ - component-promotion threshold handling is now consistent between proof validation and matrix-current-level validation
99
+ - projection output writes are centralized in `projection-writer.mjs`
100
+
101
+ ### Required repo changes
102
+
103
+ None for wave shape, config keys, or CLI usage.
104
+
105
+ ### Recommended checks
106
+
107
+ 1. Re-run `pnpm exec wave doctor`.
108
+ 2. Re-run `pnpm exec wave launch --lane main --dry-run --no-dashboard`.
109
+ 3. If your repo copied starter architecture docs or starter skills, sync them so local runbooks stop describing the older split projection behavior.
110
+ 4. If you keep historical trace fixtures, replay at least one contradiction-blocked trace and one promoted-component trace after the upgrade.
111
+
112
+ ## Upgrading From `0.8.0`-`0.8.2` To `0.8.4`
113
+
114
+ Treat this as one upgrade to the current surface.
115
+
116
+ ### What changed across that range
117
+
118
+ - completed-wave `wave control status` projection hardened in `0.8.2`
119
+ - human-input reconciliation and ad-hoc `--run <id>` context hardening landed in `0.8.3`
120
+ - contradiction replay, component-threshold consistency, and projection-writer centralization landed in `0.8.4`
121
+
122
+ ### Required repo changes
123
+
124
+ Usually none for config shape.
125
+
126
+ ### Strongly recommended sync
127
+
128
+ If your repo copied upstream starter docs or skills, sync:
129
+
130
+ - the current operator runbook and architecture docs
131
+ - the launcher and orchestrator role prompts
132
+ - the relevant runtime skills and closure-role starter skills
133
+
134
+ ### Validation focus
135
+
136
+ - check that completed waves do not show stale blockers through `wave control status`
137
+ - answer at least one human-feedback ticket in a test lane and confirm the linked clarification or escalation chain closes cleanly
138
+ - replay one contradiction-blocked trace if your repo relies on trace-based regression checks
139
+
140
+ ## Upgrading From `0.6.x` Or `0.7.x` To `0.8.4`
141
+
142
+ This is the main migration path for older adopted repos.
143
+
144
+ ### Behavioral changes you must account for
145
+
146
+ - `wave control` is the preferred operator surface for status, rerun, proof, and telemetry work
147
+ - `cont-QA` and optional `cont-EVAL` remain distinct closure roles; older overloaded evaluator language should be removed
148
+ - planner corpus files are now treated as required starter surface for repos that use planner workflows
149
+ - live closure depends on validated result envelopes plus canonical state, not only older summary-era behavior
150
+ - control-plane state, reducer state, and replay are now first-class runtime surfaces, not optional internals
151
+
152
+ ### Required repo changes
153
+
154
+ 1. Remove or rename any legacy `evaluator` role/config terminology to `cont-QA`.
155
+ 2. Keep `A0` as the final closure owner and add `E0` only when the wave needs eval-driven tuning.
156
+ 3. Add wave-level `## Eval targets` whenever `cont-EVAL` is present.
157
+ 4. Sync the planner starter corpus if the repo uses `wave project` or `wave draft`:
158
+ - `docs/agents/wave-planner-role.md`
159
+ - `skills/role-planner/`
160
+ - `docs/context7/planner-agent/`
161
+ - `docs/reference/wave-planning-lessons.md`
162
+ - the `planner-agentic` entry in `docs/context7/bundles.json`
163
+ 5. Review any repo-owned docs or internal runbooks that still describe one overloaded evaluator role, marker-era closure, or pre-control-plane retry/proof workflow.
164
+
165
+ ### Additional validation
166
+
167
+ Run the default validation set, then also check:
168
+
169
+ ```bash
170
+ pnpm exec wave control status --lane main --wave 0 --json
171
+ pnpm exec wave control rerun get --lane main --wave 0 --json
172
+ pnpm exec wave control proof get --lane main --wave 0 --json
173
+ ```
174
+
175
+ If your repo carries proof-first waves, verify that required proof artifacts are still present locally and not only in historical summaries.
176
+
177
+ ## Upgrading From `0.5.x` Or Earlier To `0.8.4`
178
+
179
+ Do not treat this as a tiny patch bump.
180
+
181
+ ### Recommended approach
182
+
183
+ 1. Read [docs/reference/migration-0.2-to-0.5.md](../reference/migration-0.2-to-0.5.md) first if the repo still looks pre-`0.5`.
184
+ 2. Run `pnpm exec wave init --adopt-existing` on a branch so the workspace records install state without overwriting repo-owned material.
185
+ 3. Move the repo onto the `0.6.x` and later surface using the section above.
186
+ 4. Re-run the full validation checklist before any live executor run.
187
+
188
+ ### Why
189
+
190
+ Older repos often differ in:
191
+
192
+ - role naming
193
+ - closure ordering
194
+ - runtime config keys
195
+ - planner starter corpus
196
+ - proof and retry operator surfaces
197
+ - generated state layout under `.tmp/`
198
+
199
+ Trying to jump directly with ad hoc edits usually leaves hidden drift in prompts, docs, or config.
200
+
201
+ ## Repo-Owned Files To Audit During Any Upgrade
202
+
203
+ These are the highest-value files to check when a repo copied starter surface instead of reading from the package.
204
+
205
+ ### Prompts and skills
75
206
 
76
- - `wave.config.json`
77
- Remove or rename `roles.evaluator*`, `skills.byRole.evaluator`, and `runtimePolicy.defaultExecutorByRole.evaluator`.
78
207
  - `docs/agents/*.md`
79
- Rename or replace any legacy evaluator prompt files so the repo clearly distinguishes `cont-QA`, `cont-EVAL`, and optional security review.
208
+ - `skills/*`
209
+ - `docs/context7/bundles.json`
210
+ - `docs/context7/planner-agent/`
211
+
212
+ ### Operator docs and runbooks
213
+
214
+ - `docs/plans/current-state.md`
215
+ - `docs/plans/wave-orchestrator.md`
216
+ - `docs/plans/end-state-architecture.md`
217
+ - `docs/plans/migration.md`
218
+ - `docs/reference/cli-reference.md`
219
+ - `docs/reference/wave-control.md`
220
+ - `docs/reference/sample-waves.md`
221
+
222
+ ### Config and wave contracts
223
+
224
+ - `wave.config.json`
80
225
  - `docs/plans/waves/*.md`
81
- Update wave agent headings, role prompts, and closure expectations to use `A0` for `cont-QA`, optional `E0` for eval tuning, and optional security review before integration.
82
- - `docs/reference/` and other operator docs
83
- Refresh any examples or internal runbooks that still describe one overloaded evaluator role.
226
+ - `docs/evals/benchmark-catalog.json`
227
+ - component-cutover matrix files under `docs/plans/`
228
+
229
+ ## Validation Checklist After The Upgrade
230
+
231
+ Use this exact sequence unless your repo has a better repo-specific smoke suite.
232
+
233
+ ```bash
234
+ pnpm exec wave doctor --json
235
+ pnpm exec wave launch --lane main --dry-run --no-dashboard
236
+ pnpm exec wave control status --lane main --wave 0 --json
237
+ pnpm exec wave coord show --lane main --wave 0 --dry-run --json
238
+ pnpm exec wave coord inbox --lane main --wave 0 --agent A1 --dry-run
239
+ ```
240
+
241
+ For repos that extend or test the runtime itself, also run:
242
+
243
+ ```bash
244
+ pnpm test
245
+ ```
246
+
247
+ For repos that depend on replay parity, replay at least:
248
+
249
+ - one contradiction-blocked trace
250
+ - one promoted-component trace
251
+ - one retry-history trace
252
+
253
+ ## Troubleshooting
254
+
255
+ ### `wave doctor` fails after the upgrade
256
+
257
+ - check whether the repo is missing planner starter surface it previously copied
258
+ - check whether old `evaluator` naming is still present in config or prompts
259
+ - check whether wave files now declare closure roles or eval targets inconsistently with the current runtime
84
260
 
85
- ### Closure And Marker Changes
261
+ ### A live lane looks blocked after the bump
86
262
 
87
- Live `0.6.1` closure is stricter than `0.5.4`.
263
+ - use `wave control status --lane <lane> --wave <n> --json`
264
+ - confirm whether the blocker is canonical coordination, dependency, proof, or human-input state
265
+ - do not trust old generated markdown alone
88
266
 
89
- - `cont-EVAL` must leave a report plus a final `[wave-eval]` marker whose `target_ids` exactly matches the wave contract and whose `benchmark_ids` stays within the benchmark catalog.
90
- - Security review, when present, must leave a report plus a final `[wave-security]` marker.
91
- - `cont-QA` must leave both the final `Verdict:` line and the final `[wave-gate]` marker.
92
- - Older evaluator-era or verdict-only artifacts remain replay-readable, but they do not satisfy live completion anymore.
267
+ ### Replay differs from old expectations
93
268
 
94
- ### Recommended Upgrade Validation
269
+ - verify whether the trace declares promoted components
270
+ - verify whether the repo relied on pre-`0.8.4` component-threshold behavior
271
+ - compare `storedOutcome.gateSnapshot` against recomputed replay output before changing live policy
95
272
 
96
- After updating repo-owned files:
273
+ ## Summary
97
274
 
98
- 1. Run `pnpm exec wave doctor`.
99
- 2. Run `pnpm exec wave launch --lane main --dry-run --no-dashboard`.
100
- 3. Use `pnpm exec wave coord show --lane main --wave 0 --dry-run --json` as a read-only inspection path for the coordination state.
101
- 4. Use `pnpm exec wave coord inbox --lane main --wave 0 --agent A1 --dry-run` when you want the launcher to materialize shared-summary and inbox artifacts for review.
102
- 5. If the repo adopts `cont-EVAL`, verify that every live eval wave declares `## Eval targets` and that the benchmark ids exist in `docs/evals/benchmark-catalog.json`.
275
+ `0.8.4` does not introduce a new authoring model. It hardens replay, makes component-promotion thresholds behave consistently, and finishes the projection-writer ownership boundary. 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, and runbooks so they describe the runtime the package now ships.
@@ -12,10 +12,33 @@ This runbook is the operational view of the architecture:
12
12
  - executor adapters preserve Claude, Codex, and OpenCode-specific runtime features at the edge
13
13
  - closure makes completion depend on integrated proof and shared state, not on free-form agent narration
14
14
 
15
+ ## Runtime Module Map
16
+
17
+ The live runtime is organized around explicit modules:
18
+
19
+ - `launcher.mjs`
20
+ Thin orchestrator for CLI parsing, launcher lock handling, wave iteration, and engine sequencing.
21
+ - `implementation-engine.mjs`
22
+ Chooses initial or retry implementation fan-out.
23
+ - `derived-state-engine.mjs`
24
+ Computes shared summary, inbox, assignment, dependency, ledger, docs queue, and integration or security projection payloads from canonical state.
25
+ - `gate-engine.mjs`
26
+ Evaluates live gates from validated result envelopes plus canonical state.
27
+ - `retry-engine.mjs`
28
+ Produces reducer-driven retry and resume plans.
29
+ - `closure-engine.mjs`
30
+ Runs staged closure sequencing across `cont-EVAL`, security, integration, documentation, and `cont-QA` using the wave's effective role bindings.
31
+ - `wave-state-reducer.mjs`
32
+ Reconstructs deterministic wave state for live queries and replay.
33
+ - `session-supervisor.mjs`
34
+ Launches and monitors sessions and writes observed `wave_run`, `attempt`, and `agent_run` lifecycle facts.
35
+ - `projection-writer.mjs`
36
+ Persists projection outputs such as dashboards, traces, board projections, compiled summaries and inboxes, assignment and dependency snapshots, docs queues, ledgers, and integration or security summaries. Clarification-triage workflow artifacts stay workflow-owned.
37
+
15
38
  ## What It Does
16
39
 
17
40
  - parses wave plans from `docs/plans/waves/`
18
- - supports transient ad-hoc runs from `.wave/adhoc/runs/` on the same launcher substrate
41
+ - supports transient ad-hoc runs from `.wave/adhoc/runs/` on the same runtime substrate
19
42
  - fans a wave out into one session per `## Agent ...` section
20
43
  - supports standing role imports from `docs/agents/*.md`
21
44
  - seeds a coordination log, generated board, compiled shared summary, and per-agent inboxes
@@ -24,11 +47,12 @@ This runbook is the operational view of the architecture:
24
47
  - validates Context7 declarations and exit contracts from configurable wave thresholds
25
48
  - validates component promotions and component-owned proof from configurable wave thresholds
26
49
  - writes prompts, logs, dashboards, coordination state, and status summaries under `.tmp/`
27
- - supports launcher-side Context7 prefetch and injection for headless runs
50
+ - supports runtime-side Context7 prefetch and injection for headless runs
28
51
  - supports headless execution through `codex`, `claude`, `opencode`, and the local smoke executor
29
52
  - can retry rate-limited `codex`, `claude`, and `opencode` launches with per-agent exponential backoff via `--agent-rate-limit-*`
30
53
  - supports a file-backed human feedback queue
31
- - performs a closure sweep so optional `cont-EVAL`, optional security review, integration, documentation, and cont-QA gates reflect final landed state
54
+ - performs a closure sweep so optional `cont-EVAL`, optional security review, integration, documentation, and cont-QA gates reflect final landed state through the wave's effective closure-role bindings
55
+ - rebuilds contradiction blockers from canonical control-plane events during replay and materializes human-blocked waves as `clarifying` plus blocked `waveState`
32
56
 
33
57
  ## Main Commands
34
58
 
@@ -147,14 +171,14 @@ Compatibility note:
147
171
 
148
172
  The canonical conversational state is the JSONL log under `.tmp/<lane>-wave-launcher/coordination/`. The markdown board is a generated projection for humans, not a decision input.
149
173
 
150
- Control-plane facts that drive reruns, proof, attempt state, contradictions, facts, and operator tasks are appended separately under `.tmp/<lane>-wave-launcher/control-plane/`. Result envelopes live under `.tmp/<lane>-wave-launcher/results/`. Legacy proof and retry files remain derived projections for compatibility, not decision inputs.
174
+ Control-plane facts that drive reruns, proof, attempt state, contradictions, facts, human-input workflow, and operator tasks are appended separately under `.tmp/<lane>-wave-launcher/control-plane/`. Result envelopes live under `.tmp/<lane>-wave-launcher/results/wave-<n>/attempt-<a>/<agent>.json`. Legacy proof and retry files remain derived projections for compatibility, not decision inputs.
151
175
 
152
176
  Capability-targeted requests now become deterministic helper assignments. The runtime resolves the assignee from explicit targets, `capabilityRouting.preferredAgents`, then least-busy matching capability owners, writes that assignment into `.tmp/<lane>-wave-launcher/assignments/`, mirrors the decision into coordination state, and keeps the wave blocked until the linked follow-up resolves.
153
177
 
154
178
  Clarification flow is orchestrator-first:
155
179
 
156
180
  1. Agent emits `clarification-request` through `wave coord post`.
157
- 2. The launcher triages it from repo policy, ownership, prior decisions, or targeted rerouting.
181
+ 2. The orchestrator triages it from repo policy, ownership, prior decisions, or targeted rerouting.
158
182
  3. Only unresolved items become human feedback tickets.
159
183
  4. Routed clarification follow-up requests remain blocking until they resolve.
160
184
  5. Human escalations are written back into coordination state, the ledger, and trace artifacts.
@@ -168,7 +192,8 @@ Retry intent, operator tasks, attempt lifecycle, and proof injection are now fir
168
192
  - canonical control events live under `.tmp/<lane>-wave-launcher/control-plane/`
169
193
  - projected retry overrides still live under `.tmp/<lane>-wave-launcher/control/`
170
194
  - projected proof registries still live under `.tmp/<lane>-wave-launcher/proof/`
171
- - live traces now copy the control-plane log alongside the proof registry so replay keeps the same operator-visible facts
195
+ - live traces now copy the control-plane log alongside the proof registry so replay keeps the same operator-visible facts and contradiction blockers
196
+ - `session-supervisor.mjs` writes observed `wave_run.started|completed|failed`, `attempt.running|completed|failed`, and `agent_run.started|completed|failed|timed_out` events into that control-plane log
172
197
 
173
198
  For a full end-to-end explainer of helper assignments, deliverables, integration, and why an agent can be locally done while the wave stays blocked, see [docs/reference/coordination-and-closure.md](../reference/coordination-and-closure.md).
174
199
 
@@ -208,7 +233,7 @@ pnpm exec wave changelog --since-installed
208
233
 
209
234
  3. Review `.wave/upgrade-history/` for any manual follow-up. The upgrade flow does not overwrite repo-owned plans, waves, or config.
210
235
 
211
- ## What The Launcher Writes
236
+ ## What The Runtime Writes
212
237
 
213
238
  - prompts: `.tmp/<lane>-wave-launcher/prompts/`
214
239
  - logs: `.tmp/<lane>-wave-launcher/logs/`
@@ -235,7 +260,7 @@ pnpm exec wave changelog --since-installed
235
260
  - proof registries: `.tmp/<lane>-wave-launcher/proof/`
236
261
  Projected from control-plane state for compatibility. Operator-registered authoritative proof bundles that feed integration, cont-QA, and replay.
237
262
  - retry overrides: `.tmp/<lane>-wave-launcher/control/`
238
- Projected from control-plane state for compatibility. Operator-applied targeted retry overrides, applied once per attempt and then cleared by the launcher.
263
+ Projected from control-plane state for compatibility. Operator-applied targeted retry overrides, applied once per attempt and then cleared after execution.
239
264
  - clarification triage: `.tmp/<lane>-wave-launcher/feedback/triage/`
240
265
  - dashboards: `.tmp/<lane>-wave-launcher/dashboards/`
241
266
  Dashboard JSON is a versioned contract. `global.json` and `wave-<n>.json` now carry explicit `schemaVersion` and `kind` fields.
@@ -248,7 +273,7 @@ pnpm exec wave changelog --since-installed
248
273
 
249
274
  Ad-hoc runs mirror the same state shape under `.tmp/<lane>-wave-launcher/adhoc/<run-id>/`, including dry-run previews at `.tmp/<lane>-wave-launcher/adhoc/<run-id>/dry-run/`. Their docs queue can still point at canonical shared-plan docs when the run reports a shared-plan delta.
250
275
 
251
- The launcher entrypoint in `scripts/wave-orchestrator/launcher.mjs` is being hardened toward a thin orchestrator over reducer, derived-state, retry, gate, closure, and supervision modules. The CLI and `traceVersion: 2` replay contract stay unchanged.
276
+ The launcher entrypoint in `scripts/wave-orchestrator/launcher.mjs` now acts as a thin orchestrator over reducer, derived-state, retry, gate, closure, and supervision modules. The CLI and `traceVersion: 2` replay contract stay unchanged.
252
277
 
253
278
  ## Trace Contract
254
279
 
@@ -275,9 +300,10 @@ The launcher entrypoint in `scripts/wave-orchestrator/launcher.mjs` is being har
275
300
  - `outcome.json` is the stored replay baseline. Replay compares recomputed gates and quality against it instead of trusting only inline metadata.
276
301
  - For `traceVersion: 2`, launched agents must have copied prompt/log/status/inbox/summary artifacts, and promoted-component waves must include the copied component matrix JSON.
277
302
  - `security.json` stores the derived per-wave security state that feeds integration summaries, gate snapshots, and replay.
303
+ - Non-promoted contradiction replay relies on copied control-plane facts and result artifacts; copied component matrices are only required when the trace declares promoted components.
278
304
  - `quality.json` is cumulative through the current attempt. It is intended for regression comparison, not only for one-shot pass/fail reporting.
279
305
  - `quality.json` also reports capability-assignment and dependency-resolution metrics, plus coordination response metrics (overdue acknowledgements, clarification timing, human escalation counts), in addition to the Phase 2/3 communication, fallback, and closure metrics.
280
- - Replay support is internal. The source tree contains helpers to load, validate, and replay trace bundles against the same gate logic the launcher uses, but there is no public replay CLI yet.
306
+ - Replay support is internal. The source tree contains helpers to load, validate, and replay trace bundles against the same gate logic the runtime uses, but there is no public replay CLI yet.
281
307
  - Replay is read-only and hash-validating for `traceVersion: 2` bundles. It ignores inline summary duplicates in `run-metadata.json` and returns a stored-vs-recomputed comparison report for gate and quality state. Legacy `traceVersion: 1` bundles remain best-effort and emit warnings instead of claiming full hermetic replay.
282
308
 
283
309
  ## Authoring Rules
@@ -375,7 +401,7 @@ pnpm exec wave feedback respond --id <request-id> --response "..."
375
401
 
376
402
  ## Closure Sweep
377
403
 
378
- If implementation agents ran, the launcher does not stop at `exit 0`. It checks implementation exit contracts, promoted component proof, helper assignments, required dependencies, and the integration recommendation first. When present, `cont-EVAL` must satisfy its declared eval targets before integration can close. Optional security review then runs before integration so the reviewer can publish findings and approval-sensitive actions while the wave is still active. In the default planner shape `E0` is report-only; if a wave explicitly assigns `E0` non-report files, the launcher also applies the normal implementation proof gates to that role. Security reviewers stay report-only by default. Documentation and cont-QA closure only run after integration is explicitly ready for doc closure; if `cont-EVAL`, security review, or integration reports more work, or if helper assignments or required dependency tickets remain open, the wave stops there and retries only the implicated owners plus the relevant closure steward. When multiple implementation agents share a promoted component, owners that already landed valid proof stay reusable while the launcher retries only the sibling owners that still owe closure evidence.
404
+ If implementation agents ran, the runtime does not stop at `exit 0`. It checks implementation exit contracts, promoted component proof, helper assignments, required dependencies, and the integration recommendation first. When present, `cont-EVAL` must satisfy its declared eval targets before integration can close. Optional security review then runs before integration so the reviewer can publish findings and approval-sensitive actions while the wave is still active. In the default planner shape `E0` is report-only; if a wave explicitly assigns `E0` non-report files, the runtime also applies the normal implementation proof gates to that role. Security reviewers stay report-only by default. Waves may override the default closure role ids; derived state, reducer snapshots, retry or resume planning, and closure sequencing all honor those wave-specific bindings consistently. Documentation and cont-QA closure only run after integration is explicitly ready for doc closure; if `cont-EVAL`, security review, or integration reports more work, or if helper assignments or required dependency tickets remain open, the wave stops there and retries only the implicated owners plus the relevant closure steward. When multiple implementation agents share a promoted component, owners that already landed valid proof stay reusable while the runtime retries only the sibling owners that still owe closure evidence.
379
405
 
380
406
  Live closure is fail-closed:
381
407
 
@@ -7,6 +7,19 @@ summary: "Complete syntax reference for all wave CLI commands, flags, and operat
7
7
 
8
8
  Complete syntax for every `wave` command. All commands use `pnpm exec wave` as the entry point.
9
9
 
10
+ ## Command Families
11
+
12
+ - Runtime:
13
+ `wave launch`, `wave autonomous`, and `wave local` cover dry-run validation, live execution, and executor-specific prompt transport.
14
+ - Operator control:
15
+ `wave control` is the preferred surface for live status, tasks, reruns, proof bundles, and telemetry.
16
+ - Compatibility and inspection:
17
+ `wave coord`, `wave retry`, and `wave proof` remain available where older runbooks still depend on them.
18
+ - Planning and transient work:
19
+ `wave project`, `wave draft`, and `wave adhoc` cover defaults, authored waves, and operator-driven one-off runs.
20
+ - Setup and lifecycle:
21
+ `wave init`, `wave doctor`, `wave upgrade`, and `wave self-update` cover workspace adoption, validation, and package upgrades.
22
+
10
23
  ## wave launch
11
24
 
12
25
  Launch waves for execution.
@@ -15,6 +28,10 @@ Launch waves for execution.
15
28
  wave launch [options]
16
29
  ```
17
30
 
31
+ Defaults below reflect the starter workspace surface in this repo. Lane config can override executor, timeout, retry, and terminal defaults.
32
+
33
+ Closure-role bindings do not have a CLI override surface. When a wave file declares custom integration, documentation, `cont-QA`, `cont-EVAL`, or security-review role ids, launch, retry, reducer, and closure flows honor those wave-level bindings end to end.
34
+
18
35
  | Flag | Default | Description |
19
36
  |------|---------|-------------|
20
37
  | `--lane <name>` | `main` | Lane name |
@@ -22,20 +39,23 @@ wave launch [options]
22
39
  | `--end-wave <n>` | last available | Last wave to launch |
23
40
  | `--auto-next` | off | Start from next unfinished wave and continue |
24
41
  | `--resume-control-state` | off | Preserve the prior auto-generated relaunch plan instead of treating the launch as a fresh wave start |
25
- | `--executor <id>` | lane config | Default executor: `codex`, `claude`, `opencode`, `local` |
42
+ | `--executor <id>` | `codex` | Default executor: `codex`, `claude`, `opencode`, `local` |
26
43
  | `--codex-sandbox <mode>` | `danger-full-access` | Codex sandbox isolation level |
27
- | `--timeout-minutes <n>` | `60` | Max minutes to wait per wave |
28
- | `--max-retries-per-wave <n>` | `3` | Relaunch failed agents per wave |
29
- | `--agent-rate-limit-retries <n>` | `3` | Per-agent retries for 429 errors |
30
- | `--agent-rate-limit-base-delay-seconds <n>` | `1` | Base exponential backoff for 429 |
31
- | `--agent-rate-limit-max-delay-seconds <n>` | `60` | Max backoff delay for 429 |
32
- | `--agent-launch-stagger-ms <n>` | `250` | Delay between agent launches |
33
- | `--terminal-surface <mode>` | configured | `tmux`, `vscode`, or `none` |
44
+ | `--timeout-minutes <n>` | `240` | Max minutes to wait per wave |
45
+ | `--max-retries-per-wave <n>` | `1` | Relaunch failed agents per wave |
46
+ | `--agent-rate-limit-retries <n>` | `2` | Per-agent retries for 429 errors |
47
+ | `--agent-rate-limit-base-delay-seconds <n>` | `20` | Base exponential backoff for 429 |
48
+ | `--agent-rate-limit-max-delay-seconds <n>` | `180` | Max backoff delay for 429 |
49
+ | `--agent-launch-stagger-ms <n>` | `1200` | Delay between agent launches |
50
+ | `--terminal-surface <mode>` | `vscode` | `tmux`, `vscode`, or `none` |
34
51
  | `--no-dashboard` | off | Disable per-wave tmux dashboard |
35
52
  | `--cleanup-sessions` | on | Kill lane tmux sessions after each wave |
36
53
  | `--keep-sessions` | off | Keep lane tmux sessions |
37
54
  | `--keep-terminals` | off | Keep temporary terminal entries |
38
55
  | `--orchestrator-id <id>` | generated | Stable orchestrator identity |
56
+ | `--orchestrator-board <path>` | default board path | Write coordination-board updates to a specific shared board |
57
+ | `--no-orchestrator-board` | off | Disable shared orchestrator-board writes for this run |
58
+ | `--coordination-note <text>` | empty | Append a startup intent note to orchestrator-board updates |
39
59
  | `--resident-orchestrator` | off | Launch long-running non-owning orchestrator session |
40
60
  | `--no-telemetry` | off | Disable Wave Control event publication |
41
61
  | `--no-context7` | off | Disable Context7 prefetch |
@@ -57,13 +77,13 @@ wave autonomous [options]
57
77
  | `--lane <name>` | `main` | Lane name |
58
78
  | `--executor <id>` | lane config | `codex`, `claude`, or `opencode` (not `local`) |
59
79
  | `--codex-sandbox <mode>` | `danger-full-access` | Codex sandbox mode |
60
- | `--timeout-minutes <n>` | `60` | Per-wave timeout passed to launcher |
61
- | `--max-retries-per-wave <n>` | `3` | Per-wave relaunches inside launcher |
80
+ | `--timeout-minutes <n>` | `240` | Per-wave timeout passed to launcher |
81
+ | `--max-retries-per-wave <n>` | `1` | Per-wave relaunches inside launcher |
62
82
  | `--max-attempts-per-wave <n>` | `1` | External attempts per wave |
63
- | `--agent-rate-limit-retries <n>` | `3` | Per-agent 429 retries |
64
- | `--agent-rate-limit-base-delay-seconds <n>` | `1` | Base 429 backoff |
65
- | `--agent-rate-limit-max-delay-seconds <n>` | `60` | Max 429 backoff |
66
- | `--agent-launch-stagger-ms <n>` | `250` | Delay between agent launches |
83
+ | `--agent-rate-limit-retries <n>` | `2` | Per-agent 429 retries |
84
+ | `--agent-rate-limit-base-delay-seconds <n>` | `20` | Base 429 backoff |
85
+ | `--agent-rate-limit-max-delay-seconds <n>` | `180` | Max 429 backoff |
86
+ | `--agent-launch-stagger-ms <n>` | `1200` | Delay between agent launches |
67
87
  | `--orchestrator-id <id>` | `<lane>-autonomous` | Orchestrator identity |
68
88
  | `--resident-orchestrator` | off | Launch resident orchestrator for each wave |
69
89
  | `--dashboard` | off | Enable dashboards |
@@ -25,6 +25,17 @@ Those are related, but they are not the same.
25
25
 
26
26
  An implementation agent can be locally complete and still leave the wave blocked if it created open helper work, unresolved clarification chains, or required dependencies.
27
27
 
28
+ At runtime, those distinctions map onto separate modules:
29
+
30
+ - `implementation-engine.mjs` selects implementation work
31
+ - `derived-state-engine.mjs` rebuilds the blackboard projections
32
+ - `gate-engine.mjs` evaluates closure and barrier state from envelopes plus canonical logs
33
+ - `retry-engine.mjs` decides what can safely resume
34
+ - `closure-engine.mjs` sequences the staged closeout
35
+ - `session-supervisor.mjs` only launches sessions and records observed facts
36
+
37
+ Closure roles are resolved from the wave definition first, then from starter defaults. In other words, integration, documentation, `cont-QA`, `cont-EVAL`, and security review keep the same semantics even when a wave overrides the default role ids such as `A8`, `A9`, `A0`, `E0`, or `A7`.
38
+
28
39
  ## Durable State Surfaces
29
40
 
30
41
  The runtime writes several different artifacts, but they do different jobs:
@@ -52,6 +63,8 @@ The runtime writes several different artifacts, but they do different jobs:
52
63
 
53
64
  The important rule is that decisions come from the canonical authority set: wave definitions, the coordination log, the control-plane log, and immutable result envelopes. The markdown board is a projection for humans. See [wave-orchestrator.md](../plans/wave-orchestrator.md).
54
65
 
66
+ That control-plane log also carries observed `wave_run`, `attempt`, and `agent_run` lifecycle facts from `session-supervisor.mjs`. When human feedback or escalation remains open, the reducer materializes the wave as `clarifying` with blocked `waveState` instead of flattening it into generic progress.
67
+
55
68
  Live waves now keep refreshing that derived state while agents are still running. Shared summaries, inboxes, dashboard coordination metrics, and clarification routing are not only recomputed at attempt boundaries; they are also refreshed during active wave execution so stale clarification and acknowledgement timing is machine-visible before the attempt ends.
56
69
 
57
70
  ## What Agents Should Use
@@ -61,7 +74,7 @@ Use the coordination log for conversational or workflow state:
61
74
  - `request`
62
75
  Use this when you need another agent or capability owner to do work. Target it explicitly. This is the kind that becomes a helper assignment.
63
76
  - `blocker`
64
- Use this when the wave is blocked, but not because the launcher needs to route work to a specific assignee.
77
+ Use this when the wave is blocked, but not because the runtime needs to route work to a specific assignee.
65
78
  - `handoff`
66
79
  Use this for continuity and context transfer. This is informative by itself; it is not the same as a blocking helper assignment.
67
80
  - `evidence`
@@ -164,7 +177,7 @@ pnpm exec wave control task create \
164
177
  What happens next:
165
178
 
166
179
  - the request lands in the canonical coordination log
167
- - the launcher derives a helper assignment for `agent:A8`
180
+ - the runtime derives a helper assignment for `agent:A8`
168
181
  - that assignment is written into the assignment snapshot
169
182
  - the shared summary and A8 inbox now show the open helper work
170
183
 
@@ -230,9 +243,9 @@ pnpm exec wave coord post \
230
243
 
231
244
  What happens next:
232
245
 
233
- 1. the launcher triages the clarification from repo policy, ownership, prior decisions, and routing context
246
+ 1. the orchestrator triages the clarification from repo policy, ownership, prior decisions, and routing context
234
247
  2. if it can answer inside the wave, it writes the resolution back into coordination state
235
- 3. if another owner can answer it, the launcher opens a targeted follow-up request and keeps the clarification chain blocking
248
+ 3. if another owner can answer it, the runtime opens a targeted follow-up request and keeps the clarification chain blocking
236
249
  4. only after policy and routed follow-up paths are exhausted does it create human feedback or escalation artifacts
237
250
  5. until that chain is resolved, clarification remains a closure barrier and any routed follow-up also remains blocking helper work
238
251
 
@@ -406,7 +419,7 @@ That gives Wave two useful properties:
406
419
 
407
420
  ## Targeted Retry Behavior
408
421
 
409
- When closure fails, the launcher does not always relaunch the entire wave.
422
+ When closure fails, the runtime does not always relaunch the entire wave.
410
423
 
411
424
  It tries to relaunch only the implicated owners:
412
425
 
@@ -425,7 +438,7 @@ pnpm exec wave control rerun get --lane main --wave 10 --json
425
438
  pnpm exec wave control rerun request --lane main --wave 10 --agent A2 --agent A7 --clear-reuse A2 --reason "Resume sibling-owned component closure"
426
439
  ```
427
440
 
428
- The canonical rerun request is written under `.tmp/<lane>-wave-launcher/control-plane/`, projected to `.tmp/<lane>-wave-launcher/control/` for compatibility, consumed by the launcher on the next retry decision, and then cleared by default after one application. This is the supported path for:
441
+ The canonical rerun request is written under `.tmp/<lane>-wave-launcher/control-plane/`, projected to `.tmp/<lane>-wave-launcher/control/` for compatibility, consumed by the retry engine on the next retry decision, and then cleared by default after one application. This is the supported path for:
429
442
 
430
443
  - rerunning only specific owners
431
444
  - preserving explicit reuse selectors such as attempt ids, proof bundle ids, derived-summary reuse, and invalidated component ids through the compatibility projection