@chllming/wave-orchestration 0.9.0 → 0.9.2

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 (68) hide show
  1. package/CHANGELOG.md +57 -0
  2. package/LICENSE.md +21 -0
  3. package/README.md +133 -20
  4. package/docs/README.md +12 -4
  5. package/docs/agents/wave-security-role.md +1 -0
  6. package/docs/architecture/README.md +1498 -0
  7. package/docs/concepts/operating-modes.md +2 -2
  8. package/docs/guides/author-and-run-waves.md +14 -4
  9. package/docs/guides/planner.md +2 -2
  10. package/docs/guides/{recommendations-0.9.0.md → recommendations-0.9.2.md} +8 -7
  11. package/docs/guides/sandboxed-environments.md +158 -0
  12. package/docs/guides/terminal-surfaces.md +14 -12
  13. package/docs/plans/current-state.md +11 -3
  14. package/docs/plans/end-state-architecture.md +3 -1
  15. package/docs/plans/examples/wave-example-design-handoff.md +1 -1
  16. package/docs/plans/examples/wave-example-live-proof.md +1 -1
  17. package/docs/plans/migration.md +70 -19
  18. package/docs/plans/sandbox-end-state-architecture.md +153 -0
  19. package/docs/reference/cli-reference.md +71 -7
  20. package/docs/reference/coordination-and-closure.md +18 -1
  21. package/docs/reference/corridor.md +225 -0
  22. package/docs/reference/github-packages-setup.md +1 -1
  23. package/docs/reference/migration-0.2-to-0.5.md +9 -7
  24. package/docs/reference/npmjs-token-publishing.md +53 -0
  25. package/docs/reference/npmjs-trusted-publishing.md +4 -50
  26. package/docs/reference/package-publishing-flow.md +272 -0
  27. package/docs/reference/runtime-config/README.md +61 -3
  28. package/docs/reference/sample-waves.md +5 -5
  29. package/docs/reference/skills.md +1 -1
  30. package/docs/reference/wave-control.md +358 -27
  31. package/docs/roadmap.md +39 -204
  32. package/package.json +1 -1
  33. package/releases/manifest.json +38 -0
  34. package/scripts/wave-cli-bootstrap.mjs +52 -1
  35. package/scripts/wave-orchestrator/agent-process-runner.mjs +344 -0
  36. package/scripts/wave-orchestrator/agent-state.mjs +0 -1
  37. package/scripts/wave-orchestrator/artifact-schemas.mjs +7 -0
  38. package/scripts/wave-orchestrator/autonomous.mjs +47 -14
  39. package/scripts/wave-orchestrator/closure-engine.mjs +138 -17
  40. package/scripts/wave-orchestrator/config.mjs +199 -3
  41. package/scripts/wave-orchestrator/context7.mjs +231 -29
  42. package/scripts/wave-orchestrator/control-cli.mjs +42 -5
  43. package/scripts/wave-orchestrator/coordination.mjs +14 -0
  44. package/scripts/wave-orchestrator/corridor.mjs +363 -0
  45. package/scripts/wave-orchestrator/dashboard-renderer.mjs +115 -43
  46. package/scripts/wave-orchestrator/derived-state-engine.mjs +44 -4
  47. package/scripts/wave-orchestrator/gate-engine.mjs +126 -38
  48. package/scripts/wave-orchestrator/install.mjs +46 -0
  49. package/scripts/wave-orchestrator/launcher-progress.mjs +91 -0
  50. package/scripts/wave-orchestrator/launcher-runtime.mjs +290 -75
  51. package/scripts/wave-orchestrator/launcher.mjs +201 -53
  52. package/scripts/wave-orchestrator/ledger.mjs +7 -2
  53. package/scripts/wave-orchestrator/planner.mjs +1 -0
  54. package/scripts/wave-orchestrator/projection-writer.mjs +36 -1
  55. package/scripts/wave-orchestrator/provider-runtime.mjs +104 -0
  56. package/scripts/wave-orchestrator/reducer-snapshot.mjs +6 -0
  57. package/scripts/wave-orchestrator/retry-control.mjs +3 -3
  58. package/scripts/wave-orchestrator/retry-engine.mjs +93 -6
  59. package/scripts/wave-orchestrator/role-helpers.mjs +30 -0
  60. package/scripts/wave-orchestrator/session-supervisor.mjs +94 -85
  61. package/scripts/wave-orchestrator/shared.mjs +1 -0
  62. package/scripts/wave-orchestrator/supervisor-cli.mjs +1306 -0
  63. package/scripts/wave-orchestrator/terminals.mjs +12 -32
  64. package/scripts/wave-orchestrator/tmux-adapter.mjs +300 -0
  65. package/scripts/wave-orchestrator/traces.mjs +25 -0
  66. package/scripts/wave-orchestrator/wave-control-client.mjs +14 -1
  67. package/scripts/wave-orchestrator/wave-files.mjs +38 -5
  68. package/scripts/wave.mjs +13 -0
