@chllming/wave-orchestration 0.9.1 → 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 (43) hide show
  1. package/CHANGELOG.md +30 -1
  2. package/LICENSE.md +21 -0
  3. package/README.md +18 -6
  4. package/docs/README.md +8 -4
  5. package/docs/agents/wave-security-role.md +1 -0
  6. package/docs/architecture/README.md +1 -1
  7. package/docs/concepts/operating-modes.md +1 -1
  8. package/docs/guides/author-and-run-waves.md +1 -1
  9. package/docs/guides/planner.md +2 -2
  10. package/docs/guides/{recommendations-0.9.1.md → recommendations-0.9.2.md} +7 -7
  11. package/docs/guides/sandboxed-environments.md +2 -2
  12. package/docs/plans/current-state.md +8 -2
  13. package/docs/plans/end-state-architecture.md +1 -1
  14. package/docs/plans/examples/wave-example-design-handoff.md +1 -1
  15. package/docs/plans/examples/wave-example-live-proof.md +1 -1
  16. package/docs/plans/migration.md +42 -18
  17. package/docs/reference/cli-reference.md +1 -1
  18. package/docs/reference/coordination-and-closure.md +18 -1
  19. package/docs/reference/corridor.md +225 -0
  20. package/docs/reference/npmjs-token-publishing.md +2 -2
  21. package/docs/reference/package-publishing-flow.md +11 -11
  22. package/docs/reference/runtime-config/README.md +61 -3
  23. package/docs/reference/sample-waves.md +5 -5
  24. package/docs/reference/skills.md +1 -1
  25. package/docs/reference/wave-control.md +358 -27
  26. package/docs/roadmap.md +12 -19
  27. package/package.json +1 -1
  28. package/releases/manifest.json +22 -3
  29. package/scripts/wave-cli-bootstrap.mjs +52 -1
  30. package/scripts/wave-orchestrator/config.mjs +199 -3
  31. package/scripts/wave-orchestrator/context7.mjs +231 -29
  32. package/scripts/wave-orchestrator/coordination.mjs +14 -0
  33. package/scripts/wave-orchestrator/corridor.mjs +363 -0
  34. package/scripts/wave-orchestrator/derived-state-engine.mjs +38 -1
  35. package/scripts/wave-orchestrator/gate-engine.mjs +20 -0
  36. package/scripts/wave-orchestrator/install.mjs +34 -1
  37. package/scripts/wave-orchestrator/launcher-runtime.mjs +111 -7
  38. package/scripts/wave-orchestrator/planner.mjs +1 -0
  39. package/scripts/wave-orchestrator/projection-writer.mjs +23 -0
  40. package/scripts/wave-orchestrator/provider-runtime.mjs +104 -0
  41. package/scripts/wave-orchestrator/shared.mjs +1 -0
  42. package/scripts/wave-orchestrator/traces.mjs +25 -0
  43. package/scripts/wave-orchestrator/wave-control-client.mjs +14 -1