@@ -0,0 +1,53 @@
1
+ # npmjs Token Publishing
2
+
3
+ This repo now includes a dedicated npmjs publish workflow at [publish-npm.yml](../../.github/workflows/publish-npm.yml).
4
+
5
+ The current `0.9.2` release procedure publishes through a repository Actions secret named `NPM_TOKEN`.
6
+
7
+ ## What This Repo Already Does
8
+
9
+ - `package.json` no longer hardcodes GitHub Packages as the publish registry.
10
+ - `publish-npm.yml` publishes tagged releases to `https://registry.npmjs.org`.
11
+ - `publish-package.yml` still publishes to GitHub Packages explicitly, so both registries can coexist.
12
+ - `publish-npm.yml` expects `NPM_TOKEN` in GitHub Actions secrets.
13
+ - The public install path is already npmjs; GitHub Packages remains the authenticated fallback path.
14
+
15
+ ## One-Time npm Setup
16
+
17
+ 1. Create an npm granular access token with:
18
+ - package or scope access for `@chllming/wave-orchestration`
19
+ - `Read and write` permission
20
+ - `Bypass 2FA` enabled
21
+ 2. In the GitHub repo `chllming/agent-wave-orchestrator`, add that token as an Actions secret named `NPM_TOKEN`.
22
+ 3. Rotate or revoke the token when no longer needed.
23
+
24
+ ## GitHub Workflow Behavior
25
+
26
+ The npmjs workflow:
27
+
28
+ - runs on GitHub-hosted runners
29
+ - requires `contents: read`
30
+ - installs dependencies with `pnpm install --frozen-lockfile`
31
+ - runs `pnpm test`
32
+ - publishes with `pnpm publish --access public --no-git-checks`
33
+ - authenticates with `NODE_AUTH_TOKEN=${{ secrets.NPM_TOKEN }}`
34
+
35
+ ## Security Follow-Up
36
+
37
+ After a successful npm publish:
38
+
39
+ 1. Keep the token scoped only to this package or scope.
40
+ 2. Rotate the token periodically.
41
+ 3. Revoke emergency or temporary tokens once they are no longer needed.
42
+
43
+ If this repo later needs private npm dependencies during CI, consider a separate read-only install token rather than reusing the publish token.
44
+
45
+ ## Release Checklist
46
+
47
+ 1. Confirm [publish-npm.yml](../../.github/workflows/publish-npm.yml) is on the default branch.
48
+ 2. Confirm `NPM_TOKEN` exists in the GitHub repo secrets.
49
+ 3. Confirm the package version has been bumped and committed.
50
+ 4. Confirm `README.md`, `CHANGELOG.md`, `releases/manifest.json`, and `docs/plans/migration.md` all describe the same release surface.
51
+ 5. Push the release commit and release tag, for example `v0.9.2`.
52
+ 6. Verify both `publish-npm.yml` and `publish-package.yml` start from the tag push.
53
+ 7. Verify the npmjs publish completes successfully for the tagged source.
@@ -1,53 +1,7 @@
1
- # npmjs Publishing
1
+ # npmjs Trusted Publishing
2
2
 
3
- This repo now includes a dedicated npmjs publish workflow at [publish-npm.yml](../../.github/workflows/publish-npm.yml).
3
+ This repo does not currently use npm trusted publishing or OIDC-based publish credentials.
4
4
 
5
- The current `0.9.0` release procedure publishes through a repository Actions secret named `NPM_TOKEN`.
5
+ The live npmjs workflow is token-based and documented in [npmjs-token-publishing.md](./npmjs-token-publishing.md).
6
6
 
7
- ## What This Repo Already Does
8
-
9
- - `package.json` no longer hardcodes GitHub Packages as the publish registry.
10
- - `publish-npm.yml` publishes tagged releases to `https://registry.npmjs.org`.
11
- - `publish-package.yml` still publishes to GitHub Packages explicitly, so both registries can coexist.
12
- - `publish-npm.yml` expects `NPM_TOKEN` in GitHub Actions secrets.
13
- - The public install path is already npmjs; GitHub Packages remains the authenticated fallback path.
14
-
15
- ## One-Time npm Setup
16
-
17
- 1. Create an npm granular access token with:
18
- - package or scope access for `@chllming/wave-orchestration`
19
- - `Read and write` permission
20
- - `Bypass 2FA` enabled
21
- 2. In the GitHub repo `chllming/agent-wave-orchestrator`, add that token as an Actions secret named `NPM_TOKEN`.
22
- 3. Rotate or revoke the token when no longer needed.
23
-
24
- ## GitHub Workflow Behavior
25
-
26
- The npmjs workflow:
27
-
28
- - runs on GitHub-hosted runners
29
- - requires `contents: read`
30
- - installs dependencies with `pnpm install --frozen-lockfile`
31
- - runs `pnpm test`
32
- - publishes with `pnpm publish --access public --no-git-checks`
33
- - authenticates with `NODE_AUTH_TOKEN=${{ secrets.NPM_TOKEN }}`
34
-
35
- ## Security Follow-Up
36
-
37
- After a successful npm publish:
38
-
39
- 1. Keep the token scoped only to this package or scope.
40
- 2. Rotate the token periodically.
41
- 3. Revoke emergency or temporary tokens once they are no longer needed.
42
-
43
- If this repo later needs private npm dependencies during CI, consider a separate read-only install token rather than reusing the publish token.
44
-
45
- ## Release Checklist
46
-
47
- 1. Confirm [publish-npm.yml](../../.github/workflows/publish-npm.yml) is on the default branch.
48
- 2. Confirm `NPM_TOKEN` exists in the GitHub repo secrets.
49
- 3. Confirm the package version has been bumped and committed.
50
- 4. Confirm `README.md`, `CHANGELOG.md`, `releases/manifest.json`, and `docs/plans/migration.md` all describe the same release surface.
51
- 5. Push the release commit and release tag, for example `v0.9.0`.
52
- 6. Verify both `publish-npm.yml` and `publish-package.yml` start from the tag push.
53
- 7. Verify the npmjs publish completes successfully for the tagged source.
7
+ If this repo later migrates to trusted publishing, replace this compatibility stub with the real OIDC procedure in the same change as the workflow update.
@@ -0,0 +1,272 @@
1
+ # Package Publishing Flow
2
+
3
+ This document describes how this repo publishes `@chllming/wave-orchestration` end to end, including the scripts, workflows, release artifacts, and verification steps involved.
4
+
5
+ ## Overview
6
+
7
+ The package publish flow has two layers:
8
+
9
+ 1. repo-owned release preparation
10
+ 2. tag-triggered registry publishing
11
+
12
+ Release preparation happens in the repository itself:
13
+
14
+ - bump `package.json`
15
+ - update release-surface docs and fixtures
16
+ - validate the repo
17
+ - merge the release changes to `main`
18
+ - push a version tag such as `v0.9.2`
19
+
20
+ Registry publishing happens in GitHub Actions after the tag push:
21
+
22
+ - [publish-npm.yml](../../.github/workflows/publish-npm.yml) publishes to npmjs
23
+ - [publish-package.yml](../../.github/workflows/publish-package.yml) publishes to GitHub Packages
24
+ - [npmjs-token-publishing.md](./npmjs-token-publishing.md) documents the npm token setup used by `publish-npm.yml`
25
+
26
+ Both workflows run on tag pushes matching `v*`, and each workflow now fails fast unless `github.ref_name` exactly matches `v${package.json.version}`.
27
+
28
+ ## Release Artifacts That Move Together
29
+
30
+ These files are part of the release surface and should be updated in the same change when the package version changes:
31
+
32
+ - `package.json`
33
+ - `README.md`
34
+ - `CHANGELOG.md`
35
+ - `docs/README.md`
36
+ - `docs/plans/current-state.md`
37
+ - `docs/plans/migration.md`
38
+ - `docs/guides/sandboxed-environments.md`
39
+ - `docs/reference/coordination-and-closure.md`
40
+ - `docs/reference/runtime-config/README.md`
41
+ - `releases/manifest.json`
42
+ - `.wave/install-state.json`
43
+ - tracked `.wave/upgrade-history/*`
44
+ - versioned docs such as `docs/guides/recommendations-<version>.md`
45
+ - `AGENTS.md`
46
+
47
+ This repo treats those files as part of the package-facing release contract, not just internal documentation.
48
+
49
+ ## Scripts And Commands Involved
50
+
51
+ ### Main CLI entrypoint
52
+
53
+ - `scripts/wave.mjs`
54
+ Routes install and lifecycle commands into `scripts/wave-orchestrator/install.mjs`.
55
+
56
+ The lifecycle commands relevant to publishing are:
57
+
58
+ - `wave doctor`
59
+ - `wave changelog`
60
+ - `wave upgrade`
61
+ - `wave self-update`
62
+
63
+ ### Install and release-state module
64
+
65
+ - `scripts/wave-orchestrator/install.mjs`
66
+
67
+ This module owns the local package-lifecycle surfaces:
68
+
69
+ - `wave init`
70
+ Seeds or adopts starter workspace files.
71
+ - `wave doctor`
72
+ Validates that the current workspace matches the installed package expectations.
73
+ - `wave changelog`
74
+ Reads `releases/manifest.json` and prints release notes.
75
+ - `wave upgrade`
76
+ Writes `.wave/install-state.json` and a markdown/json report into `.wave/upgrade-history/`.
77
+ - `wave self-update`
78
+ Updates the dependency in the target workspace, prints changelog deltas, and then runs `wave upgrade`.
79
+
80
+ ### Release-validation commands
81
+
82
+ These are the normal validation commands before tagging:
83
+
84
+ ```bash
85
+ pnpm test
86
+ pnpm test -- test/wave-orchestrator/release-surface.test.ts
87
+ node scripts/wave.mjs doctor --json
88
+ node scripts/wave.mjs launch --lane main --dry-run --no-dashboard
89
+ ```
90
+
91
+ ### Registry verification commands
92
+
93
+ After publish:
94
+
95
+ ```bash
96
+ npm view @chllming/wave-orchestration version dist-tags --json
97
+ gh run list --limit 10
98
+ ```
99
+
100
+ ## End-to-End Flow
101
+
102
+ ### 1. Prepare the release change
103
+
104
+ Update the release artifacts together, then validate locally.
105
+
106
+ Typical local flow:
107
+
108
+ ```bash
109
+ pnpm test -- test/wave-orchestrator/release-surface.test.ts
110
+ node scripts/wave.mjs doctor --json
111
+ node scripts/wave.mjs launch --lane main --dry-run --no-dashboard
112
+ ```
113
+
114
+ If the version changed, also refresh the tracked workspace lifecycle state:
115
+
116
+ ```bash
117
+ pnpm exec wave upgrade
118
+ pnpm exec wave changelog --since-installed
119
+ ```
120
+
121
+ In this source repo, `.wave/install-state.json` and tracked `.wave/upgrade-history/` records are intentionally part of the release surface.
122
+
123
+ ### 2. Merge the release change to `main`
124
+
125
+ This repository protects `main`, so release changes must land through a pull request rather than a direct push.
126
+
127
+ Typical git flow:
128
+
129
+ ```bash
130
+ git checkout -b release/0.9.2
131
+ git push -u origin release/0.9.2
132
+ gh pr create --base main --head release/0.9.2
133
+ gh pr merge <pr-number> --merge --delete-branch
134
+ ```
135
+
136
+ ### 3. Push the release tag
137
+
138
+ After the release commit is on `main`, push the version tag:
139
+
140
+ ```bash
141
+ git tag v0.9.2
142
+ git push origin v0.9.2
143
+ ```
144
+
145
+ That tag push is the event that starts both publishing workflows.
146
+
147
+ The tag must match the checked-in package version exactly. Example: if `package.json.version` is `0.9.2`, the pushed tag must be `v0.9.2`.
148
+
149
+ ## GitHub Actions Workflows
150
+
151
+ ### npmjs publish
152
+
153
+ - workflow: [publish-npm.yml](../../.github/workflows/publish-npm.yml)
154
+ - trigger: push tags matching `v*`
155
+ - runtime: Node 22
156
+ - auth secret: `NPM_TOKEN`
157
+ - publish command:
158
+
159
+ ```bash
160
+ pnpm publish --access public --no-git-checks
161
+ ```
162
+
163
+ The workflow does:
164
+
165
+ 1. `actions/checkout`
166
+ 2. `pnpm/action-setup`
167
+ 3. `actions/setup-node` with `registry-url: https://registry.npmjs.org`
168
+ 4. verify `github.ref_name === "v" + package.json.version`
169
+ 5. `pnpm install --frozen-lockfile`
170
+ 6. `pnpm test`
171
+ 7. `pnpm publish --access public --no-git-checks`
172
+
173
+ ### GitHub Packages publish
174
+
175
+ - workflow: [publish-package.yml](../../.github/workflows/publish-package.yml)
176
+ - trigger: push tags matching `v*`
177
+ - runtime: Node 22
178
+ - auth token: `GITHUB_TOKEN`
179
+ - publish command:
180
+
181
+ ```bash
182
+ pnpm publish --registry=https://npm.pkg.github.com --no-git-checks
183
+ ```
184
+
185
+ The workflow does:
186
+
187
+ 1. `actions/checkout`
188
+ 2. `pnpm/action-setup`
189
+ 3. `actions/setup-node` with `registry-url: https://npm.pkg.github.com`
190
+ 4. verify `github.ref_name === "v" + package.json.version`
191
+ 5. `pnpm install --frozen-lockfile`
192
+ 6. `pnpm test`
193
+ 7. `pnpm publish --registry=https://npm.pkg.github.com --no-git-checks`
194
+
195
+ ## Verification After Tag Push
196
+
197
+ Use GitHub Actions first:
198
+
199
+ ```bash
200
+ gh run list --limit 10 --json workflowName,headBranch,headSha,status,conclusion,url
201
+ gh run watch <run-id> --exit-status
202
+ gh run view <run-id> --log-failed
203
+ ```
204
+
205
+ Then verify the public registry:
206
+
207
+ ```bash
208
+ npm view @chllming/wave-orchestration version dist-tags --json
209
+ ```
210
+
211
+ Expected result after a successful publish:
212
+
213
+ ```json
214
+ {
215
+ "version": "0.9.2",
216
+ "dist-tags": {
217
+ "latest": "0.9.2"
218
+ }
219
+ }
220
+ ```
221
+
222
+ ## Repair Flow When Publish Fails
223
+
224
+ If a tag-triggered publish fails before the package is actually published, the fastest repair path is:
225
+
226
+ 1. fix the repo issue in a new commit
227
+ 2. move the tag to the fixed commit
228
+ 3. force-push the tag
229
+ 4. watch the rerun
230
+
231
+ Example:
232
+
233
+ ```bash
234
+ git tag -f v0.9.2 <fixed-commit>
235
+ git push origin refs/tags/v0.9.2 --force
236
+ ```
237
+
238
+ Use that only before the package is live on npmjs. Once npmjs has accepted a version, do not try to republish the same version; cut a new version instead.
239
+
240
+ Common failure classes:
241
+
242
+ - release-surface drift
243
+ A versioned doc or fixture did not move with `package.json`.
244
+ - workflow-environment drift
245
+ The CI runtime differs from the runtime that was locally validated.
246
+ - missing secrets
247
+ `NPM_TOKEN` is missing or invalid for npmjs.
248
+ - test assumptions on ignored files
249
+ CI cannot see local-only workstation files such as `.vscode/terminals.json`.
250
+
251
+ ## Security And Secrets
252
+
253
+ For npmjs publishing:
254
+
255
+ - keep `NPM_TOKEN` scoped as narrowly as possible
256
+ - use `Read and write` only for the target package or scope
257
+ - rotate the token periodically
258
+ - revoke temporary or emergency tokens after use
259
+
260
+ GitHub Packages publishing uses the workflow `GITHUB_TOKEN`, so it does not require a separate package-publish secret.
261
+
262
+ ## What This Flow Does Not Do
263
+
264
+ There is no dedicated local `release` shell script in this repo that bumps versions, tags commits, and publishes in one command.
265
+
266
+ The flow today is intentionally split:
267
+
268
+ - repo release preparation is explicit and reviewable
269
+ - package lifecycle state is recorded by `wave upgrade`
270
+ - actual registry publishing is delegated to tag-triggered GitHub Actions
271
+
272
+ That split keeps release metadata, workspace upgrade history, and package publication visible and auditable.
@@ -8,6 +8,7 @@ Use it when you need the full supported surface for:
8
8
  - `defaultProject` and `projects.<projectId>`