@@ -0,0 +1,225 @@
1
+ ---
2
+ title: "Corridor"
3
+ summary: "How Wave loads Corridor security context, matches findings against implementation-owned paths, and uses the result during closure."
4
+ ---
5
+
6
+ # Corridor
7
+
8
+ Corridor is Wave's optional external security-context provider.
9
+
10
+ It does not replace the report-owning security reviewer. Instead, it adds a machine-readable guardrail and findings input that Wave can materialize before security and integration closure run.
11
+
12
+ Use it when you want Wave to:
13
+
14
+ - pull guardrail or findings context for a project
15
+ - filter that context down to the implementation-owned paths in the current wave
16
+ - persist the normalized result as a runtime artifact
17
+ - fail closure automatically when the fetch fails or matched findings cross a configured severity threshold
18
+
19
+ ## Modes
20
+
21
+ Wave supports three Corridor modes under `externalProviders.corridor`:
22
+
23
+ ```json
24
+ {
25
+ "externalProviders": {
26
+ "corridor": {
27
+ "enabled": true,
28
+ "mode": "hybrid",
29
+ "baseUrl": "https://app.corridor.dev/api",
30
+ "apiTokenEnvVar": "CORRIDOR_API_TOKEN",
31
+ "apiKeyFallbackEnvVar": "CORRIDOR_API_KEY",
32
+ "teamId": "corridor-team-id",
33
+ "projectId": "corridor-project-id",
34
+ "severityThreshold": "critical",
35
+ "findingStates": ["open", "potential"],
36
+ "requiredAtClosure": true
37
+ }
38
+ }
39
+ }
40
+ ```
41
+
42
+ - `direct`
43
+ Wave calls Corridor from the repo runtime with `CORRIDOR_API_TOKEN` or the fallback `CORRIDOR_API_KEY`.
44
+ - `broker`
45
+ Wave calls an owned `wave-control` deployment with `WAVE_API_TOKEN`, and that service uses deployment-owned Corridor credentials.
46
+ - `hybrid`
47
+ Wave tries the owned `wave-control` broker first and falls back to direct auth if broker setup or broker delivery fails.
48
+
49
+ Notes:
50
+
51
+ - direct mode requires both `teamId` and `projectId` in config; the live fetches use `projectId`, while `teamId` keeps the project identity explicit in repo config
52
+ - broker mode requires an owned Wave Control endpoint; the packaged default endpoint intentionally rejects Corridor brokering
53
+ - if `findingStates` is omitted or set to `[]`, Wave does not filter by finding state and the provider may return all states
54
+ - if you only want active findings, set `findingStates` explicitly, for example `["open", "potential"]`
55
+
56
+ ## What Wave Matches
57
+
58
+ Wave does not send every file in the repo to Corridor matching.
59
+
60
+ The runtime builds the relevant path set from implementation-owned paths in the current wave:
61
+
62
+ - security reviewers are excluded
63
+ - design stewards are excluded
64
+ - integration, documentation, and `cont-QA` owners are excluded
65
+ - `cont-EVAL` only contributes owned paths when that agent is implementation-owning
66
+ - `.tmp/` paths are excluded
67
+ - `docs/` paths are excluded
68
+ - `.md` and `.txt` files are excluded
69
+
70
+ That means Corridor is aimed at code and implementation-owned assets, not shared-plan markdown or generated launcher state.
71
+
72
+ Matching is path-prefix based:
73
+
74
+ - an exact file match counts
75
+ - a finding under a matched owned directory also counts
76
+ - unmatched findings remain in the upstream provider but are dropped from the normalized Wave artifact
77
+
78
+ ## Generated Artifact
79
+
80
+ Wave writes the normalized Corridor artifact to:
81
+
82
+ - `.tmp/<lane>-wave-launcher/security/wave-<n>-corridor.json`
83
+ - `.tmp/projects/<projectId>/<lane>-wave-launcher/security/wave-<n>-corridor.json` for explicit projects
84
+
85
+ Representative shape:
86
+
87
+ ```json
88
+ {
89
+ "schemaVersion": 1,
90
+ "wave": 7,
91
+ "lane": "main",
92
+ "projectId": "app",
93
+ "providerMode": "broker",
94
+ "source": "wave-control-broker",
95
+ "requiredAtClosure": true,
96
+ "severityThreshold": "critical",
97
+ "fetchedAt": "2026-03-29T12:00:00.000Z",
98
+ "relevantOwnedPaths": ["src/auth", "src/session"],
99
+ "guardrails": [{ "id": "r1", "name": "No secrets" }],
100
+ "matchedFindings": [
101
+ {
102
+ "id": "f1",
103
+ "title": "Hardcoded token",
104
+ "affectedFile": "src/auth/token.ts",
105
+ "severity": "critical",
106
+ "state": "open",
107
+ "matchedOwnedPaths": ["src/auth"]
108
+ }
109
+ ],
110
+ "blockingFindings": [
111
+ {
112
+ "id": "f1",
113
+ "title": "Hardcoded token",
114
+ "affectedFile": "src/auth/token.ts",
115
+ "severity": "critical",
116
+ "state": "open",
117
+ "matchedOwnedPaths": ["src/auth"]
118
+ }
119
+ ],
120
+ "blocking": true,
121
+ "error": null
122
+ }
123
+ ```
124
+
125
+ Important fields:
126
+
127
+ - `providerMode`: the configured mode after runtime resolution
128
+ - `source`: the actual fetch source such as direct Corridor API or owned Wave Control broker
129
+ - `relevantOwnedPaths`: the implementation-owned paths Wave considered eligible for matching
130
+ - `guardrails`: normalized provider-side guardrail/report metadata
131
+ - `matchedFindings`: findings that hit the wave's eligible owned paths
132
+ - `blockingFindings`: matched findings whose severity meets or exceeds `severityThreshold`
133
+ - `blocking`: whether the Corridor result alone is enough to fail the security gate
134
+ - `error`: the fetch or broker error when the load failed
135
+
136
+ If the wave has no eligible implementation-owned paths, Wave still writes a successful artifact with `blocking: false` and a `detail` explaining that nothing qualified for matching.
137
+
138
+ ## Closure Behavior
139
+
140
+ Corridor is evaluated before security review finishes.
141
+
142
+ The security gate behaves like this:
143
+
144
+ 1. If Corridor is disabled, Wave ignores it.
145
+ 2. If Corridor is enabled and the fetch fails:
146
+ - `requiredAtClosure: true` turns that into `corridor-fetch-failed`
147
+ - `requiredAtClosure: false` keeps the failure visible in summaries without hard-failing the gate
148
+ 3. If Corridor loads and matched findings meet the configured threshold:
149
+ - the gate fails as `corridor-blocked`
150
+ 4. If Corridor loads cleanly:
151
+ - security review still runs and still owns the human-readable report plus `[wave-security]`
152
+
153
+ That separation matters:
154
+
155
+ - Corridor provides machine-readable blocking evidence
156
+ - the security reviewer still provides the threat-model-first narrative review, approvals, and final marker
157
+ - `concerns` from the human reviewer remain advisory, while `blocked` from either the reviewer or Corridor stops closure before integration
158
+
159
+ Matched Corridor findings are also copied into the generated security and integration summaries, so they remain visible even when the human reviewer reports advisory concerns rather than a hard block.
160
+
161
+ ## Broker Mode Through Wave Control
162
+
163
+ In broker mode, the repo runtime sends a normalized request to:
164
+
165
+ - `POST /api/v1/providers/corridor/context`
166
+
167
+ The request body contains:
168
+
169
+ - `projectId`: the active Wave project id
170
+ - `wave`: current wave number
171
+ - `ownedPaths`: the filtered implementation-owned paths
172
+ - `severityThreshold`
173
+ - `findingStates`
174
+
175
+ The owned `wave-control` deployment then:
176
+
177
+ - looks up the Wave project id inside `WAVE_BROKER_CORRIDOR_PROJECT_MAP`
178
+ - fetches Corridor reports and findings with the deployment-owned `WAVE_BROKER_CORRIDOR_API_TOKEN`
179
+ - returns the same normalized shape Wave would have produced in direct mode
180
+
181
+ Example mapping:
182
+
183
+ ```json
184
+ {
185
+ "app": {
186
+ "teamId": "corridor-team-uuid",
187
+ "projectId": "corridor-project-uuid"
188
+ }
189
+ }
190
+ ```
191
+
192
+ Broker mode requirements:
193
+
194
+ - `waveControl.endpoint` must point at an owned Wave Control deployment, not the packaged default endpoint
195
+ - Wave must have a bearer token, normally `WAVE_API_TOKEN`
196
+ - the service deployment must enable Corridor brokering with `WAVE_BROKER_OWNED_DEPLOYMENT=true`, `WAVE_BROKER_ENABLE_CORRIDOR=true`, `WAVE_BROKER_CORRIDOR_API_TOKEN`, and `WAVE_BROKER_CORRIDOR_PROJECT_MAP`
197
+
198
+ ## Prompt And Summary Surfaces
199
+
200
+ When Corridor loads during a live run, Wave also projects a compact text summary into the generated runtime context. That summary includes:
201
+
202
+ - the actual source used
203
+ - whether Corridor is currently blocking
204
+ - the configured threshold
205
+ - matched finding count
206
+ - up to five blocking findings
207
+
208
+ The same Corridor result then appears in:
209
+
210
+ - the generated security summary
211
+ - the integration summary
212
+ - the trace bundle's copied `corridor.json`
213
+
214
+ This keeps security context visible to humans without turning the provider response into the sole authority.
215
+
216
+ ## Recommended Pattern
217
+
218
+ For most repos:
219
+
220
+ - use `hybrid` if you want an owned Wave Control deployment in normal operation but still want direct-repo fallback during outages or incomplete broker setup
221
+ - set `findingStates` explicitly if you only want open or potential findings considered live
222
+ - leave `requiredAtClosure` enabled when Corridor is meant to be part of the actual release gate
223
+ - keep a report-owning security reviewer in the wave; Corridor should strengthen that review, not replace it
224
+
225
+ See [runtime-config/README.md](./runtime-config/README.md) for the config keys, [wave-control.md](./wave-control.md) for the owned broker surface, and [coordination-and-closure.md](./coordination-and-closure.md) for the closure-stage gate ordering.
@@ -2,7 +2,7 @@
2
2
 