9
9
  - `lanes.<lane>.executors`
10
10
  - `waveControl`
11
+ - `externalProviders`
11
12
  - `executors.profiles.<profile>`
12
13
  - per-agent `### Executor` blocks inside a wave file
13
14
 
@@ -190,7 +191,7 @@ Practical guidance:
190
191
  - prefer `budget.minutes` for normal synthesis, integration, and closure work
191
192
  - use generic `budget.turns` as a planning hint, not a hard failure trigger
192
193
  - only set `claude.maxTurns` or `opencode.steps` when you deliberately want a hard ceiling for that runtime
193
- - see [../../guides/recommendations-0.9.0.md](../../guides/recommendations-0.9.0.md) for the recommended `0.9.0` operating stance that combines advisory turn budgets with softer non-proof coordination states
194
+ - see [../../guides/recommendations-0.9.2.md](../../guides/recommendations-0.9.2.md) for the recommended `0.9.2` operating stance that combines advisory turn budgets with softer non-proof coordination states
194
195
 
195
196
  ## Runtime Pages
196
197
 
@@ -202,7 +203,7 @@ Practical guidance:
202
203
 
203
204
  `wave.config.json` may also declare a `waveControl` block for local-first telemetry delivery.
204
205
 
205
- Packaged defaults in `@chllming/wave-orchestration@0.9.0`:
206
+ Packaged defaults in `@chllming/wave-orchestration@0.9.2`:
206
207
 
207
208
  - `endpoint`: `https://wave-control.up.railway.app/api/v1`
208
209
  - `reportMode`: `metadata-only`
@@ -219,7 +220,10 @@ Supported top-level fields:
219
220
  | `endpoint` | string | `https://wave-control.up.railway.app/api/v1` | Base URL for the Railway-hosted `services/wave-control` API |
220
221
  | `workspaceId` | string | derived from repo path | Stable workspace identity used across runs |
221
222
  | `projectId` | string | resolved project id | Stable project identity used for cross-workspace reporting and filtering |
222
- | `authTokenEnvVar` | string | `WAVE_CONTROL_AUTH_TOKEN` | Environment variable name holding the bearer token |
223
+ | `authTokenEnvVar` | string | `WAVE_API_TOKEN` | Primary environment variable name holding the bearer token |
224
+ | `authTokenEnvVars` | string[] | `["WAVE_API_TOKEN", "WAVE_CONTROL_AUTH_TOKEN"]` | Ordered fallback env var list consulted when Wave resolves a bearer token for owned Wave Control routes |
225
+ | `credentialProviders` | string[] | `[]` | Allowlisted runtime credential leases requested from an owned Wave Control deployment before executor launch. Supported values: `openai`, `anthropic` |
226
+ | `credentials` | `{ id, envVar }[]` | `[]` | Arbitrary per-user credential leases requested from an owned Wave Control deployment before executor launch |
223
227
  | `reportMode` | string | `metadata-only` | `disabled`, `metadata-only`, `metadata-plus-selected`, or `full-artifact-upload` |