3
3
  This repo now includes a dedicated npmjs publish workflow at [publish-npm.yml](../../.github/workflows/publish-npm.yml).
4
4
 
5
- The current `0.9.1` release procedure publishes through a repository Actions secret named `NPM_TOKEN`.
5
+ The current `0.9.2` release procedure publishes through a repository Actions secret named `NPM_TOKEN`.
6
6
 
7
7
  ## What This Repo Already Does
8
8
 
@@ -48,6 +48,6 @@ If this repo later needs private npm dependencies during CI, consider a separate
48
48
  2. Confirm `NPM_TOKEN` exists in the GitHub repo secrets.
49
49
  3. Confirm the package version has been bumped and committed.
50
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.1`.
51
+ 5. Push the release commit and release tag, for example `v0.9.2`.
52
52
  6. Verify both `publish-npm.yml` and `publish-package.yml` start from the tag push.
53
53
  7. Verify the npmjs publish completes successfully for the tagged source.
@@ -15,7 +15,7 @@ Release preparation happens in the repository itself:
15
15
  - update release-surface docs and fixtures
16
16
  - validate the repo
17
17
  - merge the release changes to `main`
18
- - push a version tag such as `v0.9.1`
18
+ - push a version tag such as `v0.9.2`
19
19
 
20
20
  Registry publishing happens in GitHub Actions after the tag push:
21
21
 
@@ -127,9 +127,9 @@ This repository protects `main`, so release changes must land through a pull req
127
127
  Typical git flow:
128
128
 
129
129
  ```bash