224
228
  | `uploadArtifactKinds` | string[] | selected proof/trace/benchmark kinds | Artifact classes eligible for body upload when an artifact's upload policy requests a body |
225
229
  | `requestTimeoutMs` | integer | `5000` | Per-batch network timeout |
@@ -232,6 +236,8 @@ Supported top-level fields:
232
236
 
233
237
  Lane overrides may refine the same keys under `lanes.<lane>.waveControl` or `projects.<projectId>.lanes.<lane>.waveControl`.
234
238
 
239
+ Wave resolves the Wave Control bearer token from `authTokenEnvVars` when that list is present. Otherwise it resolves `authTokenEnvVar` first and keeps `WAVE_CONTROL_AUTH_TOKEN` as a compatibility fallback.
240
+
235
241
  One-run override:
236
242
 
237
243
  - `wave launch --no-telemetry` disables Wave Control queueing and remote delivery for that launcher invocation without changing the repo config.
@@ -246,6 +252,8 @@ Example:
246
252
  "endpoint": "https://wave-control.up.railway.app/api/v1",
247
253
  "workspaceId": "wave-main",
248
254
  "projectId": "app",
255
+ "credentialProviders": ["openai"],
256
+ "credentials": [{ "id": "github_pat", "envVar": "GITHUB_TOKEN" }],
249
257
  "reportMode": "metadata-only",