130
- git checkout -b release/0.9.1
131
- git push -u origin release/0.9.1
132
- gh pr create --base main --head release/0.9.1
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
133
  gh pr merge <pr-number> --merge --delete-branch
134
134
  ```
135
135
 
@@ -138,13 +138,13 @@ gh pr merge <pr-number> --merge --delete-branch
138
138
  After the release commit is on `main`, push the version tag:
139
139
 
140
140
  ```bash
141
- git tag v0.9.1
142
- git push origin v0.9.1
141
+ git tag v0.9.2
142
+ git push origin v0.9.2
143
143
  ```
144
144
 
145
145
  That tag push is the event that starts both publishing workflows.
146
146
 
147
- The tag must match the checked-in package version exactly. Example: if `package.json.version` is `0.9.1`, the pushed tag must be `v0.9.1`.
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
148
 
149
149
  ## GitHub Actions Workflows
150
150
 
@@ -212,9 +212,9 @@ Expected result after a successful publish:
212
212
 
213
213
  ```json
214
214
  {
215
- "version": "0.9.1",
215
+ "version": "0.9.2",
216
216
  "dist-tags": {
217
- "latest": "0.9.1"
217
+ "latest": "0.9.2"
218
218
  }
219
219
  }
220
220
  ```
@@ -231,8 +231,8 @@ If a tag-triggered publish fails before the package is actually published, the f
231
231
  Example:
232
232
 
233
233
  ```bash
234
- git tag -f v0.9.1 <fixed-commit>
235
- git push origin refs/tags/v0.9.1 --force
234
+ git tag -f v0.9.2 <fixed-commit>
235
+ git push origin refs/tags/v0.9.2 --force
236
236
  ```
237
237
 
238
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.
@@ -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.1.md](../../guides/recommendations-0.9.1.md) for the recommended `0.9.1` 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.1`:
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.1 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.1` 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.1` 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.1`:
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.1` 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.1` 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