250
258
  "uploadArtifactKinds": [
251
259
  "trace-run-metadata",
@@ -261,6 +269,56 @@ Runtime-emitted Wave Control events also attach:
261
269
  - `orchestratorId` from the active launcher or resident orchestrator
262
270
  - `runtimeVersion` from the installed Wave package metadata
263
271
 
272
+ ## External Providers
273
+
274
+ Wave can resolve third-party auth directly in the repo runtime or through an owned Wave Control broker.
275
+
276
+ ```json
277
+ {
278
+ "externalProviders": {
279
+ "context7": {
280
+ "mode": "direct",
281
+ "apiKeyEnvVar": "CONTEXT7_API_KEY"
282
+ },
283
+ "corridor": {
284
+ "enabled": false,
285
+ "mode": "direct",
286
+ "baseUrl": "https://app.corridor.dev/api",
287
+ "apiTokenEnvVar": "CORRIDOR_API_TOKEN",
288
+ "apiKeyFallbackEnvVar": "CORRIDOR_API_KEY",
289
+ "teamId": "team-id-for-direct-mode",
290
+ "projectId": "project-id-for-direct-mode",
291
+ "severityThreshold": "critical",
292
+ "findingStates": ["open", "potential"],
293
+ "requiredAtClosure": true
294
+ }
295
+ }
296
+ }
297
+ ```
298
+
299
+ - `direct`: use repo/runtime env vars directly
300
+ - `broker`: use the owned Wave Control endpoint with `WAVE_API_TOKEN`
301
+ - `hybrid`: try the broker first, then fall back to direct auth if broker setup fails or a broker request fails at runtime
302
+ - direct Corridor mode requires both `teamId` and `projectId` in config; broker mode instead requires a matching `WAVE_BROKER_CORRIDOR_PROJECT_MAP` entry on the owned Wave Control deployment
303
+ - Wave auto-loads an allowlisted repo-root `.env.local` for `CONTEXT7_API_KEY`, `CORRIDOR_API_TOKEN`, `CORRIDOR_API_KEY`, `WAVE_API_TOKEN`, and `WAVE_CONTROL_AUTH_TOKEN`
304
+ - `wave doctor` now warns or fails early when brokered providers target the packaged default endpoint or no Wave Control auth token is available
305
+ - Context7 remains fail-open
306
+ - Corridor writes `.tmp/<lane>-wave-launcher/security/wave-<n>-corridor.json`, filters findings down to the wave's implementation-owned non-doc, non-`.tmp/`, non-markdown paths, and can fail closure when the fetch fails or matched findings meet the configured threshold
307
+ - Broker mode is intended for self-hosted or team-owned Wave Control only; the packaged default endpoint is rejected as a provider-secret proxy
308
+ - if `findingStates` is omitted or set to `[]`, Wave does not apply a state filter and the provider may return all states
309
+ - for the full Corridor lifecycle, including broker mapping, generated artifact shape, and gate semantics, see [../corridor.md](../corridor.md)
310
+
311
+ `waveControl.credentialProviders` is related but separate from `externalProviders`:
312
+
313
+ - use `externalProviders.context7` and `externalProviders.corridor` for brokered or direct API access during planning / closure flows
314
+ - use `waveControl.credentialProviders` only when an executor needs env vars leased into its runtime
315
+ - use `waveControl.credentials` when an executor needs arbitrary user-owned secrets leased into env vars such as `GITHUB_TOKEN` or `NPM_TOKEN`
316
+ - only `openai` and `anthropic` are valid leased providers today
317
+ - `context7` and `corridor` remain broker-only and are never returned as raw env secrets
318
+ - `waveControl.credentials[*].id` must match `/^[a-z0-9][a-z0-9._-]*$/`
319
+ - `waveControl.credentials[*].envVar` must match `/^[A-Z_][A-Z0-9_]*$/`
320
+ - when provider or arbitrary credentials are leased, Wave injects them into the live executor environment and redacts those keys in `launch-preview.json`
321
+
264
322
  Those fields are queryable in the `wave-control` service alongside `workspaceId`,
265
323
  `projectId`, `runKind`, `runId`, `lane`, and benchmark ids.
266
324
 
@@ -1,11 +1,11 @@
1
1
  ---
2
2
  title: "Sample Waves"
3
- summary: "Showcase-first sample waves that demonstrate the shipped 0.9.0 authored surface, including the optional design-role path."
3
+ summary: "Showcase-first sample waves that demonstrate the shipped 0.9.2 authored surface, including the optional design-role path."
4
4
  ---
5
5
 
6
6
  # Sample Waves
7
7
 
8
- This guide points to showcase-first sample waves that demonstrate the shipped `0.9.0` authored Wave surface.
8
+ This guide points to showcase-first sample waves that demonstrate the shipped `0.9.2` authored Wave surface.
9
9
 
10
10
  The examples are intentionally denser than typical production waves. Their job is to teach the current authoring and runtime surface quickly, not to be the smallest possible launch-ready files.
11
11
 
@@ -17,7 +17,7 @@ All example `.tmp/main-wave-launcher/...` paths assume the implicit default proj
17
17
  Shows what a good `repo-landed` outcome looks like when one promoted component only closes honestly if desired-state records, reconcile-loop substrate, and cluster-view surfaces land together. It emphasizes maturity discipline, explicit deliverables, and shared-plan closure without drifting into `pilot-live` claims.
18
18
 
19
19
  - [Full modern sample wave](../plans/examples/wave-example-live-proof.md)
20
- Shows the combined `0.9.0` authored surface in one file: closure roles, `E0`, optional security review, delegated and pinned benchmark targets, richer executor config, `### Skills`, `### Capabilities`, `### Deliverables`, `### Exit contract`, `### Proof artifacts`, sticky retry, deploy environments, and proof-first live-wave structure.
20
+ Shows the combined `0.9.2` authored surface in one file: closure roles, `E0`, optional security review, delegated and pinned benchmark targets, richer executor config, `### Skills`, `### Capabilities`, `### Deliverables`, `### Exit contract`, `### Proof artifacts`, sticky retry, deploy environments, and proof-first live-wave structure.
21
21
 
22
22
  - [Optional design-steward handoff wave](../plans/examples/wave-example-design-handoff.md)
23
23
  Shows the shipped design-role surface: one pre-implementation design steward publishes a design packet, downstream implementation owners read that packet before coding, and normal closure roles still decide final completion. For terminal or operator-surface work, pair that shape with explicit `tui-design` in the design steward's `### Skills`. For the hybrid variant, explicitly give that same design agent implementation-owned paths and the normal implementation contract sections.
@@ -46,7 +46,7 @@ All example `.tmp/main-wave-launcher/...` paths assume the implicit default proj
46
46
 
47
47
  ## Feature Coverage Map
48
48
 
49
- Together these samples cover the main surfaces added or hardened through `0.9.0`:
49
+ Together these samples cover the main surfaces added or hardened through `0.9.2`:
50
50
 
51
51
  - repo-landed maturity discipline and anti-overclaim framing
52
52
  - explicit shared-plan closure for future-wave safety
@@ -184,7 +184,7 @@ Adapt more aggressively when:
184
184
  ## Suggested Reading Order
185
185
 
186
186
  1. Start with [High-fidelity repo-landed rollout wave](../plans/examples/wave-example-rollout-fidelity.md) if you want the clearest example of good closure-ready wave fidelity for a repo-only outcome.
187
- 2. Read [Full modern sample wave](../plans/examples/wave-example-live-proof.md) if you want the denser proof-first and eval-heavy `0.9.0` surface.
187
+ 2. Read [Full modern sample wave](../plans/examples/wave-example-live-proof.md) if you want the denser proof-first and eval-heavy `0.9.2` surface.
188
188
  3. Read [Optional design-steward handoff wave](../plans/examples/wave-example-design-handoff.md) if the task needs a design packet before implementation fan-out.
189
189
  4. Read [docs/evals/README.md](../evals/README.md) if you want more background on benchmark target selection.
190
190
  5. Read [docs/reference/live-proof-waves.md](./live-proof-waves.md) if you want more detail on proof-first `pilot-live` authoring.
@@ -124,7 +124,7 @@ Top-level and lane-local skill attachment use the same shape:
124
124
 
125
125
  Lane-local `lanes.<lane>.skills` extends the global config instead of replacing it.
126
126
 
127
- Optional design workers in the shipped `0.9.0` surface normally attach `role-design`. That bundle is intended for docs/spec-first design packets and explicit implementation handoff work before implementation starts. When the design packet covers terminal UX, dashboards, or other operator surfaces, add `tui-design` explicitly in the wave's `### Skills`.
127
+ Optional design workers in the shipped `0.9.2` surface normally attach `role-design`. That bundle is intended for docs/spec-first design packets and explicit implementation handoff work before implementation starts. When the design packet covers terminal UX, dashboards, or other operator surfaces, add `tui-design` explicitly in the wave's `### Skills`.
128
128
 
129
129
  Long-running agents that should stay resident and react only to orchestrator signal changes can add `signal-hygiene` explicitly in `### Skills`. That bundle is not auto-attached and is not meant for normal one-shot implementation agents.
130
130